T IN T – Mining data & crafting insights (It’s Dynamite)

Category summary

Redstone Realm

  • Uses Microsoft 365 & Teams as the primary collaboration and experience hub.
  • Combines Microsoft Fabric, Dataverse, the Power platform, Azure Functions and more into a unified workflow.
  • Integrates AI agents in Fabric and Copilot Studio for data interpretation of geoJSON and creating resource insights.
  • Focuses on accessibility, usability, and smooth user experience using an adaptive Power App and Teams default accessibility properties
  • Provides real‑time notifications through a Teams Bot and thereby improving responsiveness and collaboration.
  • Providing automatic storing of opportunities using Dynamics

Governance & Best Practices

  • Uses official, publicly available Norwegian geodata ensuring transparency and compliant sourcing.
  • Keeps data in Microsoft Fabric + Dataverse, benefiting from enterprise‑grade security, governance and access control.
  • AI agents are explicitly instructed to handle inconsistent formats reducing risk of misinterpretation.
  • The Copilot Studio agent uses traceable and explainable knowledge sources (NGU, Geonorge).
  • Workflow ensures AI recommendations feed into human‑in‑the‑loop processes by focusing on consultancy requests and advisor review
  • Interactions (requests, opportunities, notifications) are logged and stored for auditability.

Data, AI & Analytics

  • Ingests large‑scale geodata from a 430k‑line XML + multiple CSV metadata files.
  • Built a Fabric Lakehouse to store, structure and refine all raw geographic information.
  • Created pipelines + dataflows to process and transform data into a clean SQL analytics table.
  • Set up Dataverse virtual tables for live synchronization of processed geodata to Power Platform.
  • Developed a data‑aware AI Agent inside Fabric for interpreting geoJSON and using an complex geometry logic.
  • Copilot Studio agents that takes advantage of external knowledge sources, implementing the Fabric Data agent as a supportive agent and trigger automated processes in Power Automate
  • Final output enables AI-driven insights, area‑based resource predictions and intelligent automation.

Low‑Code

  • End‑user interaction handled via a Power App with native map control for shape and area selection.
  • Power Automate flows orchestrate resource detection, consultancy booking, SMS notifications,and agent communication.
  • Copilot Studio agent handles reasoning about geodata, resource discovery and external API querying without custom code.
  • Uses Dataverse virtual tables to create a low‑code bridge between Fabric and Power Platform.
  • Power BI as an dashboard to help decide if an request is a suitable opportunity using Dynamics
  • User journeys (select area → request consultancy → receive SMS → create CRM opportunity) are built mostly with low‑code components.

Code Connoisseur

  • Provisioned an Azure Function via Bicep, demonstrating infrastructure‑as‑code mastery.
  • Built custom functions to:
    • Convert Markdown → HTML for clean rendering inside Power Apps.
    • Encode inputs to Base64 when needed.
  • Developed a Teams Bot using Teams SDK 2.0, integrating:
    • Microsoft Graph
    • Dataverse CRM
    • Azure Maps
    • Azure Tables for proactive notification logic
  • Implemented autonomous alert logic tied to an external speaker “sales‑bell” system via custom code.
  • Demonstrates how pro‑code extends low‑code elegantly and purposefully.

Digital Transformation

  • Converts complex Norwegian geological data into simple, actionable insights for businesses.
  • Reduces risk and cost in early‑stage assessments (site evaluation, planning, resource estimation).
  • Automation:
    • Data ingestion
    • Data transformation
    • Resource detection
    • Notification
    • CRM opportunity creation
  • Improves customer & employee experience with:
    • A simple map-based interface
    • Automated consultancy booking
    • SMS confirmation
    • Proactive Teams alerts
  • Demonstrates measurable real‑world impact by accelerating project startup and democratizing access to geodata.

Expanding on the solution

Our initial idea

We wanted to bring the simplicity of the Minecraft-way of discovering and gathering natural resources into the real world by helping organizations collect, process, and act on geological and geographical data. By gathering these publicly available geodata from official Norwegian sources, bringing them into a Datalake in Microsoft Fabric and synchronizing it with Dataverse, we wanted to end up with a solution that enable companies in real estate, agriculture, mining, infrastructure and related sectors to reduce risk, lower costs, improve sustainability planning, and accelerate project startup.

