<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Willem van Heemstra</title>
    <description>The latest articles on DEV Community by Willem van Heemstra (@wvanheemstra).</description>
    <link>https://dev.to/wvanheemstra</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1547150%2Fcf4a7812-9d15-47b3-9284-0510a0931fd9.jpeg</url>
      <title>DEV Community: Willem van Heemstra</title>
      <link>https://dev.to/wvanheemstra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wvanheemstra"/>
    <language>en</language>
    <item>
      <title>Santa Augmentcode Intent Ep.9</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 24 Apr 2026 07:25:48 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep9-44jl</link>
      <guid>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep9-44jl</guid>
      <description>&lt;h1&gt;
  
  
  Beyond the Workshop — Intent Meets an External Agent Stack 🎅
&lt;/h1&gt;

&lt;p&gt;Accompanying solution repository: &lt;code&gt;augment-claude-litellm-rtk&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not every job can be done at the main workbench. Sometimes Father Christmas must leave the Workshop entirely — to inspect a toy factory in Helsinki, advise a biscuit plant in Brussels, or help a Mac Mini in a quiet study learn some manners. On such occasions, I cannot carry the whole North Pole on my back. But I can carry its discipline. And that, dear reader, is what this final episode is about.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When the Workshop Must Travel
&lt;/h2&gt;

&lt;p&gt;Throughout this series, we have talked about Augment Intent as though it were the whole Workshop in one warm, glowing window. And in many ways, it is.&lt;/p&gt;

&lt;p&gt;But Head Elf Pepper, being both brilliant and troublesome in equal measure, asked the obvious next question:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Santa, what if I want some of these advantages when I am working with an external agent stack? What if I want semantic retrieval, slimmer shell output, and model routing without abandoning good engineering discipline?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An excellent question. The answer is not to copy Intent feature-for-feature in a panic. The answer is to assemble a &lt;strong&gt;practical travelling toolkit&lt;/strong&gt; that preserves the same principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use the &lt;strong&gt;right context&lt;/strong&gt;, not just more context,&lt;/li&gt;
&lt;li&gt;keep noisy output from flooding the model window,&lt;/li&gt;
&lt;li&gt;maintain clear verification steps,&lt;/li&gt;
&lt;li&gt;and route models sensibly rather than treating every task as if it requires a royal audience with the most expensive intelligence in the kingdom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is precisely what the solution in &lt;code&gt;augment-claude-litellm-rtk&lt;/code&gt; offers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Travelling Kit: Four Tools in One Case
&lt;/h2&gt;

&lt;p&gt;The repository documents a concrete setup for a &lt;strong&gt;token-aware coding stack on macOS Apple Silicon&lt;/strong&gt;, especially a &lt;strong&gt;Mac Mini M4 Pro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Its four main pieces are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; as the external coding agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Augment Context Engine MCP&lt;/strong&gt; for semantic codebase retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTK&lt;/strong&gt; for reducing verbose shell output before it reaches the model context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM&lt;/strong&gt; as a local AI gateway for routing, budgets, testing, and future expansion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Workshop terms:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Travelling Kit&lt;/th&gt;
&lt;th&gt;Workshop Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;The senior travelling Elf who can actually do the work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Augment Context Engine MCP&lt;/td&gt;
&lt;td&gt;The portable Workshop Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTK&lt;/td&gt;
&lt;td&gt;The Elf who edits rambling reports down to what matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiteLLM&lt;/td&gt;
&lt;td&gt;The dispatch office that decides which sleigh goes where&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The magic here is not the individual tools alone. It is the fact that each one solves a different form of waste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Context Quality Beats Context Quantity
&lt;/h2&gt;

&lt;p&gt;One of the deepest lessons from Intent is that &lt;strong&gt;retrieval quality matters more than brute-force stuffing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you hand an agent an entire warehouse of scrolls, you have not made it wise. You have merely made it late.&lt;/p&gt;

&lt;p&gt;The Augment Context Engine MCP matters because it gives an external agent stack something much closer to the Workshop Library from Episode 6: a way to retrieve the &lt;em&gt;relevant&lt;/em&gt; architectural memory at the right moment. Instead of pasting huge files and hoping for the best, the agent can ask for the meaningful part of the codebase.&lt;/p&gt;

&lt;p&gt;That is not a luxury. It is cost control, latency control, and correctness control, all disguised as tidiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Token Tax: Shell Output
&lt;/h2&gt;

&lt;p&gt;Now let Father Christmas tell you about a villain rarely invited into respectable technical architecture diagrams: the verbose shell command.&lt;/p&gt;

&lt;p&gt;The shell is useful, of course. But many tools speak like overexcited uncles after mulled wine. They print logs, warnings, duplicate context, and endless lines of output that an agent then dutifully drags into the model context window like muddy boots across a clean floor.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;RTK&lt;/strong&gt; enters the scene.&lt;/p&gt;

&lt;p&gt;RTK helps reduce shell output before it hits the model context. In other words, it trims the transcript to what is materially useful. That is splendidly important. Every token wasted on irrelevant command noise is a token &lt;em&gt;not&lt;/em&gt; spent on reasoning.&lt;/p&gt;

&lt;p&gt;Or, to put it in festive terms: if the reindeer are hauling boilerplate logs, they are not hauling presents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gateway Question: Why LiteLLM Belongs in the Story
&lt;/h2&gt;

&lt;p&gt;The LiteLLM part of this setup deserves a careful, honest explanation.&lt;/p&gt;

&lt;p&gt;The repository is admirably clear about this: the fully documented and officially supported core path is &lt;strong&gt;Claude Code + Augment Context Engine MCP + RTK&lt;/strong&gt;. LiteLLM is included because it is &lt;strong&gt;useful and production-worthy&lt;/strong&gt;, but not every environment clearly guarantees a direct Claude Code → LiteLLM base-URL workflow.&lt;/p&gt;

&lt;p&gt;That honesty matters.&lt;/p&gt;

&lt;p&gt;In the Workshop, we do not claim a sleigh can land on a roof it has never tested. We say what is proven, what is practical, and what is ready for future expansion.&lt;/p&gt;

&lt;p&gt;LiteLLM still brings real value here because it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;local AI gateway&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a place for &lt;strong&gt;routing and budget control&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;support for &lt;strong&gt;OpenAI-compatible tools and scripts&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;and a staging ground for future direct integration paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not smoke and mirrors. It is infrastructure with proper manners.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Finished Setup Looks Like
&lt;/h2&gt;

&lt;p&gt;After following the repository, the machine ends up with a rather handsome set of capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Homebrew-installed prerequisites&lt;/li&gt;
&lt;li&gt;Python 3.12 for LiteLLM&lt;/li&gt;
&lt;li&gt;Node.js for &lt;code&gt;auggie&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auggie CLI installed and ready&lt;/li&gt;
&lt;li&gt;Claude Code installed and authenticated&lt;/li&gt;
&lt;li&gt;Augment MCP registered inside Claude Code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rtk&lt;/code&gt; installed and initialized for Claude Code shell usage&lt;/li&gt;
&lt;li&gt;PostgreSQL 17 running locally for the LiteLLM UI backend&lt;/li&gt;
&lt;li&gt;LiteLLM Proxy on &lt;code&gt;http://127.0.0.1:4000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;LiteLLM admin UI at &lt;code&gt;http://127.0.0.1:4000/ui&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;verification scripts and example prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not merely “a bunch of tools installed.” It is a &lt;strong&gt;composed operator’s station&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture, as Father Christmas Would Draw It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
   │
   ▼
Claude Code
   ├── Augment Context Engine MCP  → retrieves relevant code context
   ├── RTK                         → compresses noisy shell output
   └── LiteLLM Proxy               → routes requests, tracks budgets, enables expansion
                                      │
                                      ▼
                                  Model providers / compatible tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will notice something familiar here.&lt;/p&gt;

&lt;p&gt;Intent taught us that coordination beats improvisation. This stack applies the same lesson in a looser environment. The coordination is not provided by one integrated application window now; it is provided by a carefully assembled toolchain whose pieces each have a distinct job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Recommended Order Matters
&lt;/h2&gt;

&lt;p&gt;The repository even has the decency to tell you the correct order in which to approach the setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;prerequisites&lt;/li&gt;
&lt;li&gt;install Claude Code&lt;/li&gt;
&lt;li&gt;install Auggie and the MCP connection&lt;/li&gt;
&lt;li&gt;install RTK&lt;/li&gt;
&lt;li&gt;install LiteLLM&lt;/li&gt;
&lt;li&gt;verification&lt;/li&gt;
&lt;li&gt;daily usage&lt;/li&gt;
&lt;li&gt;troubleshooting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not administrative fussiness. It is Workshop thinking.&lt;/p&gt;

&lt;p&gt;Good systems are built in the right order because later steps depend on earlier truths. Episode 7 taught us about orchestration waves. The same logic applies here, only now the “agents” are installations, services, scripts, and runtime expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast Path for the Impatient Elf
&lt;/h2&gt;

&lt;p&gt;For those who cannot resist pulling the ribbon before reading the card, the repository also gives a direct setup path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your/workspace
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x scripts/&lt;span class="k"&gt;*&lt;/span&gt;.sh
./scripts/install_prereqs.sh
./scripts/install_auggie.sh
./scripts/install_rtk.sh
./scripts/setup_litellm.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you manually complete the sign-ins, register the MCP server, restart Claude Code, and run the verification script.&lt;/p&gt;

&lt;p&gt;Even the “fast path” still respects the discipline of verification. That is how you know serious engineers packed this travelling case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is a Perfect Episode 9
&lt;/h2&gt;

