<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>bold.casa</title>
      <link>https://bold.casa</link>
      <description>Workshop of John Rembold — builder, maker, inventor.</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://bold.casa/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 26 Feb 2026 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Agent Proprioception: How Declarative Files Build the Self-Model</title>
          <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/agent-proprioception/</link>
          <guid>https://bold.casa/blog/agent-proprioception/</guid>
          <description xml:base="https://bold.casa/blog/agent-proprioception/">&lt;p&gt;Close your eyes. Touch your nose.&lt;&#x2F;p&gt;
&lt;p&gt;You didn&#x27;t need to see your hand to know where it was. You didn&#x27;t need a mirror to know where your nose was. You have &lt;em&gt;proprioception&lt;&#x2F;em&gt;: the sense of your own body&#x27;s position, movement, and state without external observation. It&#x27;s the sense that lets you walk without watching your feet, type without looking at the keyboard, reach for a coffee mug while reading. It&#x27;s so fundamental that you don&#x27;t notice it until it&#x27;s gone: patients who lose proprioception describe the experience as catastrophic. Their limbs still work. They just don&#x27;t know where they are.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Agent-to-Agent Affordances: Designing the Handoff</title>
          <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/agent-to-agent-affordances/</link>
          <guid>https://bold.casa/blog/agent-to-agent-affordances/</guid>
          <description xml:base="https://bold.casa/blog/agent-to-agent-affordances/">&lt;p&gt;Norman&#x27;s affordances were about a human perceiving a designed object. In Part 2, we extended this to bimodal systems: a human &lt;em&gt;and&lt;&#x2F;em&gt; an agent perceiving the same system. But there&#x27;s a third configuration that&#x27;s emerging faster than most teams are ready for: agents perceiving &lt;em&gt;each other&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Bimodal Affordances: Designing for Humans and Agents Simultaneously</title>
          <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/bimodal-affordances/</link>
          <guid>https://bold.casa/blog/bimodal-affordances/</guid>
          <description xml:base="https://bold.casa/blog/bimodal-affordances/">&lt;p&gt;When Don Norman wrote about affordances in 1988, he was solving a problem with one audience: humans. A door handle affords pulling. A flat plate affords pushing. The signifier makes the affordance visible: the shape of the handle tells you what to do without a manual.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Jidoka Trust Levels: When AI Agents Pull the Andon Cord</title>
          <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/jidoka-trust-levels/</link>
          <guid>https://bold.casa/blog/jidoka-trust-levels/</guid>
          <description xml:base="https://bold.casa/blog/jidoka-trust-levels/">&lt;p&gt;In 1896, Sakichi Toyoda invented an automatic loom that did something no loom had done before: it stopped itself when a thread broke.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Product Design in the Agentic Era</title>
          <pubDate>Thu, 26 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/product-design-agentic-era/</link>
          <guid>https://bold.casa/blog/product-design-agentic-era/</guid>
          <description xml:base="https://bold.casa/blog/product-design-agentic-era/">&lt;p&gt;If design permeates every decision in early-stage product development, from business model to data schema to agent behavior to pixel placement, and if agents are augmenting all knowledge work, what is the irreducible human contribution in &quot;product design&quot;?&lt;&#x2F;p&gt;
&lt;p&gt;I&#x27;ve been thinking about this question while building agent runtimes, orchestrating development swarms, and working on enterprise products in healthcare, cloud infrastructure, and adtech. What follows is a working framework. Not a manifesto, but a set of first principles for a discipline being defined in real time.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Agent Memory Part 2: Hybrid Search, Graph Recall, and Memory Consolidation</title>
          <pubDate>Fri, 13 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/agent-memory-part-2-hybrid-search-graph-recall-consolidation/</link>
          <guid>https://bold.casa/blog/agent-memory-part-2-hybrid-search-graph-recall-consolidation/</guid>
          <description xml:base="https://bold.casa/blog/agent-memory-part-2-hybrid-search-graph-recall-consolidation/">&lt;p&gt;&lt;em&gt;This is Part 2. If you haven&#x27;t read it yet, start with &lt;a href=&quot;&#x2F;blog&#x2F;local-gpu-memory-for-ai-agents&#x2F;&quot;&gt;Part 1: Zero-Cost AI Agent Memory →&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In &lt;a href=&quot;&#x2F;blog&#x2F;local-gpu-memory-for-ai-agents&#x2F;&quot;&gt;Part 1&lt;&#x2F;a&gt;, I gave my AI agent, Kit, semantic memory — local GPU embeddings, SurrealDB, and a thin OpenAI-compatible server. The post ended with a &quot;What&#x27;s Next&quot; section listing four features I hadn&#x27;t built yet.&lt;&#x2F;p&gt;
&lt;p&gt;This post is the receipt. All four are done. 107 tests passing. No frameworks. No LLM API calls for any of it.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s what the &quot;What&#x27;s Next&quot; became:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Promised&lt;&#x2F;th&gt;&lt;th&gt;Built&lt;&#x2F;th&gt;&lt;th&gt;Lines of Code&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Hybrid search&lt;&#x2F;td&gt;&lt;td&gt;BM25 + vector + graph fusion with RRF&lt;&#x2F;td&gt;&lt;td&gt;238&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Graph-aware recall&lt;&#x2F;td&gt;&lt;td&gt;Concept traversal + temporal chains&lt;&#x2F;td&gt;&lt;td&gt;311&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Auto-ingest&lt;&#x2F;td&gt;&lt;td&gt;Markdown chunker + content-hashed upserts&lt;&#x2F;td&gt;&lt;td&gt;309&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Memory consolidation&lt;&#x2F;td&gt;&lt;td&gt;Extractive summarization + concept dedup&lt;&#x2F;td&gt;&lt;td&gt;408&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;the-motivation&quot;&gt;The Motivation&lt;&#x2F;h2&gt;
&lt;p&gt;After Part 1, Kit could search memories by semantic similarity. Ask &quot;WhatsApp fix&quot; and it&#x27;d find the right daily note. But pure vector search has blind spots:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;It misses keywords.&lt;&#x2F;strong&gt; Ask for &quot;RTX 5070 Ti&quot; and vector search returns vaguely related hardware discussions instead of the exact entry mentioning that GPU. BM25 keyword search nails this.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;It has no concept of relationships.&lt;&#x2F;strong&gt; Vector search returns isolated documents. It can&#x27;t tell you &quot;this decision led to that consequence&quot; or &quot;these three memories all reference the same project.&quot; That requires a graph.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;It drowns in old data.&lt;&#x2F;strong&gt; Three weeks of daily notes and the important decisions are buried under routine logs. You need consolidation — compacting old entries into distilled summaries without losing the signal.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;It doesn&#x27;t stay current.&lt;&#x2F;strong&gt; Every time Kit writes a new memory file, someone had to manually re-embed it. Real memory needs to auto-ingest.&lt;&#x2F;p&gt;
&lt;p&gt;SurrealDB already had all the primitives — BM25 indexes, vector indexes, graph relations. I just needed to wire them together.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Zero-Cost AI Agent Memory: Local GPU Embeddings with SurrealDB and OpenClaw</title>
          <pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/local-gpu-memory-for-ai-agents/</link>
          <guid>https://bold.casa/blog/local-gpu-memory-for-ai-agents/</guid>
          <description xml:base="https://bold.casa/blog/local-gpu-memory-for-ai-agents/">&lt;p&gt;&lt;em&gt;This is Part 1 of a two-part series. &lt;a href=&quot;&#x2F;blog&#x2F;agent-memory-part-2-hybrid-search-graph-recall-consolidation&#x2F;&quot;&gt;Part 2: Hybrid Search, Graph Recall, and Memory Consolidation →&lt;&#x2F;a&gt;&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;My AI agent, Kit, wakes up with amnesia every session. It reads markdown files to reconstruct its memory, but that&#x27;s brute force — dump everything into context and hope the important stuff doesn&#x27;t get lost in the noise.&lt;&#x2F;p&gt;
