From d9709c773add46038e2cacf95c5a76b419ad2cd4 Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 12:17:53 +0100
Subject: [PATCH 01/14] Create joe-os-analytics.md
---
contents/blog/joe-os-analytics.md | 88 +++++++++++++++++++++++++++++++
1 file changed, 88 insertions(+)
create mode 100644 contents/blog/joe-os-analytics.md
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
new file mode 100644
index 000000000000..6a7b419c7b27
--- /dev/null
+++ b/contents/blog/joe-os-analytics.md
@@ -0,0 +1,88 @@
+---
+date: 2026-06-05
+title: I don't understand the OS I built — so I gave it analytics
+rootPage: /blog
+sidebar: Blog
+showTitle: true
+hideAnchor: true
+author:
+ - joe-martin
+featuredImage: >-
+ https://res.cloudinary.com/dmukukwp6/image/upload/w_800,c_limit,q_auto,f_auto/this_is_fine_6336efb0ae.jpg
+featuredImageType: full
+category: Inside PostHog
+tags:
+ - AI
+ - Guides
+---
+
+For my birthday I was given a [Pimoroni Presto](https://shop.pimoroni.com/products/presto) — a little developer gadget with a 240×240 touchscreen and not much else. I also got an environment sensor which can track CO2, temperature, and humidity. I wanted to build something for it.
+
+The thing is, I'm a marketer, not an engineer. Until I joined PostHog [I couldn't code at all](/blog/a-non-coders-thoughts-on-everybody-codes-culture). I've made effort to learn and slowly got myself to the point where [I could ship product features](https://www.linkedin.com/feed/update/urn:li:activity:7311329717784096770/), but it wasn't until [DeskHog](/deskhog) came along that I saw how AI could supercharge my progress.
+
+My goal was a desk dashboard that worked at any level of attention. Something I could glance at between meetings and read idly, but that also had deeper things to poke at while I waited for someone to join a call or had lunch.
+
+## What I built
+
+I call it Joe-OS, because naming things is the one part of software I'm actually qualified for.
+
+The Presto runs MicroPython. The top two-thirds of the screen is a carousel of panels; the bottom third permanently shows temperature and CO2 from the sensor, with little sparklines of the last half hour. You move between panels by tapping the corners of the screen.
+
+
+
+
+The panels are deliberately a mix of useful and useless:
+
+- Three news readers that stream the latest RSS headlines from The Guardian, BBC News, and Rock, Paper, Shotgun.
+- Oblique Strategies — Brian Eno's deck of creative prompts, plus a few dozen I wrote myself to build it out more.
+- A rotating daily joke, a random fractal, and a Sky panel showing the current moon phase, sunrise, and sunset.
+- And Vigil.
+
+Vigil is the most ambitious part of Joe-OS.
+
+It's a tiny medieval roguelike text adventure about a knight keeping watch over a dying realm. Every turn something happens — a ghoul rises, a house burns, a bandit approaches — and you respond by choosing either an Honorable or a Craven choice. Sometimes you get a third option that opens based on your inventory or companions, each of which has their own simple personality.
+
+It runs across five acts and 400-odd hand-written events, with a two-and-a-half minute cooldown between choices during which the world breathes by giving you a slow trickle of flavour events.
+
+When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is, deliberately, not a game you rush. It's something you keep half an eye on while you wait for a meeting to start and games are intended to last weeks.
+
+## How I built it
+
+The whole thing was built in plain English, in conversation with Claude. I'd describe what I wanted — a new panel, a layout tweak, a bug to chase — and it would write the MicroPython, flash it to the device over USB, and read the logs back when something broke. For the bigger pieces, like expanding Vigil, I'd put it in plan mode first, so it thought through the structure before touching a single file. For everything small, I just said the thing and watched it land a few seconds later.
+
+My prompts were not precise. A few were proper specs — _"double the number of events in Vigil and slow it to one choice every two and a half minutes."_ Most were vibes — _"make the moon panel a bit nicer and more in keeping with the aesthetic."_ Some were just _"the clock is five minutes slow,"_ with a photo of the screen attached. The rhythm never changed: ask, flash, see what it actually did, report back. A weekend of that, and I had an OS.
+
+## Modern coding is mostly copy-and-paste
+
+AI helped me ship this thing, but I didn't always understand the thing I shipped. It broke constantly during the 48 hours it took to build. Sometimes the clock ran five minutes slow. Sometimes the whole device hung on boot and I had no idea why. A news feed once tried to allocate 450KB on a chip that didn't have it and simply gave up.
+
+When that happens, the AI is only as good as what you can tell it. "_It's broken_" isn't as powerful as "_It hangs at the weather fetch, here's the boot log, and the clock is five minutes slow_" gets fixed in a single round.
+
+The bottleneck in non-technical building isn't building anymore — it's _diagnosis_. And diagnosis is just data you haven't collected yet.
+
+So the more of my code an AI does, the more I need a backend telling me — and it — what's actually happening. That's the opposite of what you'd assume. You'd think tools like Claude make analytics less necessary. For people like me, they make it _more_.
+
+## Setting up PostHog
+
+Which is why the last thing I added was PostHog.
+
+There are a lot of ways to [install PostHog](/wizard), but I did this with one sentence: _"Add PostHog to track usage, games played, and errors."_
+
+Claude wrote a small capture client that batches events in memory and ships them over WiFi without ever blocking the screen, then wired it through the whole OS. I pasted in a project key. That was the entirety of the install experience.
+
+The more interesting part happened next, through the [PostHog MCP](/docs/model-context-protocol) — a connector that lets Claude talk to my PostHog project directly. I never opened the PostHog UI. I just asked, and Claude found my new project, confirmed events were arriving, built two pinned dashboards, and filled them with fifteen [insights](/docs/product-analytics/insights) — all from plain English.
+
+
+
+
+The device now reports boots, which panels I actually visit and for how long, every honour-or-craven choice my knights make, which companions I recruit, where they die, and a temperature and CO2 reading every five minutes. One dashboard tracks device health — errors grouped by where they fired, CO2 plotted against the same thresholds the OS uses to colour its own display. Another dashboard tracks interactions in Vigil.
+
+None of it touched a SQL query or a chart builder. I described what I wanted to know, and the data was waiting for me when I looked.
+
+## Shipping isn't maintaining
+
+I'm not going to pretend I'm an engineer now. I do enough of that on LinkedIn. But the gap between "I have an idea" and "it's running on hardware on my desk" has collapsed, and it'll keep collapsing for people like me. It's genuinely exciting.
+
+What hasn't changed is everything that happens after "it works." A thing that runs is not a thing you understand. The instrumentation is what lets me, and the AI I build with, keep something alive that neither of us could have written alone.
+
+Also, my desk now tells me when the CO2 in the room is too high, which explains an enormous amount about my sleepy afternoons.
From a05b9d1dd73138a51662a1b3b3e5b0fbdb3b2606 Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 12:56:41 +0100
Subject: [PATCH 02/14] Update joe-os-analytics.md
---
contents/blog/joe-os-analytics.md | 33 +++++++++++++------------------
1 file changed, 14 insertions(+), 19 deletions(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 6a7b419c7b27..9a9cc0a568b5 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -1,6 +1,6 @@
---
date: 2026-06-05
-title: I don't understand the OS I built — so I gave it analytics
+title: I didn't understand the OS I built with AI until the MCP gave it analytics
rootPage: /blog
sidebar: Blog
showTitle: true
@@ -8,7 +8,7 @@ hideAnchor: true
author:
- joe-martin
featuredImage: >-
- https://res.cloudinary.com/dmukukwp6/image/upload/w_800,c_limit,q_auto,f_auto/this_is_fine_6336efb0ae.jpg
+ https://res.cloudinary.com/dmukukwp6/image/upload/q_auto,f_auto/mcp_analytics_fe722d85af.jpg
featuredImageType: full
category: Inside PostHog
tags:
@@ -16,21 +16,18 @@ tags:
- Guides
---
-For my birthday I was given a [Pimoroni Presto](https://shop.pimoroni.com/products/presto) — a little developer gadget with a 240×240 touchscreen and not much else. I also got an environment sensor which can track CO2, temperature, and humidity. I wanted to build something for it.
+For my birthday this year I got a [Pimoroni Presto](https://shop.pimoroni.com/products/presto) — a little developer gadget with a 240×240 touchscreen and not much else. I also got an environment sensor which can track CO2, temperature, and humidity. I wanted to build something for it.
-The thing is, I'm a marketer, not an engineer. Until I joined PostHog [I couldn't code at all](/blog/a-non-coders-thoughts-on-everybody-codes-culture). I've made effort to learn and slowly got myself to the point where [I could ship product features](https://www.linkedin.com/feed/update/urn:li:activity:7311329717784096770/), but it wasn't until [DeskHog](/deskhog) came along that I saw how AI could supercharge my progress.
+The thing is, I'm not an engineer. I'm a marketer. Until I joined PostHog [I couldn't code at all](/blog/a-non-coders-thoughts-on-everybody-codes-culture). I've made effort to learn and slowly got myself to the point where [I could ship product features](https://www.linkedin.com/feed/update/urn:li:activity:7311329717784096770/), but it wasn't until [DeskHog](/deskhog) came along that I saw how AI could supercharge my progress.
My goal was a desk dashboard that worked at any level of attention. Something I could glance at between meetings and read idly, but that also had deeper things to poke at while I waited for someone to join a call or had lunch.
## What I built
-I call it Joe-OS, because naming things is the one part of software I'm actually qualified for.
+I call it Joe-OS, because naming things is the one part of this I'm actually qualified for.
The Presto runs MicroPython. The top two-thirds of the screen is a carousel of panels; the bottom third permanently shows temperature and CO2 from the sensor, with little sparklines of the last half hour. You move between panels by tapping the corners of the screen.
-
-
-
The panels are deliberately a mix of useful and useless:
- Three news readers that stream the latest RSS headlines from The Guardian, BBC News, and Rock, Paper, Shotgun.
@@ -40,23 +37,22 @@ The panels are deliberately a mix of useful and useless:
Vigil is the most ambitious part of Joe-OS.
-It's a tiny medieval roguelike text adventure about a knight keeping watch over a dying realm. Every turn something happens — a ghoul rises, a house burns, a bandit approaches — and you respond by choosing either an Honorable or a Craven choice. Sometimes you get a third option that opens based on your inventory or companions, each of which has their own simple personality.
-
-It runs across five acts and 400-odd hand-written events, with a two-and-a-half minute cooldown between choices during which the world breathes by giving you a slow trickle of flavour events.
+It's a tiny medieval roguelike text adventure about a knight keeping watch over a dying realm. Every turn something happens — a ghoul rises, a house burns, a bandit approaches — and you respond by choosing an Honorable or a Craven option. Sometimes you get a third choice based on your inventory or companions, each of which has their own simple personality.
-When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is, deliberately, not a game you rush. It's something you keep half an eye on while you wait for a meeting to start and games are intended to last weeks.
+It runs across five acts and 400+ hand-written events, with a two-and-a-half minute cooldown between choices during which the world breathes by giving you a slow trickle of flavour events.
-## How I built it
+When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is not a game you rush. It's something you keep half an eye on while you wait for a meeting to start and games are intended to last weeks.
-The whole thing was built in plain English, in conversation with Claude. I'd describe what I wanted — a new panel, a layout tweak, a bug to chase — and it would write the MicroPython, flash it to the device over USB, and read the logs back when something broke. For the bigger pieces, like expanding Vigil, I'd put it in plan mode first, so it thought through the structure before touching a single file. For everything small, I just said the thing and watched it land a few seconds later.
+  
-My prompts were not precise. A few were proper specs — _"double the number of events in Vigil and slow it to one choice every two and a half minutes."_ Most were vibes — _"make the moon panel a bit nicer and more in keeping with the aesthetic."_ Some were just _"the clock is five minutes slow,"_ with a photo of the screen attached. The rhythm never changed: ask, flash, see what it actually did, report back. A weekend of that, and I had an OS.
## Modern coding is mostly copy-and-paste
-AI helped me ship this thing, but I didn't always understand the thing I shipped. It broke constantly during the 48 hours it took to build. Sometimes the clock ran five minutes slow. Sometimes the whole device hung on boot and I had no idea why. A news feed once tried to allocate 450KB on a chip that didn't have it and simply gave up.
+The whole thing was built in plain English, in conversation with Claude. I'd describe what I wanted — a new panel, a layout tweak, a bug to chase — and it would write the MicroPython, flash it to the device over USB, and read the logs back when something broke. For the bigger pieces, like expanding Vigil, I'd put it in plan mode first, so it thought through the structure before touching a single file. For everything small, I just said the thing and watched it land a few seconds later.
+
+Initially my prompts were not precise. Most were vibes — _"make the moon panel a bit nicer and more in keeping with the aesthetic."_ Some were just _"the clock is five minutes slow,"_ with a photo of the screen attached. The rhythm never changed: ask, flash, see what it actually did, report back.
-When that happens, the AI is only as good as what you can tell it. "_It's broken_" isn't as powerful as "_It hangs at the weather fetch, here's the boot log, and the clock is five minutes slow_" gets fixed in a single round.
+This was a necessary pattern because, while AI helped me ship this thing, I didn't always understand the thing I shipped and the AI is only as good as what you can tell it. "_It's broken_" isn't as powerful as "_It hangs at the weather fetch, here's the boot log for you to debug_"..
The bottleneck in non-technical building isn't building anymore — it's _diagnosis_. And diagnosis is just data you haven't collected yet.
@@ -72,8 +68,7 @@ Claude wrote a small capture client that batches events in memory and ships them
The more interesting part happened next, through the [PostHog MCP](/docs/model-context-protocol) — a connector that lets Claude talk to my PostHog project directly. I never opened the PostHog UI. I just asked, and Claude found my new project, confirmed events were arriving, built two pinned dashboards, and filled them with fifteen [insights](/docs/product-analytics/insights) — all from plain English.
-
-
+
The device now reports boots, which panels I actually visit and for how long, every honour-or-craven choice my knights make, which companions I recruit, where they die, and a temperature and CO2 reading every five minutes. One dashboard tracks device health — errors grouped by where they fired, CO2 plotted against the same thresholds the OS uses to colour its own display. Another dashboard tracks interactions in Vigil.
From 31fe77c8d55a083505048b2946406600e41ed95a Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 13:01:02 +0100
Subject: [PATCH 03/14] Apply suggestion from @joethreepwood
---
contents/blog/joe-os-analytics.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 9a9cc0a568b5..c7f208289e40 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -45,7 +45,6 @@ When your knight finally dies, you choose their last words, and those words shap
  
-
## Modern coding is mostly copy-and-paste
The whole thing was built in plain English, in conversation with Claude. I'd describe what I wanted — a new panel, a layout tweak, a bug to chase — and it would write the MicroPython, flash it to the device over USB, and read the logs back when something broke. For the bigger pieces, like expanding Vigil, I'd put it in plan mode first, so it thought through the structure before touching a single file. For everything small, I just said the thing and watched it land a few seconds later.
From e37beb6effe0b96cd03b82bc299445c8c45194e5 Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 14:15:00 +0100
Subject: [PATCH 04/14] Update contents/blog/joe-os-analytics.md
Co-authored-by: Ian Vanagas <34755028+ivanagas@users.noreply.github.com>
---
contents/blog/joe-os-analytics.md | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index c7f208289e40..2f58f35da29b 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -33,9 +33,17 @@ The panels are deliberately a mix of useful and useless:
- Three news readers that stream the latest RSS headlines from The Guardian, BBC News, and Rock, Paper, Shotgun.
- Oblique Strategies — Brian Eno's deck of creative prompts, plus a few dozen I wrote myself to build it out more.
- A rotating daily joke, a random fractal, and a Sky panel showing the current moon phase, sunrise, and sunset.
-- And Vigil.
+
-Vigil is the most ambitious part of Joe-OS.
+
+
+
+
+![oblique panel]()
+
+
+
+The most ambitious part of Joe-OS was Vigil
It's a tiny medieval roguelike text adventure about a knight keeping watch over a dying realm. Every turn something happens — a ghoul rises, a house burns, a bandit approaches — and you respond by choosing an Honorable or a Craven option. Sometimes you get a third choice based on your inventory or companions, each of which has their own simple personality.
@@ -43,7 +51,7 @@ It runs across five acts and 400+ hand-written events, with a two-and-a-half min
When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is not a game you rush. It's something you keep half an eye on while you wait for a meeting to start and games are intended to last weeks.
-  
+![vigil panel]()
## Modern coding is mostly copy-and-paste
From 36bd0857ca090d9fc5276565d4627187ad5c9519 Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 14:15:32 +0100
Subject: [PATCH 05/14] Apply suggestion from @joethreepwood
---
contents/blog/joe-os-analytics.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 2f58f35da29b..5230c0e03ab5 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -51,7 +51,7 @@ It runs across five acts and 400+ hand-written events, with a two-and-a-half min
When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is not a game you rush. It's something you keep half an eye on while you wait for a meeting to start and games are intended to last weeks.
-![vigil panel]()
+
## Modern coding is mostly copy-and-paste
From 68238eed78a5ad5735b2533a6f222fb7c4f0cd84 Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 14:17:30 +0100
Subject: [PATCH 06/14] Apply suggestion from @joethreepwood
---
contents/blog/joe-os-analytics.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 5230c0e03ab5..28955e7fd40a 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -39,7 +39,9 @@ The panels are deliberately a mix of useful and useless:

-![oblique panel]()
+
+
+
From 0977011b534c0d52b03d4eaffc89b2bab4288b4c Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 14:20:01 +0100
Subject: [PATCH 07/14] Apply suggestions from code review
Co-authored-by: Ian Vanagas <34755028+ivanagas@users.noreply.github.com>
---
contents/blog/joe-os-analytics.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 28955e7fd40a..5ef0a0406e10 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -57,7 +57,7 @@ When your knight finally dies, you choose their last words, and those words shap
## Modern coding is mostly copy-and-paste
-The whole thing was built in plain English, in conversation with Claude. I'd describe what I wanted — a new panel, a layout tweak, a bug to chase — and it would write the MicroPython, flash it to the device over USB, and read the logs back when something broke. For the bigger pieces, like expanding Vigil, I'd put it in plan mode first, so it thought through the structure before touching a single file. For everything small, I just said the thing and watched it land a few seconds later.
+The whole thing was built in plain English, in conversation with Claude. I'd describe what I wanted — a new panel, a layout tweak, a bug to chase — and it would write the MicroPython, flash it to the device over USB, and read the logs back when something broke. For the bigger pieces, like expanding Vigil, I'd put it in plan mode first, but for everything small, I just said the thing and watched it land a few seconds later.
Initially my prompts were not precise. Most were vibes — _"make the moon panel a bit nicer and more in keeping with the aesthetic."_ Some were just _"the clock is five minutes slow,"_ with a photo of the screen attached. The rhythm never changed: ask, flash, see what it actually did, report back.
@@ -65,7 +65,7 @@ This was a necessary pattern because, while AI helped me ship this thing, I didn
The bottleneck in non-technical building isn't building anymore — it's _diagnosis_. And diagnosis is just data you haven't collected yet.
-So the more of my code an AI does, the more I need a backend telling me — and it — what's actually happening. That's the opposite of what you'd assume. You'd think tools like Claude make analytics less necessary. For people like me, they make it _more_.
+So the more of my code an AI writes, the more I need something telling me — and it — what's actually happening. That's the opposite of what you'd assume. You'd think tools like Claude make analytics less necessary. For people like me, they make it _more_.
## Setting up PostHog
@@ -75,7 +75,7 @@ There are a lot of ways to [install PostHog](/wizard), but I did this with one s
Claude wrote a small capture client that batches events in memory and ships them over WiFi without ever blocking the screen, then wired it through the whole OS. I pasted in a project key. That was the entirety of the install experience.
-The more interesting part happened next, through the [PostHog MCP](/docs/model-context-protocol) — a connector that lets Claude talk to my PostHog project directly. I never opened the PostHog UI. I just asked, and Claude found my new project, confirmed events were arriving, built two pinned dashboards, and filled them with fifteen [insights](/docs/product-analytics/insights) — all from plain English.
+The more interesting part happened next, through the [PostHog MCP](/docs/model-context-protocol). With it, I never had to open the PostHog UI. I just asked, and Claude found my new project, confirmed events were arriving, built two pinned dashboards, and filled them with fifteen [insights](/docs/product-analytics/insights) – all from plain English.

From 5dc00dde8e1919383cfb6623fcd5302de83f741d Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 15:01:11 +0100
Subject: [PATCH 08/14] Update contents/blog/joe-os-analytics.md
---
contents/blog/joe-os-analytics.md | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 5ef0a0406e10..2dbf318a4794 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -85,8 +85,14 @@ None of it touched a SQL query or a chart builder. I described what I wanted to
## Shipping isn't maintaining
-I'm not going to pretend I'm an engineer now. I do enough of that on LinkedIn. But the gap between "I have an idea" and "it's running on hardware on my desk" has collapsed, and it'll keep collapsing for people like me. It's genuinely exciting.
+I'm not going to pretend I'm an engineer now. I do enough of that on LinkedIn. But the gap between "I have an idea" and "it's running on hardware on my desk" has collapsed, and it'll keep collapsing for people like me.
-What hasn't changed is everything that happens after "it works." A thing that runs is not a thing you understand. The instrumentation is what lets me, and the AI I build with, keep something alive that neither of us could have written alone.
+Analytics added via PostHog are part of how that happens. The dashboards and tracking I've implemented can function as just a curiosity — a scoreboard by which I can track my lifetime progress in Vigil and the temperature in my home office. But they also provide so much more as a way for me to enrich my prompts, gather insights, and build more features.
+
+A few things that are already changing because of what I can now see in the data include re-ordering the panels and tweaking the UI. I knew this intuitively, but the data in PostHog showed I opened Vigil more often than anything else. So, I asked Claude to create a shortcut. Now, I can tap the clock from any panel and it'll take me straight back to my knights' dreary adventure.
+
+Further updates are coming too. Right now, the numbers in Vigil's dashboard suggest I choose the Honorable option far more often than not – which suggests the moral tension I was hoping for isn't landing. When I get time I plan to rewrite many of the story beats, remove the Honor and Craven labels, and make the positions randomize. That way there won't always be an obviously good choice to lean on.
+
+In other words, while the way I build is changing thanks to AI tools like Claude, product analytics remains an important part of the process and helps me decide what I'll build. The instrumentation is what lets me, and the AI I build with, keep something alive that neither of us could have written alone.
Also, my desk now tells me when the CO2 in the room is too high, which explains an enormous amount about my sleepy afternoons.
From 465993c5c42c3f8ddcec621584f513307f6184dc Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 15:01:20 +0100
Subject: [PATCH 09/14] Update contents/blog/joe-os-analytics.md
---
contents/blog/joe-os-analytics.md | 1 -
1 file changed, 1 deletion(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 2dbf318a4794..a4be26d364bd 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -81,7 +81,6 @@ The more interesting part happened next, through the [PostHog MCP](/docs/model-c
The device now reports boots, which panels I actually visit and for how long, every honour-or-craven choice my knights make, which companions I recruit, where they die, and a temperature and CO2 reading every five minutes. One dashboard tracks device health — errors grouped by where they fired, CO2 plotted against the same thresholds the OS uses to colour its own display. Another dashboard tracks interactions in Vigil.
-None of it touched a SQL query or a chart builder. I described what I wanted to know, and the data was waiting for me when I looked.
## Shipping isn't maintaining
From 463d75dfc20c7d4ac03f68e86bba1a05e5ed97fa Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 15:13:19 +0100
Subject: [PATCH 10/14] Update contents/blog/joe-os-analytics.md
---
contents/blog/joe-os-analytics.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index a4be26d364bd..f6fb0edee84b 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -51,7 +51,7 @@ It's a tiny medieval roguelike text adventure about a knight keeping watch over
It runs across five acts and 400+ hand-written events, with a two-and-a-half minute cooldown between choices during which the world breathes by giving you a slow trickle of flavour events.
-When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is not a game you rush. It's something you keep half an eye on while you wait for a meeting to start and games are intended to last weeks.
+When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is not a game you rush. It's something you keep half an eye on while you wait for meetings to start over the course of weeks.

From 1d3150adab079f016c461eaddc56f138ad453aca Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Fri, 5 Jun 2026 15:13:29 +0100
Subject: [PATCH 11/14] Update contents/blog/joe-os-analytics.md
---
contents/blog/joe-os-analytics.md | 2 ++
1 file changed, 2 insertions(+)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index f6fb0edee84b..69016e34e5b1 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -77,6 +77,8 @@ Claude wrote a small capture client that batches events in memory and ships them
The more interesting part happened next, through the [PostHog MCP](/docs/model-context-protocol). With it, I never had to open the PostHog UI. I just asked, and Claude found my new project, confirmed events were arriving, built two pinned dashboards, and filled them with fifteen [insights](/docs/product-analytics/insights) – all from plain English.
+AI collapsed the gap between having an idea and shipping it. The MCP collapsed the gap between shipping it and understanding it — which, for someone like me, is the harder of the two.
+

The device now reports boots, which panels I actually visit and for how long, every honour-or-craven choice my knights make, which companions I recruit, where they die, and a temperature and CO2 reading every five minutes. One dashboard tracks device health — errors grouped by where they fired, CO2 plotted against the same thresholds the OS uses to colour its own display. Another dashboard tracks interactions in Vigil.
From 0202e2d521a29479fe842cd7a03c00811141fe20 Mon Sep 17 00:00:00 2001
From: Ian Vanagas <34755028+ivanagas@users.noreply.github.com>
Date: Fri, 5 Jun 2026 11:56:13 -0400
Subject: [PATCH 12/14] add newline
---
contents/blog/joe-os-analytics.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 69016e34e5b1..a94ac5ebacde 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -33,6 +33,7 @@ The panels are deliberately a mix of useful and useless:
- Three news readers that stream the latest RSS headlines from The Guardian, BBC News, and Rock, Paper, Shotgun.
- Oblique Strategies — Brian Eno's deck of creative prompts, plus a few dozen I wrote myself to build it out more.
- A rotating daily joke, a random fractal, and a Sky panel showing the current moon phase, sunrise, and sunset.
+

From d446a1c19cc85878b853cda13828575dae8485d6 Mon Sep 17 00:00:00 2001
From: Ian Vanagas <34755028+ivanagas@users.noreply.github.com>
Date: Fri, 5 Jun 2026 13:58:44 -0400
Subject: [PATCH 13/14] center images
---
contents/blog/joe-os-analytics.md | 4 +++-
src/styles/global.css | 4 ++++
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index a94ac5ebacde..69cec94ffa6d 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -54,7 +54,9 @@ It runs across five acts and 400+ hand-written events, with a two-and-a-half min
When your knight finally dies, you choose their last words, and those words shape the knight who takes up the watch next. It is not a game you rush. It's something you keep half an eye on while you wait for meetings to start over the course of weeks.
-
+
+

+
## Modern coding is mostly copy-and-paste
diff --git a/src/styles/global.css b/src/styles/global.css
index e899499ef5e3..3366a0e20929 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -2087,6 +2087,10 @@ li.squeak-left-border {
.image-slider {
.slick-slide {
@apply pt-0;
+
+ img {
+ @apply mx-auto;
+ }
}
}
From 1e569483c38dd6b0271ea24242e34a2da4ad779c Mon Sep 17 00:00:00 2001
From: Joe Martin <84011561+joethreepwood@users.noreply.github.com>
Date: Mon, 8 Jun 2026 10:04:23 +0100
Subject: [PATCH 14/14] Apply suggestion from @joethreepwood
---
contents/blog/joe-os-analytics.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/contents/blog/joe-os-analytics.md b/contents/blog/joe-os-analytics.md
index 69cec94ffa6d..3cf2c2589901 100644
--- a/contents/blog/joe-os-analytics.md
+++ b/contents/blog/joe-os-analytics.md
@@ -1,5 +1,5 @@
---
-date: 2026-06-05
+date: 2026-08-05
title: I didn't understand the OS I built with AI until the MCP gave it analytics
rootPage: /blog
sidebar: Blog