By using the Power Platform with Power BI for insights, Power Automate for workflows, Power Apps for interaction, and Copilot Studio for AI assistance, we could provide future customers with accessible, actionable resource knowledge delivered directly through Teams as a unified collaboration and interface hub. Ultimately, leveraging Microsoft’s cloud and low‑code ecosystem to make geodata more usable, intuitive, and strategically valuable.

Using Fabric and Data agent

Norway’s open geodata portal, Geonorge, provides extensive natural‑resource information and for our solution, we decided to use the “N50 Kartdata” dataset from Kartverket as the primary data source. By downloading a XML file, with over 430.000 lines of geodata, and CSV files with supportive metadata, we could populate a Fabric Lakehouse with all this data. Then using pipelines and dataflows, we could process the data into a single SQL analytics table for easier querying. A virtual table in Dataverse were created to automatically synchronize the data and making it easily available to the Power Platform ecosystem, enabling efficient and accurate retrieval of resource information whenever needed.

Within the same Fabric workspace, an AIdriven data agent was created and finely instructed to ensure seamless use of the dataset and handling of geoJSON data that wasn’t always following the standard formatting. This proved very useful as the standard map controller in Power Apps allows us to select a shape on a map, but the JSON data returned from the controller was not always in a correct geoJSON format as it could return an array with the geoJSON as a property on the elements within. The agent also had to be instructed how to handle circle shapes, as this is defined in geoJSON as a single point with a radius property, and the agent kept misinterpreted the radius as a real-world distance measured in meters.

Low code acces using the Power platform

