A Game Boy Style RPG Dashboard with Microsoft Fabric and Rayfin

I built a Game Boy Color style RPG as a Fabric app with Rayfin and Claude Code. Its NPCs answer with live DAX queries on a semantic model.

In this article 6 sections
  1. Ask the townspeople about your data
  2. Planning the game with Claude
  3. Sprites and maps as text
  4. Building it with Claude Code
  5. Fixing blurry text and a stuttering walk
  6. The world’s worst dashboard

I made the coolest and most useless dashboard ever: a role-playing game in the style of the Game Boy Color. You walk around a pixel-art town with the arrow keys, press space to talk to the people in it, and they tell you about your business. Every answer is a live DAX query against a semantic model in Microsoft Fabric.

It runs as a Fabric app built with Rayfin. I planned it with Claude, and Claude Code wrote all of the code. If Rayfin is new to you, start with building a Microsoft Fabric app with Rayfin and Claude Code. At the end of part two I wrote that we could probably even do Pokémon-style maps, so I tried it.

Coolest Useless BI Dashboard Ever with Microsoft Fabric Rayfin App, Inspired By GBC and Pokemon Gold Watch on YouTube

Ask the townspeople about your data

I’m from 1993, and I played a lot of Pokémon on my Game Boy Color when I was five or six. The people in that world told you things, did nothing at all or wanted to battle you. In my version, they tell you about your data.

Walk to the gate at the start of the level, press space, and Sergeant Hal says: “Halt. Nothing passes this gate unrecorded. Ask your questions.” A menu pops up, just like in the old games. Ask him for the oldest record and he tells you the books open on 1 January 2009. Everything he knows comes from the semantic model with my New York City taxi analysis data set.

Each NPC knows about a different part of the data and has four questions in its menu:

NPCQuestionsOne of the answers
Sergeant Hal, at the gateNewest record, oldest record, records held, miles driven“16.8B miles covered. Enough to reach the moon and back.”
Pip, by the fountainTop borough, top pickup spot, most common cab, how many zones“There are 262 zones to be picked up in.”
Old CorwinYear on year, busiest year, quietest year, miles year on year“2018 was the busiest year these roads have seen.”
Marge, at the dispatch officeTrips all time, last 30 days, this year so far, busiest month“We have logged 3.87B trips since the very beginning.”
Bryn, at the innRiders all time, riders last 30 days, riders this year, riders per cab“About 1.3 riders to a cab. Most ride alone.”

Old Corwin also remembers 2010 as the quietest year: “The streets were near empty.” I don’t know why, but that’s what he tells us.

Old Corwin's menu in the pixel-art town with the options Year on year, Busiest year, Quietest year and Miles year on yr
Four predefined questions per NPC, picked from a menu like in the old games
Old Corwin's dialogue box saying 2018 was the busiest year these roads have seen
The answer comes from a DAX query against the semantic model

The NPCs fire their DAX queries at the semantic model every time you talk to them. So when a nightly or hourly ETL process refreshes the model, they have new numbers the next time you ask.

Planning the game with Claude

The idea came on a run. I usually listen to podcasts when I run, but I’d forgotten to charge my headphones, so I started thinking about what would make a really cool Fabric app. As a kid I loved Mario on the Nintendo and Pokémon on the Game Boy Color, and with the software and hardware we have now, games in that style should be super easy to build.

I wasn’t trying to make an actual Pokémon game, and I didn’t use any screenshots or assets from one. I asked Claude for the style and graphics of a Game Boy Color:

Is it possible with Fabric and Rayfin to create an app that looks like an old Pokémon game from the Game Boy Color era, where you can walk through the game using the arrow keys and talk to NPCs, and the NPCs then give you data or information? Instead of looking at a dashboard, it will be more of an interactive game, where you talk to NPCs in a role-playing game. Is that a possibility, and how would you do that? Feel free to search online for Rayfin and anything that you need there.

Claude said yes, and that Rayfin is a reasonable fit for a reason that has nothing to do with games. A project like this normally dies on the boring parts: authentication, per-user state, a hosted frontend and governed access to your data. Rayfin gives you exactly those.

The hard part, it said, is how an NPC answers. A deterministic NPC runs a fixed DAX query and drops the result into a templated line. That’s fast and can’t hallucinate, but it’s “essentially a report page wearing a sprite”. An agentic NPC sends free text to an LLM, which is slow and costs money on every interaction, and an NPC that confidently states a wrong number is worse than no NPC at all. Claude’s honest assessment was that as a replacement for a dashboard, this is worse in every measurable way, and it estimated two to three weeks for real semantic model queries, save state and several maps. I didn’t agree:

Womp womp, I think I can vibe code this in an hour.

Let's go with 1 map that is reasonably small, maybe 4-5 NPCs at the start. For the interacton, I would do 4 predefined queries in a menu-style.

Now make the plan I can give to my coding agent.

Claude wrote a build spec in Markdown and pointed out the two things in it that mattered most. One is a DataSource interface with a mock that has a deliberate 400 ms delay. The other is building steps 1 to 7 with no Fabric connection at all. Without that, the agent wires in the DAX at step 2 and you spend the hour debugging authentication instead of collision detection.

Sprites and maps as text

The sprites, the little figures walking around, are what give it the look and feel of 1990s handheld gaming. So I asked Claude how to create the map and the sprites for the character and the NPCs.