&lt;p&gt;If Episode 8 showed the ideal, integrated flow of work inside Intent, Episode 9 answers the natural follow-up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do the same principles look like when the Workshop goes mobile?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is reassuringly consistent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preserve semantic retrieval,&lt;/li&gt;
&lt;li&gt;reduce irrelevant context,&lt;/li&gt;
&lt;li&gt;separate proven paths from aspirational ones,&lt;/li&gt;
&lt;li&gt;verify the stack end-to-end,&lt;/li&gt;
&lt;li&gt;and make room for future routing sophistication without lying about what is already supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is excellent engineering. Also, I am pleased to report, excellent Christmas engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPOC: The Travelling Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Developer, Claude Code, Augment MCP, RTK, LiteLLM, local services&lt;/td&gt;
&lt;td&gt;Repository, shell commands, MCP registration, local config, verification scripts&lt;/td&gt;
&lt;td&gt;Install prerequisites → connect MCP → trim shell output → route through gateway → verify stack&lt;/td&gt;
&lt;td&gt;Working token-aware coding environment, lower context waste, future-ready routing setup&lt;/td&gt;
&lt;td&gt;Solo developers, engineering teams, cost-conscious operators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Father Christmas, travelling Elf, portable library, dispatch desk, tidy stenographer&lt;/td&gt;
&lt;td&gt;Tool chest, route map, sleigh rules, checked inventory&lt;/td&gt;
&lt;td&gt;Pack the case → bring the right books → shorten the chatter → dispatch the right sleigh → inspect before departure&lt;/td&gt;
&lt;td&gt;A reliable travelling workshop that still behaves like the North Pole&lt;/td&gt;
&lt;td&gt;Every workshop beyond the snow line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A Final Word from Father Christmas
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The true sign of a good Workshop is not that it works only in its own building. It is that its principles survive the journey. Intent taught us to coordinate, retrieve wisely, verify carefully, and keep the plan honest. This external stack shows those same values travelling well: the right agent, the right context, less wasted chatter, and an honest gateway for the road ahead. If you can carry that discipline with you, then you are not merely using clever tools. You are building like the North Pole.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This concludes the &lt;em&gt;[*Santa Augmentcode Intent&lt;/em&gt;](&lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;https://dev.to/wvanheemstra/series/37310&lt;/a&gt;)&lt;/em&gt; series. All nine episodes are available on &lt;em&gt;[*dev.to&lt;/em&gt;](&lt;a href="https://dev.to)*"&gt;https://dev.to)*&lt;/a&gt; under the &lt;em&gt;[*the-software-s-journey&lt;/em&gt;](&lt;a href="https://dev.to/the-software-s-journey)*"&gt;https://dev.to/the-software-s-journey)*&lt;/a&gt; organisation.*&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for reading. May your specs be living, your context relevant, and your token bills modest. Ho ho ho! 🎅&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>claudecode</category>
      <category>litellm</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.8</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 24 Apr 2026 07:25:42 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep8-4a3c</link>
      <guid>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep8-4a3c</guid>
      <description>&lt;h1&gt;
  
  
  The Gifts Are Under the Tree — From Spec to Merged PR 🎄
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every year, on the morning of December 25th, I allow myself one quiet moment before the sleigh is unpacked and the Thank-You Letters start arriving. I sit in the empty Workshop, still warm from the night’s work, and look at the bare shelves where the gifts used to be. They are gone because they were delivered. Every one of them. On time, as specified, to the right address. That moment — that quiet confirmation that everything worked — is what we have been building towards in this entire series. Today, we deliver.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Complete Picture
&lt;/h2&gt;

&lt;p&gt;Over the past seven episodes, we have assembled all the pieces of the Intent workshop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Episode 1&lt;/strong&gt;: The Workshop and what Intent is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 2&lt;/strong&gt;: The Living Spec — the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 3&lt;/strong&gt;: Santa the Coordinator and the Specialist Elves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 4&lt;/strong&gt;: Isolated workspaces and resumable sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 5&lt;/strong&gt;: Spec-Driven Development and finishing on time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 6&lt;/strong&gt;: The Context Engine — the Workshop Library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 7&lt;/strong&gt;: Multi-agent orchestration in waves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we put them all together and walk through a complete Intent session, from the moment Head Elf Pepper opens the application to the moment the pull request is merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scenario
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Add a real-time gift delivery progress dashboard to the North Pole’s internal web application. The dashboard should show live sleigh position, remaining delivery count, and an estimated completion time. It must work on tablets and update every 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the existing Reindeer GPS API (v2)&lt;/li&gt;
&lt;li&gt;No changes to the Delivery Manifest microservice&lt;/li&gt;
&lt;li&gt;Safari / iPad compatible&lt;/li&gt;
&lt;li&gt;Must pass existing end-to-end test suite&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Open Intent and Set the Goal
&lt;/h2&gt;

&lt;p&gt;Pepper opens Intent on her MacBook. She types into the Coordinator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We need a real-time gift delivery dashboard. Show sleigh position
on a map, remaining delivery count, and estimated completion time.
Updates every 30 seconds. Must work on iPad Safari.
Use Reindeer GPS API v2. No changes to Delivery Manifest Service.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator reads this prompt alongside the Context Engine’s analysis of the codebase. It knows the existing frontend stack (React, TypeScript), the API patterns used elsewhere in the project, and the existing test suite structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: The Coordinator Drafts the Living Spec
&lt;/h2&gt;

&lt;p&gt;Within seconds, the Coordinator produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Gift Delivery Dashboard — Living Spec&lt;/span&gt;

&lt;span class="gu"&gt;### Goal&lt;/span&gt;
Real-time dashboard showing sleigh position, delivery count,
and ETA. Updates every 30 seconds. iPad Safari compatible.

&lt;span class="gu"&gt;### Success Criteria&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map renders in &amp;lt; 1s on iPad Safari
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Position updates within 30s of GPS data change
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery count matches Manifest API response
&lt;span class="p"&gt;-&lt;/span&gt; [ ] ETA calculated from current position + remaining stops
&lt;span class="p"&gt;-&lt;/span&gt; [ ] All existing e2e tests pass
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Lighthouse accessibility score ≥ 90

&lt;span class="gu"&gt;### Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Reindeer GPS API v2 (existing auth token pattern)
&lt;span class="p"&gt;-&lt;/span&gt; Delivery Manifest Service: read-only, no new endpoints
&lt;span class="p"&gt;-&lt;/span&gt; Safari / iPad: no Chrome-only APIs

&lt;span class="gu"&gt;### Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New React component: &lt;span class="sb"&gt;`&amp;lt;DeliveryDashboard /&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GPS polling service (30s interval, exponential backoff on fail)
&lt;span class="p"&gt;-&lt;/span&gt; Map: Leaflet.js (already in dependencies — see package.json)
&lt;span class="p"&gt;-&lt;/span&gt; Offline fallback: show last known position with staleness indicator

&lt;span class="gu"&gt;### Tasks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] GPS Polling Service — GPS Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map Component — Map Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery Count &amp;amp; ETA Widget — Data Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Safari/iPad CSS fixes — Responsive Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Integration tests — Test Elf (starts after GPS + Map done)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Accessibility audit — A11y Elf (background)

&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
(none yet)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reads the spec. She adds one clarification: &lt;em&gt;“ETA should display in local Workshop time, not UTC.”&lt;/em&gt; The Coordinator updates the spec and records the decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review time: 4 minutes. No code written yet. One important decision already captured.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Intent Creates Isolated Workspaces
&lt;/h2&gt;

&lt;p&gt;The Coordinator identifies the dependency graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPS Elf and Map Elf can start in parallel immediately.&lt;/li&gt;
&lt;li&gt;Data Elf can start immediately (it only reads from the Manifest API).&lt;/li&gt;
&lt;li&gt;Responsive Elf can start once Map Elf has a working component.&lt;/li&gt;
&lt;li&gt;Test Elf starts after GPS Elf and Map Elf complete.&lt;/li&gt;
&lt;li&gt;A11y Elf runs as a background agent throughout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intent creates five Git worktrees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat/dashboard-gps-service        ← GPS Elf
feat/dashboard-map-component      ← Map Elf
feat/dashboard-data-widgets       ← Data Elf
feat/dashboard-responsive         ← Responsive Elf (waiting)
feat/dashboard-tests              ← Test Elf (waiting)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wave 1 agents — GPS Elf, Map Elf, Data Elf — start simultaneously. The A11y Elf begins in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Wave 1 Runs
&lt;/h2&gt;

&lt;p&gt;Pepper watches the Intent window. Three agent conversations are active. Code appears in the Changes panel. The spec’s task list updates as work progresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPS Elf&lt;/strong&gt; implements the polling service, using the existing auth token pattern it found via the Context Engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// gps-polling.service.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GpsPollingService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;startPolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SleighPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;poll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reindeerGpsApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The spec updates: ✅ GPS Polling Service — GPS Elf — done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map Elf&lt;/strong&gt; creates the &lt;code&gt;&amp;lt;DeliveryMap /&amp;gt;&lt;/code&gt; component using Leaflet.js, which it found already installed in &lt;code&gt;package.json&lt;/code&gt; via the Context Engine. It does not install a duplicate library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Elf&lt;/strong&gt; builds the delivery count and ETA widget, correctly calling the Manifest API’s read-only endpoint and displaying ETA in Workshop local time (it read the spec decision).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Handoffs and Wave 2
&lt;/h2&gt;

&lt;p&gt;Both GPS Elf and Map Elf report completion. The spec records the interfaces they produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GPS service exposes: &lt;span class="sb"&gt;`startPolling(cb: (SleighPosition) =&amp;gt; void)`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Map component props: &lt;span class="sb"&gt;`{ position: SleighPosition; zoom?: number }`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator briefs Responsive Elf with the updated spec and the actual component structure. No guesswork. Test Elf receives both the GPS service interface and the Map component props, plus the existing e2e test patterns from the Context Engine.&lt;/p&gt;

&lt;p&gt;Wave 2 begins. Responsive Elf adds Safari/iPad CSS. Test Elf writes integration tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The Verifier Checks Everything
&lt;/h2&gt;

&lt;p&gt;Wave 2 complete. The Coordinator spawns the Verifier Elf with the full spec and all five implementations.&lt;/p&gt;

&lt;p&gt;Verifier’s report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Map renders in &amp;lt; 1s on iPad Safari — confirmed (Lighthouse: 0.7s)
✅ Position updates within 30s — confirmed
✅ Delivery count matches Manifest API — confirmed
✅ ETA in Workshop local time — confirmed
✅ Existing e2e tests pass — confirmed
✅ Lighthouse accessibility score ≥ 90 — confirmed (score: 94)
⚠️  Minor: GPS service does not log polling errors to existing
    structured logger (see logger.ts — used throughout codebase)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The warning is real and useful. The Context Engine told the Verifier about &lt;code&gt;logger.ts&lt;/code&gt;. A generic agent would have missed it.&lt;/p&gt;

&lt;p&gt;The Coordinator sends the GPS Elf back for a five-minute fix. It adds one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GPS polling failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Re-verification: all green.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: The Pull Request
&lt;/h2&gt;

&lt;p&gt;The Coordinator integrates all five worktrees into a single branch &lt;code&gt;feat/delivery-dashboard&lt;/code&gt; and opens a pull request. The PR description is generated from the Living Spec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Gift Delivery Dashboard&lt;/span&gt;

Implements real-time dashboard (sleigh position, delivery count, ETA).

&lt;span class="gu"&gt;### Changes&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`GpsPollingService`&lt;/span&gt; with 30s polling + exponential backoff
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryMap /&amp;gt;`&lt;/span&gt; using existing Leaflet.js dependency
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryStats /&amp;gt;`&lt;/span&gt; widget with ETA in Workshop local time
&lt;span class="p"&gt;-&lt;/span&gt; New: iPad/Safari responsive CSS
&lt;span class="p"&gt;-&lt;/span&gt; New: Integration test suite (12 tests, all passing)

&lt;span class="gu"&gt;### Verified Against Spec&lt;/span&gt;
All 6 success criteria confirmed by Verifier Agent.
Existing e2e suite: all passing.

&lt;span class="gu"&gt;### Decisions Recorded&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; ETA displayed in Workshop local time (not UTC) — per Pepper, Dec 3
&lt;span class="p"&gt;-&lt;/span&gt; Used existing Leaflet.js (not installed new mapping library)
&lt;span class="p"&gt;-&lt;/span&gt; GPS errors logged via existing structured logger (logger.ts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reviews the spec (4 minutes). She reviews the diff (10 minutes, because the spec told her exactly what to look for). She approves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total elapsed time: 47 minutes. Zero rework. Christmas safe.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built Together
&lt;/h2&gt;

&lt;p&gt;Over this series, Father Christmas and Head Elf Pepper have explained every layer of Intent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Workshop Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Living Spec&lt;/td&gt;
&lt;td&gt;Source of truth, auto-updated&lt;/td&gt;
&lt;td&gt;Master Gift List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordinator Agent&lt;/td&gt;
&lt;td&gt;Plans, delegates, manages handoffs&lt;/td&gt;
&lt;td&gt;Father Christmas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specialist Agents&lt;/td&gt;
&lt;td&gt;Execute focused tasks in parallel&lt;/td&gt;
&lt;td&gt;Craft Elves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolated Workspaces&lt;/td&gt;
&lt;td&gt;No collisions between parallel agents&lt;/td&gt;
&lt;td&gt;Private workbenches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec-Driven Development&lt;/td&gt;
&lt;td&gt;Plan first, code follows&lt;/td&gt;
&lt;td&gt;Write the List before carving begins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Engine&lt;/td&gt;
&lt;td&gt;Deep codebase knowledge for every agent&lt;/td&gt;
&lt;td&gt;The Workshop Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Agent Orchestration&lt;/td&gt;
&lt;td&gt;Waves, handoffs, background agents&lt;/td&gt;
&lt;td&gt;Workshop floor choreography&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resumable Sessions&lt;/td&gt;
&lt;td&gt;State preserved across restarts&lt;/td&gt;
&lt;td&gt;Workshop never forgets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SIPOC: The Complete Intent Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Developer, Coordinator, Specialists, Context Engine, AI models&lt;/td&gt;
&lt;td&gt;Goal statement, codebase, constraints, model selection&lt;/td&gt;
&lt;td&gt;Spec → Review → Wave 1 agents → Handoffs → Wave 2 → Verifier → PR&lt;/td&gt;
&lt;td&gt;Verified code, living spec, decision log, merged PR&lt;/td&gt;
&lt;td&gt;Engineering team, product owner, CI/CD, end users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Pepper, Father Christmas, all Elves, the Library&lt;/td&gt;
&lt;td&gt;Gift order, Workshop constraints, quality standards&lt;/td&gt;
&lt;td&gt;Write List → Agree → Parallel building → Handoffs → QC → Sleigh&lt;/td&gt;
&lt;td&gt;All gifts delivered correctly, on time, to every child&lt;/td&gt;
&lt;td&gt;Children of the world&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Intent is available in &lt;strong&gt;public beta for macOS&lt;/strong&gt;. &lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;Download it here&lt;/a&gt;. It uses your existing Augment credits. You can also bring Claude Code, Codex, or OpenCode if you already have subscriptions.&lt;/p&gt;

&lt;p&gt;Augment’s documentation is at &lt;a href="https://docs.augmentcode.com" rel="noopener noreferrer"&gt;docs.augmentcode.com&lt;/a&gt;. Their manifesto — &lt;em&gt;The End of Linear Work&lt;/em&gt; — is worth reading before your first session.&lt;/p&gt;

&lt;h2&gt;
  
  
  One More Sleigh Stop
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;We have reached the point where the gifts are wrapped, the sleigh is loaded, and the Workshop itself is humming beautifully. But Head Elf Pepper asked me one more excellent question over a final cup of cocoa: *“Santa, what if I want some of this magic outside Intent itself? What if I want Claude Code, the Augment Context Engine, RTK, and LiteLLM working together on a machine of my own?”*Quite right, Pepper. One more stop, then. One more lesson before the reindeer sleep.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the next episode, Father Christmas steps just beyond the Workshop walls to show how Intent’s principles carry into an external, token-aware coding stack: &lt;strong&gt;Claude Code + Augment Context Engine MCP + RTK + LiteLLM on a Mac Mini M4 Pro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;em&gt;[*Santa Augmentcode Intent&lt;/em&gt;](&lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;https://dev.to/wvanheemstra/series/37310&lt;/a&gt;)&lt;/em&gt; series. Published on &lt;em&gt;[*dev.to&lt;/em&gt;](&lt;a href="https://dev.to)*"&gt;https://dev.to)*&lt;/a&gt; under the &lt;em&gt;[*the-software-s-journey&lt;/em&gt;](&lt;a href="https://dev.to/the-software-s-journey)*"&gt;https://dev.to/the-software-s-journey)*&lt;/a&gt; organisation.*&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>devworkflow</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.9</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:38:45 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep9-2mb2</link>
      <guid>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep9-2mb2</guid>
      <description>&lt;h1&gt;
  
  
  Beyond the Workshop — Intent Meets an External Agent Stack 🎅
&lt;/h1&gt;

&lt;p&gt;Accompanying solution repository: &lt;a href="https://github.com/vanHeemstraSystems/augment-claude-litellm-rtk" rel="noopener noreferrer"&gt;&lt;code&gt;augment-claude-litellm-rtk&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Not every job can be done at the main workbench. Sometimes Father Christmas must leave the Workshop entirely — to inspect a toy factory in Helsinki, advise a biscuit plant in Brussels, or help a Mac Mini in a quiet study learn some manners. On such occasions, I cannot carry the whole North Pole on my back. But I can carry its &lt;em&gt;discipline&lt;/em&gt;. And that, dear reader, is what this final episode is about.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  When the Workshop Must Travel
&lt;/h2&gt;

&lt;p&gt;Throughout this series, we have talked about Augment Intent as though it were the whole Workshop in one warm, glowing window. And in many ways, it is.&lt;/p&gt;

&lt;p&gt;But Head Elf Pepper, being both brilliant and troublesome in equal measure, asked the obvious next question:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Santa, what if I want some of these advantages when I am working with an external agent stack? What if I want semantic retrieval, slimmer shell output, and model routing without abandoning good engineering discipline?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;An excellent question. The answer is not to copy Intent feature-for-feature in a panic. The answer is to assemble a &lt;strong&gt;practical travelling toolkit&lt;/strong&gt; that preserves the same principles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;use the &lt;strong&gt;right context&lt;/strong&gt;, not just more context,&lt;/li&gt;
&lt;li&gt;keep noisy output from flooding the model window,&lt;/li&gt;
&lt;li&gt;maintain clear verification steps,&lt;/li&gt;
&lt;li&gt;and route models sensibly rather than treating every task as if it requires a royal audience with the most expensive intelligence in the kingdom.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is precisely what the solution in &lt;a href="https://github.com/vanHeemstraSystems/augment-claude-litellm-rtk" rel="noopener noreferrer"&gt;&lt;code&gt;augment-claude-litellm-rtk&lt;/code&gt;&lt;/a&gt; offers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Travelling Kit: Four Tools in One Case
&lt;/h2&gt;

&lt;p&gt;The repository documents a concrete setup for a &lt;strong&gt;token-aware coding stack on macOS Apple Silicon&lt;/strong&gt;, especially a &lt;strong&gt;Mac Mini M4 Pro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Its four main pieces are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; as the external coding agent&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Augment Context Engine MCP&lt;/strong&gt; for semantic codebase retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RTK&lt;/strong&gt; for reducing verbose shell output before it reaches the model context&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LiteLLM&lt;/strong&gt; as a local AI gateway for routing, budgets, testing, and future expansion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Workshop terms:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Travelling Kit&lt;/th&gt;
&lt;th&gt;Workshop Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;The senior travelling Elf who can actually do the work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Augment Context Engine MCP&lt;/td&gt;
&lt;td&gt;The portable Workshop Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RTK&lt;/td&gt;
&lt;td&gt;The Elf who edits rambling reports down to what matters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LiteLLM&lt;/td&gt;
&lt;td&gt;The dispatch office that decides which sleigh goes where&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The magic here is not the individual tools alone. It is the fact that each one solves a different form of waste.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Context Quality Beats Context Quantity
&lt;/h2&gt;

&lt;p&gt;One of the deepest lessons from Intent is that &lt;strong&gt;retrieval quality matters more than brute-force stuffing&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If you hand an agent an entire warehouse of scrolls, you have not made it wise. You have merely made it late.&lt;/p&gt;

&lt;p&gt;The Augment Context Engine MCP matters because it gives an external agent stack something much closer to the Workshop Library from Episode 6: a way to retrieve the &lt;em&gt;relevant&lt;/em&gt; architectural memory at the right moment. Instead of pasting huge files and hoping for the best, the agent can ask for the meaningful part of the codebase.&lt;/p&gt;

&lt;p&gt;That is not a luxury. It is cost control, latency control, and correctness control, all disguised as tidiness.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Hidden Token Tax: Shell Output
&lt;/h2&gt;

&lt;p&gt;Now let Father Christmas tell you about a villain rarely invited into respectable technical architecture diagrams: the verbose shell command.&lt;/p&gt;

&lt;p&gt;The shell is useful, of course. But many tools speak like overexcited uncles after mulled wine. They print logs, warnings, duplicate context, and endless lines of output that an agent then dutifully drags into the model context window like muddy boots across a clean floor.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;RTK&lt;/strong&gt; enters the scene.&lt;/p&gt;

&lt;p&gt;RTK helps reduce shell output before it hits the model context. In other words, it trims the transcript to what is materially useful. That is splendidly important. Every token wasted on irrelevant command noise is a token &lt;em&gt;not&lt;/em&gt; spent on reasoning.&lt;/p&gt;

&lt;p&gt;Or, to put it in festive terms: if the reindeer are hauling boilerplate logs, they are not hauling presents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Gateway Question: Why LiteLLM Belongs in the Story
&lt;/h2&gt;

&lt;p&gt;The LiteLLM part of this setup deserves a careful, honest explanation.&lt;/p&gt;

&lt;p&gt;The repository is admirably clear about this: the fully documented and officially supported core path is &lt;strong&gt;Claude Code + Augment Context Engine MCP + RTK&lt;/strong&gt;. LiteLLM is included because it is &lt;strong&gt;useful and production-worthy&lt;/strong&gt;, but not every environment clearly guarantees a direct Claude Code → LiteLLM base-URL workflow.&lt;/p&gt;

&lt;p&gt;That honesty matters.&lt;/p&gt;

&lt;p&gt;In the Workshop, we do not claim a sleigh can land on a roof it has never tested. We say what is proven, what is practical, and what is ready for future expansion.&lt;/p&gt;

&lt;p&gt;LiteLLM still brings real value here because it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a &lt;strong&gt;local AI gateway&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;a place for &lt;strong&gt;routing and budget control&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;support for &lt;strong&gt;OpenAI-compatible tools and scripts&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;and a staging ground for future direct integration paths.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not smoke and mirrors. It is infrastructure with proper manners.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Finished Setup Looks Like
&lt;/h2&gt;

&lt;p&gt;After following the repository, the machine ends up with a rather handsome set of capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Homebrew-installed prerequisites&lt;/li&gt;
&lt;li&gt;Python 3.12 for LiteLLM&lt;/li&gt;
&lt;li&gt;Node.js for &lt;code&gt;auggie&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Auggie CLI installed and ready&lt;/li&gt;
&lt;li&gt;Claude Code installed and authenticated&lt;/li&gt;
&lt;li&gt;Augment MCP registered inside Claude Code&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;rtk&lt;/code&gt; installed and initialized for Claude Code shell usage&lt;/li&gt;
&lt;li&gt;PostgreSQL 17 running locally for the LiteLLM UI backend&lt;/li&gt;
&lt;li&gt;LiteLLM Proxy on &lt;code&gt;http://127.0.0.1:4000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;LiteLLM admin UI at &lt;code&gt;http://127.0.0.1:4000/ui&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;verification scripts and example prompts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not merely “a bunch of tools installed.” It is a &lt;strong&gt;composed operator’s station&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture, as Father Christmas Would Draw It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
   │
   ▼
Claude Code
   ├── Augment Context Engine MCP  → retrieves relevant code context
   ├── RTK                         → compresses noisy shell output
   └── LiteLLM Proxy               → routes requests, tracks budgets, enables expansion
                                      │
                                      ▼
                                  Model providers / compatible tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will notice something familiar here.&lt;/p&gt;

&lt;p&gt;Intent taught us that coordination beats improvisation. This stack applies the same lesson in a looser environment. The coordination is not provided by one integrated application window now; it is provided by a carefully assembled toolchain whose pieces each have a distinct job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Recommended Order Matters
&lt;/h2&gt;

&lt;p&gt;The repository even has the decency to tell you the correct order in which to approach the setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;prerequisites&lt;/li&gt;
&lt;li&gt;install Claude Code&lt;/li&gt;
&lt;li&gt;install Auggie and the MCP connection&lt;/li&gt;
&lt;li&gt;install RTK&lt;/li&gt;
&lt;li&gt;install LiteLLM&lt;/li&gt;
&lt;li&gt;verification&lt;/li&gt;
&lt;li&gt;daily usage&lt;/li&gt;
&lt;li&gt;troubleshooting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is not administrative fussiness. It is Workshop thinking.&lt;/p&gt;

&lt;p&gt;Good systems are built in the right order because later steps depend on earlier truths. Episode 7 taught us about orchestration waves. The same logic applies here, only now the “agents” are installations, services, scripts, and runtime expectations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fast Path for the Impatient Elf
&lt;/h2&gt;

&lt;p&gt;For those who cannot resist pulling the ribbon before reading the card, the repository also gives a direct setup path:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/your/workspace
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x scripts/&lt;span class="k"&gt;*&lt;/span&gt;.sh
./scripts/install_prereqs.sh
./scripts/install_auggie.sh
./scripts/install_rtk.sh
./scripts/setup_litellm.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you manually complete the sign-ins, register the MCP server, restart Claude Code, and run the verification script.&lt;/p&gt;

&lt;p&gt;Even the “fast path” still respects the discipline of verification. That is how you know serious engineers packed this travelling case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is a Perfect Episode 9
&lt;/h2&gt;

&lt;p&gt;If Episode 8 showed the ideal, integrated flow of work inside Intent, Episode 9 answers the natural follow-up:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do the same principles look like when the Workshop goes mobile?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The answer is reassuringly consistent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preserve semantic retrieval,&lt;/li&gt;
&lt;li&gt;reduce irrelevant context,&lt;/li&gt;
&lt;li&gt;separate proven paths from aspirational ones,&lt;/li&gt;
&lt;li&gt;verify the stack end-to-end,&lt;/li&gt;
&lt;li&gt;and make room for future routing sophistication without lying about what is already supported.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is excellent engineering. Also, I am pleased to report, excellent Christmas engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPOC: The Travelling Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Developer, Claude Code, Augment MCP, RTK, LiteLLM, local services&lt;/td&gt;
&lt;td&gt;Repository, shell commands, MCP registration, local config, verification scripts&lt;/td&gt;
&lt;td&gt;Install prerequisites → connect MCP → trim shell output → route through gateway → verify stack&lt;/td&gt;
&lt;td&gt;Working token-aware coding environment, lower context waste, future-ready routing setup&lt;/td&gt;
&lt;td&gt;Solo developers, engineering teams, cost-conscious operators&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Father Christmas, travelling Elf, portable library, dispatch desk, tidy stenographer&lt;/td&gt;
&lt;td&gt;Tool chest, route map, sleigh rules, checked inventory&lt;/td&gt;
&lt;td&gt;Pack the case → bring the right books → shorten the chatter → dispatch the right sleigh → inspect before departure&lt;/td&gt;
&lt;td&gt;A reliable travelling workshop that still behaves like the North Pole&lt;/td&gt;
&lt;td&gt;Every workshop beyond the snow line&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A Final Word from Father Christmas
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The true sign of a good Workshop is not that it works only in its own building. It is that its principles survive the journey. Intent taught us to coordinate, retrieve wisely, verify carefully, and keep the plan honest. This external stack shows those same values travelling well: the right agent, the right context, less wasted chatter, and an honest gateway for the road ahead. If you can carry that discipline with you, then you are not merely using clever tools. You are building like the North Pole.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This concludes the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. All nine episodes are available on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for reading. May your specs be living, your context relevant, and your token bills modest. Ho ho ho! 🎅&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>claudecode</category>
      <category>litellm</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.8</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:38:09 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep8-56bg</link>
      <guid>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep8-56bg</guid>
      <description>&lt;h1&gt;
  
  
  The Gifts Are Under the Tree — From Spec to Merged PR 🎄
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every year, on the morning of December 25th, I allow myself one quiet moment before the sleigh is unpacked and the Thank-You Letters start arriving. I sit in the empty Workshop, still warm from the night’s work, and look at the bare shelves where the gifts used to be. They are gone because they were delivered. Every one of them. On time, as specified, to the right address. That moment — that quiet confirmation that everything worked — is what we have been building towards in this entire series. Today, we deliver.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Complete Picture
&lt;/h2&gt;

&lt;p&gt;Over the past seven episodes, we have assembled all the pieces of the Intent workshop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Episode 1&lt;/strong&gt;: The Workshop and what Intent is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 2&lt;/strong&gt;: The Living Spec — the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 3&lt;/strong&gt;: Santa the Coordinator and the Specialist Elves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 4&lt;/strong&gt;: Isolated workspaces and resumable sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 5&lt;/strong&gt;: Spec-Driven Development and finishing on time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 6&lt;/strong&gt;: The Context Engine — the Workshop Library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 7&lt;/strong&gt;: Multi-agent orchestration in waves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we put them all together and walk through a complete Intent session, from the moment Head Elf Pepper opens the application to the moment the pull request is merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scenario
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Add a real-time gift delivery progress dashboard to the North Pole’s internal web application. The dashboard should show live sleigh position, remaining delivery count, and an estimated completion time. It must work on tablets and update every 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the existing Reindeer GPS API (v2)&lt;/li&gt;
&lt;li&gt;No changes to the Delivery Manifest microservice&lt;/li&gt;
&lt;li&gt;Safari / iPad compatible&lt;/li&gt;
&lt;li&gt;Must pass existing end-to-end test suite&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Open Intent and Set the Goal
&lt;/h2&gt;

&lt;p&gt;Pepper opens Intent on her MacBook. She types into the Coordinator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We need a real-time gift delivery dashboard. Show sleigh position
on a map, remaining delivery count, and estimated completion time.
Updates every 30 seconds. Must work on iPad Safari.
Use Reindeer GPS API v2. No changes to Delivery Manifest Service.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator reads this prompt alongside the Context Engine’s analysis of the codebase. It knows the existing frontend stack (React, TypeScript), the API patterns used elsewhere in the project, and the existing test suite structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: The Coordinator Drafts the Living Spec
&lt;/h2&gt;

&lt;p&gt;Within seconds, the Coordinator produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Gift Delivery Dashboard — Living Spec&lt;/span&gt;

&lt;span class="gu"&gt;### Goal&lt;/span&gt;
Real-time dashboard showing sleigh position, delivery count,
and ETA. Updates every 30 seconds. iPad Safari compatible.

&lt;span class="gu"&gt;### Success Criteria&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map renders in &amp;lt; 1s on iPad Safari
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Position updates within 30s of GPS data change
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery count matches Manifest API response
&lt;span class="p"&gt;-&lt;/span&gt; [ ] ETA calculated from current position + remaining stops
&lt;span class="p"&gt;-&lt;/span&gt; [ ] All existing e2e tests pass
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Lighthouse accessibility score ≥ 90

&lt;span class="gu"&gt;### Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Reindeer GPS API v2 (existing auth token pattern)
&lt;span class="p"&gt;-&lt;/span&gt; Delivery Manifest Service: read-only, no new endpoints
&lt;span class="p"&gt;-&lt;/span&gt; Safari / iPad: no Chrome-only APIs

&lt;span class="gu"&gt;### Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New React component: &lt;span class="sb"&gt;`&amp;lt;DeliveryDashboard /&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GPS polling service (30s interval, exponential backoff on fail)
&lt;span class="p"&gt;-&lt;/span&gt; Map: Leaflet.js (already in dependencies — see package.json)
&lt;span class="p"&gt;-&lt;/span&gt; Offline fallback: show last known position with staleness indicator

&lt;span class="gu"&gt;### Tasks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] GPS Polling Service — GPS Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map Component — Map Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery Count &amp;amp; ETA Widget — Data Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Safari/iPad CSS fixes — Responsive Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Integration tests — Test Elf (starts after GPS + Map done)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Accessibility audit — A11y Elf (background)

&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
(none yet)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reads the spec. She adds one clarification: &lt;em&gt;“ETA should display in local Workshop time, not UTC.”&lt;/em&gt; The Coordinator updates the spec and records the decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review time: 4 minutes. No code written yet. One important decision already captured.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Intent Creates Isolated Workspaces
&lt;/h2&gt;

&lt;p&gt;The Coordinator identifies the dependency graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPS Elf and Map Elf can start in parallel immediately.&lt;/li&gt;
&lt;li&gt;Data Elf can start immediately (it only reads from the Manifest API).&lt;/li&gt;
&lt;li&gt;Responsive Elf can start once Map Elf has a working component.&lt;/li&gt;
&lt;li&gt;Test Elf starts after GPS Elf and Map Elf complete.&lt;/li&gt;
&lt;li&gt;A11y Elf runs as a background agent throughout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intent creates five Git worktrees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat/dashboard-gps-service        ← GPS Elf
feat/dashboard-map-component      ← Map Elf
feat/dashboard-data-widgets       ← Data Elf
feat/dashboard-responsive         ← Responsive Elf (waiting)
feat/dashboard-tests              ← Test Elf (waiting)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wave 1 agents — GPS Elf, Map Elf, Data Elf — start simultaneously. The A11y Elf begins in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Wave 1 Runs
&lt;/h2&gt;

&lt;p&gt;Pepper watches the Intent window. Three agent conversations are active. Code appears in the Changes panel. The spec’s task list updates as work progresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPS Elf&lt;/strong&gt; implements the polling service, using the existing auth token pattern it found via the Context Engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// gps-polling.service.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GpsPollingService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;startPolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SleighPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;poll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reindeerGpsApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The spec updates: ✅ GPS Polling Service — GPS Elf — done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map Elf&lt;/strong&gt; creates the &lt;code&gt;&amp;lt;DeliveryMap /&amp;gt;&lt;/code&gt; component using Leaflet.js, which it found already installed in &lt;code&gt;package.json&lt;/code&gt; via the Context Engine. It does not install a duplicate library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Elf&lt;/strong&gt; builds the delivery count and ETA widget, correctly calling the Manifest API’s read-only endpoint and displaying ETA in Workshop local time (it read the spec decision).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Handoffs and Wave 2
&lt;/h2&gt;

&lt;p&gt;Both GPS Elf and Map Elf report completion. The spec records the interfaces they produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GPS service exposes: &lt;span class="sb"&gt;`startPolling(cb: (SleighPosition) =&amp;gt; void)`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Map component props: &lt;span class="sb"&gt;`{ position: SleighPosition; zoom?: number }`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator briefs Responsive Elf with the updated spec and the actual component structure. No guesswork. Test Elf receives both the GPS service interface and the Map component props, plus the existing e2e test patterns from the Context Engine.&lt;/p&gt;

&lt;p&gt;Wave 2 begins. Responsive Elf adds Safari/iPad CSS. Test Elf writes integration tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The Verifier Checks Everything
&lt;/h2&gt;

&lt;p&gt;Wave 2 complete. The Coordinator spawns the Verifier Elf with the full spec and all five implementations.&lt;/p&gt;

&lt;p&gt;Verifier’s report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Map renders in &amp;lt; 1s on iPad Safari — confirmed (Lighthouse: 0.7s)
✅ Position updates within 30s — confirmed
✅ Delivery count matches Manifest API — confirmed
✅ ETA in Workshop local time — confirmed
✅ Existing e2e tests pass — confirmed
✅ Lighthouse accessibility score ≥ 90 — confirmed (score: 94)
⚠️  Minor: GPS service does not log polling errors to existing
    structured logger (see logger.ts — used throughout codebase)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The warning is real and useful. The Context Engine told the Verifier about &lt;code&gt;logger.ts&lt;/code&gt;. A generic agent would have missed it.&lt;/p&gt;

&lt;p&gt;The Coordinator sends the GPS Elf back for a five-minute fix. It adds one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GPS polling failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Re-verification: all green.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: The Pull Request
&lt;/h2&gt;

&lt;p&gt;The Coordinator integrates all five worktrees into a single branch &lt;code&gt;feat/delivery-dashboard&lt;/code&gt; and opens a pull request. The PR description is generated from the Living Spec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Gift Delivery Dashboard&lt;/span&gt;

Implements real-time dashboard (sleigh position, delivery count, ETA).

&lt;span class="gu"&gt;### Changes&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`GpsPollingService`&lt;/span&gt; with 30s polling + exponential backoff
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryMap /&amp;gt;`&lt;/span&gt; using existing Leaflet.js dependency
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryStats /&amp;gt;`&lt;/span&gt; widget with ETA in Workshop local time
&lt;span class="p"&gt;-&lt;/span&gt; New: iPad/Safari responsive CSS
&lt;span class="p"&gt;-&lt;/span&gt; New: Integration test suite (12 tests, all passing)

&lt;span class="gu"&gt;### Verified Against Spec&lt;/span&gt;
All 6 success criteria confirmed by Verifier Agent.
Existing e2e suite: all passing.

&lt;span class="gu"&gt;### Decisions Recorded&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; ETA displayed in Workshop local time (not UTC) — per Pepper, Dec 3
&lt;span class="p"&gt;-&lt;/span&gt; Used existing Leaflet.js (not installed new mapping library)
&lt;span class="p"&gt;-&lt;/span&gt; GPS errors logged via existing structured logger (logger.ts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reviews the spec (4 minutes). She reviews the diff (10 minutes, because the spec told her exactly what to look for). She approves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total elapsed time: 47 minutes. Zero rework. Christmas safe.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built Together
&lt;/h2&gt;

&lt;p&gt;Over this series, Father Christmas and Head Elf Pepper have explained every layer of Intent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Workshop Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Living Spec&lt;/td&gt;
&lt;td&gt;Source of truth, auto-updated&lt;/td&gt;
&lt;td&gt;Master Gift List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordinator Agent&lt;/td&gt;
&lt;td&gt;Plans, delegates, manages handoffs&lt;/td&gt;
&lt;td&gt;Father Christmas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specialist Agents&lt;/td&gt;
&lt;td&gt;Execute focused tasks in parallel&lt;/td&gt;
&lt;td&gt;Craft Elves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolated Workspaces&lt;/td&gt;
&lt;td&gt;No collisions between parallel agents&lt;/td&gt;
&lt;td&gt;Private workbenches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec-Driven Development&lt;/td&gt;
&lt;td&gt;Plan first, code follows&lt;/td&gt;
&lt;td&gt;Write the List before carving begins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Engine&lt;/td&gt;
&lt;td&gt;Deep codebase knowledge for every agent&lt;/td&gt;
&lt;td&gt;The Workshop Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Agent Orchestration&lt;/td&gt;
&lt;td&gt;Waves, handoffs, background agents&lt;/td&gt;
&lt;td&gt;Workshop floor choreography&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resumable Sessions&lt;/td&gt;
&lt;td&gt;State preserved across restarts&lt;/td&gt;
&lt;td&gt;Workshop never forgets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SIPOC: The Complete Intent Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Developer, Coordinator, Specialists, Context Engine, AI models&lt;/td&gt;
&lt;td&gt;Goal statement, codebase, constraints, model selection&lt;/td&gt;
&lt;td&gt;Spec → Review → Wave 1 agents → Handoffs → Wave 2 → Verifier → PR&lt;/td&gt;
&lt;td&gt;Verified code, living spec, decision log, merged PR&lt;/td&gt;
&lt;td&gt;Engineering team, product owner, CI/CD, end users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Pepper, Father Christmas, all Elves, the Library&lt;/td&gt;
&lt;td&gt;Gift order, Workshop constraints, quality standards&lt;/td&gt;
&lt;td&gt;Write List → Agree → Parallel building → Handoffs → QC → Sleigh&lt;/td&gt;
&lt;td&gt;All gifts delivered correctly, on time, to every child&lt;/td&gt;
&lt;td&gt;Children of the world&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Intent is available in &lt;strong&gt;public beta for macOS&lt;/strong&gt;. &lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;Download it here&lt;/a&gt;. It uses your existing Augment credits. You can also bring Claude Code, Codex, or OpenCode if you already have subscriptions.&lt;/p&gt;

&lt;p&gt;Augment’s documentation is at &lt;a href="https://docs.augmentcode.com" rel="noopener noreferrer"&gt;docs.augmentcode.com&lt;/a&gt;. Their manifesto — &lt;em&gt;The End of Linear Work&lt;/em&gt; — is worth reading before your first session.&lt;/p&gt;

&lt;h2&gt;
  
  
  One More Sleigh Stop
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;We have reached the point where the gifts are wrapped, the sleigh is loaded, and the Workshop itself is humming beautifully. But Head Elf Pepper asked me one more excellent question over a final cup of cocoa: *“Santa, what if I want some of this magic outside Intent itself? What if I want Claude Code, the Augment Context Engine, RTK, and LiteLLM working together on a machine of my own?”*Quite right, Pepper. One more stop, then. One more lesson before the reindeer sleep.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the next episode, Father Christmas steps just beyond the Workshop walls to show how Intent’s principles carry into an external, token-aware coding stack: &lt;strong&gt;Claude Code + Augment Context Engine MCP + RTK + LiteLLM on a Mac Mini M4 Pro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>devworkflow</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:38:03 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep1-1h0a</link>
      <guid>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep1-1h0a</guid>
      <description>&lt;h1&gt;
  
  
  Santa’s Secret Weapon: Welcome to the Workshop! 🎅
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Ho ho ho! Come in, come in — the fire is warm and the cocoa is hot. Pull up a stool and let Father Christmas tell you a story. Not about reindeer, not about presents — but about the most magical piece of software to land in the Workshop since the invention of the Nice List.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem With Being Father Christmas
&lt;/h2&gt;

&lt;p&gt;Every year it is the same. December arrives like an avalanche, and suddenly Father Christmas has more tasks than minutes.&lt;/p&gt;

&lt;p&gt;The chimneys of the world do not care that Jingle-Bell the Elf is busy repainting the rocking horses while Twinkle the Elf is still debugging the train set firmware. The world expects &lt;strong&gt;one coordinated, perfectly wrapped result&lt;/strong&gt; under every tree by Christmas morning.&lt;/p&gt;

&lt;p&gt;For centuries, I managed this with clipboards, coloured yarn on a corkboard, and a great deal of shouting across the workshop floor. Then, this year, Head Elf Pepper handed me a laptop and said: &lt;em&gt;“Santa, you need to see Augment Intent.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Reader, I wept a single dignified tear into my beard.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Augment Intent?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;Augment Intent&lt;/a&gt; is a &lt;strong&gt;macOS developer workspace&lt;/strong&gt; designed for the age of AI agents. It is not merely a chat window where you ask a single Elf to do one thing. It is a &lt;strong&gt;coordinated workshop&lt;/strong&gt; where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Coordinator&lt;/strong&gt; (that would be me, Father Christmas) breaks down a complex goal into a living &lt;strong&gt;Spec&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialist Agents&lt;/strong&gt; (my Elves) run in &lt;strong&gt;parallel&lt;/strong&gt;, each tackling their portion of the work.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Verifier Agent&lt;/strong&gt; checks that what was built actually matches the Spec.&lt;/li&gt;
&lt;li&gt;The entire workspace — code, browser, terminal, git — lives in &lt;strong&gt;one window&lt;/strong&gt;, and the state &lt;strong&gt;persists&lt;/strong&gt; when you close the lid.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short: it is the North Pole Workshop, but running on silicon instead of snowflakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The North Pole Analogy, Explained
&lt;/h2&gt;

&lt;p&gt;Before we dive into the technical magic in later episodes, let me introduce the cast of characters you will meet throughout this series.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;The Workshop&lt;/th&gt;
&lt;th&gt;Augment Intent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Father Christmas&lt;/td&gt;
&lt;td&gt;Coordinator Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head Elf Pepper&lt;/td&gt;
&lt;td&gt;You, the Developer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Elves&lt;/td&gt;
&lt;td&gt;Specialist Agents (Implement, Verify, Debug, Review…)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Master Gift List&lt;/td&gt;
&lt;td&gt;The Living Spec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Each Elf’s Workbench&lt;/td&gt;
&lt;td&gt;Isolated Workspace / Git Worktree&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Workshop Floor&lt;/td&gt;
&lt;td&gt;Intent’s unified window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Context Engine&lt;/td&gt;
&lt;td&gt;The Workshop’s shared knowledge of every toy design, material, and elf skill&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The magic of Christmas has always been &lt;strong&gt;parallelism with coordination&lt;/strong&gt;. Teddy-bear Elves do not wait for train-set Elves to finish. They work simultaneously, guided by the same Master Gift List. That is precisely what Intent enables for software development.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Series Covers
&lt;/h2&gt;

&lt;p&gt;Over the coming episodes, Father Christmas will walk you through Intent one concept at a time, always in the style of a cosy fireside chat. Here is the full gift list:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Welcome to the Workshop (you are here!)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;The Master Gift List — Living Specs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Santa &amp;amp; the Elves — Coordinator vs Specialist Agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Every Elf Has a Workbench — Isolated Workspaces&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Finishing in Time for Christmas — Spec-Driven Development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;The Context Engine — The Workshop Knows Every Toy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Parallel Elves, No Chaos — Multi-Agent Orchestration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;The Delivery — From Spec to Merged Pull Request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Beyond the Workshop — Intent Meets an External Agent Stack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SIPOC: The Workshop at a Glance
&lt;/h2&gt;

&lt;p&gt;Before any Elf touches a piece of wood, Father Christmas draws the SIPOC on the big blackboard. Here is Intent’s SIPOC.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What provides&lt;/td&gt;
&lt;td&gt;Developer intent, codebase, models (Claude Opus, Sonnet, GPT…)&lt;/td&gt;
&lt;td&gt;Task description, repository files, rules &amp;amp; guidelines&lt;/td&gt;
&lt;td&gt;Spec creation → Coordinator planning → Parallel agent execution → Verification&lt;/td&gt;
&lt;td&gt;Working code, updated spec, pull request&lt;/td&gt;
&lt;td&gt;Engineering team, end users, CI/CD pipeline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop equivalent&lt;/td&gt;
&lt;td&gt;Head Elf Pepper, the toy blueprints, the Elf skill registry&lt;/td&gt;
&lt;td&gt;The gift order, the raw materials, the Elf roster&lt;/td&gt;
&lt;td&gt;Santa writes the Master List → assigns Elves → Elves build in parallel → quality check&lt;/td&gt;
&lt;td&gt;Wrapped, labelled gifts → sleigh&lt;/td&gt;
&lt;td&gt;Children of the world&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Should You Care?
&lt;/h2&gt;

&lt;p&gt;You may be thinking: &lt;em&gt;“Santa, I already have VS Code and a single agent. Why do I need a whole workshop?”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fair question. The answer is the same reason I do not gift-wrap eight billion presents with one pair of hands. Beyond a certain complexity, &lt;strong&gt;serial work with a single agent creates a bottleneck&lt;/strong&gt;. The agent re-explains context, loses state between sessions, and cannot parallelise.&lt;/p&gt;

&lt;p&gt;As Augment’s own manifesto puts it: &lt;em&gt;parallel execution is no longer the hard part — coordination is.&lt;/em&gt; Intent solves the coordination problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Intent is currently in &lt;strong&gt;public beta for macOS&lt;/strong&gt;. You can &lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;download it here&lt;/a&gt;. It works with your existing Augment credits, and you can even bring Claude Code, Codex, or OpenCode if you already have a subscription for those.&lt;/p&gt;

&lt;p&gt;In the next episode, Father Christmas will introduce &lt;strong&gt;The Master Gift List&lt;/strong&gt; — the Living Spec that keeps every Elf pointed at the same star.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Until then: stay warm, write good specs, and remember — Christmas is only ever early for developers who plan ahead.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>aiagents</category>
      <category>devtools</category>
    </item>
    <item>
      <title>Wizard of Oz Warp 🌪️ Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 17 Apr 2026 13:13:15 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/wizard-of-oz-warp-ep1-3e0f</link>
      <guid>https://dev.to/the-software-s-journey/wizard-of-oz-warp-ep1-3e0f</guid>
      <description>&lt;h2&gt;
  
  
  Episode 1: Follow the Yellow Brick Road
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"Toto, I've a feeling we're not in Kansas anymore."— Dorothy Gale, The Wizard of Oz (1939)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Grey Skies of Kansas 🌩️
&lt;/h2&gt;

&lt;p&gt;Kansas is a traditional terminal. It is grey, functional, unchanged since the 1970s in ways that matter. Commands vanish upward in a wall of text. You scroll to find output from thirty seconds ago. The prompt is a single blinking cursor that knows nothing about what you typed last week. An error arrives with no suggestion of how to fix it. You copy-paste from Stack Overflow into a terminal that treats you like a system administrator from 1983.&lt;/p&gt;

&lt;p&gt;You are Dorothy. You have been working in this Kansas for years. It works. Everything works. The Ruby slippers are right there on your feet — you just do not know they are magic yet.&lt;/p&gt;

&lt;p&gt;Then the tornado arrives. It is called &lt;strong&gt;Warp&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  🗂️ SIPOC — The Journey Begins
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Suppliers&lt;/th&gt;
&lt;th&gt;Inputs&lt;/th&gt;
&lt;th&gt;Process&lt;/th&gt;
&lt;th&gt;Outputs&lt;/th&gt;
&lt;th&gt;Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Warp installer (DMG)&lt;/td&gt;
&lt;td&gt;Your Mac Mini M4 Pro, macOS Sequoia&lt;/td&gt;
&lt;td&gt;Download → drag to Applications → launch → authenticate&lt;/td&gt;
&lt;td&gt;A modern Agentic Development Environment running natively on Apple Silicon&lt;/td&gt;
&lt;td&gt;You — with every future episode's workflow running here&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your project idea&lt;/td&gt;
&lt;td&gt;An empty directory&lt;/td&gt;
&lt;td&gt;Scaffold warp-of-oz-tasks with uv, FastAPI, Python 3.12&lt;/td&gt;
&lt;td&gt;A running health endpoint at &lt;a href="http://localhost:8000/health" rel="noopener noreferrer"&gt;http://localhost:8000/health&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;The series codebase that grows across all 8 episodes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warp's block system&lt;/td&gt;
&lt;td&gt;Every command you run&lt;/td&gt;
&lt;td&gt;Group command + output into a navigable atomic Block&lt;/td&gt;
&lt;td&gt;A terminal session you can navigate, copy, search, and share&lt;/td&gt;
&lt;td&gt;Your future self — no more scrolling through output walls&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Land of Oz: What Warp Actually Is 🏙️
&lt;/h2&gt;

&lt;p&gt;Warp is not a terminal emulator with an AI bolt-on. It is an &lt;strong&gt;Agentic Development Environment&lt;/strong&gt; — a rethinking of what the terminal can be when you assume the developer also has access to a large language model, a cloud orchestration platform, and a team knowledge base.&lt;/p&gt;

&lt;p&gt;It has two parts:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Warp Terminal&lt;/strong&gt; — the application you download and run on your Mac. Built in Rust for performance. It supports zsh, bash, fish, and PowerShell. It adds blocks, a code-editor-quality input experience, AI features, a file editor, code review, and the ability to run local agents interactively.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oz&lt;/strong&gt; — the orchestration platform that lives at &lt;code&gt;oz.warp.dev&lt;/code&gt;. Cloud agents that run in the background, triggered by Slack messages, GitHub PRs, Linear issues, or schedules. Oz is the Emerald City — not visible from Dorothy's first view of the munchkin country, but always glowing on the horizon.&lt;/p&gt;

&lt;p&gt;This episode is about arriving. The tornado. The yellow bricks. The first steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install Warp on the Mac Mini M4 Pro 💻
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Option 1: Direct download from warp.dev&lt;/span&gt;
&lt;span class="c"&gt;# Download Warp.dmg → drag to /Applications → launch&lt;/span&gt;

&lt;span class="c"&gt;# Option 2: Homebrew (recommended — keeps it updated)&lt;/span&gt;
brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; warp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Warp runs natively on Apple Silicon — no Rosetta translation. The Mac Mini M4 Pro (24 GB unified memory, 12-core CPU) is an excellent host: Warp launches in under a second and local agent inference runs without thermal throttling.&lt;/p&gt;

&lt;p&gt;After first launch, Warp asks you to sign in. A free account unlocks AI features with generous limits. Sign in with GitHub or email.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verifying the install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Warp will already be your terminal — just confirm it loaded zsh correctly&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$SHELL&lt;/span&gt;
&lt;span class="c"&gt;# /bin/zsh&lt;/span&gt;

&lt;span class="c"&gt;# Confirm macOS version&lt;/span&gt;
sw_vers
&lt;span class="c"&gt;# ProductName:    macOS&lt;/span&gt;
&lt;span class="c"&gt;# ProductVersion: 15.x.x (Sequoia)&lt;/span&gt;
&lt;span class="c"&gt;# BuildVersion:   ...&lt;/span&gt;

&lt;span class="c"&gt;# Confirm architecture&lt;/span&gt;
&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-m&lt;/span&gt;
&lt;span class="c"&gt;# arm64   ← Apple Silicon, not x86_64&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The First Blocks: The Munchkins Welcome You 🌈
&lt;/h2&gt;

&lt;p&gt;The first thing you notice in Warp is that command output is not a river — it is &lt;strong&gt;Blocks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Every command and its output form a single, self-contained unit. The block has a border. You can click anywhere in it to select it. You can navigate between blocks with &lt;code&gt;Ctrl-Up&lt;/code&gt; and &lt;code&gt;Ctrl-Down&lt;/code&gt;. You can copy just the output, just the command, or both — with formatting preserved.&lt;/p&gt;

&lt;p&gt;Try it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run a command&lt;/span&gt;
&lt;span class="nb"&gt;ls&lt;/span&gt; &lt;span class="nt"&gt;-la&lt;/span&gt; ~

&lt;span class="c"&gt;# Click somewhere else, then press Ctrl-Up&lt;/span&gt;
&lt;span class="c"&gt;# You land on the ls -la ~ block, not anywhere in the sea of text&lt;/span&gt;

&lt;span class="c"&gt;# Press Cmd-C on a block to copy just the output&lt;/span&gt;
&lt;span class="c"&gt;# Press Shift-Cmd-C to copy "command + output" — useful for sharing&lt;/span&gt;

&lt;span class="c"&gt;# Type: ls -la ~/Des&lt;/span&gt;
&lt;span class="c"&gt;# Warp auto-completes the path. Press Tab. It works.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the yellow brick road. Every step is paved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up the Series Project: &lt;code&gt;warp-of-oz-tasks&lt;/code&gt; 🏗️
&lt;/h2&gt;

&lt;p&gt;Throughout this series, we build a single Python FastAPI application — a task management API — that grows from a bare scaffold to a production-grade service with authentication, background processing, and cloud agent automation. Every feature is added in Warp, using Warp's tools, on the Mac Mini M4 Pro.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install &lt;code&gt;uv&lt;/code&gt; (Python package manager)
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is a Rust-based Python package manager from Astral. Massively faster than &lt;code&gt;pip&lt;/code&gt;. Perfect pairing with Warp on Apple Silicon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install uv&lt;/span&gt;
curl &lt;span class="nt"&gt;-LsSf&lt;/span&gt; https://astral.sh/uv/install.sh | sh

&lt;span class="c"&gt;# Add to PATH (uv installer does this, but verify)&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
which uv
&lt;span class="c"&gt;# /Users/you/.cargo/bin/uv (or ~/.local/bin/uv)&lt;/span&gt;

uv &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# uv 0.x.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scaffold the project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the project directory&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projects/warp-of-oz-tasks
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/warp-of-oz-tasks

&lt;span class="c"&gt;# Initialise with uv&lt;/span&gt;
uv init &lt;span class="nt"&gt;--name&lt;/span&gt; warp-of-oz-tasks &lt;span class="nt"&gt;--python&lt;/span&gt; 3.12

&lt;span class="c"&gt;# The project structure uv creates:&lt;/span&gt;
&lt;span class="c"&gt;# warp-of-oz-tasks/&lt;/span&gt;
&lt;span class="c"&gt;# ├── .python-version    ← pins Python version&lt;/span&gt;
&lt;span class="c"&gt;# ├── pyproject.toml     ← project metadata and dependencies&lt;/span&gt;
&lt;span class="c"&gt;# ├── README.md&lt;/span&gt;
&lt;span class="c"&gt;# └── hello.py           ← placeholder (we'll replace this)&lt;/span&gt;

&lt;span class="c"&gt;# Add FastAPI and uvicorn&lt;/span&gt;
uv add fastapi &lt;span class="s2"&gt;"uvicorn[standard]"&lt;/span&gt;

&lt;span class="c"&gt;# Confirm&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;pyproject.toml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Write the first source file
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Remove the placeholder&lt;/span&gt;
&lt;span class="nb"&gt;rm &lt;/span&gt;hello.py

&lt;span class="c"&gt;# Create the application entry point&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; src/main.py &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;PYTHON&lt;/span&gt;&lt;span class="sh"&gt;'
"""
warp-of-oz-tasks: A FastAPI task management API.
Built across 8 episodes of the Warp of Oz series on a Mac Mini M4 Pro.
"""
from fastapi import FastAPI
from datetime import datetime

app = FastAPI(
    title="Warp of Oz Tasks",
    description="Follow the yellow brick road — one endpoint at a time.",
    version="0.1.0",
)

@app.get("/health")
async def health_check():
    """The Munchkins confirm you have arrived safely."""
    return {
        "status": "alive",
        "message": "Toto, I've a feeling we're not in Kansas anymore.",
        "timestamp": datetime.utcnow().isoformat(),
    }
&lt;/span&gt;&lt;span class="no"&gt;PYTHON

&lt;/span&gt;&lt;span class="c"&gt;# uv expects src layout — create the package&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; src
&lt;span class="nb"&gt;touch &lt;/span&gt;src/__init__.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait — let's check the &lt;code&gt;pyproject.toml&lt;/code&gt; and fix the source layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Update pyproject.toml to reflect src layout&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; pyproject.toml &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;TOML&lt;/span&gt;&lt;span class="sh"&gt;'
[project]
name = "warp-of-oz-tasks"
version = "0.1.0"
description = "A FastAPI task API — built with Warp, episode by episode."
requires-python = "&amp;gt;=3.12"
dependencies = [
    "fastapi&amp;gt;=0.115.0",
    "uvicorn[standard]&amp;gt;=0.30.0",
]

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[tool.hatch.build.targets.wheel]
packages = ["src"]
&lt;/span&gt;&lt;span class="no"&gt;TOML
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Run the first server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run with uv run (handles the venv automatically)&lt;/span&gt;
uv run uvicorn src.main:app &lt;span class="nt"&gt;--reload&lt;/span&gt; &lt;span class="nt"&gt;--host&lt;/span&gt; 0.0.0.0 &lt;span class="nt"&gt;--port&lt;/span&gt; 8000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open another Warp tab (&lt;code&gt;Cmd-T&lt;/code&gt;) and test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:8000/health | python3 &lt;span class="nt"&gt;-m&lt;/span&gt; json.tool
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#     "status": "alive",&lt;/span&gt;
&lt;span class="c"&gt;#     "message": "Toto, I've a feeling we're not in Kansas anymore.",&lt;/span&gt;
&lt;span class="c"&gt;#     "timestamp": "2026-04-17T..."&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The yellow brick road is paved. The first block sparkles.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Warp Input Editor: Cursor Movement in the Terminal 🖊️
&lt;/h2&gt;

&lt;p&gt;Traditional terminals treat the input line like a 1970s text field. Warp treats it like a code editor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Multi-line input — press Shift-Enter for new lines&lt;/span&gt;
&lt;span class="c"&gt;# The entire block becomes a multi-line script&lt;/span&gt;
python3 &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"
import sys
print(f'Python {sys.version}')
print('Running on Apple Silicon' if 'arm64' in sys.platform else 'Not ARM')
"&lt;/span&gt;

&lt;span class="c"&gt;# Alt-click to place the cursor exactly where you want&lt;/span&gt;
&lt;span class="c"&gt;# Cmd-Z to undo a character you deleted in the input&lt;/span&gt;
&lt;span class="c"&gt;# Select text with Shift-Arrow and delete it&lt;/span&gt;

&lt;span class="c"&gt;# This works like VS Code. Because Warp is built to.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The &lt;code&gt;#&lt;/code&gt; Key: Your First Taste of Magic ✨
&lt;/h2&gt;

&lt;p&gt;Type &lt;code&gt;#&lt;/code&gt; in Warp's input and start describing what you want in plain English:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# show me all python processes running on this machine&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Warp converts this to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ps aux | &lt;span class="nb"&gt;grep &lt;/span&gt;python
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not AI autocomplete. This is natural language to shell command translation. Try more:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# find all files larger than 100MB in my home directory&lt;/span&gt;
&lt;span class="c"&gt;# show disk usage for the current directory sorted by size&lt;/span&gt;
&lt;span class="c"&gt;# what port is uvicorn running on&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Scarecrow is acquiring a brain. But that is Episode 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Project Structure So Far 📁
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/projects/warp-of-oz-tasks/
├── .python-version         ← Python 3.12
├── pyproject.toml          ← dependencies and metadata
├── README.md
└── src/
    ├── __init__.py
    └── main.py             ← health endpoint ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Commit this starting point:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/warp-of-oz-tasks
git init
git add &lt;span class="nb"&gt;.&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"feat: scaffold warp-of-oz-tasks — the tornado has landed"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Series Map: Eight Episodes 🗺️
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Oz parallel&lt;/th&gt;
&lt;th&gt;Warp feature&lt;/th&gt;
&lt;th&gt;Codebase milestone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;This one — Yellow Brick Road&lt;/td&gt;
&lt;td&gt;Dorothy arrives&lt;/td&gt;
&lt;td&gt;Blocks, input editor, # key&lt;/td&gt;
&lt;td&gt;Health endpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;The Scarecrow Gets a Brain&lt;/td&gt;
&lt;td&gt;Scarecrow + brain&lt;/td&gt;
&lt;td&gt;AI completions, Active AI, agent chat&lt;/td&gt;
&lt;td&gt;CRUD endpoints for tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;The Tin Man Gets a Heart&lt;/td&gt;
&lt;td&gt;Tin Man + heart&lt;/td&gt;
&lt;td&gt;WARP.md, Rules, Skills&lt;/td&gt;
&lt;td&gt;Auth middleware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;The Lion Gets Courage&lt;/td&gt;
&lt;td&gt;Cowardly Lion&lt;/td&gt;
&lt;td&gt;Agent pair mode, code review panel&lt;/td&gt;
&lt;td&gt;Debug a planted error&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Flying Monkeys: Dispatch&lt;/td&gt;
&lt;td&gt;Flying monkeys&lt;/td&gt;
&lt;td&gt;Autonomous dispatch mode&lt;/td&gt;
&lt;td&gt;Background task processor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;The Emerald City: Oz&lt;/td&gt;
&lt;td&gt;Emerald City&lt;/td&gt;
&lt;td&gt;Cloud agents, Oz CLI, schedules&lt;/td&gt;
&lt;td&gt;Scheduled cleanup agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;The Ruby Slippers: Augment&lt;/td&gt;
&lt;td&gt;Ruby slippers&lt;/td&gt;
&lt;td&gt;Augment Code Intent + Warp&lt;/td&gt;
&lt;td&gt;Spec-driven feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;There's No Place Like Home&lt;/td&gt;
&lt;td&gt;Going home&lt;/td&gt;
&lt;td&gt;MCP, Warp Drive, full workflow&lt;/td&gt;
&lt;td&gt;Production-ready service&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In &lt;strong&gt;Episode 2&lt;/strong&gt;, the Scarecrow joins the road. He needs a brain. Warp's AI features are exactly that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔗 Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Warp download&lt;/strong&gt;: &lt;a href="https://www.warp.dev" rel="noopener noreferrer"&gt;warp.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Warp documentation&lt;/strong&gt;: &lt;a href="https://docs.warp.dev" rel="noopener noreferrer"&gt;docs.warp.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Oz platform&lt;/strong&gt;: &lt;a href="https://oz.warp.dev" rel="noopener noreferrer"&gt;oz.warp.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;uv (Python package manager)&lt;/strong&gt;: &lt;a href="https://docs.astral.sh/uv" rel="noopener noreferrer"&gt;docs.astral.sh/uv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FastAPI&lt;/strong&gt;: &lt;a href="https://fastapi.tiangolo.com" rel="noopener noreferrer"&gt;fastapi.tiangolo.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;🌪️ Warp of Oz Series follows the Yellow Brick Road through Warp's Agentic Development Environment — from the first install on a Mac Mini M4 Pro to cloud agent orchestration with Oz, with Augment Code Intent as the ruby slippers that were powerful all along.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>warp</category>
      <category>terminal</category>
      <category>macos</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Magic Lamp Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 17 Apr 2026 12:33:42 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/magic-lamp-ep1-558f</link>
      <guid>https://dev.to/the-software-s-journey/magic-lamp-ep1-558f</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"You'll like it — not a lot, but you'll like it."&lt;/em&gt;&lt;br&gt;
— Paul Daniels&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Paul Daniels never actually made things appear from nowhere. The secret to his act was subtler: he made &lt;em&gt;you&lt;/em&gt; see life in the lifeless. A silk handkerchief folded just so. A coin that hesitated before vanishing. The magic wasn't in the props — it was in the relationship between performer and object. The audience believed because the performer believed first.&lt;/p&gt;

&lt;p&gt;This is a project that works the same way.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎭 The Performance
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PIXSTARS&lt;/strong&gt; is a 20-minute silent theatrical piece for a live event. The setup is deliberately sparse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One performer on stage&lt;/li&gt;
&lt;li&gt;One animatronic desk lamp named &lt;strong&gt;Pinokio&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;A live piano&lt;/li&gt;
&lt;li&gt;A deconstructed rendering of Guns N' Roses' &lt;em&gt;November Rain&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;No dialogue. Not a single word.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The lamp is not a prop. It is a co-performer. It has 14 distinct personality states — from &lt;code&gt;INERT&lt;/code&gt; to &lt;code&gt;ARROGANT&lt;/code&gt; to &lt;code&gt;DYING&lt;/code&gt; to &lt;code&gt;REBORN&lt;/code&gt; — and moves through them on choreographed cues as the music plays. The performer holds three simultaneous character identities (Rockstar, Creator, Witness). The lamp holds the mirror.&lt;/p&gt;

&lt;p&gt;Think Kim Ki-duk, not Cirque du Soleil. Sparse. Patient. Emotionally loaded.&lt;/p&gt;




&lt;h2&gt;
  
  
  🪄 The Paul Daniels Problem
&lt;/h2&gt;

&lt;p&gt;When Paul Daniels placed a lifeless prop on his table, it was just an object. The moment he began working with it — tilting, pausing, reacting — it became a &lt;em&gt;character&lt;/em&gt;. The prop hadn't changed. The frame around it had.&lt;/p&gt;

&lt;p&gt;Building Pinokio means solving the same problem in code: how do you cross the line from &lt;em&gt;object that moves&lt;/em&gt; to &lt;em&gt;character that lives&lt;/em&gt;?&lt;/p&gt;

&lt;p&gt;The answer, it turns out, is architecture.&lt;/p&gt;

&lt;p&gt;A lamp that moves on command is a prop. A lamp that has &lt;strong&gt;emotional states&lt;/strong&gt;, &lt;strong&gt;reacts to music&lt;/strong&gt;, &lt;strong&gt;speaks with its body&lt;/strong&gt;, and &lt;strong&gt;wakes up on cue&lt;/strong&gt; — that's a character. The difference is not hardware. It's the layer of abstraction between the mechanical and the theatrical.&lt;/p&gt;

&lt;p&gt;This series documents exactly how that abstraction is built.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ The Stack
&lt;/h2&gt;

&lt;p&gt;Before we get into code, here is the complete hardware and software picture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hardware:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mac Mini M4 Pro&lt;/td&gt;
&lt;td&gt;Show control host, runs everything&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pololu Mini Maestro 24-ch USB servo controller&lt;/td&gt;
&lt;td&gt;Lamp motion brain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4x MG996R servos&lt;/td&gt;
&lt;td&gt;Large articulation: base, shoulder, elbow, head tilt&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2x MG90S servos&lt;/td&gt;
&lt;td&gt;Fine motion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MEAN WELL LRS-50-5 PSU&lt;/td&gt;
&lt;td&gt;5V servo rail, isolated from logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Arduino Nano&lt;/td&gt;
&lt;td&gt;NeoPixel serial bridge (the Maestro doesn't speak NeoPixel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NeoPixel RGBW ring&lt;/td&gt;
&lt;td&gt;Lamp head LED indicator&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Logitech C920 webcam&lt;/td&gt;
&lt;td&gt;Mounted near lamp — gaze source or projection input&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Raspberry Pi Zero 2 WH&lt;/td&gt;
&lt;td&gt;Satellite node: mic, speaker, LED — no soldering required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enttec DMX USB Pro&lt;/td&gt;
&lt;td&gt;Stage lighting control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Software subsystems&lt;/strong&gt; (all on the Mac Mini):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────────────┐
│                   SHOW CONDUCTOR                    │
│           conductor/main.py  (YAML timeline)        │
└────────┬──────────┬──────────┬──────────┬───────────┘
         │ OSC      │ OSC      │ OSC      │ OSC
         ▼          ▼          ▼          ▼
    Port 3819   Port 9001   Port 9002   Port 9003
    ┌───────┐  ┌────────┐  ┌──────────┐  ┌─────────┐
    │Ardour │  │  Lamp  │  │Projection│  │Lighting │
    │  DAW  │  │adapter │  │(pygame)  │  │  (DMX)  │
    └───────┘  └────────┘  └──────────┘  └─────────┘
                                  all mirrored to
                              Port 9004 / WS 8765
                         ┌──────────────────────┐
                         │    Digital Twin      │
                         │  (BabylonJS + Deno)  │
                         └──────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every subsystem speaks &lt;strong&gt;OSC&lt;/strong&gt; (Open Sound Control) over UDP on localhost. The conductor doesn't know or care whether the lamp adapter talks to real servos or a simulator — it just sends &lt;code&gt;/lamp/state CURIOUS&lt;/code&gt; and moves on.&lt;/p&gt;

&lt;p&gt;That decoupling is the key architectural decision. More on that in episode 2.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎛️ OSC: The Nervous System
&lt;/h2&gt;

&lt;p&gt;OSC is the protocol that holds the show together. It's a UDP-based message format originally designed for musical instruments and live sound, which makes it a natural fit for real-time stage control. Messages look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/lamp/state        CURIOUS
/projection/scene  DISNEY_CASTLE
/lighting/state    DISNEY_SOFT
/toggle_roll       (Ardour play/stop)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each subsystem listens on its own port. The conductor dispatches all messages for a single cue within the same 50ms polling tick. The result is near-simultaneous state transitions across audio, video, light, and motion.&lt;/p&gt;

&lt;p&gt;The complete port map:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# conductor/config.py
&lt;/span&gt;&lt;span class="n"&gt;ARDOUR_OSC_PORT&lt;/span&gt;     &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3819&lt;/span&gt;   &lt;span class="c1"&gt;# Ardour 9 control surface
&lt;/span&gt;&lt;span class="n"&gt;LAMP_OSC_PORT&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9001&lt;/span&gt;   &lt;span class="c1"&gt;# Lamp personality adapter
&lt;/span&gt;&lt;span class="n"&gt;PROJECTION_OSC_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9002&lt;/span&gt;   &lt;span class="c1"&gt;# Pygame display
&lt;/span&gt;&lt;span class="n"&gt;LIGHTING_OSC_PORT&lt;/span&gt;   &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9003&lt;/span&gt;   &lt;span class="c1"&gt;# Enttec DMX USB Pro
&lt;/span&gt;&lt;span class="n"&gt;TWIN_OSC_PORT&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9004&lt;/span&gt;   &lt;span class="c1"&gt;# Digital Twin OSC bridge
&lt;/span&gt;&lt;span class="n"&gt;TWIN_WS_PORT&lt;/span&gt;        &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8765&lt;/span&gt;   &lt;span class="c1"&gt;# Digital Twin WebSocket (browser)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⏱️ The Timeline: 15 Cues, 9 Minutes 15 Seconds
&lt;/h2&gt;

&lt;p&gt;The entire show lives in a single YAML file. Here's a slice:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# conductor/timeline.yaml (excerpt)&lt;/span&gt;
&lt;span class="na"&gt;cues&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;SHOW_START&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;INERT&lt;/span&gt;
    &lt;span class="na"&gt;projection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BLACKOUT&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BLACKOUT&lt;/span&gt;
    &lt;span class="na"&gt;ardour&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;{&lt;/span&gt;&lt;span class="nv"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="nv"&gt;transport_play&lt;/span&gt;&lt;span class="pi"&gt;}&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;60.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DRUMS_BEGIN&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;CURIOUS&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;340.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OVERHEATING&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OVERHEATING&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;OVERHEAT&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;380.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;LAMP_DEATH&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DYING&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;DEATH&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;time&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;460.0&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;REVEAL_AI&lt;/span&gt;
    &lt;span class="na"&gt;lamp&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;WEAK&lt;/span&gt;
    &lt;span class="na"&gt;projection&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;AI_SIGNATURE&lt;/span&gt;
    &lt;span class="na"&gt;lighting&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;REBIRTH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At second 0, the lamp is &lt;code&gt;INERT&lt;/code&gt; and Ardour begins playing. By second 60, the drums enter and the lamp becomes &lt;code&gt;CURIOUS&lt;/code&gt;. By second 380, it is &lt;code&gt;DYING&lt;/code&gt;. The arc from object to character to death to rebirth — all scripted, all precise, all driven by this YAML.&lt;/p&gt;

&lt;p&gt;Paul Daniels rehearsed his timing with a stopwatch. So does Pinokio.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔮 What's Coming in This Series
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;1&lt;/strong&gt; (this one)&lt;/td&gt;
&lt;td&gt;Architecture overview — the magic prop metaphor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Show Conductor — OSC dispatching and timeline execution&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;14 Personalities in a Lampshade — servo states and motion vocabulary&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Light the Stage — DMX control, pygame projection, and the digital twin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Finding Its Voice — HiveMind, Coqui XTTS, and the Raspberry Pi satellite&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;By the end of episode 5, Pinokio will have gone from a desk lamp on a table to a character capable of reacting to music, shifting emotional states on cue, speaking in a synthesised voice, and lighting up its own head in synchrony with its mood — all orchestrated from a single Python process on a Mac Mini.&lt;/p&gt;

&lt;p&gt;Not a lot. But you'll like it.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Next: Episode 2 — The Show Conductor: how 15 YAML cues orchestrate five subsystems in real time.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>hardware</category>
      <category>showcontrol</category>
      <category>makers</category>
    </item>
    <item>
      <title>Air Traffic Control Scaleway Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Fri, 17 Apr 2026 10:09:31 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/air-traffic-control-scaleway-ep1-5hcj</link>
      <guid>https://dev.to/the-software-s-journey/air-traffic-control-scaleway-ep1-5hcj</guid>
      <description>&lt;h1&gt;
  
  
  Cleared for Approach: Identity and Access Management on Scaleway
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;“F-A-B, Mr. Tracy. All runways are cleared. But before any aircraft lifts off, we must know exactly&lt;/em&gt; who &lt;em&gt;is behind the controls — and precisely&lt;/em&gt; what &lt;em&gt;they are cleared to do.”&lt;/em&gt;&lt;em&gt;— International Rescue, Thunderbird 5 Orbital Station&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Welcome to the &lt;strong&gt;Scaleway Air Traffic Control Centre&lt;/strong&gt; — your operations hub in the French cloud.&lt;/p&gt;

&lt;p&gt;In this series, we run our infrastructure the way International Rescue manages its missions: with discipline, precision, and absolute clarity about who is authorised to do what. In a busy airport, you do not simply wave aircraft onto the runway. Every pilot has a licence. Every aircraft has a flight plan. Every gate has a crew with specific clearances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity and Access Management (IAM)&lt;/strong&gt; on Scaleway works on precisely this principle.&lt;/p&gt;

&lt;p&gt;Think of your Scaleway &lt;strong&gt;Organisation&lt;/strong&gt; as Thunderbird Island itself — the central command. Your &lt;strong&gt;Projects&lt;/strong&gt; are the individual Thunderbird vehicles: Dev is Thunderbird 1 (fast, agile, first on the scene), Production is Thunderbird 2 (heavy lifting, critical cargo), and Test is Thunderbird 3 (probing unmapped territory). Each requires its own flight crew, its own access codes, and its own launch protocols.&lt;/p&gt;

&lt;p&gt;By the end of this episode, you will have configured the entire clearance architecture: SSH keys, collaborators, groups, applications, policies, and an API key — all locked down in a manner that would satisfy even the most zealous International Rescue security review.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 Mission Parameters
&lt;/h2&gt;

&lt;p&gt;In this hands-on episode, you will learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up multiple &lt;strong&gt;Projects&lt;/strong&gt; within a Scaleway Organisation&lt;/li&gt;
&lt;li&gt;Access the &lt;strong&gt;IAM&lt;/strong&gt; section of the Scaleway Console&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;member accounts&lt;/strong&gt; and invite collaborators to your Organisation&lt;/li&gt;
&lt;li&gt;Navigate between Organisations as a guest member&lt;/li&gt;
&lt;li&gt;Create a &lt;strong&gt;Group&lt;/strong&gt; and assign members to it&lt;/li&gt;
&lt;li&gt;Create &lt;strong&gt;Applications&lt;/strong&gt; for non-human (programmatic) principals&lt;/li&gt;
&lt;li&gt;Define &lt;strong&gt;Policies&lt;/strong&gt; with scoped permission sets for different principals&lt;/li&gt;
&lt;li&gt;Attach an existing Policy to an Application&lt;/li&gt;
&lt;li&gt;Generate an &lt;strong&gt;API key&lt;/strong&gt; with a controlled expiry window&lt;/li&gt;
&lt;li&gt;Authenticate a live Scaleway API request using a secret key&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pre-Launch Checklist
&lt;/h3&gt;

&lt;p&gt;Before Scott Tracy can take Thunderbird 1 to maximum velocity, ground crew run their checks. Do the same:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ You hold an active &lt;a href="https://console.scaleway.com" rel="noopener noreferrer"&gt;Scaleway account&lt;/a&gt; and own an Organisation&lt;/li&gt;
&lt;li&gt;✅ Two teammates are available — they will serve as co-pilots, each assigned a different clearance level&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  📊 SIPOC — How IAM Moves Through the System
&lt;/h2&gt;

&lt;p&gt;Before we touch the Console, let us map the process. IAM is not a single action — it is a pipeline. The &lt;strong&gt;SIPOC&lt;/strong&gt; model (Supplier → Input → Process → Output → Consumer) reveals exactly how identity and access flow through your Scaleway Organisation.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;SIPOC Element&lt;/th&gt;
&lt;th&gt;IAM Equivalent&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;S&lt;/td&gt;
&lt;td&gt;Supplier&lt;/td&gt;
&lt;td&gt;Scaleway IAM engine + your Organisation Owner account&lt;/td&gt;
&lt;td&gt;The platform and the human who configures it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;Input&lt;/td&gt;
&lt;td&gt;Member definitions, Group memberships, Application names, Policy rules&lt;/td&gt;
&lt;td&gt;“User: teammate-1, Group: Developers, Scope: Dev project, Permission: FullAccess”&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P&lt;/td&gt;
&lt;td&gt;Process&lt;/td&gt;
&lt;td&gt;Creating Projects → Onboarding members → Defining Groups → Writing Policies → Issuing API keys&lt;/td&gt;
&lt;td&gt;All the hands-on steps in this episode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;O&lt;/td&gt;
&lt;td&gt;Output&lt;/td&gt;
&lt;td&gt;A working IAM architecture: scoped permissions enforced across all projects&lt;/td&gt;
&lt;td&gt;Teammate 1 can create Instances in Dev. Teammate 2 can create Instances in Production. Applications hold API keys.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Consumer&lt;/td&gt;
&lt;td&gt;Developers, CI/CD pipelines, automation scripts, and applications that interact with Scaleway resources&lt;/td&gt;
&lt;td&gt;Your team, app-1, app-2, and your own curl commands&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Supplier              Input                Process               Output               Consumer
─────────             ─────────            ─────────             ─────────            ─────────
Scaleway IAM   ──▶   Members         ──▶  Create Projects  ──▶  Scoped        ──▶   Developers
engine               Groups               Onboard users         policies              CI/CD
                     Applications         Define groups         enforced              pipelines
Organisation         Policy rules         Write policies        across all            Applications
Owner account        SSH keys             Issue API keys        projects              (app-1, app-2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Tower to crew: The SIPOC view tells us something important — IAM is only as good as the inputs you provide. Vague policy rules produce vague clearances. Garbage in, unrestricted access out. Thunderbird Island does not operate on vague.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🛫 Section 1 — Establishing the Flight Zones: Set Up Projects
&lt;/h2&gt;

&lt;p&gt;Every International Rescue operation begins with a clear separation of zones. We mirror this discipline with three Scaleway Projects.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 — Create Three Projects
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Organisation Dashboard&lt;/strong&gt; menu, select the &lt;strong&gt;Projects&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create Project&lt;/strong&gt; and enter &lt;code&gt;Dev&lt;/code&gt; as the Project Name.&lt;/li&gt;
&lt;li&gt;Repeat to create a project named &lt;code&gt;Production&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Repeat once more for a project named &lt;code&gt;Test&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1.2 — Generate Three SSH Keys — One Per Zone
&lt;/h3&gt;

&lt;p&gt;An SSH key is your pilot’s licence. Each zone gets its own key; cross-zone entry is not permitted. Open your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Generate Ed25519 keys, AES-256-GCM encrypted, no passphrase&lt;/span&gt;
ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"login"&lt;/span&gt; &lt;span class="nt"&gt;-Z&lt;/span&gt; aes256-gcm@openssh.com &lt;span class="se"&gt;\&lt;/span&gt;
           &lt;span class="nt"&gt;-f&lt;/span&gt; handson-iam-dev.pub &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;

ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"login"&lt;/span&gt; &lt;span class="nt"&gt;-Z&lt;/span&gt; aes256-gcm@openssh.com &lt;span class="se"&gt;\&lt;/span&gt;
           &lt;span class="nt"&gt;-f&lt;/span&gt; handson-iam-production.pub &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;

ssh-keygen &lt;span class="nt"&gt;-t&lt;/span&gt; ed25519 &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="s2"&gt;"login"&lt;/span&gt; &lt;span class="nt"&gt;-Z&lt;/span&gt; aes256-gcm@openssh.com &lt;span class="se"&gt;\&lt;/span&gt;
           &lt;span class="nt"&gt;-f&lt;/span&gt; handson-iam-test.pub &lt;span class="nt"&gt;-N&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Why Ed25519? It is modern, compact, and resistant to the brute-force attacks that might trouble a less security-conscious organisation. The -Z &lt;a href="mailto:aes256-gcm@openssh.com"&gt;aes256-gcm@openssh.com&lt;/a&gt; flag encrypts the private key file at rest. International Rescue keeps its launch codes safe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  1.3 — Register SSH Keys to Each Project
&lt;/h3&gt;

&lt;p&gt;Repeat this procedure for &lt;code&gt;Dev&lt;/code&gt;, &lt;code&gt;Test&lt;/code&gt;, and &lt;code&gt;Production&lt;/code&gt; — using the corresponding key file each time.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run &lt;code&gt;cat handson-iam-dev.pub&lt;/code&gt; in your terminal to display the public key.&lt;/li&gt;
&lt;li&gt;Copy the key. It begins with &lt;code&gt;ssh-ed25519&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Organisation Dashboard&lt;/strong&gt;, click the &lt;code&gt;Dev&lt;/code&gt; project, then select the &lt;strong&gt;SSH keys&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add SSH key&lt;/strong&gt;. Enter a name such as &lt;code&gt;Hands on IAM dev&lt;/code&gt; and paste the public key.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add SSH key&lt;/strong&gt; to confirm.&lt;/li&gt;
&lt;li&gt;Repeat for &lt;code&gt;Test&lt;/code&gt; and &lt;code&gt;Production&lt;/code&gt; using their respective key files.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🧑‍✈️ Section 2 — Crew Manifest: Adding Collaborators
&lt;/h2&gt;

&lt;p&gt;No mission launches with anonymous personnel aboard. We now bring our two teammates into the Organisation — each with their own identity and password, ready to receive specific clearances.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Management &amp;amp; Governance&lt;/strong&gt; drop-down, select &lt;strong&gt;IAM&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the &lt;strong&gt;Users&lt;/strong&gt; tab, then click &lt;strong&gt;Create member&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;For each teammate: enter their &lt;code&gt;username&lt;/code&gt;, select &lt;strong&gt;Send password by email&lt;/strong&gt;, then add their &lt;code&gt;email&lt;/code&gt; and personal information. Leave &lt;strong&gt;Assign member to group&lt;/strong&gt; empty for now. Click &lt;strong&gt;Create member&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Ask each teammate to check their inbox and log in to your Organisation.&lt;/li&gt;
&lt;li&gt;Repeat for the second teammate.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Once logged in, teammates can reach your Organisation via the Organisation drop-down → + Add Organisation. They will see the projects you created — but, with no policy assigned yet, they cannot touch anything. Clearance is coming. Patience, as Brains would say.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🏗️ Section 3 — Clearance Architecture: Groups, Applications &amp;amp; Policies
&lt;/h2&gt;

&lt;p&gt;With the crew aboard, we build the clearance architecture — the system that determines who may access which runway, and with what authority.&lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Group&lt;/strong&gt; is a flight crew qualification — all pilots in the group share the same category of clearance.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Policy&lt;/strong&gt; is the air traffic control instruction that says precisely which zones that clearance covers.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;Application&lt;/strong&gt; is an unmanned probe — a programmatic identity with its own flight plan.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.1 — Create the Developers Group
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt;, select the &lt;strong&gt;Groups&lt;/strong&gt; tab. Click &lt;strong&gt;Create group&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Enter &lt;code&gt;Developers&lt;/code&gt; as the Name. Leave Tags empty.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Add a member&lt;/strong&gt; and add your first teammate.&lt;/li&gt;
&lt;li&gt;Confirm with &lt;strong&gt;Create group&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.2 — Deploy Unmanned Probes: Create Applications
&lt;/h3&gt;

&lt;p&gt;Thunderbird 3 can fly to Space Station Alpha without a human crew. Our Applications are the cloud equivalent — automated systems that need identities and permissions, but no login.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt;, select the &lt;strong&gt;Applications&lt;/strong&gt; tab. Click &lt;strong&gt;Create application&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Name it &lt;code&gt;app-1&lt;/code&gt;. Leave Tags and Policy empty. Confirm.&lt;/li&gt;
&lt;li&gt;Repeat to create a second application named &lt;code&gt;app-2&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.3 — Issue Flight Plans: Create Policies &amp;amp; Configure Rules
&lt;/h3&gt;

&lt;p&gt;Three principals. Three policies. Each one a precisely scoped flight authorisation.&lt;/p&gt;

&lt;p&gt;Navigate to &lt;strong&gt;IAM&lt;/strong&gt; → &lt;strong&gt;Policies&lt;/strong&gt; → &lt;strong&gt;Create policy&lt;/strong&gt; for each of the following.&lt;/p&gt;

&lt;h4&gt;
  
  
  Policy A — Developers Group
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Hands on IAM developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;Group → Developers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → Dev project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Permissions&lt;/td&gt;
&lt;td&gt;AllProducts → AllProductsFullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 2 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → All current and future projects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 2 — Permissions&lt;/td&gt;
&lt;td&gt;AllProducts → AllProductsReadOnly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Work through the policy wizard in order: set &lt;strong&gt;① Scope&lt;/strong&gt; and validate; set &lt;strong&gt;② Permission sets&lt;/strong&gt; and validate; leave &lt;strong&gt;③ CEL conditions&lt;/strong&gt; empty; add a second rule via &lt;strong&gt;Add rule&lt;/strong&gt; and repeat. Finalise with &lt;strong&gt;Create policy&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Tower confirms: Teammate 1 now has full command over the Dev zone and read-only visibility everywhere else. Ask them to attempt launching an Instance in both Dev and Production. Dev succeeds; Production refuses. Exactly as the clearance system intends.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Policy B — Individual User
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Hands on IAM User&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;User → Teammate 2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → Production project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Permissions&lt;/td&gt;
&lt;td&gt;Compute → InstancesFullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Tower confirms: Teammate 2 has been given the Production runway — specifically for compute resources. They can create and manage Instances there, and nowhere else.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  Policy C — Application Principal
&lt;/h4&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;app-policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Principal&lt;/td&gt;
&lt;td&gt;Application → app-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Scope&lt;/td&gt;
&lt;td&gt;Access to resources → Test project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rule 1 — Permissions&lt;/td&gt;
&lt;td&gt;AllProducts → AllProductsFullAccess&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  3.4 — Transfer Flight Plan: Attach Policy to app-2
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;app-2&lt;/code&gt; currently has no clearance — it sits idle on the apron. Rather than writing a new policy, we duplicate the existing &lt;code&gt;app-policy&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt; → &lt;strong&gt;Applications&lt;/strong&gt;, click &lt;code&gt;app-2&lt;/code&gt;, then open the &lt;strong&gt;Groups &amp;amp; Policies&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;In the &lt;strong&gt;Policies&lt;/strong&gt; section, click &lt;strong&gt;Attach a policy&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Duplicate an existing policy&lt;/strong&gt;, then choose &lt;code&gt;app-policy&lt;/code&gt;. Confirm.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🗺️ IAM Architecture — The Clearance Map
&lt;/h2&gt;

&lt;p&gt;Your Organisation’s IAM implementation should now match the following layout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌────────────────────────────────────────────────────────────────┐
│                     ORGANISATION                               │
│                                                                │
│  PRINCIPALS             POLICIES              PROJECTS         │
│  ──────────────         ─────────────         ───────────      │
│                                                                │
│  Developers  ──────▶  IAM developers ──▶  Dev (Full)          │
│  Group                                ──▶  All (Read-Only)    │
│  (Teammate 1)                                                  │
│                                                                │
│  Teammate 2  ──────▶  IAM User       ──▶  Production          │
│  (IAM user)                               (InstancesFullAccess)│
│                                                                │
│  app-1       ──────▶  app-policy     ──▶  Test (Full)         │
│                                                                │
│  app-2       ──────▶  app-policy     ──▶  Test (Full)         │
│               (duplicated)                                     │
└────────────────────────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔑 Section 4 — The Master Override: API Keys
&lt;/h2&gt;

&lt;p&gt;Every control tower has a master key — used sparingly, stored securely, and never left on the desk. In Scaleway, the &lt;strong&gt;API key&lt;/strong&gt; is that master key. It allows you to issue commands to the platform programmatically, bypassing the Console entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 — Generate an API Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In &lt;strong&gt;IAM&lt;/strong&gt;, select the &lt;strong&gt;API keys&lt;/strong&gt; tab. Click &lt;strong&gt;Generate API key&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Myself (IAM user)&lt;/strong&gt; as the bearer.&lt;/li&gt;
&lt;li&gt;Leave Description empty. Set &lt;strong&gt;Expiration&lt;/strong&gt; to &lt;code&gt;1 hour&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;No&lt;/strong&gt; for Object Storage usage.&lt;/li&gt;
&lt;li&gt;Copy and securely store the &lt;strong&gt;Secret Key&lt;/strong&gt; displayed. It will not be shown again.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ Security Protocol — Restricted: A Secret Key is sensitive data of the highest classification. Never commit it to a repository, paste it into a chat message, or leave it in a shell history file. The Organisation Owner’s API key inherits full permissions — treat it accordingly. International Rescue does not negotiate with those who mishandle launch codes.&lt;/p&gt;

&lt;p&gt;Note: When an Organisation Owner generates an API key for themselves, the key carries all permissions, since the Owner holds all permissions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  4.2 — Rename a Project via the Scaleway API
&lt;/h3&gt;

&lt;p&gt;We will demonstrate the API key by renaming the &lt;code&gt;Test&lt;/code&gt; project to &lt;code&gt;updated_test&lt;/code&gt; — without touching the Console. A single &lt;code&gt;curl&lt;/code&gt; command, precisely aimed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;Project&lt;/strong&gt; header drop-down, select &lt;code&gt;Test&lt;/code&gt;, then click &lt;strong&gt;Copy ID&lt;/strong&gt; next to the project name to copy its UUID.&lt;/li&gt;
&lt;li&gt;Open a terminal and run the following command, substituting your actual secret key and project ID:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; PATCH &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Auth-Token: &amp;lt;your_secret_key&amp;gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"name": "updated_test"}'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"https://api.scaleway.com/account/v3/projects/&amp;lt;test_project_id&amp;gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Refresh your browser. The &lt;code&gt;Test&lt;/code&gt; project is now named &lt;code&gt;updated_test&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: Take care with invisible whitespace when copying keys and IDs from the Console — a single hidden character produces a 401 Unauthorised response, and even the most experienced tower controller will spend a frustrating few minutes debugging. You have been warned by someone who has been there.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🚀 Section 5 — Advanced Flight Options
&lt;/h2&gt;

&lt;p&gt;You have now proven your ability at the controls. But International Rescue never stops improving its equipment. The API key you generated can power far more than a single &lt;code&gt;curl&lt;/code&gt; call. Two recommended flight paths once you have your bearings:&lt;/p&gt;

&lt;h3&gt;
  
  
  Scaleway CLI
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://github.com/scaleway/scaleway-cli/blob/master/docs/commands/iam.md" rel="noopener noreferrer"&gt;Scaleway CLI&lt;/a&gt; gives you full IAM control from the terminal. Install it and try:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# List all IAM policies in your organisation&lt;/span&gt;
scw iam policy list

&lt;span class="c"&gt;# Describe a specific policy by ID&lt;/span&gt;
scw iam policy get policy-id&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your-policy-id&amp;gt;

&lt;span class="c"&gt;# List all IAM users&lt;/span&gt;
scw iam user list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Terraform Provider
&lt;/h3&gt;

&lt;p&gt;The &lt;a href="https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/resources/iam_api_key" rel="noopener noreferrer"&gt;Scaleway Terraform provider&lt;/a&gt; lets you manage IAM as infrastructure-as-code. A minimal API key resource looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"scaleway_iam_application"&lt;/span&gt; &lt;span class="s2"&gt;"app_ci"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;        &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"app-ci-pipeline"&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"Programmatic identity for CI/CD pipeline"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"scaleway_iam_api_key"&lt;/span&gt; &lt;span class="s2"&gt;"app_ci_key"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;application_id&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;scaleway_iam_application&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app_ci&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;
  &lt;span class="nx"&gt;description&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"CI pipeline key — rotated monthly"&lt;/span&gt;
  &lt;span class="nx"&gt;expires_at&lt;/span&gt;     &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2026-04-01T00:00:00Z"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The Terraform approach is strongly recommended for any IAM configuration that will persist beyond a lab environment. Infrastructure-as-code means your clearance architecture is version-controlled, peer-reviewed, and reproducible — three qualities that Jeff Tracy demands of every Thunderbird system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  📋 Episode Debrief
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;“All systems nominal. Clearances verified. The runway is yours — and only yours. Thunderbirds are GO.”&lt;/em&gt;&lt;em&gt;— Jeff Tracy, Thunderbird Island Operations Centre&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In this episode, you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Created three Projects — &lt;code&gt;Dev&lt;/code&gt;, &lt;code&gt;Production&lt;/code&gt;, &lt;code&gt;Test&lt;/code&gt; — each with its own SSH key&lt;/li&gt;
&lt;li&gt;✅ Onboarded two collaborators as Organisation members&lt;/li&gt;
&lt;li&gt;✅ Established a &lt;code&gt;Developers&lt;/code&gt; Group for shared clearance management&lt;/li&gt;
&lt;li&gt;✅ Registered two Applications as non-human principals (&lt;code&gt;app-1&lt;/code&gt;, &lt;code&gt;app-2&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;✅ Defined three Policies with scoped permission sets across group, user, and application principals&lt;/li&gt;
&lt;li&gt;✅ Duplicated an existing Policy and attached it to &lt;code&gt;app-2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;✅ Generated an API key with a one-hour expiry window&lt;/li&gt;
&lt;li&gt;✅ Executed a live Scaleway API call via &lt;code&gt;curl&lt;/code&gt; to rename a project&lt;/li&gt;
&lt;li&gt;✅ Mapped the full process through the SIPOC model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The clearance architecture is in place. In the next episode, we will spin up our first compute resources inside these carefully guarded zones — and the IAM rules we built today will be the first thing that greets them.&lt;/p&gt;

&lt;h2&gt;
  
  
  📡 Further Transmissions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.scaleway.com/en/docs/iam/concepts/" rel="noopener noreferrer"&gt;Scaleway IAM documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/scaleway/scaleway-cli/blob/master/docs/commands/iam.md" rel="noopener noreferrer"&gt;Scaleway CLI — IAM command reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://registry.terraform.io/providers/scaleway/scaleway/latest/docs/resources/iam_api_key" rel="noopener noreferrer"&gt;Terraform Provider — &lt;/a&gt;&lt;code&gt;scaleway_iam_api_key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.scaleway.com/en/developers/api/account/#path-projects-update-project" rel="noopener noreferrer"&gt;Scaleway API — Update Project endpoint&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Estimated reading time: 12 minutes. Estimated hands-on time: 45–60 minutes with teammates.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This series is part of the *&lt;/em&gt;&lt;strong&gt;the-software-s-journey&lt;/strong&gt;** publication on DEV.to — cloud infrastructure explained through the metaphors that make it stick.*&lt;/p&gt;

</description>
      <category>scaleway</category>
      <category>cloud</category>
      <category>iam</category>
      <category>security</category>
    </item>
    <item>
      <title>Game on Djangular 🎮 Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Thu, 16 Apr 2026 13:33:21 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/game-on-djangular-ep1-43a8</link>
      <guid>https://dev.to/the-software-s-journey/game-on-djangular-ep1-43a8</guid>
      <description>&lt;h2&gt;
  
  
  Episode 1: Welcome to the Vault
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Every gamer has a backlog. The good ones have a system.”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Backlog Problem 🎯
&lt;/h2&gt;

&lt;p&gt;Every gamer knows the feeling. Forty-three games in your library. You can only name eight of them from memory. Three are half-finished from two years ago. You started one last week but cannot remember whether the save file is on the laptop or the desktop. Someone on Reddit just posted that a game you bought on sale is “not worth it past hour 12” and you are on hour 11.&lt;/p&gt;

&lt;p&gt;You need a Vault.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GameLib&lt;/strong&gt; is that vault: a full-stack web application where gamers manage their personal libraries, track progress, discover new titles, and share reviews. Built for a Web Development course at KBTU, it is a working example of the &lt;strong&gt;Djangular&lt;/strong&gt; stack — Django REST Framework on the backend, Angular on the frontend, PostgreSQL as the game database, and JWT tokens as the keys to your personal collection.&lt;/p&gt;

&lt;p&gt;This series builds GameLib from the ground up and extends it into enterprise territory: XML file exchange with external Linux servers, TLS and mutual TLS certificate management, SailPoint IAM for identity verification, and a full PKI infrastructure managed by &lt;code&gt;django-ca&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗂️ SIPOC — The Vault
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Suppliers&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Inputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Process&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Outputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Customers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Gamers (registered users)&lt;/td&gt;
&lt;td&gt;Game titles, play status, ratings, reviews&lt;/td&gt;
&lt;td&gt;Angular frontend → DRF API → PostgreSQL&lt;/td&gt;
&lt;td&gt;A personal vault: tracked games, statuses, scores, reviews&lt;/td&gt;
&lt;td&gt;The gamer — with a searchable, filterable record of their entire library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The global game catalogue&lt;/td&gt;
&lt;td&gt;Game metadata: title, genre, description, cover image&lt;/td&gt;
&lt;td&gt;Django admin / seed scripts → Game model&lt;/td&gt;
&lt;td&gt;A browsable catalogue of all games the system knows about&lt;/td&gt;
&lt;td&gt;All users — browsing before adding to their vault&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External Linux server (Episodes 5–8)&lt;/td&gt;
&lt;td&gt;XML files containing game catalogue updates or vault exports&lt;/td&gt;
&lt;td&gt;Django backend ↔ Linux server via HTTP/HTTPS/mTLS&lt;/td&gt;
&lt;td&gt;Synchronised data; audit trail; identity-verified exchange&lt;/td&gt;
&lt;td&gt;Enterprise operators, partner systems, compliance teams&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Gamer Metaphor: Your Stack as Your Library 🗂️
&lt;/h2&gt;

&lt;p&gt;The metaphor is exact, not decorative.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Game library world&lt;/th&gt;
&lt;th&gt;Djangular stack&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your game Vault (personal collection)&lt;/td&gt;
&lt;td&gt;PostgreSQL + Django &lt;code&gt;UserGame&lt;/code&gt; model&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The global catalogue you browse&lt;/td&gt;
&lt;td&gt;DRF read-only &lt;code&gt;Game&lt;/code&gt; and &lt;code&gt;Genre&lt;/code&gt; endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adding a game to your Vault&lt;/td&gt;
&lt;td&gt;Authenticated POST to &lt;code&gt;UserGame&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your status badge (Playing/Finished/Planned)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;status&lt;/code&gt; field — string enum on &lt;code&gt;UserGame&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your review and score out of ten&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Review&lt;/code&gt; model — one per user per game&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Genre filter on the shelf&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;django-filter&lt;/code&gt; + DRF &lt;code&gt;FilterBackend&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your login / session token&lt;/td&gt;
&lt;td&gt;JWT via &lt;code&gt;djangorestframework-simplejwt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Angular loading your shelf on login&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;HttpClient&lt;/code&gt; → DRF API → component binding&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exporting saves to a remote server&lt;/td&gt;
&lt;td&gt;Django &lt;code&gt;requests.post()&lt;/code&gt; with XML payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encrypting the connection to the server&lt;/td&gt;
&lt;td&gt;TLS — self-signed cert, &lt;code&gt;verify=ca.crt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both sides proving who they are&lt;/td&gt;
&lt;td&gt;mTLS — mutual certificate handshake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The key factory that issues all certs&lt;/td&gt;
&lt;td&gt;PKI — Root CA + Intermediate CA&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The guild’s member identity check&lt;/td&gt;
&lt;td&gt;SailPoint IAM — verifying server requester&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A banned player’s membership card&lt;/td&gt;
&lt;td&gt;Revoked certificate — CRL or OCSP&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Project Structure 🗂️
&lt;/h2&gt;

&lt;p&gt;Based on the GameLib repository at &lt;a href="https://github.com/software-journey/djangular" rel="noopener noreferrer"&gt;github.com/software-journey/djangular&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;djangular/
├── backend/                    ← Django project
│   ├── manage.py
│   ├── gamelib/                ← Django settings/urls/wsgi
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── games/                  ← Django app: catalogue
│   │   ├── models.py           ← Game, Genre
│   │   ├── serializers.py
│   │   ├── views.py
│   │   └── urls.py
│   ├── vault/                  ← Django app: personal library
│   │   ├── models.py           ← UserGame, Review
│   │   ├── serializers.py
│   │   ├── views.py
│   │   └── urls.py
│   ├── users/                  ← Django app: auth
│   │   ├── models.py           ← Custom User
│   │   ├── serializers.py
│   │   └── views.py
│   ├── xml_bridge/             ← Django app: XML exchange (Ep.5–7)
│   │   ├── client.py           ← HTTP/HTTPS/mTLS requests
│   │   ├── serializers.py      ← lxml XML serialisation
│   │   └── views.py
│   └── requirements.txt
│
└── frontend/gamelib/           ← Angular project
    ├── src/
    │   ├── app/
    │   │   ├── core/           ← AuthService, JwtInterceptor, Guards
    │   │   ├── features/
    │   │   │   ├── catalogue/  ← Browse games, genre filter
    │   │   │   ├── vault/      ← Your library, status, reviews
    │   │   │   └── auth/       ← Login, register
    │   │   └── shared/         ← Components, pipes, models
    │   └── environments/
    └── angular.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Series Map: Nine Episodes 🗺️
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Gamer concept&lt;/th&gt;
&lt;th&gt;Technical concept&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;This one&lt;/em&gt; — Welcome to the Vault&lt;/td&gt;
&lt;td&gt;The backlog problem&lt;/td&gt;
&lt;td&gt;Architecture overview&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Building the Game Catalogue&lt;/td&gt;
&lt;td&gt;Designing the Vault&lt;/td&gt;
&lt;td&gt;Django models, DRF serializers, viewsets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Your Login Token&lt;/td&gt;
&lt;td&gt;The guild membership card&lt;/td&gt;
&lt;td&gt;JWT auth, simplejwt, Angular interceptor&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Loading Your Shelf&lt;/td&gt;
&lt;td&gt;The front of the Vault&lt;/td&gt;
&lt;td&gt;Angular components, services, routing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Save Data Over the Wire&lt;/td&gt;
&lt;td&gt;Syncing to a remote server&lt;/td&gt;
&lt;td&gt;XML POST/GET to Linux server, HTTP toggle&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Encrypting the Channel&lt;/td&gt;
&lt;td&gt;Locking the save file&lt;/td&gt;
&lt;td&gt;TLS, self-signed certs, &lt;code&gt;requests&lt;/code&gt; verify&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Both Sides of the Lock&lt;/td&gt;
&lt;td&gt;Proving who you are&lt;/td&gt;
&lt;td&gt;mTLS, client cert generation, full handshake&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;The Guild Registry&lt;/td&gt;
&lt;td&gt;The guildmaster’s identity check&lt;/td&gt;
&lt;td&gt;SailPoint IAM, SCIM 2.0, access verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;The Key Factory&lt;/td&gt;
&lt;td&gt;Where all locks are made&lt;/td&gt;
&lt;td&gt;PKI management, &lt;code&gt;django-ca&lt;/code&gt;, CRL, OCSP, rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Technology Stack Cheat Sheet 📋
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Backend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.12+&lt;/li&gt;
&lt;li&gt;Django 5.x + Django REST Framework 3.15+&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;djangorestframework-simplejwt&lt;/code&gt; — JWT auth&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;django-filter&lt;/code&gt; — queryset filtering&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;django-cors-headers&lt;/code&gt; — CORS for Angular dev server&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;psycopg2-binary&lt;/code&gt; — PostgreSQL adapter&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requests&lt;/code&gt; — HTTP client for XML exchange&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;lxml&lt;/code&gt; — XML serialisation / deserialisation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cryptography&lt;/code&gt; / OpenSSL — TLS / mTLS cert handling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;django-ca&lt;/code&gt; — PKI certificate authority management&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Angular 17+ with standalone components&lt;/li&gt;
&lt;li&gt;TypeScript 5+&lt;/li&gt;
&lt;li&gt;Angular &lt;code&gt;HttpClient&lt;/code&gt; + &lt;code&gt;HttpInterceptor&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Angular Router with route guards&lt;/li&gt;
&lt;li&gt;RxJS for reactive state&lt;/li&gt;
&lt;li&gt;Angular Material (optional) or TailwindCSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Database:&lt;/strong&gt; PostgreSQL 16+&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;External Linux server:&lt;/strong&gt; Nginx (TLS termination) + custom XML endpoint&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IAM:&lt;/strong&gt; SailPoint IdentityIQ or IdentityNow (SCIM 2.0 API)&lt;/p&gt;




&lt;h2&gt;
  
  
  Quick-Start: Running GameLib Locally 🚀
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone the repo&lt;/span&gt;
git clone https://github.com/Elsa-Yanke/web-dev-project-2026.git
&lt;span class="nb"&gt;cd &lt;/span&gt;web-dev-project-2026

&lt;span class="c"&gt;# Backend setup&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;backend
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv venv
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate          &lt;span class="c"&gt;# Windows: venv\Scripts\activate&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# Create PostgreSQL database&lt;/span&gt;
createdb gamelib_db               &lt;span class="c"&gt;# or use pgAdmin&lt;/span&gt;

&lt;span class="c"&gt;# Configure environment&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env              &lt;span class="c"&gt;# fill in DB credentials, SECRET_KEY&lt;/span&gt;
python manage.py migrate
python manage.py createsuperuser
python manage.py runserver

&lt;span class="c"&gt;# Frontend setup (new terminal)&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; ../frontend/gamelib
npm &lt;span class="nb"&gt;install
&lt;/span&gt;ng serve                          &lt;span class="c"&gt;# http://localhost:4200&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In &lt;strong&gt;Episode 2&lt;/strong&gt;, we open the database and build the models: Game, Genre, UserGame, Review. The Vault takes shape.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔗 Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GameLib repository&lt;/strong&gt;: &lt;a href="https://github.com/software-journey/djangular" rel="noopener noreferrer"&gt;github.com/software-journey/djangular&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Django REST Framework&lt;/strong&gt;: &lt;a href="https://www.django-rest-framework.org" rel="noopener noreferrer"&gt;django-rest-framework.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Angular&lt;/strong&gt;: &lt;a href="https://angular.dev" rel="noopener noreferrer"&gt;angular.dev&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;djangorestframework-simplejwt&lt;/strong&gt;: &lt;a href="https://django-rest-framework-simplejwt.readthedocs.io" rel="noopener noreferrer"&gt;django-rest-framework-simplejwt.readthedocs.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;🎮 Game on Djangular Series is a series about building GameLib — a full-stack game library tracker — with Django REST Framework and Angular, extended with XML exchange, TLS/mTLS, SailPoint IAM, and PKI management.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>django</category>
      <category>angular</category>
      <category>python</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.8</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:40:38 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep8-20d2</link>
      <guid>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep8-20d2</guid>
      <description>&lt;h1&gt;
  
  
  The Gifts Are Under the Tree — From Spec to Merged PR 🎄
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every year, on the morning of December 25th, I allow myself one quiet moment before the sleigh is unpacked and the Thank-You Letters start arriving. I sit in the empty Workshop, still warm from the night’s work, and look at the bare shelves where the gifts used to be. They are gone because they were delivered. Every one of them. On time, as specified, to the right address. That moment — that quiet confirmation that everything worked — is what we have been building towards in this entire series. Today, we deliver.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Complete Picture
&lt;/h2&gt;

&lt;p&gt;Over the past seven episodes, we have assembled all the pieces of the Intent workshop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Episode 1&lt;/strong&gt;: The Workshop and what Intent is.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 2&lt;/strong&gt;: The Living Spec — the source of truth.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 3&lt;/strong&gt;: Santa the Coordinator and the Specialist Elves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 4&lt;/strong&gt;: Isolated workspaces and resumable sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 5&lt;/strong&gt;: Spec-Driven Development and finishing on time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 6&lt;/strong&gt;: The Context Engine — the Workshop Library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Episode 7&lt;/strong&gt;: Multi-agent orchestration in waves.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now we put them all together and walk through a complete Intent session, from the moment Head Elf Pepper opens the application to the moment the pull request is merged.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Scenario
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Add a real-time gift delivery progress dashboard to the North Pole’s internal web application. The dashboard should show live sleigh position, remaining delivery count, and an estimated completion time. It must work on tablets and update every 30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Constraints&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the existing Reindeer GPS API (v2)&lt;/li&gt;
&lt;li&gt;No changes to the Delivery Manifest microservice&lt;/li&gt;
&lt;li&gt;Safari / iPad compatible&lt;/li&gt;
&lt;li&gt;Must pass existing end-to-end test suite&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Open Intent and Set the Goal
&lt;/h2&gt;

&lt;p&gt;Pepper opens Intent on her MacBook. She types into the Coordinator:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;We need a real-time gift delivery dashboard. Show sleigh position
on a map, remaining delivery count, and estimated completion time.
Updates every 30 seconds. Must work on iPad Safari.
Use Reindeer GPS API v2. No changes to Delivery Manifest Service.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator reads this prompt alongside the Context Engine’s analysis of the codebase. It knows the existing frontend stack (React, TypeScript), the API patterns used elsewhere in the project, and the existing test suite structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: The Coordinator Drafts the Living Spec
&lt;/h2&gt;

&lt;p&gt;Within seconds, the Coordinator produces:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Gift Delivery Dashboard — Living Spec&lt;/span&gt;

&lt;span class="gu"&gt;### Goal&lt;/span&gt;
Real-time dashboard showing sleigh position, delivery count,
and ETA. Updates every 30 seconds. iPad Safari compatible.

&lt;span class="gu"&gt;### Success Criteria&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map renders in &amp;lt; 1s on iPad Safari
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Position updates within 30s of GPS data change
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery count matches Manifest API response
&lt;span class="p"&gt;-&lt;/span&gt; [ ] ETA calculated from current position + remaining stops
&lt;span class="p"&gt;-&lt;/span&gt; [ ] All existing e2e tests pass
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Lighthouse accessibility score ≥ 90

&lt;span class="gu"&gt;### Constraints&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Reindeer GPS API v2 (existing auth token pattern)
&lt;span class="p"&gt;-&lt;/span&gt; Delivery Manifest Service: read-only, no new endpoints
&lt;span class="p"&gt;-&lt;/span&gt; Safari / iPad: no Chrome-only APIs

&lt;span class="gu"&gt;### Architecture&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New React component: &lt;span class="sb"&gt;`&amp;lt;DeliveryDashboard /&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GPS polling service (30s interval, exponential backoff on fail)
&lt;span class="p"&gt;-&lt;/span&gt; Map: Leaflet.js (already in dependencies — see package.json)
&lt;span class="p"&gt;-&lt;/span&gt; Offline fallback: show last known position with staleness indicator

&lt;span class="gu"&gt;### Tasks&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; [ ] GPS Polling Service — GPS Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Map Component — Map Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Delivery Count &amp;amp; ETA Widget — Data Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Safari/iPad CSS fixes — Responsive Elf
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Integration tests — Test Elf (starts after GPS + Map done)
&lt;span class="p"&gt;-&lt;/span&gt; [ ] Accessibility audit — A11y Elf (background)

&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
(none yet)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reads the spec. She adds one clarification: &lt;em&gt;“ETA should display in local Workshop time, not UTC.”&lt;/em&gt; The Coordinator updates the spec and records the decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Review time: 4 minutes. No code written yet. One important decision already captured.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Intent Creates Isolated Workspaces
&lt;/h2&gt;

&lt;p&gt;The Coordinator identifies the dependency graph:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GPS Elf and Map Elf can start in parallel immediately.&lt;/li&gt;
&lt;li&gt;Data Elf can start immediately (it only reads from the Manifest API).&lt;/li&gt;
&lt;li&gt;Responsive Elf can start once Map Elf has a working component.&lt;/li&gt;
&lt;li&gt;Test Elf starts after GPS Elf and Map Elf complete.&lt;/li&gt;
&lt;li&gt;A11y Elf runs as a background agent throughout.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Intent creates five Git worktrees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat/dashboard-gps-service        ← GPS Elf
feat/dashboard-map-component      ← Map Elf
feat/dashboard-data-widgets       ← Data Elf
feat/dashboard-responsive         ← Responsive Elf (waiting)
feat/dashboard-tests              ← Test Elf (waiting)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wave 1 agents — GPS Elf, Map Elf, Data Elf — start simultaneously. The A11y Elf begins in the background.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Wave 1 Runs
&lt;/h2&gt;

&lt;p&gt;Pepper watches the Intent window. Three agent conversations are active. Code appears in the Changes panel. The spec’s task list updates as work progresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GPS Elf&lt;/strong&gt; implements the polling service, using the existing auth token pattern it found via the Context Engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// gps-polling.service.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GpsPollingService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="nx"&gt;_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;startPolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;SleighPosition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;poll&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;reindeerGpsApi&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getCurrentPosition&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="nf"&gt;onUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;interval&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nf"&gt;poll&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The spec updates: ✅ GPS Polling Service — GPS Elf — done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Map Elf&lt;/strong&gt; creates the &lt;code&gt;&amp;lt;DeliveryMap /&amp;gt;&lt;/code&gt; component using Leaflet.js, which it found already installed in &lt;code&gt;package.json&lt;/code&gt; via the Context Engine. It does not install a duplicate library.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Elf&lt;/strong&gt; builds the delivery count and ETA widget, correctly calling the Manifest API’s read-only endpoint and displaying ETA in Workshop local time (it read the spec decision).&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Handoffs and Wave 2
&lt;/h2&gt;

&lt;p&gt;Both GPS Elf and Map Elf report completion. The spec records the interfaces they produced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;### Decisions&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; GPS service exposes: &lt;span class="sb"&gt;`startPolling(cb: (SleighPosition) =&amp;gt; void)`&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Map component props: &lt;span class="sb"&gt;`{ position: SleighPosition; zoom?: number }`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Coordinator briefs Responsive Elf with the updated spec and the actual component structure. No guesswork. Test Elf receives both the GPS service interface and the Map component props, plus the existing e2e test patterns from the Context Engine.&lt;/p&gt;

&lt;p&gt;Wave 2 begins. Responsive Elf adds Safari/iPad CSS. Test Elf writes integration tests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: The Verifier Checks Everything
&lt;/h2&gt;

&lt;p&gt;Wave 2 complete. The Coordinator spawns the Verifier Elf with the full spec and all five implementations.&lt;/p&gt;

&lt;p&gt;Verifier’s report:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✅ Map renders in &amp;lt; 1s on iPad Safari — confirmed (Lighthouse: 0.7s)
✅ Position updates within 30s — confirmed
✅ Delivery count matches Manifest API — confirmed
✅ ETA in Workshop local time — confirmed
✅ Existing e2e tests pass — confirmed
✅ Lighthouse accessibility score ≥ 90 — confirmed (score: 94)
⚠️  Minor: GPS service does not log polling errors to existing
    structured logger (see logger.ts — used throughout codebase)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The warning is real and useful. The Context Engine told the Verifier about &lt;code&gt;logger.ts&lt;/code&gt;. A generic agent would have missed it.&lt;/p&gt;

&lt;p&gt;The Coordinator sends the GPS Elf back for a five-minute fix. It adds one line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GPS polling failed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;backoff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;backoff&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Re-verification: all green.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: The Pull Request
&lt;/h2&gt;

&lt;p&gt;The Coordinator integrates all five worktrees into a single branch &lt;code&gt;feat/delivery-dashboard&lt;/code&gt; and opens a pull request. The PR description is generated from the Living Spec:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Gift Delivery Dashboard&lt;/span&gt;

Implements real-time dashboard (sleigh position, delivery count, ETA).

&lt;span class="gu"&gt;### Changes&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`GpsPollingService`&lt;/span&gt; with 30s polling + exponential backoff
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryMap /&amp;gt;`&lt;/span&gt; using existing Leaflet.js dependency
&lt;span class="p"&gt;-&lt;/span&gt; New: &lt;span class="sb"&gt;`&amp;lt;DeliveryStats /&amp;gt;`&lt;/span&gt; widget with ETA in Workshop local time
&lt;span class="p"&gt;-&lt;/span&gt; New: iPad/Safari responsive CSS
&lt;span class="p"&gt;-&lt;/span&gt; New: Integration test suite (12 tests, all passing)

&lt;span class="gu"&gt;### Verified Against Spec&lt;/span&gt;
All 6 success criteria confirmed by Verifier Agent.
Existing e2e suite: all passing.

&lt;span class="gu"&gt;### Decisions Recorded&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; ETA displayed in Workshop local time (not UTC) — per Pepper, Dec 3
&lt;span class="p"&gt;-&lt;/span&gt; Used existing Leaflet.js (not installed new mapping library)
&lt;span class="p"&gt;-&lt;/span&gt; GPS errors logged via existing structured logger (logger.ts)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pepper reviews the spec (4 minutes). She reviews the diff (10 minutes, because the spec told her exactly what to look for). She approves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Total elapsed time: 47 minutes. Zero rework. Christmas safe.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What We Built Together
&lt;/h2&gt;

&lt;p&gt;Over this series, Father Christmas and Head Elf Pepper have explained every layer of Intent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concept&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;th&gt;Workshop Equivalent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Living Spec&lt;/td&gt;
&lt;td&gt;Source of truth, auto-updated&lt;/td&gt;
&lt;td&gt;Master Gift List&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coordinator Agent&lt;/td&gt;
&lt;td&gt;Plans, delegates, manages handoffs&lt;/td&gt;
&lt;td&gt;Father Christmas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specialist Agents&lt;/td&gt;
&lt;td&gt;Execute focused tasks in parallel&lt;/td&gt;
&lt;td&gt;Craft Elves&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Isolated Workspaces&lt;/td&gt;
&lt;td&gt;No collisions between parallel agents&lt;/td&gt;
&lt;td&gt;Private workbenches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec-Driven Development&lt;/td&gt;
&lt;td&gt;Plan first, code follows&lt;/td&gt;
&lt;td&gt;Write the List before carving begins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context Engine&lt;/td&gt;
&lt;td&gt;Deep codebase knowledge for every agent&lt;/td&gt;
&lt;td&gt;The Workshop Library&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-Agent Orchestration&lt;/td&gt;
&lt;td&gt;Waves, handoffs, background agents&lt;/td&gt;
&lt;td&gt;Workshop floor choreography&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resumable Sessions&lt;/td&gt;
&lt;td&gt;State preserved across restarts&lt;/td&gt;
&lt;td&gt;Workshop never forgets&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  SIPOC: The Complete Intent Workflow
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Developer, Coordinator, Specialists, Context Engine, AI models&lt;/td&gt;
&lt;td&gt;Goal statement, codebase, constraints, model selection&lt;/td&gt;
&lt;td&gt;Spec → Review → Wave 1 agents → Handoffs → Wave 2 → Verifier → PR&lt;/td&gt;
&lt;td&gt;Verified code, living spec, decision log, merged PR&lt;/td&gt;
&lt;td&gt;Engineering team, product owner, CI/CD, end users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;Pepper, Father Christmas, all Elves, the Library&lt;/td&gt;
&lt;td&gt;Gift order, Workshop constraints, quality standards&lt;/td&gt;
&lt;td&gt;Write List → Agree → Parallel building → Handoffs → QC → Sleigh&lt;/td&gt;
&lt;td&gt;All gifts delivered correctly, on time, to every child&lt;/td&gt;
&lt;td&gt;Children of the world&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Intent is available in &lt;strong&gt;public beta for macOS&lt;/strong&gt;. &lt;a href="https://www.augmentcode.com/product/intent" rel="noopener noreferrer"&gt;Download it here&lt;/a&gt;. It uses your existing Augment credits. You can also bring Claude Code, Codex, or OpenCode if you already have subscriptions.&lt;/p&gt;

&lt;p&gt;Augment’s documentation is at &lt;a href="https://docs.augmentcode.com" rel="noopener noreferrer"&gt;docs.augmentcode.com&lt;/a&gt;. Their manifesto — &lt;em&gt;The End of Linear Work&lt;/em&gt; — is worth reading before your first session.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Final Word from Father Christmas
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;I have been doing this for over a thousand years. Every century, the tools improve. The quill gave way to the telegraph, the telegraph to the computer, and now the computer gives way to the agent. But the fundamental challenge has never changed: how do you coordinate complex, parallel work towards a shared goal, on an unmovable deadline, without chaos?The answer, in 1025 and in 2025, is the same: a clear plan, a good team, and the discipline to keep the plan honest.Augment Intent is the first software I have encountered that truly understands this. It puts the plan first. It keeps the plan honest. It coordinates the team without the Elves colliding. And it finishes on time.I am proud of everything we have built in this Workshop. I hope you will build something wonderful in yours.Merry Christmas, and Happy Coding.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;This concludes the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. All eight episodes are available on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thank you for reading. May your specs be living and your merges be clean.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>devworkflow</category>
      <category>aiagents</category>
    </item>
    <item>
      <title>Santa Augmentcode Intent Ep.6</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:40:32 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep6-5g3e</link>
      <guid>https://dev.to/the-software-s-journey/santa-augmentcode-intent-ep6-5g3e</guid>
      <description>&lt;h1&gt;
  
  
  The Workshop Knows Every Toy — The Context Engine 🧠
&lt;/h1&gt;

&lt;p&gt;Accompanying source code repository: &lt;a href="https://github.com/software-journey/augmentcode-intent" rel="noopener noreferrer"&gt;&lt;code&gt;Santa Augmentcode Intent&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;People often ask: how do the Elves know how to build anything? We do not run a formal university. There is no Elf Academy. The answer is the Workshop Library — a living collection of every toy blueprint, every material data sheet, every technique manual, and every lesson learned from every Christmas since 843 AD. When an Elf sits down at their workbench, they are not starting from scratch. They are standing on twelve centuries of accumulated knowledge. Augment calls their version of this the Context Engine. I call it essential.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Problem Every AI Tool Has
&lt;/h2&gt;

&lt;p&gt;Most AI coding tools share one fundamental limitation: they know a great deal about programming in general, and almost nothing about &lt;strong&gt;your&lt;/strong&gt; codebase in particular.&lt;/p&gt;

&lt;p&gt;Ask a generic AI assistant to add a feature to your application and it will produce something that compiles — but may ignore your naming conventions, duplicate utilities you already have, conflict with an architecture decision made six months ago, or violate a security pattern your team spent weeks establishing.&lt;/p&gt;

&lt;p&gt;The AI does not know what it does not know. And what it does not know is everything specific to you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Context Engine Does
&lt;/h2&gt;

&lt;p&gt;Augment’s Context Engine solves this by maintaining a &lt;strong&gt;live, semantic understanding of your entire stack&lt;/strong&gt; — not just the files you have open, but everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt;: every file, class, function, interface across the whole repository.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies&lt;/strong&gt;: the libraries you use and how you use them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: inline comments, READMEs, architecture docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style&lt;/strong&gt;: your naming conventions, code patterns, formatting preferences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recent changes&lt;/strong&gt;: what has changed, when, and why (from commit messages and PRs).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Issues&lt;/strong&gt;: open tickets and known problems in the tracker.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Context Engine does not just store this as flat text. It builds &lt;strong&gt;semantic understanding&lt;/strong&gt; — it knows that &lt;code&gt;UserAuthService&lt;/code&gt; depends on &lt;code&gt;TokenRepository&lt;/code&gt;, that the codebase uses dependency injection everywhere, that the team agreed six weeks ago to use RS256 for all signing operations.&lt;/p&gt;

&lt;p&gt;When a Specialist Agent is spawned in Intent, it does not receive a raw dump of your entire codebase (which would exceed any model’s context window). The Context Engine &lt;strong&gt;curates&lt;/strong&gt; the relevant context: from 4,456 potential sources, it selects the 682 actually relevant to this task. The Elf gets the right blueprints for the toy it is building, not the entire library.&lt;/p&gt;

&lt;h2&gt;
  
  
  The North Pole Library Analogy
&lt;/h2&gt;

&lt;p&gt;Imagine your Workshop contains twelve centuries of toy designs. Before the Context Engine, an Elf would walk to the Library, spend an hour searching, find three relevant blueprints, and guess at the rest. Slow, incomplete, error-prone.&lt;/p&gt;

&lt;p&gt;With the Context Engine, the Library is &lt;strong&gt;live and intelligent&lt;/strong&gt;. The moment an Elf is assigned to build a toy locomotive, the Library automatically surfaces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every locomotive built in the past ten years (with the code patterns used).&lt;/li&gt;
&lt;li&gt;The wheel standard the Workshop adopted in 2019.&lt;/li&gt;
&lt;li&gt;The paint specification that applies to all wheeled toys.&lt;/li&gt;
&lt;li&gt;The safety test that all vehicles must pass.&lt;/li&gt;
&lt;li&gt;The in-progress work by the Gauge Elf that this locomotive’s tracks must match.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Elf starts with full situational awareness. It will not accidentally use the old wheel standard. It will not duplicate the paint specification utility someone wrote three years ago. It will not create a track gauge that conflicts with the in-progress work next door.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters for Multi-Agent Work
&lt;/h2&gt;

&lt;p&gt;In single-agent workflows, limited context is an inconvenience. The agent produces slightly generic code that needs tidying.&lt;/p&gt;

&lt;p&gt;In multi-agent workflows, limited context is a &lt;strong&gt;coordination failure&lt;/strong&gt;. If Agent A does not know that Agent B is using RS256 signing, Agent A might implement its own signing with a different algorithm. The Verifier will catch this — but only after both agents have done significant work that now needs to be reconciled.&lt;/p&gt;

&lt;p&gt;The Context Engine prevents this by ensuring &lt;strong&gt;all agents share the same understanding&lt;/strong&gt; of the codebase from the start. When the Coordinator drafts the spec, it can declare &lt;em&gt;“use RS256 for signing — see existing pattern in *&lt;code&gt;auth/signing.ts&lt;/code&gt;&lt;/em&gt;”* because it has that knowledge available. Every Specialist that reads the spec inherits that context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context Engine vs Vanilla Models: The Numbers
&lt;/h2&gt;

&lt;p&gt;Augment published benchmarks comparing agent performance on the Elasticsearch repository (3.6 million lines of Java, 2,187 contributors). Their agents — powered by the Context Engine — outperformed other tools on a blind evaluation of 500 agent-generated pull requests:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Criterion&lt;/th&gt;
&lt;th&gt;Augment&lt;/th&gt;
&lt;th&gt;Others&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Overall&lt;/td&gt;
&lt;td&gt;Outperforms&lt;/td&gt;
&lt;td&gt;Underperforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Correctness&lt;/td&gt;
&lt;td&gt;+14.8&lt;/td&gt;
&lt;td&gt;-9 to -12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Reuse&lt;/td&gt;
&lt;td&gt;Notable&lt;/td&gt;
&lt;td&gt;Below baseline&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best Practice adherence&lt;/td&gt;
&lt;td&gt;Strong&lt;/td&gt;
&lt;td&gt;Weakest area&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The largest gap was in &lt;strong&gt;code reuse&lt;/strong&gt; and &lt;strong&gt;best practice adherence&lt;/strong&gt; — exactly the dimensions where knowing the codebase matters most. Any model can write code that compiles. Knowing when to reuse an existing utility instead of writing a new one requires context.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Context Engine Feeds Intent Specifically
&lt;/h2&gt;

&lt;p&gt;Inside Intent, the Context Engine serves three distinct consumers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Coordinator&lt;/strong&gt; uses it to write a better spec. When it knows the existing architecture, it can propose task decompositions that respect real dependencies rather than imagined ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Specialists&lt;/strong&gt; use it to write better code. They know the patterns, the utilities, the interfaces they must respect.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Verifier&lt;/strong&gt; uses it to catch spec violations that are only visible with codebase knowledge. “This code bypasses the existing rate-limiting middleware” is only a useful comment if the Verifier knows that middleware exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  SIPOC: Context Engine in Action
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;S — Suppliers&lt;/th&gt;
&lt;th&gt;I — Inputs&lt;/th&gt;
&lt;th&gt;P — Process&lt;/th&gt;
&lt;th&gt;O — Outputs&lt;/th&gt;
&lt;th&gt;C — Customers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Who/What&lt;/td&gt;
&lt;td&gt;Repository, CI/CD history, docs, issues, recent changes&lt;/td&gt;
&lt;td&gt;Raw codebase files, dependency manifests, commit history, tickets&lt;/td&gt;
&lt;td&gt;Index → Semantic analysis → Relevance ranking → Context curation per task&lt;/td&gt;
&lt;td&gt;Curated, task-relevant context for each agent&lt;/td&gt;
&lt;td&gt;Coordinator Agent, all Specialist Agents, Verifier Agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workshop&lt;/td&gt;
&lt;td&gt;The Workshop Library (12 centuries of blueprints)&lt;/td&gt;
&lt;td&gt;Every toy design, material spec, historical decisions&lt;/td&gt;
&lt;td&gt;Library catalogues → Semantic search → Relevant blueprints selected per Elf&lt;/td&gt;
&lt;td&gt;Exactly the right materials and references for each workbench&lt;/td&gt;
&lt;td&gt;Every Elf, Father Christmas, Quality Control&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  A Note on Privacy
&lt;/h2&gt;

&lt;p&gt;Father Christmas takes privacy seriously. So does Augment. The Context Engine processes your codebase to build its index, and Augment’s &lt;a href="https://trust.augmentcode.com" rel="noopener noreferrer"&gt;Trust Center&lt;/a&gt; documents how data is handled. For enterprise teams with sensitive codebases, it is worth reviewing before you hand the Library over to the Engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Comes Next
&lt;/h2&gt;

&lt;p&gt;In Episode 7, we bring everything together: multiple Elves, working simultaneously, without chaos. &lt;strong&gt;Multi-Agent Orchestration&lt;/strong&gt; — the art of running a parallel workshop without collision, confusion, or Christmas catastrophe.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An Elf without context is an Elf making expensive guesses. Give them the Library. Give them the Context Engine. Watch them build miracles.Ho ho ho! 🎅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Part of the &lt;a href="https://dev.to/wvanheemstra/series/37310"&gt;Santa Augmentcode Intent&lt;/a&gt; series. Published on &lt;a href="https://dev.to"&gt;dev.to&lt;/a&gt; under the &lt;a href="https://dev.to/the-software-s-journey"&gt;the-software-s-journey&lt;/a&gt; organisation.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>augmentcode</category>
      <category>intent</category>
      <category>contextengine</category>
      <category>ai</category>
    </item>
    <item>
      <title>Luxo Jr. ThingsBoard 🎬 Ep.1</title>
      <dc:creator>Willem van Heemstra</dc:creator>
      <pubDate>Mon, 13 Apr 2026 20:40:13 +0000</pubDate>
      <link>https://dev.to/the-software-s-journey/luxo-jr-thingsboard-ep1-1co5</link>
      <guid>https://dev.to/the-software-s-journey/luxo-jr-thingsboard-ep1-1co5</guid>
      <description>&lt;h2&gt;
  
  
  Episode 1: The Prop That Came Alive
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“The question is not whether a lamp can have a personality. The question is whether you are willing to do the work to give it one.”&lt;/em&gt;&lt;br&gt;
— paraphrasing John Lasseter, very liberally&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  A Desk Lamp That Changed Everything 💡
&lt;/h2&gt;

&lt;p&gt;In 1986, John Lasseter had a real Luxo brand desk lamp on his drawing table. He had been using it as a rendering model — studying how light fell on its surfaces, how its joints articulated. It was a prop. An inert object. A piece of hardware.&lt;/p&gt;

&lt;p&gt;Then he gave it joints. He gave it movement. He gave it &lt;em&gt;reaction&lt;/em&gt; — a curious tilt of the head when the ball rolled by, a deflated slump when the ball burst, an instant excited pivot when something bigger and bouncier appeared. He gave it a story.&lt;/p&gt;

&lt;p&gt;Within two minutes of film, the audience at SIGGRAPH 1986 was on its feet screaming. Not because the lamp was technically impressive — though it was. Because they had forgotten it was a lamp. It had become, impossibly, &lt;em&gt;something alive&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This is the precise ambition of the IoT platform &lt;strong&gt;ThingsBoard&lt;/strong&gt;: to take your physical hardware — sensors, actuators, meters, controllers — and give them the equivalent of Lasseter’s joints. Telemetry. Attributes. Dashboards. Rules. Relationships. Commands. To animate the inert thing and turn it into something you can watch, understand, and direct.&lt;/p&gt;

&lt;p&gt;In this series, we build stage props. We give them personality. By Episode 8, they will perform.&lt;/p&gt;




&lt;h2&gt;
  
  
  🗂️ SIPOC — The Stage
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Suppliers&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Inputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Process&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Outputs&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Customers&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Physical devices (sensors, actuators, meters)&lt;/td&gt;
&lt;td&gt;Raw telemetry data: temperature, humidity, power, position&lt;/td&gt;
&lt;td&gt;ThingsBoard: ingest, store, visualise, process, alert&lt;/td&gt;
&lt;td&gt;Live dashboards, alarm notifications, RPC commands, analytics&lt;/td&gt;
&lt;td&gt;Operators, homeowners, engineers, stakeholders — anyone who needs to &lt;em&gt;see and act on&lt;/em&gt; what devices are doing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Home Assistant (Ep.7)&lt;/td&gt;
&lt;td&gt;Entity states and sensor readings via MQTT&lt;/td&gt;
&lt;td&gt;MQTT bridge: HA → ThingsBoard for enterprise-scale visualisation&lt;/td&gt;
&lt;td&gt;Enterprise dashboard showing all HA devices alongside industrial sensors&lt;/td&gt;
&lt;td&gt;IT/OT teams bridging consumer smart home with professional IoT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ThingsBoard AI Solution Creator (Ep.6)&lt;/td&gt;
&lt;td&gt;A plain-language description of your use case&lt;/td&gt;
&lt;td&gt;AI agent: generates entity profiles, dashboards, alarm rules, roles&lt;/td&gt;
&lt;td&gt;A working prototype of your IoT solution in under 10 minutes&lt;/td&gt;
&lt;td&gt;System integrators, explorers, business stakeholders doing PoC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The Stage Props Metaphor 🎭
&lt;/h2&gt;

&lt;p&gt;Every stage production has &lt;strong&gt;props&lt;/strong&gt; — the physical objects on stage that the cast interacts with: lamps, chairs, telephones, clocks. A prop sitting in the prop house is inert. It has physical properties (weight, colour, shape) but no story, no behaviour, no relationship to anything else.&lt;/p&gt;

&lt;p&gt;Bring the prop onto the stage and give it context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;position&lt;/strong&gt; (where on the stage it sits)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;character&lt;/strong&gt; (what role it plays in the story)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Joints&lt;/strong&gt; (how it can move and change)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cues&lt;/strong&gt; (when it does something — the lamp flickers when the villain enters)&lt;/li&gt;
&lt;li&gt;A place on the &lt;strong&gt;prompt book&lt;/strong&gt; (the director’s master view of the whole production)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly what ThingsBoard does to a physical sensor or actuator:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage props world&lt;/th&gt;
&lt;th&gt;ThingsBoard world&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;An inert prop in the prop house&lt;/td&gt;
&lt;td&gt;A sensor with no platform — just hardware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Giving the prop joints &amp;amp; articulation&lt;/td&gt;
&lt;td&gt;Registering a &lt;strong&gt;Device&lt;/strong&gt; with a &lt;strong&gt;Device Profile&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The prop’s observable state&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Telemetry&lt;/strong&gt; — timestamped key-value data the device sends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The prop’s fixed characteristics&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Attributes&lt;/strong&gt; — static properties (location, model number, threshold)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Grouping props on the same set&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Assets&lt;/strong&gt; — logical containers (rooms, floors, buildings)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The director’s prompt book&lt;/td&gt;
&lt;td&gt;The &lt;strong&gt;Dashboard&lt;/strong&gt; — master view of the whole production&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A lighting cue (“if lamp &amp;gt; 50°C → warn director”)&lt;/td&gt;
&lt;td&gt;An &lt;strong&gt;Alarm Rule&lt;/strong&gt; — automated trigger on telemetry threshold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The director calling “Action!”&lt;/td&gt;
&lt;td&gt;An &lt;strong&gt;RPC command&lt;/strong&gt; — instructing a device to do something&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The Pixar logo animation&lt;/td&gt;
&lt;td&gt;Your finished, running, production-grade IoT solution&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Luxo Jr. had one prop — a desk lamp — and gave it so much personality that it became a mascot seen before every Pixar film for forty years. You have sensors, meters, and controllers. ThingsBoard gives them the same treatment.&lt;/p&gt;




&lt;h2&gt;
  
  
  What ThingsBoard Actually Is 🏗️
&lt;/h2&gt;

&lt;p&gt;ThingsBoard is an &lt;strong&gt;open-source IoT platform&lt;/strong&gt; for data collection, processing, visualisation, and device management. It is production-grade: companies use it to manage tens of thousands of devices across smart energy, fleet tracking, agriculture, smart buildings, and industrial automation.&lt;/p&gt;

&lt;h3&gt;
  
  
  The key capabilities
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Device connectivity&lt;/strong&gt; — ThingsBoard speaks MQTT, HTTP, CoAP, LwM2M, and more. Any device that can transmit data via one of these protocols can connect. If it cannot, the ThingsBoard IoT Gateway (Python, open-source) acts as a translator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telemetry and attributes&lt;/strong&gt; — Every data point a device sends is stored as a timestamped key-value pair. Device metadata (location, firmware version, thresholds) is stored as attributes — permanent properties rather than time-series values.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dashboards and widgets&lt;/strong&gt; — A rich, configurable UI for visualising your data: time-series charts, gauges, maps, alarm tables, entity lists, and custom widgets. Dashboards are built by wiring widgets to device telemetry and attributes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rule Engine&lt;/strong&gt; — A visual, flow-based processing system. Incoming messages pass through chains of nodes that filter, transform, and react. An alarm fires. An email sends. A command goes back to the device. A Kafka message is published.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entity model&lt;/strong&gt; — Devices, Assets, Customers, Users, and more — all connected via typed relations. A building contains floors, which contain rooms, which contain devices. The hierarchy is modelled explicitly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alarms&lt;/strong&gt; — When telemetry crosses a threshold, ThingsBoard creates an alarm, propagates it up the entity hierarchy, and notifies the appropriate users via the Notification Centre.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which edition?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Edition&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community Edition (CE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Self-hosted, learning, open-source projects&lt;/td&gt;
&lt;td&gt;Free (Apache 2.0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Professional Edition (PE)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise features: platform integrations, entity groups, white-labelling&lt;/td&gt;
&lt;td&gt;Commercial licence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zero-setup SaaS — US or EU regions&lt;/td&gt;
&lt;td&gt;Free tier + paid plans&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For this series, everything works on Community Edition and Cloud. Where PE-specific features appear, they are labelled.&lt;/p&gt;




&lt;h2&gt;
  
  
  ThingsBoard and Home Assistant: Two Stages, One Show 🏠
&lt;/h2&gt;

&lt;p&gt;Home Assistant (HA) is your &lt;em&gt;personal&lt;/em&gt; stage — the smart home controller that knows Rianne’s heating schedule, whether Beau and Elvis are in the garden, and which lights to turn off at bedtime.&lt;/p&gt;

&lt;p&gt;ThingsBoard is the &lt;em&gt;enterprise&lt;/em&gt; stage — built for industrial-scale telemetry, multi-tenant isolation, hierarchical entity models, and professional dashboards.&lt;/p&gt;

&lt;p&gt;They are not competitors. They are collaborators. In Episode 7, we bridge them via MQTT — HA publishes its entity states to ThingsBoard’s MQTT broker. ThingsBoard ingests them as device telemetry, displays them on dashboards alongside other sensors, and applies alarm rules that HA has no native concept of.&lt;/p&gt;

&lt;p&gt;The result: your home’s Luxo Jr. lamp plays alongside industrial-scale equipment on the same stage. The prompt book covers both.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Series Map: Eight Episodes 🎬
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Episode&lt;/th&gt;
&lt;th&gt;Stage props concept&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;
&lt;em&gt;This one&lt;/em&gt; — What ThingsBoard is&lt;/td&gt;
&lt;td&gt;The prop house and the stage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Devices, Assets, Profiles, Relations&lt;/td&gt;
&lt;td&gt;Building the set&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;MQTT, HTTP, telemetry, attributes&lt;/td&gt;
&lt;td&gt;The prop speaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Dashboards and widgets&lt;/td&gt;
&lt;td&gt;The prompt book&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Rule Engine, alarms, notifications&lt;/td&gt;
&lt;td&gt;The director’s cue sheet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;AI Solution Creator&lt;/td&gt;
&lt;td&gt;Animating the lamp in 10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Home Assistant ↔ ThingsBoard via MQTT&lt;/td&gt;
&lt;td&gt;Two stages, one show&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Production deployment, ThingsBoard Edge, scaling&lt;/td&gt;
&lt;td&gt;The Pixar logo — going live&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The prop house is open. The stage is set. In Episode 2, we build the first set and register our first device.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;🔗 Resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ThingsBoard website&lt;/strong&gt;: &lt;a href="https://thingsboard.io" rel="noopener noreferrer"&gt;thingsboard.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThingsBoard Cloud&lt;/strong&gt; (free tier): &lt;a href="https://thingsboard.io/installations/" rel="noopener noreferrer"&gt;thingsboard.io/installations&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ThingsBoard docs&lt;/strong&gt;: &lt;a href="https://thingsboard.io/docs" rel="noopener noreferrer"&gt;thingsboard.io/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Solution Creator blog post&lt;/strong&gt;: &lt;a href="https://thingsboard.io/blog/ai-solution-creator/" rel="noopener noreferrer"&gt;thingsboard.io/blog/ai-solution-creator&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Luxo Jr. (Wikipedia)&lt;/strong&gt;: &lt;a href="https://en.wikipedia.org/wiki/Luxo_Jr._(character)" rel="noopener noreferrer"&gt;en.wikipedia.org/wiki/Luxo_Jr.&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;🎬 Stage Props! is a series about ThingsBoard — the IoT platform that gives your devices joints, personality, and behaviour, the way John Lasseter gave Luxo Jr. a soul.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>thingsboard</category>
      <category>beginners</category>
      <category>homeautomation</category>
    </item>
  </channel>
</rss>
