Everything you need to know about our mission to save the elders!

Middle-age Mutable Ninja Tuples are taking a break from fighting crime and want to take care of the elders instead.

Imagine that your grandmother has had a fall, and can’t get up. She now has the difficult choice of whether to call for an ambulance or call family members for help. Both options are hard – having to wait a long time to get help, and feeling like a burden to society and family is a real struggle for senior citizens. A lot of elders don’t even have family to rely on. “Eldrebølgen” is going to hit hard and our society isn’t ready.

We aim to revolutionize senior citizen assistance. Using our app, it’s trivial and fast for senior citizens to get help, and for any people to provide that help. Finally, senior citizens can get the dignity they deserve.

Killer app

Our platform makes it trivial for senior citizens to call for help (e.g. when having a fall), and for any people to provide that help. Both senior citizens and helpers easily find each other on a map, using location tracking. The back-office is able to monitor both the senior citizens and the helpers, and collect data to improve how automatic dispatching of helpers is done. 

Our app is senior citizen friendly, with a single large button to avoid misclicks and confusion. Getting help is fast and simple, and it’s easy to see when and how help arrives, using the map. This is a much better alternative than calling for help from a family member or calling for an ambulance, and senior citizens can keep their dignity. Feedback from test audiences is great – senior citizens are able to understand and use the service.

Our research shows that senior citizens assistance is an open market (at least in Norway), and that governments, senior citizens and investors are very interested in our platform. Since we are the first to market, we expect to get great PR in newspapers, TV news and social media, and be regarded as a killer app.

Our apps use state of the art technology (.NET MAUI and gRPC, among others), to provide an easy to use and seamless experience for all parties involved. Because of the technical advantage, the platform will be easy to maintain and cheap to run, which provides an advantage against other potential competitors in the senior citizens assistance area. 

The platform contains all components needed to compete against the incumbents in the food delivery and transportation business areas and other similar business areas. You might say we have created a killer platform.

Business Value

Foodora revolutionized food delivery, and Uber revolutionized transportation. Wolt copied Foodoras idea and is thriving, and the same applies to Lyft, which is competing with Uber. These types of platforms are a part of the Gig economy, the economy/business of the future. Now is the time for senior citizen assistance (SCA) to enter the Gig economy.

We will market our solution towards the Norwegian government, counties and municipalities. The first business plan is to get paid by the public sector each time an elderly citizen has received assistance.

We expect a few municipalities to want to test our services, and other municipalities and counties to jump onboard after we start getting positive press.

To scale the service, we allow anyone to register as a helper. Helpers will get a cut of the money. This will allow us to scale up to assist elders in many countries across the world.

We expect to get positive press and be noticed by investors. We can collaborate with investors to expand into other markets as well. The platform we have created is already capable of pivoting to other markets and compete with the likes of Lyft/Uber and Foodora/Wolt. This makes us agile and can take advantage of new market openings.

Our technical platform is state of the art, meaning we can compete with Foodora and Uber with lower prices. The sky’s the limit for this amazing platform.

User Experience

We have studied UX for senior citizens and have tailored the UX accordingly. The .NET MAUI app is senior citizen friendly, with an easy to use interface. The buttons are large and there are very few features, to avoid misclicks and confusion. It’s very intuitive to call for help (just press the large button). When help is on the way it’s easy to see where the assigned Turtle is currently located and to see when help arrives. 

Feedback from senior citizens is very positive, most say it’s very easy to call for help and understand when and how it arrives. 

The Turtles and extra helpers use the Dynamics mobile app which we have customized to aid in finding nearby senior citizens in need of assistance on a map. The Dynamics mobile app is created by Microsoft, and uses industry UX standards.

The back-office uses Dynamics Field Service which is customized to aid Turtles and helpers in the field. Back-office workers can track Turtles, helpers and senior citizens are shown on a map, and see a heat-map showing where there is more need of assistance. 