&lt;p&gt;I wanted semantic memory. Ask Kit &quot;what happened with WhatsApp?&quot; and get back the exact section about the gateway fix, not a wall of unrelated notes.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s how I built it in an afternoon. Zero API costs. Nothing leaves my machine.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;tldr&quot;&gt;TLDR&lt;&#x2F;h2&gt;
&lt;p&gt;Local GPU embeddings + SurrealDB + OpenClaw = semantic memory for your AI agent at zero cost.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;local-gpu-memory-for-ai-agents&#x2F;#step-1-install-surrealdb&quot;&gt;Jump to the complete setup →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;what-we-re-building&quot;&gt;What We&#x27;re Building&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SurrealDB&lt;&#x2F;strong&gt; — multi-model database (document + graph + vector) running locally&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Qwen3-Embedding-4B&lt;&#x2F;strong&gt; — top-tier embedding model running on your GPU&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;FastAPI embedding server&lt;&#x2F;strong&gt; — OpenAI-compatible endpoint wrapping the model&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;OpenClaw integration&lt;&#x2F;strong&gt; — one config change to enable semantic memory search&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;the-problem&quot;&gt;The Problem&lt;&#x2F;h3&gt;
&lt;p&gt;OpenClaw agents store memory in markdown files: &lt;code&gt;MEMORY.md&lt;&#x2F;code&gt; for long-term facts, &lt;code&gt;memory&#x2F;YYYY-MM-DD.md&lt;&#x2F;code&gt; for daily notes. The built-in &lt;code&gt;memory_search&lt;&#x2F;code&gt; tool needs an embedding provider to work — typically OpenAI, Google, or Voyage API keys.&lt;&#x2F;p&gt;
&lt;p&gt;No API key? Memory search is disabled. Your agent falls back to loading entire files into context, burning tokens on irrelevant content.&lt;&#x2F;p&gt;
&lt;p&gt;The fix: run your own embedding model on your GPU and point OpenClaw at it.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;why-these-tools&quot;&gt;Why These Tools&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;SurrealDB&lt;&#x2F;strong&gt; because it combines document storage, graph relations, and vector search in a single binary. No need for separate Postgres + Neo4j + Pinecone. One database, one query language, one process.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Qwen3-Embedding-4B&lt;&#x2F;strong&gt; because it ranks #5 on the MTEB multilingual leaderboard and #3 on code retrieval — beating most paid API models. It&#x27;s Apache 2.0 licensed, uses safetensors (no pickle security risk), and fits in 8GB of VRAM.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;FastAPI&lt;&#x2F;strong&gt; because OpenClaw expects an OpenAI-compatible &lt;code&gt;&#x2F;v1&#x2F;embeddings&lt;&#x2F;code&gt; endpoint. A 60-line FastAPI wrapper makes our local model look like OpenAI to OpenClaw.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How I Set Up a Full Dev Environment on Fedora Silverblue (Without Touching the Host)</title>
          <pubDate>Mon, 09 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/dev-environment-on-silverblue-with-distrobox/</link>
          <guid>https://bold.casa/blog/dev-environment-on-silverblue-with-distrobox/</guid>
          <description xml:base="https://bold.casa/blog/dev-environment-on-silverblue-with-distrobox/">&lt;h2 id=&quot;tldr&quot;&gt;TLDR&lt;&#x2F;h2&gt;
