<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Projects on Nicole van der Hoeven</title><link>https://nicolevanderhoeven.com/projects/</link><description>Recent content in Projects on Nicole van der Hoeven</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Nicole van der Hoeven</copyright><lastBuildDate>Fri, 30 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://nicolevanderhoeven.com/projects/index.xml" rel="self" type="application/rss+xml"/><item><title>Spice Runner</title><link>https://nicolevanderhoeven.com/projects/spice-runner/</link><pubDate>Wed, 05 Nov 2025 00:00:00 +0000</pubDate><guid>https://nicolevanderhoeven.com/projects/spice-runner/</guid><description>&lt;p&gt;&lt;strong&gt;Spice Runner&lt;/strong&gt; is a browser-based endless runner. Think of the &amp;ldquo;unable to connect&amp;rdquo; dinosaur game in Chrome, except you are a Fremen running across the sands of Arrakis, jumping sandworms and Harkonnen ornithopters. It&amp;rsquo;s the demo app for my talk &lt;a href="https://nicolevanderhoeven.com/blog/20251105-the-spice-must-flow/"&gt;&lt;em&gt;The Spice Must Flow: The Fremen Guide to Sustainable Observability&lt;/em&gt;&lt;/a&gt;, and it exists to make one point: even a simple, throwaway game generates a surprising amount of telemetry, and that telemetry has real financial and environmental costs.&lt;/p&gt;
&lt;p&gt;The Fremen live on a planet that is rich in spice and poor in water, and they thrive by wasting nothing. Our systems are rich in telemetry and poor in budget, and in carbon. Spice Runner is a small, playable version of that problem: a real app, with real players, running on real infrastructure that scales up and down with them while I watch what it costs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/projects/spice-runner-gameplay.gif" alt="Spice Runner gameplay: a Fremen runner jumps sandworms as an ornithopter flies overhead"&gt;&lt;/p&gt;
&lt;h2 id="what-it-demonstrates"&gt;What it demonstrates&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real user monitoring with &lt;a href="https://grafana.com/oss/faro/"&gt;Grafana Faro&lt;/a&gt;.&lt;/strong&gt; Game sessions, game starts, scores, collisions, restarts, and game overs are all sent as custom events, so the dashboard shows how people actually play.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A leaderboard that&amp;rsquo;s instrumented end to end.&lt;/strong&gt; A Go API backed by PostgreSQL and Redis serves a public top-10 leaderboard. It&amp;rsquo;s instrumented with OpenTelemetry for traces and custom metrics, so a score can be followed from the browser through the API to the database and the cache.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metrics, logs, and traces on Kubernetes.&lt;/strong&gt; Prometheus, Grafana Loki, and Grafana Tempo run in the cluster, with Grafana Alloy as the collector and Grafana for dashboards. Telemetry is also sent to Grafana Cloud.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autoscaling that follows the players.&lt;/strong&gt; &lt;a href="https://keda.sh/"&gt;KEDA&lt;/a&gt; scales the game&amp;rsquo;s pods on HTTP request rate, CPU, and memory, and the GKE Cluster Autoscaler adds and removes nodes behind them. Production settings keep at least one pod running and cap it at 20, with a separate demo profile that is far more eager for live demonstrations.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Energy monitoring with &lt;a href="https://sustainable-computing.io/"&gt;Kepler&lt;/a&gt;.&lt;/strong&gt; Power and energy use are tracked per workload, so &amp;ldquo;what does this cost the planet?&amp;rdquo; is a query rather than a guess.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Load testing with &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;.&lt;/strong&gt; k6 drives load against the leaderboard API and, with a browser script, plays the game to keep the dashboard populated.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="the-dashboard"&gt;The dashboard&lt;/h2&gt;
&lt;p&gt;The live dashboard on Grafana Play shows real player data as it happens. The dashboard is also entirely AI-generated: it was built with &lt;a href="https://grafana.com/docs/grafana-cloud/machine-learning/assistant/"&gt;Grafana Assistant&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://nicole.to/spicedashboard"&gt;Open the live dashboard&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;p&gt;The app has two layers. The first is the game and its leaderboard: a vanilla JavaScript game served by Nginx, with a Go leaderboard API backed by PostgreSQL and Redis. The second is the observability stack: Faro instruments the browser, and the Nginx exporter, Alloy, Loki, Tempo, and Prometheus cover the backend. Everything runs on Google Kubernetes Engine, with persistent volumes so telemetry survives pod restarts, and autoscalers at both the pod and node level.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/projects/spice-runner-architecture.png" alt="Spice Runner architecture: the game and leaderboard, the observability stack, and the autoscalers"&gt;&lt;/p&gt;
&lt;h2 id="the-talk"&gt;The talk&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;The Spice Must Flow&lt;/em&gt; uses Dune as its framing. It covers the hidden environmental and financial costs of an observability stack, how hard it is to measure the cost of ephemeral resources on Kubernetes, how to use KEDA to right-size resources when you don&amp;rsquo;t know what the right size is, and the most effective thing you can do to cut cost: deleting the telemetry you don&amp;rsquo;t need.&lt;/p&gt;
&lt;p&gt;I first gave it at &lt;a href="https://oredev.org/"&gt;Øredev 2025&lt;/a&gt; in Malmö, Sweden. You can read the &lt;a href="https://nicolevanderhoeven.com/blog/20251105-the-spice-must-flow/"&gt;write-up and abstract&lt;/a&gt; and see the &lt;a href="https://nicole.to/spiceslides"&gt;slides&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="run-it-yourself"&gt;Run it yourself&lt;/h2&gt;
&lt;p&gt;Everything you need to deploy it on your own GKE cluster, including the Kubernetes manifests, the dashboards, and the load tests, is in the &lt;a href="https://github.com/nicolevanderhoeven/spice-runner"&gt;GitHub repository&lt;/a&gt;. Its README has a quick start.&lt;/p&gt;</description></item><item><title>The Defiant Jazz Incident</title><link>https://nicolevanderhoeven.com/projects/defiant-jazz/</link><pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate><guid>https://nicolevanderhoeven.com/projects/defiant-jazz/</guid><description>&lt;p&gt;&lt;strong&gt;The Defiant Jazz Incident&lt;/strong&gt; is a murder mystery you solve with observability tools. It&amp;rsquo;s set on the Sleep Floor at Kipsake, a company that rents your sleep: at night, its Dreamers sleep in pods while their sleepwalking selves work the floor. During the Cocoa Hour, the floor&amp;rsquo;s middle-of-the-night holiday party, the power goes out for five minutes. When it comes back, the night supervisor is dead in the elevator.&lt;/p&gt;
&lt;p&gt;Kipsake recorded everything it could: badges, doors, chat, sleep rings, power, microphones, cameras, sleep bands, and personnel records. Your job is to work out who did it, and the only way to do that is through the telemetry.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;The case file is a set of logs, metrics, and traces. A loader sends them to &lt;a href="https://grafana.com/oss/loki/"&gt;Grafana Loki&lt;/a&gt;, Prometheus or Mimir, and &lt;a href="https://grafana.com/oss/tempo/"&gt;Grafana Tempo&lt;/a&gt;, either in Grafana Cloud or in a local Docker stack, and you investigate from there with whatever you like: Grafana itself, Grafana Assistant, an MCP server, &lt;code&gt;gcx&lt;/code&gt;, or the AI agent of your choice. The data is deliberately messy. Some devices lose clock sync during the outage, some records arrive late, and not everyone on the Sleep Floor remembers what their body did.&lt;/p&gt;
&lt;p&gt;The game itself comes in two forms. A terminal version is for demos and playtests: you watch the testimonies and choose what to investigate, while an AI that only sees the telemetry answers your questions. A web version is made to embed in a Grafana dashboard panel right next to the data.&lt;/p&gt;
&lt;h2 id="why-a-murder-mystery"&gt;Why a murder mystery?&lt;/h2&gt;
&lt;p&gt;Investigating an incident is investigating an incident, whether the victim is a production service or a night supervisor. You start with a vague report, a pile of signals that don&amp;rsquo;t quite agree, and a clock that can&amp;rsquo;t be fully trusted, and you have to build a timeline you can defend. A case with a known answer is a safe way to practice that, to compare how different tools and AI agents cope with it, and to see how good a question you have to ask before the data answers.&lt;/p&gt;
&lt;h2 id="no-spoilers"&gt;No spoilers&lt;/h2&gt;
&lt;p&gt;The repository keeps the solution in clearly marked files, and the README tells you which ones to avoid if you want to play. This page deliberately says nothing about who did it.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try it&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/nicolevanderhoeven/defiantjazz"&gt;repository&lt;/a&gt; has everything: the case brief, the telemetry, the loader, and both versions of the game.&lt;/p&gt;</description></item><item><title>obsidian-okrs</title><link>https://nicolevanderhoeven.com/projects/obsidian-okrs/</link><pubDate>Wed, 12 Jan 2022 00:00:00 +0000</pubDate><guid>https://nicolevanderhoeven.com/projects/obsidian-okrs/</guid><description>&lt;p&gt;&lt;strong&gt;obsidian-okrs&lt;/strong&gt; is the set of templates I use to set up OKRs (Objectives and Key Results) and goals in &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, as described in &lt;a href="https://www.youtube.com/watch?v=T2Aeaq4sk7M"&gt;the video I made about them&lt;/a&gt; (and &lt;a href="https://nicolevanderhoeven.com/blog/20220112-how-to-set-goals-in-obsidian-for-2022/"&gt;its blog post&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;New Year&amp;rsquo;s resolutions are infamously left undone. Setting OKRs instead, and reviewing them as you go, gives you a better chance of following through, and keeping them in Markdown notes means the goals live right next to the work they describe.&lt;/p&gt;
&lt;h2 id="the-templates"&gt;The templates&lt;/h2&gt;
&lt;p&gt;The templates are organized into five levels, each one feeding the next:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Core Principles:&lt;/strong&gt; the values everything else hangs off.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Yearly:&lt;/strong&gt; a Yearly OKRs note, a template for each individual objective, and a Yearly Review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly:&lt;/strong&gt; initiatives, in the form of a monthly review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Weekly:&lt;/strong&gt; weekly goals and a weekly review.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Daily:&lt;/strong&gt; a daily note template.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="what-you-need"&gt;What you need&lt;/h2&gt;
&lt;p&gt;The templates use Obsidian&amp;rsquo;s core Templates plugin plus the community plugins Admonition and Templater. QuickAdd, Periodic Notes, Calendar, and the core Daily Notes plugin are optional extras that make creating the periodic notes smoother.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try it&lt;/h2&gt;
&lt;p&gt;Copy the templates from the &lt;a href="https://github.com/nicolevanderhoeven/obsidian-okrs"&gt;repository&lt;/a&gt; into your vault and follow along with the video.&lt;/p&gt;</description></item><item><title>obsidian-grafana</title><link>https://nicolevanderhoeven.com/projects/obsidian-grafana/</link><pubDate>Mon, 13 Oct 2025 00:00:00 +0000</pubDate><guid>https://nicolevanderhoeven.com/projects/obsidian-grafana/</guid><description>&lt;p&gt;&lt;strong&gt;obsidian-grafana&lt;/strong&gt; turns an &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; vault into time-series data and dashboards. I work at Grafana Labs, helping people monitor their systems with open source tools, and at some point I realized I could use the same tools to monitor my personal knowledge management system. It&amp;rsquo;s a nerdy and totally unnecessary setup, and I enjoy it a lot. I mention it in my post on &lt;a href="https://nicolevanderhoeven.com/blog/20251013-how-i-use-visuals-in-my-pkm/"&gt;how I use visuals in my PKM&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The screenshot above was made by running the repo&amp;rsquo;s own Grafana setup on a copy of the posts from this website.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;p&gt;A Python script reads the Markdown files in your vault and extracts metadata: word, line, and character counts, file size, frontmatter fields, tags, wikilinks, and timestamps. It runs every five minutes and has two paths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A log path for history.&lt;/strong&gt; Only the notes that changed since the last run are written, as structured JSON, to a log file. Grafana Alloy tails that file and forwards it to Loki, with tags and frontmatter fields as labels, so you can see how your notes change over time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A metrics path for the current state.&lt;/strong&gt; A metrics exporter exposes totals such as note count, word count, unique tags, and wikilinks, and Prometheus scrapes them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Grafana ties the two together with pre-configured dashboards: an overview, a time series dashboard for individual notes, a relationships dashboard for wikilinks, a dashboard of frontmatter types, and a word cloud of your most used words. Everything runs in Docker Compose.&lt;/p&gt;
&lt;h2 id="what-its-useful-for"&gt;What it&amp;rsquo;s useful for&lt;/h2&gt;
&lt;p&gt;Understanding your writing habits and how your vault grows, checking how consistently your notes are tagged, finding the notes that everything links to, and keeping an eye on notes with a given frontmatter status or priority. The README also covers installing the Grafana Assistant plugin into the local Grafana.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try it&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/nicolevanderhoeven/obsidian-grafana"&gt;repository&lt;/a&gt; has a quick start. You&amp;rsquo;ll need Docker and Python 3, and a vault to point it at.&lt;/p&gt;</description></item><item><title>Asimov</title><link>https://nicolevanderhoeven.com/projects/asimov/</link><pubDate>Wed, 02 Apr 2025 00:00:00 +0000</pubDate><guid>https://nicolevanderhoeven.com/projects/asimov/</guid><description>&lt;p&gt;&lt;strong&gt;Asimov&lt;/strong&gt; is the companion project to my talk &lt;em&gt;Asimov&amp;rsquo;s Zeroth Law of Robotics&lt;/em&gt;. It&amp;rsquo;s an AI app built to be observed and tested: &lt;strong&gt;The Silent Enterprise&lt;/strong&gt;, a single-player Star Trek text adventure. You play Data, and Claude is the game master. Every model call, dice roll, and turn shows up as telemetry in a Grafana that you can run on your own machine or in Grafana Cloud, and a k6 test suite, some of it judged by Claude, checks whether the AI follows the rules.&lt;/p&gt;
&lt;p&gt;The game master has some known flaws, kept on purpose. It sometimes narrates a rescue that didn&amp;rsquo;t happen, or &amp;ldquo;destroys&amp;rdquo; a drone that&amp;rsquo;s still standing. The point of the demo is catching those flaws with telemetry, tests, and online evaluators.&lt;/p&gt;
&lt;h2 id="the-idea"&gt;The idea&lt;/h2&gt;
&lt;p&gt;Isaac Asimov&amp;rsquo;s three Laws of Robotics govern how robots behave. The talk argues for a law that comes before all of them: a robot must be observable, and, in its newest version, testable. AI systems fail differently from traditional software. There&amp;rsquo;s no single correct output to assert against, a response can be fluent and completely wrong, and models drift. You can&amp;rsquo;t test what you can&amp;rsquo;t see, and you can&amp;rsquo;t trust what you can&amp;rsquo;t test.&lt;/p&gt;
&lt;h2 id="whats-in-it"&gt;What&amp;rsquo;s in it&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The game.&lt;/strong&gt; A Go program with a command-line interface and an HTTP API. The game engine owns the rules and the state. Claude interprets the player&amp;rsquo;s input, makes the game master&amp;rsquo;s own rolls through a tool, and narrates, so a narration that contradicts the saved state is a defect that can be caught.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Telemetry.&lt;/strong&gt; Traces, metrics, and logs go over OpenTelemetry to a local Grafana stack (Tempo, Prometheus, and Loki, with the game&amp;rsquo;s dashboard already loaded) or to Grafana Cloud. Generations can also go to Grafana Cloud&amp;rsquo;s Agent Observability, where online evaluators judge a sample of them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tests.&lt;/strong&gt; A k6 suite with code checks, LLM judges, dice-trajectory evals, and whole playthroughs. All of it can run for free against a mock game master and judge.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No account needed to start.&lt;/strong&gt; You can play offline with no API key, and see the local monitoring stack with one command and Docker.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The screenshot above is the game&amp;rsquo;s local Grafana dashboard.&lt;/p&gt;
&lt;h2 id="the-talks"&gt;The talks&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve given the talk, in several versions, at KubeCon Europe 2025, Dutch Cloud Native Day 2025, Newcrafts 2025, ExpoQA Madrid 2026, and HUSTEF 2026. The write-ups are linked below. The earlier talks used a Python and Flask version of the app, which has since been rewritten in Go.&lt;/p&gt;
&lt;h2 id="try-it"&gt;Try it&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/nicolevanderhoeven/asimov"&gt;repository&lt;/a&gt; has a quick start for playing offline, a Docker-only path, and release binaries for Windows, macOS, and Linux.&lt;/p&gt;</description></item></channel></rss>