We have created a Power App for our end users/customers, that allows our customers to use the default Power Apps map controller to select an area on a map and submit requests for consultancy assistance on possible resources. When a request is submitted a Power Automate flow is triggered, send the area coordinates to an agent in Copilot studio, which uses these coordinates to determine what resources exist there. This agent is configured with Knowledge-sources from the website of “Norway’s national geological survey” (https://www.ngu.no/) and the API’s of Geonorge (https://www.geonorge.no/verktoy/APIer-og-grensesnitt/) as general sources, and supplied by using our Fabric Data agent as a supportive agent-in-agent for detailed data. The user are able to book a concultancy with TNT by using the “Book Consultancy”-button, made available in the same app. This will generate an opportunity for our advisors to work on. Additionally this button triggers a power automate-flow that utilizes the Link Mobility-connector to notify the user by SMS, confirming their request for consultancy.

Combining with Pro-code functionality

We have provisioned an Azure function using a Bicep template, to help us with certain workflows that are typically difficult to manage in the Power platform alone. For example, the Copilot agent returns answers in Markdown language, which is not particularly suitable for our end-user to view in the Power App. So we have a script in the Azure function that converts this to HTML, which is much more readable within a richtext textfield. We also have a function that can receive inputs from a request and convert it to base64 format.

Transforming the world using autonomous agents & proactive Teams Bot

In addition, we have an autonomous geological report agent that will occasionally discover noteworthy information that our advisors should be alerted about.
This works on the same data as previously mentioned, in addition to other open sources with valuable knowledge about geology.

A Teams Bot, built with Teams SDK 2.0, integrates with Microsoft Graph, Dataverse (CRM), Azure Maps and more – and even makes some noise on an external speaker if there is a new report generated. We have removed the volume knob, so it does not help to mute the laptop and set the phone in airplane mode. They will have to act! It’s like a sales bell – only cooler!

The notifications are sent proactively by keeping track of the reports in an Azure Table. Notifications are delivered to all users – but only once. They can then choose to investigate further, ignore it, or create an opportunity directly by hitting a button!

Dashing and bashing

To make sure our employees make the right decisions if an resource report is good opportunity or not, we have crated a Power BI report that gathers all the existing data and presents them in a way they can easily read and understand. Making them better at decide if a registered request is something they should recommend or not. Using the good old Powershell scripts to create reports and saving data, thrive and thru Bice templates for deploying Azure resources and HTML to display them within the Power App and presenting them using the everlasting Power BI never goes out of fashion.

Sharing because we care!

Want to hear an awesome track? Play it on the room speakers!?!
We’ve got an endpoint for that!

This helps keep the team spirit high and boosts everyone’s joy of life.

We value openness, which is why we also want other teams to benefit from our solution. Try it yourself! The sign with the info is posted in our base.
But for those who haven’t discovered it yet, here’s a screenshot!

If you don’t want to type it yourself: curl -X POST https://89nmvx0b-3001.euw.devtunnels.ms/play-sound -H “Content-Type: application/json” -d ‘{“soundFile”: “acdc.mp3”}’

Who let the Vexes out?!? Who! Who! Who!

Yesterday, our developers got a bit carried away while base‑building in Minecraft. Mobs were generated. A lot of mobs… especially Vexes. There were simply so many that the server almost went down. The game lagged like crazy, and players reported long waiting times just to get back into the world.

Our beloved judge, Sara, also reported that her dogs in the village were being attacked by mobs!

We would like to offer our most humble apologies. We are truly sorry. We’ve spent a lot of time cleaning up, and everything is back in order now.

Use what others have created! And search the web!

Sometimes you already have what you need, or you can build it yourself. Other times, someone out there has already created exactly what you’re looking for. So why not just use what’s openly available?

In our reporting solution, we use a Copilot agent that retrieves data and information from open sources — including nartverket.no, ngu.no, and geonorge.no. The combination of these datasets gives us a solid foundation for assembling a complete picture of the areas we’re analyzing, as well as generating a high‑quality report for our customers 🤑

To convert Markdown to HTML, we use the open‑source NuGet package Markdig. This is used in the solution to present text in a clean and readable format within our app.

To send SMS confirmations to our customers, we use the SMS gateway from LinkMobility.

Master of endpoints

Our helpful proactive teams bot uses multiple APIs to make magic happen. 

The two most obvious ones are Microsoft Graph API (for user details) and Microsoft Teams API (for the bot code itself)

We also implement the Azure Maps API to render a helpful map to pinpoint where a report was generated, and most importantly we have the Dataverse Web API to create Opportunities in CRM:

->

->

Our bot’s Adaptive Card not only saves users time, it delivers a clean, modern, and engaging experience out of the box.
And since it runs inside Microsoft Teams, it automatically adapts to every device and screen size.
That leaves us free to focus on digging for gold (or dirt) instead of fighting with breakpoints.

Confirmation.. It’s a good thing.. Right?!?

Okay, we think it’s reasonable to get a confirmation for the things you do. In this case, we want to give you, as a customer, a confirmation that what you send us has actually been received. When you submit a request for consulting assistance in your project, what could be better than getting an SMS letting you know we’ve received it?

That’s exactly what we’re doing now. Thanks to LinkMobility, we’re able to send an SMS whenever we receive an Opportunity from our app. We retrieve the mobile number from the contact information and send it to LinkMobility through Power Automate.

SMS delivered, all is well! Wohoo 📱🎇🧨

Last day of hacking! But still going strong!

We’re on day 3. A lot has been done, and a lot remains. But you can’t take our good mood away 😄
We’re running into walls, building walls, and tearing walls down. The smiles stay on the whole time 😀
This has been incredibly fun so far, and we’re excited for what’s ahead. But now it’s time to get back to work!

Thanks for all the support, blog ❤️ xoxo

Follow us at our Instagram! https://www.instagram.com/p/DT4_ljaiCBy/?igsh=c2s0M3Vma3h4YTRt

Making AI great again

Since the default map-control in Power Apps delivers information about selected areas in the form of geoJSON, we had to make sure our Fabric Data agent was expecting this as a part of the initial request. Unfortunately, the controller also delivers the locations as an array if there are multiple elements, and this is not a valid geoJSON format. So we had to describe in detail how it should handle this situation.

An issue with the geoJSON format is that it does not support circle figures, which is a problem as this is a standard way of selecting coordinates within the standard Power App map controller. What causes this to be a problem is the fact that it is only considered a single point on the map, with a “radius” property indicating the size of the circle.

Our Fabric Data agent interpret this as a distance in meters and fail while trying to find the locations as this is a different method of measuring distance than geological coordinates. After manually measuring geolocations on the map, we managed to find out the “radius” property is fairly translatable to the geolocations.

For example, if the “radius” is set to 1000 then, also assuming the center point is located at [20.00000000, 20.00000000], we could fairly assume the points furthest north, east, south and west would be:

[
[20.00001000, 20.00000000],
[20.00000000, 20.00001000],
[19.00999000, 20.00001000],
[20.00000000, 19.00999000]
]

Using this knowledge, we also instructed to the agent to find resources within those coordinates. This is dirty way of solving this as it effectively measure a square rather than a circle, but the vast majority of the circle will be covered and even in real-life scenario it would most likely work as an acceptable workaround