The app for registering as helpers is streamlined, using the most popular UI component library for Blazor (Radzen).

Rock Solid Geekness

Note: everything mentioned here is already working together properly, no rubber band and paper clips required.

The app for senior citizens is made with .NET MAUI (preview) and React components in MAUI. We have not used MAUI before, and had to struggle immensely with bugs. There is no easy way to show a map in MAUI, to circumvent this we embed a react app hosted elsewhere, containing the map.

The backend for the MAUI app is a gRPC service which is able to stream location updates back to the app.

It integrates with Dynamics using .NET Core Dynamics SDK (preview), to create SOS alerts and query for updates. We have not used gRPC or this Dynamics SDK before. The gRPC service is not supported in Azure App Service, which caused us a lot of struggle.

The app for registering as a Turtle is made with Blazor Server.

It integrates with Azure using Azure APIs, to automatically create users and assign licenses. We have not used this API before.

The gRPC service and Blazor app are automatically deployed to Azure using GitHub Actions. We have not used GitHub Actions before.

The back-office is Dynamics with Field Service. We have not used Field Service before.

Reports are made in Power BI using data via (Synapse/Dataverse)? We have not used this before.

Reports, customizations, workflows, plugins, etc…

Since we are working with multiple state of the art technologies, including several that are only available as preview, and that contains critical bugs which we have overcome, we suspect we might be the greatest nerds ACDC has ever seen.

Serverless SQL and Synapse love

After taken all the data from Dynamics into Synapse Middle-Aged Mutable Ninja Tuples wanted to be able to create views and use all data gathered in Synapse.

As a first step doing this we setup a serverless SQL.

This serverless SQL has no storage and only contain of the possibilities to g.ex create Stored Procedures and Views. This will able us to cross data from many sources and get a more rich way to doing analytics without duplicating data.

First thing first: Creating a External Data source for Serverless.

Then we need to create a fileformat

(This is not the final file format we ended up with – remember to update when working)

Next create all the external table(s) we need

!Note we only get the data we need from the CSV file, there are so many fields not needed in the source so let’s get those out of the way..

This would be the “code” way. But taking the time into consideration.. We used the GUI way:

After creating all the external tables we can now create a view in serverless SQL using normal T-SQL

(Please don’t mind the “dirty case”. We tried to fix this in several ways. But could not find a solution)

Now we can use this View in Power BI to get Clean data from Synapse. We can even cross data from several sources without duplicating data.

Less work for those using Power BI, and more control of the data back-end. A win-win situation.

If this turtle had not been sick, he would dived further on, but as of to day, he has to go back to bed again..

Plans (if not sick)

  • Getting data from outside Dynamics
    • Weather info
    • Traffic info
  • Taken those data into Power BI.
    • Analyze of SOS alert VS weather and time used to solve SOS alert
    • Analyze of time used in traffic – optimalization of resource scheduling
    • ++

Concerns: Synapse VS Data Export Service and it's deprecation After looking at the synapse and comparing it with the previous Data Export Service. (Deprecated) I look forward to the future. There are an incredible number of new possibilities for synapse versus Data export Service. However, there is one thing that worries me a little. How to translate Option set values to Display names in Synapse. This is a known issue from the past g.ex power BI. The data export service had a separate function that created an optionssetmetadata table where you could join together and get the different display names for each language on option sets values. As it is today, from the synapse you only get access to the option values ​​and no longer have this support table to lean on. Ref: https://powerapps.microsoft.com/en-us/blog/do-more-with-data-from-data-export-service-to-azure-synapse-link-for-dataverse/

Download Brreg Data

To get more data for testing we did setup a new soruce in Azure Data Factory to download “Account Name” and “Orgnummer” from Brreg.

The result downloading first 1000 from Brreg..

We made it simple.. using this URL

https://data.brreg.no/enhetsregisteret/api/enheter?size=1000&page=1