For a one-hour build, it said, all of it should be text in the repo. The map is a multiline string where every character is a tile. The legend also says whether you can walk through a tile, so you get collision for free:

TypeScript
const LEGEND = {
  '.': { tile: 'grass',  solid: false },
  ',': { tile: 'path',   solid: false },
  'T': { tile: 'tree',   solid: true  },
  '#': { tile: 'wall',   solid: true  },
  'D': { tile: 'door',   solid: true  },
  '~': { tile: 'water',  solid: true  },
  'S': { tile: 'sign',   solid: true  },
};

Sprites work the same way. At 16 by 16 pixels with a four-colour palette, a sprite is 256 characters, written as an array of strings where 0 to 3 index into the palette and . is transparent. For me that’s the really cool part: an LLM generates text, so an LLM can generate the sprites.

Claude's answer with the TOWN map as rows of T, dots, hashes and D characters, and the start of the PLAYER_DOWN_0 sprite as string arrays of palette indexes
The town and the player sprite, both written as text

I checked with Claude that the text sprites would end up as real visuals, and they do. The strings are only the source format: at startup the game draws each sprite once onto an offscreen canvas, so it costs nothing per frame. I told Claude to add all of this to the plan.

Building it with Claude Code

I created a folder for the app in my repository, opened it in Visual Studio Code, copied in the spec and switched on the I Have ADHD skill in Claude Code. I’m not diagnosed with ADHD. I use the skill because I like its output: action first, numbered steps and concrete time estimates (more in Claude skills for Microsoft Fabric). Then I told it to start:

Check data-rpg-build-spec.md and start building the app. When done, publish to Microsoft Fabric. If there's anything you need, let me know.

It wrote code for about an hour and then came back with two requests. I had to run az login for the right tenant, because it can’t do an interactive login, and I had to tell it which semantic model to use. The town, the movement and five NPCs with four topics each already ran on the mock data. It had deliberately held off on publishing, because that would have shipped a game with invented numbers into my workspace.

I pointed it at Taxi_Data_Agent, the semantic model I built to demo data agents. A Rayfin app can reuse that model just as easily. Claude found it in my ThatFabricGuy workspace, the same one the app lives in, and read the schema. The spec’s placeholders assumed a revenue model with measures like [Revenue MTD], so it rewrote all 20 questions and validated every query against the model before it went into an NPC.

It also flagged the judgement calls it had made, and two of them were good ones. The first was turning “last month” into “last 30 days”. The last day in the fact table, 1 December 2024, holds only 18 trips, so a literal “last month” would have had NPCs quoting 18 trips. Year on year compares the last 365 days with the 365 before for a similar reason: 2024 stops in November.

The second was save state. Saving the player’s progress was in the spec, and enabling it provisioned an MSSQL database in my workspace. That’s a real resource on my capacity, and Claude offered to strip it back out.

Then it deployed and told me what to do next: open the portal link and walk up to Pip. Checking the game inside Fabric needs an interactive sign-in, so just like in part one, I was the first to see it run there.

The GBC app open in the Fabric portal in the ThatFabricGuy workspace, with Pip by the fountain saying I sit by the fountain and watch where all the cabs go
The game runs as an app item inside Fabric

Fixing blurry text and a stuttering walk

The gameplay was amazing, but the text was so pixelated that I couldn’t read it. I knew what it said, so I could make a guess, but it was really poorly designed:

I have been trying the app. The gameplay is amazing! However, I want you to make 1 change. The text itself in the chat is extremely pixelated. Can we make that a bit more leggible?

The game drew the text into its 320 by 240 pixel screen buffer and then scaled that up three times, so every 8-pixel letter became what Claude called “a 24px block of mush”. The fix keeps the world in pixel art and draws the dialogue straight onto the canvas at native resolution. I was just vibing away with no idea what it was coding, and after the next deploy the text was sharp.

Then the game felt laggy, and you could feel it stutter as you walked around. Claude Code first blamed the new text drawing without measuring anything, and asked whether the lag happened while walking or only in conversations. I said walking. It checked the code and admitted it was wrong, because with the dialogue closed the text code returns straight away. Instead of guessing again, it started measuring the game loop, and it turned out the game was trying to run at too high a frame rate. I asked for a lower one. Now it’s an easy-to-render app in the browser, connected live to the semantic model.

The world’s worst dashboard

I’ve built the world’s worst dashboard. Who is going to say “I want to understand this part of my business, let me open the game, find the right NPC and start talking”? Nobody wants to do that. For day-to-day analysis, a Power BI dashboard is a lot easier to work with.

As a proof of concept, though, it’s really cool, and it was really, really low effort. I did not expect Rayfin to be able to do this, and I’m super amazed by it. The world can grow from here, with more NPCs and more dialogue.

I’m already building something similar for a client, as a gimmick and a gift. They’ve been a customer of mine for years and I want to give them something cool. Their world will be about ten times bigger, with moving vehicles and objects in it.

If you’re building cool things with Rayfin, tell me in the comments on YouTube. If you can’t shoot a video yourself but want to show the world, maybe we can do a call and make one together. I read and reply to every comment myself, and I always want to know what other people are building.

Bas Land · Microsoft Data Platform MVP

Bas has spent more than 12 years in the Microsoft data stack. He builds data platforms on Microsoft Fabric, teaches as a Microsoft Certified Trainer and speaks at conferences such as Power BI Gebruikersdagen.

↑↓to move ↵to open escto close