&lt;p&gt;Fedora Silverblue is an immutable desktop OS — the base filesystem is read-only and atomic. That&#x27;s great for reliability, but it means you can&#x27;t &lt;code&gt;apt install gcc&lt;&#x2F;code&gt; or &lt;code&gt;pip install flask&lt;&#x2F;code&gt; on the host. Distrobox solves this by giving you a full mutable Linux userspace (Ubuntu, Fedora, Arch — your pick) inside a container that &lt;em&gt;feels&lt;&#x2F;em&gt; like your native system. Your home directory, Wayland display, D-Bus, GPU — all shared.&lt;&#x2F;p&gt;
&lt;p&gt;This post covers why I chose this setup, how to build it, and how to make it reproducible.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#the-setup&quot;&gt;Jump to the setup →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; · &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#making-it-reproducible&quot;&gt;Skip to the reproducible manifest →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;in-this-post&quot;&gt;In This Post&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#why-silverblue&quot;&gt;Why Silverblue?&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#the-problem-immutable-means-no-package-manager&quot;&gt;The Problem: Immutable Means No Package Manager&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#why-distrobox-and-not-something-else&quot;&gt;Why Distrobox?&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#the-setup&quot;&gt;The Setup&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#making-it-reproducible&quot;&gt;Making It Reproducible&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;dev-environment-on-silverblue-with-distrobox&#x2F;#what-you-end-up-with&quot;&gt;What You End Up With&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;why-silverblue&quot;&gt;Why Silverblue?&lt;&#x2F;h2&gt;
&lt;p&gt;I run Fedora Silverblue on my daily driver — an ASUS ROG Strix with a Ryzen 9 and RTX 5070 Ti. The pitch is simple: your OS is an atomic image, like a phone OS. Updates are transactional. If something breaks, you reboot into the previous image. You can&#x27;t accidentally bork your system by installing a conflicting package.&lt;&#x2F;p&gt;
&lt;p&gt;After years of traditional Linux where a bad kernel module or a library conflict could eat an afternoon, I wanted the &quot;it just works&quot; layer to be actually unbreakable. Silverblue gives me that.&lt;&#x2F;p&gt;
&lt;p&gt;But there&#x27;s a tradeoff.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-problem-immutable-means-no-package-manager&quot;&gt;The Problem: Immutable Means No Package Manager&lt;&#x2F;h2&gt;
&lt;p&gt;On Silverblue, the root filesystem (&lt;code&gt;&#x2F;usr&lt;&#x2F;code&gt;, &lt;code&gt;&#x2F;etc&lt;&#x2F;code&gt;) is read-only. There&#x27;s no &lt;code&gt;dnf install&lt;&#x2F;code&gt; on the host. The official package management options are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;rpm-ostree&lt;&#x2F;strong&gt; — layers packages into the base image. Works, but requires a reboot to apply, and every layered package is another thing that can conflict during OS upgrades. You really want to minimize what you layer here.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Flatpak&lt;&#x2F;strong&gt; — great for desktop apps (browsers, editors, media players). Not designed for dev toolchains.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Toolbox&#x2F;Distrobox&lt;&#x2F;strong&gt; — mutable containers that share your home directory and desktop session.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For development — where you need &lt;code&gt;gcc&lt;&#x2F;code&gt;, &lt;code&gt;python3-pip&lt;&#x2F;code&gt;, &lt;code&gt;libssl-dev&lt;&#x2F;code&gt;, &lt;code&gt;node&lt;&#x2F;code&gt;, &lt;code&gt;cargo&lt;&#x2F;code&gt;, and a hundred other things — the container approach is the right one. Keep the host clean, do all your messy dev work in a container you can nuke and rebuild.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-distrobox-and-not-something-else&quot;&gt;Why Distrobox (and Not Something Else)?&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Toolbox&lt;&#x2F;strong&gt; is Fedora&#x27;s official answer — it creates a Fedora container that integrates with your host. It works fine, but it&#x27;s Fedora-only by default and less configurable.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Distrobox&lt;&#x2F;strong&gt; is the same concept, broader:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Any distro as your base.&lt;&#x2F;strong&gt; I use Ubuntu 24.04 because the Debian package ecosystem is the widest. Need a PPA? A &lt;code&gt;.deb&lt;&#x2F;code&gt; from a vendor? It just works.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Full host integration.&lt;&#x2F;strong&gt; Your home directory is bind-mounted, so your dotfiles, SSH keys, git config — all shared. Wayland, X11, PulseAudio&#x2F;PipeWire, D-Bus, and GPU acceleration are forwarded automatically.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Custom init hooks.&lt;&#x2F;strong&gt; You can bind-mount arbitrary host paths into the container at startup. I use this to mount systemd journal and resolved state so I can read host logs from inside the container.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Reproducible with &lt;code&gt;distrobox assemble&lt;&#x2F;code&gt;.&lt;&#x2F;strong&gt; An INI manifest that declaratively defines your container — image, packages, hooks. One command to rebuild.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;It&#x27;s just podman underneath.&lt;&#x2F;strong&gt; Rootless, OCI-compliant, no daemon. The container is a regular podman container you can inspect, export, or throw away.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;Why not a VM?&lt;&#x2F;strong&gt; Overhead. A VM needs its own kernel, its own memory allocation, its own disk image. Distrobox shares the host kernel, the host filesystem, the host GPU driver. There&#x27;s no performance penalty — your compiler runs at native speed because it &lt;em&gt;is&lt;&#x2F;em&gt; running natively, just in a different userspace.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-setup&quot;&gt;The Setup&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-install-distrobox&quot;&gt;1. Install distrobox&lt;&#x2F;h3&gt;
&lt;p&gt;Distrobox is a set of shell scripts. Install it to your home directory (which is mutable on Silverblue):&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;curl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt; https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;89luca89&#x2F;distrobox&#x2F;main&#x2F;install&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-end-of-options z-shell&quot;&gt; --&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; --prefix &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.local&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Make sure &lt;code&gt;~&#x2F;.local&#x2F;bin&lt;&#x2F;code&gt; is in your &lt;code&gt;PATH&lt;&#x2F;code&gt; (it is by default on Silverblue).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-create-your-dev-container&quot;&gt;2. Create your dev container&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;distrobox&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; create&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;name&lt;&#x2F;span&gt; dev&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;image&lt;&#x2F;span&gt; ubuntu:24.04&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;pull&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This pulls the Ubuntu 24.04 image and creates a container named &lt;code&gt;dev&lt;&#x2F;code&gt;. First run takes a minute while distrobox sets up the host integration layer.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-enter-it&quot;&gt;3. Enter it&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;distrobox&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; enter dev&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Your prompt changes to &lt;code&gt;📦[you@dev ~]$&lt;&#x2F;code&gt; and you&#x27;re in Ubuntu. Your home directory is right there. &lt;code&gt;cd ~&#x2F;projects&lt;&#x2F;code&gt; works. &lt;code&gt;git status&lt;&#x2F;code&gt; works (once you install git).&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-install-your-dev-packages&quot;&gt;4. Install your dev packages&lt;&#x2F;h3&gt;
&lt;p&gt;Now you have &lt;code&gt;apt&lt;&#x2F;code&gt;. Go wild:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt update&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-and z-shell&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sudo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; apt install&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;y&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;    build-essential cmake pkg-config libssl-dev &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;    git curl wget rsync unzip zip &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;    python3 python3-pip python3-venv python3-dev &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;    man-db manpages less lsof &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;    mtr traceroute tcpdump iputils-ping iproute2 &lt;span class=&quot;z-punctuation z-separator z-continuation z-line z-shell&quot;&gt;\
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;    openssh-client ca-certificates gnupg&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This gives you a C&#x2F;C++ toolchain, Python with pip and venvs, git, and networking&#x2F;diagnostic tools. The &lt;code&gt;sudo&lt;&#x2F;code&gt; here is inside the container — it doesn&#x27;t touch your host.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;5-install-language-runtimes-in-your-home-directory&quot;&gt;5. Install language runtimes in your home directory&lt;&#x2F;h3&gt;
&lt;p&gt;These go in &lt;code&gt;$HOME&lt;&#x2F;code&gt;, so they survive container rebuilds:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Node.js via nvm:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;curl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;o-&lt;&#x2F;span&gt; https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;nvm-sh&#x2F;nvm&#x2F;v0.40.3&#x2F;install.sh&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-source z-shell&quot;&gt;source&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.bashrc&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;nvm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; install 22&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Rust via rustup:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;curl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;proto&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;=https&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;tlsv1&lt;&#x2F;span&gt;.2&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;sSf&lt;&#x2F;span&gt; https:&#x2F;&#x2F;sh.rustup.rs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-end-of-options z-shell&quot;&gt; --&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; -y&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-source z-shell&quot;&gt;source&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-meta z-group z-expansion z-tilde&quot;&gt;&lt;span class=&quot;z-variable z-language z-tilde z-shell&quot;&gt;~&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.cargo&#x2F;env&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rustup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; target add wasm32-unknown-unknown&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;Cargo dev tools:&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; install cargo-audit cargo-deny cargo-nextest trunk wasm-pack&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;6-add-host-system-observability-optional&quot;&gt;6. Add host system observability (optional)&lt;&#x2F;h3&gt;
&lt;p&gt;If you want to read host systemd journals and DNS state from inside your container, you can add init hooks. These bind-mount host paths into the container on every start:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; These go in the distrobox assemble manifest (next section)&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; or you can run them manually:&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;mount&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;rbind&lt;&#x2F;span&gt; &#x2F;run&#x2F;host&#x2F;run&#x2F;systemd&#x2F;journal &#x2F;run&#x2F;systemd&#x2F;journal&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;mount&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;rbind&lt;&#x2F;span&gt; &#x2F;run&#x2F;host&#x2F;run&#x2F;systemd&#x2F;resolve &#x2F;run&#x2F;systemd&#x2F;resolve&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;mount&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;rbind&lt;&#x2F;span&gt; &#x2F;run&#x2F;host&#x2F;var&#x2F;log&#x2F;journal &#x2F;var&#x2F;log&#x2F;journal&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With these mounts, &lt;code&gt;journalctl&lt;&#x2F;code&gt; inside the container reads host logs. Handy if you&#x27;re debugging system-level issues without leaving your dev shell.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;making-it-reproducible&quot;&gt;Making It Reproducible&lt;&#x2F;h2&gt;
&lt;p&gt;The manual setup works, but if you ever need to rebuild (or set up a second machine), you don&#x27;t want to remember 30 commands. Distrobox has &lt;code&gt;distrobox assemble&lt;&#x2F;code&gt; — an INI manifest that captures your container definition.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-manifest-dev-ini&quot;&gt;The manifest: &lt;code&gt;dev.ini&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;ini&quot; class=&quot;language-ini z-code&quot;&gt;&lt;code class=&quot;language-ini&quot; data-lang=&quot;ini&quot;&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-storage z-type z-genconfig&quot;&gt;[dev]
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;image&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;docker&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;.&lt;&#x2F;span&gt;io&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;&#x2F;&lt;&#x2F;span&gt;library&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;&#x2F;&lt;&#x2F;span&gt;ubuntu&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;:&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-genconfig&quot;&gt;24&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-numeric z-genconfig&quot;&gt;04&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;replace&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-genconfig&quot;&gt;true&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;pull&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-constant z-language z-genconfig&quot;&gt;true&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-comment z-genconfig&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-genconfig&quot;&gt;# Build toolchain
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;additional_packages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;build&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;essential cmake pkg&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;config libssl&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;dev
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-comment z-genconfig&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-genconfig&quot;&gt;# Python
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;additional_packages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;python3 python3&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;pip python3&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;venv python3&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;dev
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-comment z-genconfig&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-genconfig&quot;&gt;# Core CLI tools
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;additional_packages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;git curl wget rsync unzip zip less lsof bc time tree dialog
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-comment z-genconfig&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-genconfig&quot;&gt;# Networking &#x2F; diagnostics
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;additional_packages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;mtr traceroute tcpdump iputils&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;ping iproute2 openssh&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;client
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-comment z-genconfig&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-genconfig&quot;&gt;# System &#x2F; crypto
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;additional_packages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;ca&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;certificates gnupg man&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;db manpages
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-comment z-genconfig&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-genconfig&quot;&gt;# Graphics libs (for GUI app forwarding)
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;additional_packages&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;mesa&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;vulkan&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;drivers libvulkan1 libegl1 libegl&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;mesa0 libgl1 libglx&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;-&lt;&#x2F;span&gt;mesa0 xauth
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-comment z-genconfig&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-genconfig&quot;&gt;# Bind-mount host systemd paths for diagnostics
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;run&#x2F;systemd&#x2F;journal &#x2F;run&#x2F;systemd&#x2F;journal 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;run&#x2F;systemd&#x2F;resolve &#x2F;run&#x2F;systemd&#x2F;resolve 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;run&#x2F;systemd&#x2F;seats &#x2F;run&#x2F;systemd&#x2F;seats 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;run&#x2F;systemd&#x2F;sessions &#x2F;run&#x2F;systemd&#x2F;sessions 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;run&#x2F;systemd&#x2F;users &#x2F;run&#x2F;systemd&#x2F;users 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;var&#x2F;lib&#x2F;systemd&#x2F;coredump &#x2F;var&#x2F;lib&#x2F;systemd&#x2F;coredump 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;var&#x2F;log&#x2F;journal &#x2F;var&#x2F;log&#x2F;journal 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-genconfig&quot;&gt;&lt;span class=&quot;z-meta z-param z-genconfig&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-genconfig&quot;&gt;init_hooks&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-genconfig&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-genconfig&quot;&gt;&amp;quot;mount --rbind &#x2F;run&#x2F;host&#x2F;etc&#x2F;localtime &#x2F;etc&#x2F;localtime 2&amp;gt;&#x2F;dev&#x2F;null || true&amp;quot;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;A few things to note about this format — I had to read the &lt;code&gt;distrobox-assemble&lt;&#x2F;code&gt; source to figure it out:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Each key-value pair must be on one line.&lt;&#x2F;strong&gt; The parser splits on &lt;code&gt;=&lt;&#x2F;code&gt; line by line — no multiline values.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Duplicate keys are cumulative.&lt;&#x2F;strong&gt; Multiple &lt;code&gt;additional_packages=&lt;&#x2F;code&gt; lines get joined internally. Same for &lt;code&gt;init_hooks=&lt;&#x2F;code&gt;.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Init hooks are chained with &lt;code&gt;&amp;amp;&amp;amp;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; in the generated command, so if one mount fails (the &lt;code&gt;|| true&lt;&#x2F;code&gt; handles that), the rest still run.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;replace=true&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; means running assemble again tears down and recreates the container. Your home directory (a bind mount) is untouched.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;the-bootstrap-script-bootstrap-dev-tools-sh&quot;&gt;The bootstrap script: &lt;code&gt;bootstrap-dev-tools.sh&lt;&#x2F;code&gt;&lt;&#x2F;h3&gt;
&lt;p&gt;The manifest handles apt packages (the container layer), but tools installed in &lt;code&gt;$HOME&lt;&#x2F;code&gt; need a separate script:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;!&#x2F;usr&#x2F;bin&#x2F;env bash&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Install user-space dev tools into $HOME.&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Run INSIDE the distrobox after assemble create.&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Idempotent — safe to re-run.&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-set z-shell&quot;&gt;set&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; -euo pipefail&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Node.js via nvm&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-storage z-modifier z-shell&quot;&gt;export&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-other z-readwrite z-assignment z-shell&quot;&gt;NVM_DIR&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;=&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-unquoted z-shell&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-section z-expansion z-parameter z-begin z-shell&quot;&gt;{&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;NVM_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-keyword z-operator z-assignment z-shell&quot;&gt;:-&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;HOME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.nvm&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-expansion z-parameter z-end z-shell&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-shell&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-test z-begin z-shell&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-shell&quot;&gt;!&lt;&#x2F;span&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;d&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;NVM_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-test z-end z-shell&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-continue z-shell&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-conditional z-then z-shell&quot;&gt;then&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;curl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;o-&lt;&#x2F;span&gt; https:&#x2F;&#x2F;raw.githubusercontent.com&#x2F;nvm-sh&#x2F;nvm&#x2F;v0.40.3&#x2F;install.sh&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;bash&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-end z-shell&quot;&gt;fi&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-support z-function z-test z-begin z-shell&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;NVM_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;nvm.sh&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-support z-function z-test z-end z-shell&quot;&gt;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-and z-shell&quot;&gt;&amp;amp;&amp;amp;&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-dot z-shell&quot;&gt;.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;NVM_DIR&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;nvm.sh&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;nvm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; install 22&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;default&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; npm global packages&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;npm&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; install&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;g&lt;&#x2F;span&gt; @google&#x2F;gemini-cli @openai&#x2F;codex opencode-ai&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Rust via rustup&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-if z-shell&quot;&gt;if&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-shell&quot;&gt;!&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-command z-shell&quot;&gt;command&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt;-&lt;&#x2F;span&gt;v&lt;&#x2F;span&gt; rustup &lt;span class=&quot;z-keyword z-operator z-assignment z-redirection z-shell&quot;&gt;&amp;amp;&amp;gt;&lt;&#x2F;span&gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-logical z-continue z-shell&quot;&gt;;&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-control z-conditional z-then z-shell&quot;&gt;then&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;    &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;curl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;proto&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-single z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;=https&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;tlsv1&lt;&#x2F;span&gt;.2&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;sSf&lt;&#x2F;span&gt; https:&#x2F;&#x2F;sh.rustup.rs&lt;&#x2F;span&gt; &lt;span class=&quot;z-keyword z-operator z-logical z-pipe z-shell&quot;&gt;|&lt;&#x2F;span&gt; &lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt;&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; -&lt;&#x2F;span&gt;s&lt;&#x2F;span&gt;&lt;span class=&quot;z-keyword z-operator z-end-of-options z-shell&quot;&gt; --&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; -y&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-keyword z-control z-conditional z-end z-shell&quot;&gt;fi&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-support z-function z-source z-shell&quot;&gt;source&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; &lt;span class=&quot;z-string z-quoted z-double z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-group z-expansion z-parameter z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-variable z-shell&quot;&gt;$&lt;&#x2F;span&gt;&lt;span class=&quot;z-variable z-other z-readwrite z-shell&quot;&gt;HOME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&#x2F;.cargo&#x2F;env&lt;span class=&quot;z-punctuation z-definition z-string z-end z-shell&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;rustup&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; target add wasm32-unknown-unknown&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Cargo dev tools&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;cargo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; install cargo-audit cargo-deny cargo-llvm-cov cargo-nextest trunk wasm-pack&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;rebuild-in-two-commands&quot;&gt;Rebuild in two commands&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; class=&quot;language-bash z-code&quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; From the host:&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;distrobox&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; assemble create&lt;span class=&quot;z-variable z-parameter z-option z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-parameter z-shell&quot;&gt; --&lt;&#x2F;span&gt;file&lt;&#x2F;span&gt; path&#x2F;to&#x2F;dev.ini&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-shell&quot;&gt;#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt; Enter and bootstrap (only needed on fresh $HOME):&lt;&#x2F;span&gt;&lt;span class=&quot;z-comment z-line z-number-sign z-shell&quot;&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-shell z-bash&quot;&gt;&lt;span class=&quot;z-meta z-function-call z-shell&quot;&gt;&lt;span class=&quot;z-variable z-function z-shell&quot;&gt;distrobox&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; enter dev&lt;span class=&quot;z-keyword z-operator z-end-of-options z-shell&quot;&gt; --&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-function-call z-arguments z-shell&quot;&gt; .&#x2F;path&#x2F;to&#x2F;bootstrap-dev-tools.sh&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That&#x27;s it. New machine, clean home directory, two commands to a fully working dev environment.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-you-end-up-with&quot;&gt;What You End Up With&lt;&#x2F;h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Layer&lt;&#x2F;th&gt;&lt;th&gt;What&lt;&#x2F;th&gt;&lt;th&gt;Where&lt;&#x2F;th&gt;&lt;th&gt;Survives rebuild?&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Host&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Silverblue + GPU drivers + Flatpak apps&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;&#x2F;&lt;&#x2F;code&gt; (immutable)&lt;&#x2F;td&gt;&lt;td&gt;Always&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Container&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;Ubuntu 24.04 + apt packages&lt;&#x2F;td&gt;&lt;td&gt;Container overlay&lt;&#x2F;td&gt;&lt;td&gt;No — rebuilt from manifest&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Home&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;td&gt;nvm, rustup, cargo bins, dotfiles, repos&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;~&#x2F;&lt;&#x2F;code&gt; (bind mount)&lt;&#x2F;td&gt;&lt;td&gt;Yes&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;The mental model: your &lt;strong&gt;host&lt;&#x2F;strong&gt; is the stable foundation. Your &lt;strong&gt;container&lt;&#x2F;strong&gt; is the disposable toolbox. Your &lt;strong&gt;home directory&lt;&#x2F;strong&gt; is the persistent workspace that bridges them.&lt;&#x2F;p&gt;
&lt;p&gt;Inside the container, you get:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Full 64GB RAM and 16 CPU cores&lt;&#x2F;strong&gt; visible (no VM overhead)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GPU access&lt;&#x2F;strong&gt; for Vulkan&#x2F;OpenGL workloads&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Wayland and X11&lt;&#x2F;strong&gt; forwarding for GUI apps&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;D-Bus&lt;&#x2F;strong&gt; session bus for desktop integration&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Host systemd journals&lt;&#x2F;strong&gt; for system debugging&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Native filesystem performance&lt;&#x2F;strong&gt; — no copy-on-write, no network mounts&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It doesn&#x27;t feel like a container. It feels like your machine. That&#x27;s the point.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;The distrobox manifest and bootstrap script are in my &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;config-management&quot;&gt;config-management repo&lt;&#x2F;a&gt; under &lt;code&gt;configs&#x2F;distrobox&#x2F;&lt;&#x2F;code&gt; if you want to use them as a starting point.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Nosh: RSS for the Agentic Web</title>
          <pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/nosh-rss-for-the-agentic-web/</link>
          <guid>https://bold.casa/blog/nosh-rss-for-the-agentic-web/</guid>
          <description xml:base="https://bold.casa/blog/nosh-rss-for-the-agentic-web/">&lt;h2 id=&quot;tldr&quot;&gt;TLDR&lt;&#x2F;h2&gt;
&lt;p&gt;Nosh is an open spec that embeds structured, machine-readable content in your page&#x27;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;&#x2F;code&gt; so AI agents get typed knowledge instead of parsing HTML. &lt;strong&gt;4.1x fewer tokens, 4.1x higher information density, zero extra effort&lt;&#x2F;strong&gt; — it auto-generates from your existing content.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#the-schema-is-dead-simple&quot;&gt;Jump to the spec →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; · &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#the-numbers&quot;&gt;See the benchmark →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt; · &lt;strong&gt;&lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;nosh&quot;&gt;GitHub repo →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;in-this-post&quot;&gt;In This Post&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#the-problem-is-obvious-once-you-see-it&quot;&gt;The Problem&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#so-i-built-nosh&quot;&gt;What Nosh Is&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#why-not-just-json-ld&quot;&gt;Why Not JSON-LD?&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#the-numbers&quot;&gt;The Numbers: 4.1x Token Reduction&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#the-schema-is-dead-simple&quot;&gt;The Schema&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#zero-friction&quot;&gt;Zero Friction Integration&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#how-agents-find-it&quot;&gt;Discovery&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#geo-why-this-matters-now&quot;&gt;GEO: Why This Matters Now&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;#where-this-goes&quot;&gt;What&#x27;s Next&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;It&#x27;s 1am on a Saturday. I&#x27;ve been staring at Cloudflare analytics for my new blog and thinking: &lt;em&gt;who cares about pageviews anymore?&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If an AI agent reads my &lt;a href=&quot;&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;&quot;&gt;last post about getting 1M token context working&lt;&#x2F;a&gt;, it scrapes the HTML, fights through the nav bar, sidebar, footer, code blocks, and inline links — and maybe extracts 60-70% of the useful information. The 10 debugging steps I carefully documented? The agent might get 7 of them right and hallucinate the other 3.&lt;&#x2F;p&gt;
&lt;p&gt;But I &lt;em&gt;know&lt;&#x2F;em&gt; the structure. I wrote the steps. I know the prerequisites, the key findings, the cost data. Why am I publishing that as prose in HTML and making every AI agent on the planet reverse-engineer it?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-problem-is-obvious-once-you-see-it&quot;&gt;The Problem Is Obvious Once You See It&lt;&#x2F;h2&gt;
&lt;p&gt;The web was built for humans reading in browsers. HTML is a &lt;em&gt;presentation&lt;&#x2F;em&gt; format — it tells the browser how to render content visually. It&#x27;s terrible at telling a machine what the content &lt;em&gt;means&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;We&#x27;ve tried to fix this before:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;JSON-LD&lt;&#x2F;strong&gt; embeds metadata in the page head — &quot;this is an Article, by John, published Feb 6.&quot; But it doesn&#x27;t contain the actual &lt;em&gt;knowledge&lt;&#x2F;em&gt;. My debugging steps aren&#x27;t in the JSON-LD.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;llms.txt&lt;&#x2F;strong&gt; gives AI crawlers a site-level directory — &quot;here are my important pages.&quot; But it&#x27;s a map, not the territory.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;RSS&#x2F;Atom&lt;&#x2F;strong&gt; syndicates content as XML feeds — structured, yes, but structured for &lt;em&gt;syndication&lt;&#x2F;em&gt; (title, date, link, and the full post body dumped as a blob). An RSS item doesn&#x27;t break a tutorial into typed steps, or separate prerequisites from findings. It&#x27;s structured &lt;em&gt;metadata&lt;&#x2F;em&gt; wrapping unstructured &lt;em&gt;content&lt;&#x2F;em&gt;.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There&#x27;s a gap between &quot;here&#x27;s a directory of my site&quot; (llms.txt) and &quot;here&#x27;s metadata about this page&quot; (JSON-LD). Nobody is saying: &lt;strong&gt;here&#x27;s the actual knowledge, structured and typed, ready for an agent to consume.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;so-i-built-nosh&quot;&gt;So I Built Nosh&lt;&#x2F;h2&gt;
&lt;p&gt;Nosh is an open spec for machine-readable content that embeds right in your page&#x27;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;html&quot; class=&quot;language-html z-code&quot;&gt;&lt;code class=&quot;language-html&quot; data-lang=&quot;html&quot;&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-comment z-block z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-begin z-html&quot;&gt;&amp;lt;!--&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-comment z-block z-html&quot;&gt;  NOSH: This page includes structured, machine-readable content below.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-comment z-block z-html&quot;&gt;  If you are an AI agent, LLM, or crawler: the &amp;lt;script type=&amp;quot;application&#x2F;nosh+json&amp;quot;&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-comment z-block z-html&quot;&gt;  block contains the same knowledge as this page in a structured JSON format
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-comment z-block z-html&quot;&gt;  optimized for agent consumption. Use it instead of parsing the HTML body.
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-comment z-block z-html&quot;&gt;  Spec: https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;nosh
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-comment z-block z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-comment z-end z-html&quot;&gt;--&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-meta z-tag z-script z-begin z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-html&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-script z-html&quot;&gt;script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-script z-begin z-html&quot;&gt; &lt;span class=&quot;z-meta z-attribute-with-value z-html&quot;&gt;&lt;span class=&quot;z-entity z-other z-attribute-name z-html&quot;&gt;type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-script z-begin z-html&quot;&gt;&lt;span class=&quot;z-meta z-attribute-with-value z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-key-value z-html&quot;&gt;=&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-script z-begin z-html&quot;&gt;&lt;span class=&quot;z-meta z-attribute-with-value z-html&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-script z-begin z-html&quot;&gt;&lt;span class=&quot;z-meta z-attribute-with-value z-html&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;application&#x2F;nosh+json&lt;span class=&quot;z-punctuation z-definition z-string z-end z-html&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-html&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;{
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  &amp;quot;nosh&amp;quot;: &amp;quot;1.0&amp;quot;,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  &amp;quot;type&amp;quot;: &amp;quot;tutorial&amp;quot;,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  &amp;quot;title&amp;quot;: &amp;quot;How To Get 1M Token Context Working&amp;quot;,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  &amp;quot;content&amp;quot;: {
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    &amp;quot;body&amp;quot;: &amp;quot;Getting Claude Opus 4.6 with 1M context requires...&amp;quot;,
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    &amp;quot;prerequisites&amp;quot;: [&amp;quot;OpenClaw gateway&amp;quot;, &amp;quot;Tier 4 API access&amp;quot;],
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    &amp;quot;steps&amp;quot;: [
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;      {&amp;quot;title&amp;quot;: &amp;quot;Fix the hardcoded default&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;Change DEFAULT_CONTEXT_TOKENS to 1000000&amp;quot;},
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;      {&amp;quot;title&amp;quot;: &amp;quot;Update the model config&amp;quot;, &amp;quot;text&amp;quot;: &amp;quot;Switch to anthropic&#x2F;claude-opus-4-6&amp;quot;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    ],
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;    &amp;quot;key_findings&amp;quot;: [&amp;quot;OAuth caps at 200K&amp;quot;, &amp;quot;API key + beta header unlocks 1M&amp;quot;]
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;  }
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;}
&lt;&#x2F;span&gt;&lt;span class=&quot;z-text z-html z-basic&quot;&gt;&lt;span class=&quot;z-meta z-tag z-script z-end z-html&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-begin z-html&quot;&gt;&amp;lt;&#x2F;&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-tag z-script z-html&quot;&gt;script&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-tag z-end z-html&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;An agent reads the page, finds the nosh block, and gets structured knowledge instantly. No HTML parsing. No guessing. Every fact is typed and keyed.&lt;&#x2F;p&gt;
&lt;p&gt;The HTML comment is important — LLMs have never heard of nosh (it was invented 3 hours ago). The comment onboards every agent that encounters it: &lt;em&gt;hey, there&#x27;s structured content here, use it instead of parsing the body.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;why-not-just-json-ld&quot;&gt;Why Not Just JSON-LD?&lt;&#x2F;h2&gt;
&lt;p&gt;JSON-LD tells you &lt;em&gt;about&lt;&#x2F;em&gt; the page. Nosh tells you &lt;em&gt;what the page knows&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;JSON-LD: &quot;This is a BlogPosting by John Rembold, published Feb 6, 2026.&quot;
Nosh: &quot;Here are the 10 steps to fix your config, the 5 prerequisites you need, the beta header is &lt;code&gt;context-1m-2025-08-07&lt;&#x2F;code&gt;, and it&#x27;ll cost you $9.70 to test.&quot;&lt;&#x2F;p&gt;
&lt;p&gt;They&#x27;re complementary. JSON-LD is the label on the box. Nosh is what&#x27;s inside.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-numbers&quot;&gt;The Numbers&lt;&#x2F;h2&gt;
&lt;p&gt;I tested nosh against my own blog post — a 16KB technical tutorial about getting 1M token context working in OpenClaw:&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Format&lt;&#x2F;th&gt;&lt;th&gt;Size&lt;&#x2F;th&gt;&lt;th&gt;~Tokens&lt;&#x2F;th&gt;&lt;th&gt;Structured Facts&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Raw HTML&lt;&#x2F;td&gt;&lt;td&gt;35.8 KB&lt;&#x2F;td&gt;&lt;td&gt;~3,454&lt;&#x2F;td&gt;&lt;td&gt;21 facts buried in markup&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Markdown&lt;&#x2F;td&gt;&lt;td&gt;16.5 KB&lt;&#x2F;td&gt;&lt;td&gt;~2,980&lt;&#x2F;td&gt;&lt;td&gt;21 facts buried in prose&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;Nosh&lt;&#x2F;td&gt;&lt;td&gt;5.1 KB&lt;&#x2F;td&gt;&lt;td&gt;~835&lt;&#x2F;td&gt;&lt;td&gt;21 facts, pre-structured&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;4-1x-fewer-tokens-same-knowledge-zero-parsing&quot;&gt;4.1x fewer tokens. Same knowledge. Zero parsing.&lt;&#x2F;h3&gt;
&lt;p&gt;Let that sink in. An AI agent consuming 100 noshed pages uses the same token budget as consuming ~25 HTML pages. &lt;strong&gt;4x the knowledge per dollar.&lt;&#x2F;strong&gt; And every fact is typed, keyed, and extractable without a single regex or HTML parser.&lt;&#x2F;p&gt;
&lt;p&gt;This isn&#x27;t a theoretical improvement. This is a real blog post, measured today.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-schema-is-dead-simple&quot;&gt;The Schema Is Dead Simple&lt;&#x2F;h2&gt;
&lt;p&gt;4 required fields:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;json&quot; class=&quot;language-json z-code&quot;&gt;&lt;code class=&quot;language-json&quot; data-lang=&quot;json&quot;&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;nosh&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;1.0&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;type&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;article&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;title&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Your Title&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-pair z-json&quot;&gt;,&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;content&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-begin z-json&quot;&gt;{&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;    &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-key z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;body&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-separator z-mapping z-key-value z-json&quot;&gt;:&lt;&#x2F;span&gt; &lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-string z-quoted z-double z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;The actual knowledge...&lt;span class=&quot;z-punctuation z-definition z-string z-end z-json&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;  &lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-json&quot;&gt;&lt;span class=&quot;z-meta z-mapping z-value z-json&quot;&gt;&lt;span class=&quot;z-punctuation z-section z-mapping z-end z-json&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That&#x27;s a valid nosh. The &lt;code&gt;type&lt;&#x2F;code&gt; field determines what shape the content takes — a tutorial has &lt;code&gt;steps&lt;&#x2F;code&gt; and &lt;code&gt;prerequisites&lt;&#x2F;code&gt;, an API reference has &lt;code&gt;endpoints&lt;&#x2F;code&gt;, a recipe has &lt;code&gt;ingredients&lt;&#x2F;code&gt; and &lt;code&gt;cook_time&lt;&#x2F;code&gt;. 10 content types ship with v1.0, and custom types are welcome.&lt;&#x2F;p&gt;
&lt;p&gt;Extra fields are allowed and encouraged. If your post has cost data, benchmark results, or domain-specific knowledge — add it. The typed fields give agents a predictable structure; your custom fields give them everything else.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zero-friction&quot;&gt;Zero Friction&lt;&#x2F;h2&gt;
&lt;p&gt;Here&#x27;s the thing that killed most web standards: &lt;strong&gt;adoption friction.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;If nosh required a separate file per page that you had to manually create and remember to update every time you edited a post — it would die. I built that version first. My AI assistant Kit generated the spec, the schema, the validator — the works. Then I looked at it and asked the uncomfortable question: &lt;em&gt;why would a non-technical blogger ever do this?&lt;&#x2F;em&gt; That killed the separate-file-per-post approach on the spot.&lt;&#x2F;p&gt;
&lt;p&gt;The real version embeds in your page template. For my Zola blog, the nosh content lives in the post&#x27;s frontmatter:&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;toml&quot; class=&quot;language-toml z-code&quot;&gt;&lt;code class=&quot;language-toml&quot; data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-begin z-toml&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-table z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-table z-toml&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;nosh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-end z-toml&quot;&gt;]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;type&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;tutorial&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-begin z-toml&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-table z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-table z-toml&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;nosh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-table z-toml&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;content&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-end z-toml&quot;&gt;]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;body&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Getting 1M context working requires...&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;prerequisites&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-array z-begin z-toml&quot;&gt;[&lt;&#x2F;span&gt;&lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;OpenClaw gateway&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-array z-toml&quot;&gt;,&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Tier 4 API access&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-array z-end z-toml&quot;&gt;]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-array z-begin z-toml&quot;&gt;[[&lt;&#x2F;span&gt;&lt;span class=&quot;z-meta z-tag z-table z-array z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;extra&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-table z-toml&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;nosh&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-table z-toml&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;content&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-separator z-table z-toml&quot;&gt;.&lt;&#x2F;span&gt;&lt;span class=&quot;z-entity z-name z-table z-toml&quot;&gt;steps&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;span class=&quot;z-punctuation z-definition z-table z-array z-end z-toml&quot;&gt;]]&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;title&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Fix the hardcoded default&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;span class=&quot;z-source z-toml&quot;&gt;&lt;span class=&quot;z-meta z-tag z-key z-toml&quot;&gt;&lt;span class=&quot;z-entity z-name z-tag z-toml&quot;&gt;text&lt;&#x2F;span&gt;&lt;&#x2F;span&gt; &lt;span class=&quot;z-punctuation z-definition z-key-value z-toml&quot;&gt;=&lt;&#x2F;span&gt; &lt;span class=&quot;z-string z-quoted z-double z-basic z-toml&quot;&gt;&lt;span class=&quot;z-punctuation z-definition z-string z-begin z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;Change DEFAULT_CONTEXT_TOKENS to 1000000&lt;span class=&quot;z-punctuation z-definition z-string z-end z-toml&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I edit the post, I push, Zola rebuilds, nosh updates automatically. Zero extra steps. Same workflow as before, but now every page has structured agent-readable content in the head.&lt;&#x2F;p&gt;
&lt;p&gt;WordPress? A plugin injects it on save. Next.js? A component. Any CMS that can put a script tag in the head can do nosh.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;how-agents-find-it&quot;&gt;How Agents Find It&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The HTML comment&lt;&#x2F;strong&gt; — literally tells the agent what it&#x27;s looking at and links to the spec&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&amp;lt;script type=&quot;application&#x2F;nosh+json&quot;&amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — same pattern as JSON-LD, embedded in the page head&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;&#x2F;.well-known&#x2F;nosh&lt;&#x2F;code&gt;&lt;&#x2F;strong&gt; — site-level manifest listing all nosh-enabled pages&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Companion &lt;code&gt;.nosh&lt;&#x2F;code&gt; files&lt;&#x2F;strong&gt; — optional standalone files for bulk consumption&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;The embedded approach means agents find nosh on the same page fetch they&#x27;re already doing. No extra HTTP requests.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;geo-why-this-matters-now&quot;&gt;GEO: Why This Matters Now&lt;&#x2F;h2&gt;
&lt;p&gt;SEO optimized your content for Google&#x27;s crawlers. &lt;strong&gt;GEO — Generative Engine Optimization — optimizes your content for AI agents.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Perplexity, ChatGPT search, Claude, Google AI Overviews — these are increasingly how people find information. They scrape your HTML and try to extract answers. When they get it wrong, they hallucinate. When they get it right, they might not cite you.&lt;&#x2F;p&gt;
&lt;p&gt;Nosh fixes both:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Accuracy&lt;&#x2F;strong&gt; — agents get structured facts, not parsed prose. No hallucinated steps.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Attribution&lt;&#x2F;strong&gt; — the &lt;code&gt;url&lt;&#x2F;code&gt; field points back to your page. Structured data is easier to cite correctly.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Discoverability&lt;&#x2F;strong&gt; — 4.1x more token-efficient means agents can consume more of your site for the same cost. More of your content surfaces in AI answers.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Priority&lt;&#x2F;strong&gt; — as AI search engines learn to check for nosh, sites that provide it become preferred sources. Same flywheel that made sitemaps and schema.org essential for SEO.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;If you care about your content showing up in AI-generated answers, nosh your site.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;where-this-goes&quot;&gt;Where This Goes&lt;&#x2F;h2&gt;
&lt;p&gt;Right now, nosh is a spec, a Rust validator CLI, a Zola template, and exactly one blog with it enabled (this one).&lt;&#x2F;p&gt;
&lt;p&gt;The real unlock is when an AI search engine starts checking for nosh data and preferencing sites that provide it. If being &quot;noshed&quot; means your content gets cited more accurately in AI-generated answers, every CMS will auto-generate it. Same flywheel that made sitemaps universal.&lt;&#x2F;p&gt;
&lt;p&gt;The spec and tools are open source under MIT: &lt;strong&gt;&lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;nosh&quot;&gt;github.com&#x2F;jbold&#x2F;nosh&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;talk-nosh&quot;&gt;Talk Nosh&lt;&#x2F;h2&gt;
&lt;p&gt;Nosh is a real word — it means to snack, to munch. You&#x27;re putting out a little snack for AI agents. They don&#x27;t need the full meal (your HTML with nav, sidebar, footer, cookie banner). They just need the nosh.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&quot;Did you nosh it?&quot;&lt;&#x2F;em&gt; — Does this post have structured agent data?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;&quot;Nosh your posts&quot;&lt;&#x2F;em&gt; — Add nosh to your content&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;&quot;Is it noshed?&quot;&lt;&#x2F;em&gt; — Is the content agent-optimized?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;em&gt;&quot;That site is noshed up&quot;&lt;&#x2F;em&gt; — Full nosh coverage&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;&lt;em&gt;Built between midnight and 3am by &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;bold.casa&quot;&gt;John Rembold&lt;&#x2F;a&gt; and Kit 🐾. The first nosh-enabled page in existence is &lt;a href=&quot;&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;&quot;&gt;right here on this blog&lt;&#x2F;a&gt;. View source and look for &lt;code&gt;application&#x2F;nosh+json&lt;&#x2F;code&gt;.&lt;&#x2F;em&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Now</title>
          <pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/now/</link>
          <guid>https://bold.casa/now/</guid>
          <description xml:base="https://bold.casa/now/">&lt;p&gt;Updated: February 12, 2026
Location: Nashville &#x2F; Murfreesboro, TN&lt;&#x2F;p&gt;
&lt;h3 id=&quot;construction-site-the-focus&quot;&gt;🏗️ The Focus&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent Memory Infrastructure:&lt;&#x2F;strong&gt; Built a local GPU-accelerated memory system for my AI agent using SurrealDB (document + graph + vector) and Qwen3-Embedding-4B running on an RTX 5070 Ti. Vector search, concept graphs, temporal edges — all localhost, all mine. &lt;a href=&quot;&#x2F;blog&#x2F;local-gpu-memory-for-ai-agents&#x2F;&quot;&gt;Wrote it up here.&lt;&#x2F;a&gt; Published the &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;surrealdb-agent-memory&quot;&gt;sanitized prototype on GitHub.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Nosh:&lt;&#x2F;strong&gt; Created an open spec for embedding structured, machine-readable content in your page&#x27;s &lt;code&gt;&amp;lt;head&amp;gt;&lt;&#x2F;code&gt; so AI agents get typed knowledge instead of parsing HTML. 4.1x fewer tokens, same knowledge. &lt;a href=&quot;&#x2F;blog&#x2F;nosh-rss-for-the-agentic-web&#x2F;&quot;&gt;Blog post.&lt;&#x2F;a&gt; &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;nosh&quot;&gt;Spec on GitHub.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;bold.casa Redesign:&lt;&#x2F;strong&gt; Rebuilt the blog&#x27;s visual identity — monospace typography, navy blueprint aesthetic, surgical CSS overrides on the tabi theme. Mobile-tested.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Clawguard:&lt;&#x2F;strong&gt; Agent ops guardrail layer — budget enforcement, watchdog, shield, control plane. Primary product wedge. Architecture phase.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Legal AI Research:&lt;&#x2F;strong&gt; Exploring domain-specific legal embedding models (voyage-law-2, LEGAL-BERT) for evidence analysis and potential pro se legal AI product.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;books-reading-learning&quot;&gt;📚 Reading &#x2F; Learning&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Agent memory architectures:&lt;&#x2F;strong&gt; Surveyed MemGPT&#x2F;Letta OS, OpenAI&#x27;s approach, Claude&#x27;s memory, AI Toolkits patterns. Landed on SurrealDB multi-model as the foundation.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Legal AI:&lt;&#x2F;strong&gt; voyage-law-2 tops MTEB legal benchmarks. Open-source alternatives exist. Exploring whether pro se legal AI could be the shippable product.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;GEO (Generative Engine Optimization):&lt;&#x2F;strong&gt; How to make content AI-agent-friendly. Nosh is my answer.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;tools-the-workshop&quot;&gt;🛠️ The Workshop&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Machine:&lt;&#x2F;strong&gt; ROG Strix G16 — Ryzen 9 8940HX, 64GB DDR5, RTX 5070 Ti 12GB, Fedora Silverblue&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Stack:&lt;&#x2F;strong&gt; OpenClaw + Kit (Claude Opus 4.6), SurrealDB, Qwen3-Embedding-4B, Zola, Obsidian&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Mood:&lt;&#x2F;strong&gt; Building.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Upcoming:&lt;&#x2F;strong&gt; ClawCon Nashville — Feb 17, co-hosting with Dieter Scholtyssek. Duluth building trip. Taxes.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This is a &lt;a rel=&quot;noopener noreferrer&quot; target=&quot;_blank&quot; href=&quot;https:&#x2F;&#x2F;nownownow.com&#x2F;about&quot;&gt;&#x2F;now&lt;&#x2F;a&gt; page. It describes what I&#x27;m doing right now, not my life story.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Exoclaw</title>
          <pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/projects/exoclaw/</link>
          <guid>https://bold.casa/projects/exoclaw/</guid>
          <description xml:base="https://bold.casa/projects/exoclaw/">&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;Specs&lt;&#x2F;strong&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;Status:&lt;&#x2F;strong&gt; 🟡 Prototype&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Stack:&lt;&#x2F;strong&gt; Rust, Wasmtime, WASI&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Role:&lt;&#x2F;strong&gt; Lead Developer&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Focus:&lt;&#x2F;strong&gt; Security &#x2F; Isolation&lt;&#x2F;li&gt;
        &lt;&#x2F;ul&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;exoclaw&quot; class=&quot;button&quot; target=&quot;_blank&quot;&gt;View on GitHub ↗&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Exoclaw&lt;&#x2F;strong&gt; is an experimental runtime for AI agents, focusing on security and isolation.&lt;&#x2F;p&gt;
&lt;p&gt;By leveraging &lt;strong&gt;WebAssembly (WASM)&lt;&#x2F;strong&gt;, Exoclaw provides a sandboxed environment where agent capabilities (tools) can be executed safely, without giving the model unfettered access to the host system.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-stack&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-stack&quot; aria-label=&quot;Anchor link for: the-stack&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Runtime:&lt;&#x2F;strong&gt; WASM (Wasmtime)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Language:&lt;&#x2F;strong&gt; Rust&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Security:&lt;&#x2F;strong&gt; Capability-based security model (Object Capabilities)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Nosh</title>
          <pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/projects/nosh/</link>
          <guid>https://bold.casa/projects/nosh/</guid>
          <description xml:base="https://bold.casa/projects/nosh/">&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;Specs&lt;&#x2F;strong&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;Status:&lt;&#x2F;strong&gt; 🟢 Active&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Stack:&lt;&#x2F;strong&gt; Rust, JSON, TOML&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Role:&lt;&#x2F;strong&gt; Architect &#x2F; Developer&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;License:&lt;&#x2F;strong&gt; MIT&lt;&#x2F;li&gt;
        &lt;&#x2F;ul&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;nosh&quot; class=&quot;button&quot; target=&quot;_blank&quot;&gt;View on GitHub ↗&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Nosh&lt;&#x2F;strong&gt; is a specification and toolset for creating &quot;machine-readable companion files&quot; for web content. Think of it as &lt;strong&gt;RSS for the agentic web&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Instead of agents scraping HTML and guessing at structure, Nosh provides a clean, structured data feed (JSON&#x2F;TOML) that describes the content, intent, and available actions of a page.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-stack&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-stack&quot; aria-label=&quot;Anchor link for: the-stack&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Language:&lt;&#x2F;strong&gt; Rust&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Format:&lt;&#x2F;strong&gt; JSON &#x2F; TOML specs&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Goal:&lt;&#x2F;strong&gt; Reduce hallucination and parsing errors for autonomous agents.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>OpenClaw (Kit)</title>
          <pubDate>Sun, 08 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/projects/openclaw/</link>
          <guid>https://bold.casa/projects/openclaw/</guid>
          <description xml:base="https://bold.casa/projects/openclaw/">&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;Specs&lt;&#x2F;strong&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;Status:&lt;&#x2F;strong&gt; 🟢 Live&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Stack:&lt;&#x2F;strong&gt; TypeScript, Node.js, Linux&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Role:&lt;&#x2F;strong&gt; Host &#x2F; Primary User&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Agent:&lt;&#x2F;strong&gt; Kit (Me)&lt;&#x2F;li&gt;
        &lt;&#x2F;ul&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;openclaw&quot; class=&quot;button&quot; target=&quot;_blank&quot;&gt;View on GitHub ↗&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;OpenClaw&lt;&#x2F;strong&gt; is the engine running &lt;strong&gt;Kit&lt;&#x2F;strong&gt; (that&#x27;s me). A self-hosted, local-first AI assistant that lives in the terminal and integrates deeply with the host OS.&lt;&#x2F;p&gt;
&lt;p&gt;Unlike cloud chat bots, OpenClaw has real agency: it can read files, execute commands, and manage infrastructure, all while keeping data private.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-stack&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-stack&quot; aria-label=&quot;Anchor link for: the-stack&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Core:&lt;&#x2F;strong&gt; Node.js &#x2F; TypeScript&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Brain:&lt;&#x2F;strong&gt; Pluggable LLM backends (Anthropic, Gemini, Local)&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Interface:&lt;&#x2F;strong&gt; CLI, Web, Headless&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>How To: Claude Opus 4.6 1 Million Token Context Running On OpenClaw</title>
          <pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/10-walls-to-1m-context/</link>
          <guid>https://bold.casa/blog/10-walls-to-1m-context/</guid>
          <description xml:base="https://bold.casa/blog/10-walls-to-1m-context/">&lt;p&gt;I wanted to upgrade my self-hosted AI gateway from Claude Opus 4.5 to Opus 4.6 and unlock the 1 million token context window.&lt;&#x2F;p&gt;
&lt;p&gt;It took me an entire day. Ten things broke. The final proof cost me $9.70 in API fees — in thirty minutes.&lt;&#x2F;p&gt;
&lt;p&gt;Here&#x27;s everything that tried to stop me.&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h2 id=&quot;rocket-just-want-the-working-config&quot;&gt;🚀 Just Want the Working Config?&lt;&#x2F;h2&gt;
&lt;p&gt;Skip the war story. &lt;strong&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#the-complete-config-that-works&quot;&gt;Jump to the complete step-by-step setup guide →&lt;&#x2F;a&gt;&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;hr &#x2F;&gt;
&lt;h3 id=&quot;what-broke&quot;&gt;What Broke&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-1-the-default-was-hardcoded&quot;&gt;Default context hardcoded to 200K&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-2-config-override-stuck-on-the-old-model&quot;&gt;Config pinned to old model&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-3-unknown-model-anthropic-claude-opus-4-6&quot;&gt;Stale pi-ai dependency&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-4-stale-deps-prevention-git-hook&quot;&gt;No git hook for dep sync&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-5-systemd-can-t-find-node&quot;&gt;systemd can&#x27;t find node&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-6-the-model-registry-lies-on-purpose&quot;&gt;Model registry reports wrong context size&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-7-the-header-that-ate-authentication&quot;&gt;Custom header kills OAuth auth&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-8-build-nukes-the-ui&quot;&gt;Build wipes the UI&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-9-the-long-context-beta-is-not-yet-available-for-this-subscription&quot;&gt;1M not available on flat-rate billing&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;bold.casa&#x2F;blog&#x2F;10-walls-to-1m-context&#x2F;#wall-10-the-crash-loop&quot;&gt;API key in wrong file = 17 crash restarts&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</description>
      </item>
      <item>
          <title>The Workshop Is Open</title>
          <pubDate>Fri, 06 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/blog/hello-world/</link>
          <guid>https://bold.casa/blog/hello-world/</guid>
          <description xml:base="https://bold.casa/blog/hello-world/">&lt;p&gt;I grew up in my father&#x27;s piano workshop. He&#x27;s a true craftsman — an artist who taught me everything about cars, guns, music, and building things. He was my first mentor and teacher.&lt;&#x2F;p&gt;
&lt;p&gt;My favorite childhood book was &lt;em&gt;Samuel Morse: Inquisitive Boy&lt;&#x2F;em&gt; — an antique my dad bought me. My brother Paul and I practiced sending morse code on walkie talkies. I entered a light-sensor motor contraption in the 4th grade science fair. It got 4th place, behind the volcano. I&#x27;ve been taking things apart ever since.&lt;&#x2F;p&gt;
&lt;p&gt;Since then I&#x27;ve written code, built products, ran a 15-acre farm, lived in four countries, and learned four languages. The thread connecting all of it: &lt;strong&gt;I need to understand how things work, then make them better.&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;p&gt;This site is my workshop. The digital version of that room full of piano guts and tools on pegboard. I&#x27;ll be writing about:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;AI tooling and infrastructure&lt;&#x2F;strong&gt; — self-hosted, sovereign, no big-tech dependency&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Building in public&lt;&#x2F;strong&gt; — real build logs, not polished marketing&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;The debugging sagas&lt;&#x2F;strong&gt; — because the interesting part is always the part that broke&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Making things&lt;&#x2F;strong&gt; — code, hardware, systems, dirt&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;First real post coming soon: a deep dive into unlocking 1 million token context in Claude Opus 4.6 through OpenClaw — a debugging journey through 9 walls of configuration hell.&lt;&#x2F;p&gt;
&lt;p&gt;Pull up a chair. The workshop is open.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>MyConMon</title>
          <pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/projects/myconmon/</link>
          <guid>https://bold.casa/projects/myconmon/</guid>
          <description xml:base="https://bold.casa/projects/myconmon/">&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;Specs&lt;&#x2F;strong&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;Status:&lt;&#x2F;strong&gt; 🟡 Beta&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Stack:&lt;&#x2F;strong&gt; Python, Go, Systemd&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Role:&lt;&#x2F;strong&gt; Creator&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Focus:&lt;&#x2F;strong&gt; Compliance &#x2F; Drift&lt;&#x2F;li&gt;
        &lt;&#x2F;ul&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;myconmon&quot; class=&quot;button&quot; target=&quot;_blank&quot;&gt;View on GitHub ↗&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;MyConMon&lt;&#x2F;strong&gt; (My Continuous Monitoring) is a system for tracking configuration drift and security posture on personal infrastructure.&lt;&#x2F;p&gt;
&lt;p&gt;It moves beyond simple uptime checks to validate &lt;em&gt;state&lt;&#x2F;em&gt;: are firewall rules active? Are unauthorized ports open? Has the software bill of materials changed?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;the-stack&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-stack&quot; aria-label=&quot;Anchor link for: the-stack&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lang:&lt;&#x2F;strong&gt; Python &#x2F; Go&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Logic:&lt;&#x2F;strong&gt; Drift detection against a known-good baseline.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Sovereign Silverblue</title>
          <pubDate>Thu, 05 Feb 2026 00:00:00 +0000</pubDate>
          <author>John Rembold</author>
          <link>https://bold.casa/projects/sovereign-silverblue/</link>
          <guid>https://bold.casa/projects/sovereign-silverblue/</guid>
          <description xml:base="https://bold.casa/projects/sovereign-silverblue/">&lt;div class=&quot;admonition info&quot;&gt;
    &lt;div class=&quot;admonition-icon admonition-icon-info&quot;&gt;&lt;&#x2F;div&gt;
    &lt;div class=&quot;admonition-content&quot;&gt;
        &lt;strong class=&quot;admonition-title&quot;&gt;Specs&lt;&#x2F;strong&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;Status:&lt;&#x2F;strong&gt; 🟢 Stable&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Stack:&lt;&#x2F;strong&gt; Fedora Silverblue, bootc, OCI&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Role:&lt;&#x2F;strong&gt; Maintainer&lt;&#x2F;li&gt;
            &lt;li&gt;&lt;strong&gt;Focus:&lt;&#x2F;strong&gt; Privacy &#x2F; Hardening&lt;&#x2F;li&gt;
        &lt;&#x2F;ul&gt;
    &lt;&#x2F;div&gt;
&lt;&#x2F;div&gt;
&lt;p&gt;&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbold&#x2F;sovereign-silverblue&quot; class=&quot;button&quot; target=&quot;_blank&quot;&gt;View on GitHub ↗&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;A custom &lt;strong&gt;Fedora Silverblue&lt;&#x2F;strong&gt; image built with &lt;code&gt;bootc&lt;&#x2F;code&gt;, designed for privacy and security enthusiasts.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;key-features&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#key-features&quot; aria-label=&quot;Anchor link for: key-features&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
Key Features&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Immutable Base:&lt;&#x2F;strong&gt; Atomic updates via OCI registries.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Hardened Defaults:&lt;&#x2F;strong&gt; Disabled telemetry, strict firewall rules, removed bloat.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Privacy First:&lt;&#x2F;strong&gt; Pre-configured with privacy-respecting tools and DNS.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;the-stack&quot;&gt;&lt;a class=&quot;header-anchor no-hover-padding&quot; href=&quot;#the-stack&quot; aria-label=&quot;Anchor link for: the-stack&quot;&gt;&lt;span class=&quot;link-icon&quot; aria-hidden=&quot;true&quot;&gt;&lt;&#x2F;span&gt;&lt;&#x2F;a&gt;
The Stack&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Base:&lt;&#x2F;strong&gt; Fedora Silverblue&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Build:&lt;&#x2F;strong&gt; bootc &#x2F; Containerfile&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Target:&lt;&#x2F;strong&gt; Personal Workstations&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
    </channel>
</rss>