https://data.brreg.no/enhetsregisteret/api/enheter?size=1000&page=4

With an param to ADF to say how many pages we should download.. Simply changing the number of pages to download.. Meaning batches of 1000 accounts.. So, g.ex: We set

ADF will loop until 5 pages in URL have been set in API URL and downloaded to source

g:ex:

run 1: https://data.brreg.no/enhetsregisteret/api/enheter?size=1000&page=1

run 2: https://data.brreg.no/enhetsregisteret/api/enheter?size=1000&page=2

run 3: https://data.brreg.no/enhetsregisteret/api/enheter?size=1000&page=x

For each loop we download these data and dump them into TEST SQL DB

Example now:

Designing minimalist apps

Sometimes you want to go all out with fancy effects and complex UI, other times you have to pull back and remove everything non-essential. We had to do the latter.

Our app is supposed to be used in emergencies and mostly older people. So designed our app to have large fonts and huge buttons so that the user always know what they have to press and what information is important.

It may seem simple, but creating custom layouts with .NET MAUI is hard. It’s still in preview and since it is cross platform it has to work on multiple devices. Pixels should be glossy, but also functional.

Here are some screens from our app running natively on Windows. It also runs on iOS, Android and macOS.

Middle-Aged Mutable Ninja Tuples REACT!

We made a React app that we consume within our .NET MUI app. The MAUI app uses the native browser to display the web page that host our React app. It’s what we use to show the position of our Ninja Turtle and the person using our app, as described in our previous blog post.

Since it’s supposed to be used inside another app it’s quite minimal and just one component that shows the map and the relevant pins and locations.


You can try it out yourself in a development version here: http://sosmap.vercel.app. We use CI/CD to upload a new version on every push/merge to master.

If you want custom placement of tags you can format your url like this:
https://sosmap.vercel.app/?&userLat=59.94910991681978&userLng=11.060075171654933&turtleLat=59.952150495318335&turtleLng=11.07015018459058

You have to pass in userLat, userLng, turtleLat, turtleLng. They should be the gps coordinates in a number format.

Hope you like it!

Middle-age Mutable Ninja Tuples show team spirit in the face of adversity!

The Middle-age Mutable Ninja Turtles have had a turbulent ACDC. Starting off strong with a full team of five, they lost their two functional experts (Dynamics, Synapse, dashboards, low-code) due to illness after the first day. Left standing is a team of three coders.

As skilled and adaptive they may be, the developer team cannot be expected to teach themselves Dynamics 365 and functional Azure features over the course of a single day, so things were looking grim for the Middle-age Mutable Ninja Tuples as their functional guys had to tap out on Friday morning.

The functional experts were, however, heavily invested in the solution. And even stronger than their drive to deliver the best possible SOS response solution was their commitment to help their stranded teammates pull through in the face of adversity. 

The two functional experts have made an heroic effort to squeeze functionality, blog posts and assistance out of every waking and vacant moment when health allowed it, which is a testament to the strength of the team spirit in MaMNT!

Inge-André ready to work on Power Apps after a few Power Naps.

MaMNT dashing it out for operators

SOS Operator life is hard, and even harder when you have to handle everything on a SOS-by-SOS basis. In order to aid operators in dispatching the correct resources and communicating preventative measures, MaMNT have now set up a Power BI dashboard that gives operators an overview of the current and past situation in the Oslo area.

Being new to Power BI, we explored a number of different metrics that could be useful to operators in report form. Not all of them were feasible, but the heatmap we set up is the crown jewel of the report. It will act as a basis for preventative measures and staffing (turtle) needs around the city.

The first page of the report contains a heatmap of SOS calls throughout the Oslo area, which is updated every 15 minutes with new, incoming SOS calls. It also shows the spread of SOS types, and the map can be filtered to specific types by clicking the columns.

The second page shows a pie chart of the SOS types, combined with a list that shows detailed data on each SOS call.

