<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Samuel Obukwelu — Notes</title><description>Short notes from Samuel Obukwelu — TILs, links, status updates, quotes, off-cuts.</description><link>https://sobu.dev/</link><language>en-us</language><item><title>ASIDE: A Chief of Staff per domain</title><link>https://sobu.dev/notes/2026-05-25-chief-of-staff-pattern.html</link><guid isPermaLink="true">https://sobu.dev/notes/2026-05-25-chief-of-staff-pattern.html</guid><description>The work volume has crept up to where context-switching is the real cost. TaskFast, Fraction, home life. Holding all of it in one head means everything gets the same lukewarm half-attention. So I&apos;ve been building a small fleet of Chief of Staff agents, one per domain. Each is its own agent profile with its own identity file, its own chat bot, its own memory peer, its own scheduled watchers. They don&apos;t share anything. A competitive secret in TaskFast&apos;s memory will never surface in a Fraction conversation, by construction. Above them sits Benson, my main agent, who does none of the domain work. His one job is to read across the fleet every morning and tell me what to look at first. Three minds, one sense of what matters. The interesting infra question is how signal actually gets to these agents. My local server accepts no inbound network connections. So Fireflies and GitHub webhooks land on a Cloudflare Worker instead. The Worker verifies the signature, dedupes against KV, persists the raw payload to D1, and enqueues the event id. The local server then long-polls that queue, pulls events, and feeds them to the right CoS. The trick is the queue. It buffers for days. If the server is asleep, offline, or I&apos;m rebuilding it, nothing is lost. Polling APIs from the local server directly would silently lose anything that ages out of a source&apos;s window during downtime. The Worker-plus-Queue path makes the whole pipeline forgiving in the way I need it to be. What I like most is how cleanly the topology decomposes. Domain agents talk to me when I want depth. Benson talks to me when I want priority. Webhooks talk to Cloudflare. Cloudflare talks to my local server. My local server talks to nobody.</description><pubDate>Mon, 25 May 2026 00:00:00 GMT</pubDate></item><item><title>LINK: AI workshop at VueConf US 2026, with Martin Rojas</title><link>https://sobu.dev/notes/2026-05-19-vueconf-2026-ai-workshop.html</link><guid isPermaLink="true">https://sobu.dev/notes/2026-05-19-vueconf-2026-ai-workshop.html</guid><description>vueconf.us — Co-led an AI workshop with [Martin Rojas](https://www.martinrojas.dev/) at **VueConf US 2026** at Georgia Tech this past Tuesday. The room was small and curious. Most attendees came from defense and government, and most weren&apos;t asking *can AI write my Vue components*. They were asking the harder question: *how do I raise the AI IQ of my org without breaking what already works?* That reframed the workshop for me. The frontier for these folks is organizational. Procurement, evaluation, the gap between a developer who&apos;s been using these tools for a year and a director who has to authorize them. The technical bar to use AI keeps falling, while the institutional bar to adopt it inside a regulated org is where the real work is. Fun to be on the receiving end of that question for a change.</description><pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate></item><item><title>ASIDE: Six hours at the Generative UI hackathon</title><link>https://sobu.dev/notes/2026-05-09-generative-ui-hackathon.html</link><guid isPermaLink="true">https://sobu.dev/notes/2026-05-09-generative-ui-hackathon.html</guid><description>Six hours on a Saturday, noon to six. Built a thing called **Witness** at a generative UI hackathon. Most agent UIs are built for the agent. You inherit a chat log and a spinner, and you&apos;re supposed to trust it. Witness flips that. Instead of one chat shape for every task, the model renders the verification surface itself, tuned to what the agent just did. Six hours isn&apos;t enough to ship the idea, but it&apos;s enough to feel where it bites. The real frontier is the agent generating the UI that makes its own work auditable. That&apos;s a different skill from writing code, and the gap is wider than I expected.</description><pubDate>Sat, 09 May 2026 00:00:00 GMT</pubDate></item><item><title>TIL: Astro&apos;s glob loader is lazy until you call getCollection</title><link>https://sobu.dev/notes/2026-04-27-astro-glob-loader-is-lazy.html</link><guid isPermaLink="true">https://sobu.dev/notes/2026-04-27-astro-glob-loader-is-lazy.html</guid><description>The `glob()` loader Astro ships with content collections doesn&apos;t read disk at config-load time — it defers until the first `getCollection()` call. Means you can declare a hundred collections without paying for the ones a page never uses. Discovered while wiring a second collection alongside `blog`. The build stayed cheap; the new collection only got walked on the page that actually rendered it.</description><pubDate>Mon, 27 Apr 2026 00:00:00 GMT</pubDate></item><item><title>ASIDE: Discriminated unions are an authoring signal</title><link>https://sobu.dev/notes/2026-04-26-zod-discriminated-unions.html</link><guid isPermaLink="true">https://sobu.dev/notes/2026-04-26-zod-discriminated-unions.html</guid><description>Designing the notes schema, I kept reaching for &quot;make every field optional and add a `refine()` for the rules.&quot; Then I remembered the marginalia schema already uses a discriminated union, and switched. The shift wasn&apos;t about types — it was about authoring. With a flat optional schema, the editor lets you type `kind: link` and forget the URL. With a union, the build fails the moment you do that. The schema becomes a checklist you can&apos;t ignore. That&apos;s the actual win — not the type narrowing in the renderer, but the constraint at write time.</description><pubDate>Sun, 26 Apr 2026 00:00:00 GMT</pubDate></item><item><title>QUOTE: Kent Beck</title><link>https://sobu.dev/notes/2026-04-25-on-make-it-work.html</link><guid isPermaLink="true">https://sobu.dev/notes/2026-04-25-on-make-it-work.html</guid><description>&quot;Make it work, make it right, make it fast — in that order.&quot; — Kent Beck // The order is the whole lesson. People skip &quot;make it right&quot; because &quot;make it work&quot; already shipped, then optimize. Six months later the code is fast and wrong and nobody can change it. I read this as a debt instrument. Skipping a step doesn&apos;t remove the work — it moves it later, with interest.</description><pubDate>Sat, 25 Apr 2026 00:00:00 GMT</pubDate></item><item><title>LINK: Simon Willison&apos;s notes on prompt caching</title><link>https://sobu.dev/notes/2026-04-24-simon-willison-on-prompt-caching.html</link><guid isPermaLink="true">https://sobu.dev/notes/2026-04-24-simon-willison-on-prompt-caching.html</guid><description>simonwillison.net — Simon&apos;s running notes on prompt caching across providers are the closest thing to a current-state reference I&apos;ve found. The pattern of &quot;here&apos;s what I tried, here&apos;s what broke&quot; reads more useful than a vendor doc — the failure modes are where the actual cost lives. Worth checking before you wire caching into anything new.</description><pubDate>Fri, 24 Apr 2026 00:00:00 GMT</pubDate></item></channel></rss>