Middle-Age Mutable Ninja Tuples has evolved!

A lot of improvements have been added to our solution, described in detail below. As different parts start to connect, we can see the potential value provided by our solution. Not just in crime fighting, but also as a competitor to food delivery apps like Foodora or Wolt, or transport apps like Uber or Lyft. Our now fully integrated solution includes apps for employees, the back-office and end users, and is easily applied to areas like those described above.


Video of our app running on MacOS. Note: Some features are disabled when this video was recorded

We’ve just updated some design elements of our Ninja Turtle SOS App. It has a modern minimalist design. Because when you’re in an emergency you don’t want to have a confusing patterned background or 20 menus to click through. We are still improving on it but it’s feeling more modern already.

Our app is truly cross-platform. It works on iOS, Android, MacOS and Windows. The MAUI framework makes sure our app runs natively and uses device-specific buttons and UI. 

Two-way communication

The MAUI app now properly communicates with the gRPC service, giving it the ability to post SOS alerts to Dynamics and receive SOS status updates back, using a custom Dynamics API client. The status updates are streamed to the app from the server via gRPC.

The gRPC service is automatically deployed to an Azure App Service when we commit to master, using a GitHub Action. 

gRPC isn’t properly supported in Azure App Services yet, because of how new it is. Hopefully we can demonstrate the gRPC service working from Azure tomorrow – in the meantime it’s working fine running locally.

New feature: Google Maps!

When you need help from a Ninja Turtle it’s very useful to know where they are in relation to you. So we have now added Google Maps support to the .NET MAUI app. When a Turtle has been assigned to your distress call you will see a map of your area and live updates of your Ninja Turtles location. 

It’s a beautiful and easy to use feature that shows you where your Ninja Turtle and you are at any time. A small glance at the app and you know if they are close and you can continue to run towards your savior.

The Google Maps integration into MAUI was a challenge. We solved it by creating a React app that the MAUI app accesses using a WebView, basically rendering a website inside the app. The React app uses a Google Maps react library and is hosted as a separate web app (https://sosmap.vercel.app). We use CI/CD to update new features into our React app, so the users will always get the newest map features.

App for registering Turtles

We have added a web app for accepting new applicants for Ninja Turtles. This app allows for fast onboarding and expansion of the workforce in a gig economy style. Thus, Middle-aged Mutable Ninja Tuples can quickly become the biggest provider of Personal Safety as a Service, benefiting from the accompanying network effects.

The Blazor app is automatically deployed to an Azure App Service when committing to main, using a GitHub Action. It’s available here: https://mamntservice.azurewebsites.net/ 

After registering, the user should quickly be able to log in to the Dynamics mobile app. In order to make this possible, a lot of things need to happen behind the scenes.

The first step is automatic creation of an Azure AD user, and assigning of a Dynamics license. We created a custom Azure API client for this, which is called from the backend of the Blazor app. After that, the only thing missing is a Dynamics license. But first, the user must be synced to Dynamics from Azure AD, which can take up to an hour.

Because of this delay, we aren’t available to programmatically add a Dynamics license right away, so we created a Dynamics plug-in which automatically adds the license when a user is created. After it has run, the user should be able to log in to the Dynamics mobile app:

Note: it’s possible to force the user sync to happen right away using PowerShell, we’ll look into that as a possible improvement.

Feel The Heat

Dispatchers have a new tool at their disposal; a Power BI report that visualizes reported distress calls in a heatmap. This is achieved by pulling data using Azure Synapse Link to Dynamics 365, which is then used as a dataset for the Power BI report. For MaMNT, both Synapse and Power BI were uncharted waters before development began, and have proven to be just the tools we needed to bring some extra oomph to the user interface.The heatmap itself is a prebuilt feature by AppSource user Weiwei Cui that takes our latitude and longitude parameters as input and allows us to customize the clustering, values and the look and feel of the map. 

The heatmap dots warp in shape as you zoom on the map, in order to scale the dots and heat signatures, which produces an awesome-looking effect when the dots are split and merged. Going forward, the heatmap will be limited to a set number of the most recent calls, and we may add a timelapse effect to show patterns and development in crimes committed in the city.

For dispatchers, we also added a filtering feature to the right-hand side where the different types of distress calls can be selected to filter the map instantly. This will enable the turtles to move towards proactively fighting and predicting crime instead of reacting to distress calls. This has great utility not just for improving our services for individual users, but also for providing business facing services to third party security entities (i.e. Police).

Automatic test data generation

When developing a tool to fight crime and respond to distress calls, it is imperative to be able to simulate different loads on the systems and dispatchers to build the best possible solution that fits real-life scenarios. MaMNT set up an Azure Data Factory to produce the desired effect of simulated, continuous distress calls being sent from all over the city of Oslo. The Data Factory job randomizes a caller name, a crime type and x-values of coordinates within the range of 59.9xxxx, 10.xxxxx. New distress calls pop up all over the city at set intervals, and you can see the heatmap updating with a new batch of distress calls every 15 minutes.