The third page shows the 30 “neediest” citizens by number of SOS calls. The list on the right shows the types of calls made by each of the needy citizens.

Clean good practices during development

MaMNT are aiming to keep technical debt to a minimum, and to maximize agility, extensibility, security and maintainability. Sure, we could rush ahead, building a quivering monolith on the brink of collapse. But this is about putting pride in your craft!

Code Repository

The code repository is hosted in GitHub as a mono-repo, split into individual subdirectories for different parts of our solution. Mono-repo is used by software giants such as Google and Microsoft, to make testing and development easier across apps and products.

Continuous Delivery

Continuous delivery is achieved through GitHub Actions: The gRPC server and Registration app are built and deployed to Azure App Service whenever changes to the apps are pushed to the main branch.

The Github Actions workflow (steps are minimized to save space)
Deployment complete!

Secure secret storage

Of course, client secrets are kept out of the code. Secrets are kept in Azure Key Vault, and are injected as environment variables in the App Service.

The appsettings.json file does not include the Client Secret.
The secret (Azure__ClientSecret) is added in Azure Web App through a reference to Key Vault, where the secret is stored.

Inversion of Control

Following Microsoft and industry best practices, the software project uses Dependency Injection to achieve Inversion of Control. Our classes are stateless, and dependencies are injected from the service provider. Classes depend on abstractions instead of implementations, to make the solution more “plug-and-play” and simplify unit testing.

The GrpcClient class takes a StatusUpdateHandler as well as a Logger from the service collection. Appsettings are injected as well.
The GrpcClient installer.
Adding the required services in an app that uses the GrpcClient.

SOLID principles

We adhere to all “SOLID principles”. All classes and methods do one thing and do them well. Classes depend on abstractions instead of implementations. Interfaces are small and interchangeable.

Middle-age Mutable Ninja Tuples is scripting its infrastructure!

Our Blazor web app allows people to register as Turtles, meaning they will help others in need. In the field, Turtles use the official Dynamics mobile app. To use the official app, users need an Azure AD user with a Dynamics license and a security role in Dynamics.

Instead of having to manually create users in Azure AD and assign licenses and Dynamics security roles, this infrastructure is programmatically set up.

The backend of the Blazor web app uses a custom Azure API client which programmatically sets up the infrastructure: creation of Azure AD users and assigning of Dynamics licenses.

Because of our Infrastructure as Code, users are able to use the official Dynamics mobile app automatically after registering – no manual steps required!

The following image shows the method that creates an Azure AD user and assigns the Dynamics license.

Interaction with Azure AD is done using GraphServiceClient from the Microsoft.Graph NuGet package. Authentication is done using an Access Token retrieved using functionality from the Microsoft.Identity NuGet package.

Guiding turtles in the field to their destination

The Field Service mobile app was chosen as the main application for turtles in the field because it draws on the same database as that of the operators by default. Another reason for this choice is the fact that it has a host of functionality readily available for use without the need to build an app from scratch like we had to do for the public distress call app.

One of these features is the built-in map in the application that allows turtles to check locations, check directions and plan ahead while rushing from one emergency to the next.

This particular turtle had to rush home to take care of the family in a very real Covid-related emergency, so as you can see he is currently operating out of Vestby. Dispatchers were not aware that he left crime central, AKA. Oslo, and booked him to respond to an armed robbery in Sandvika:

Realistically speaking, Donatello would have phoned in his absence so that dispatch could manage it, but for the sake of argument let’s say Donatello decided to respond to the robbery. Tapping the location pin in the mobile app brings up quick information about the event; the emergency reporter and the nature of the emergency:

From here, Donatello taps the direction arrow symbol, and is taken straight to Google Maps with the destination coordinates already filled in. Tapping “Start navigation” brings up the navigation interface we’re all so used to seeing:

Petition to have Google add “Turtle” as a way of transportation anyone?