<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Vibes DIY Blog</title>
    <link>https://good.vibes.diy/blog/</link>
    <description>Field notes, evals, and stories from building the no-code app builder that turns a sentence into a working app.</description>
    <atom:link href="https://good.vibes.diy/blog/rss.xml" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Thu, 08 Oct 2026 19:00:00 GMT</lastBuildDate>
    <item>
      <title>Ask for an app just for you, and it stays yours</title>
      <link>https://good.vibes.diy/blog/just-for-me-apps.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/just-for-me-apps.html</guid>
      <pubDate>Thu, 08 Oct 2026 19:00:00 GMT</pubDate>
      <description>Every app on Vibes DIY now comes with its own sharing rules. Ask for one just for you and it opens only for the people you let in, everyone inside keeps their own records, and one tap shares the entry you&apos;re proud of.</description>
    </item>
    <item>
      <title>We Know Too Much About How Mercury Doesn&apos;t Think</title>
      <link>https://good.vibes.diy/blog/how-mercury-doesnt-think.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/how-mercury-doesnt-think.html</guid>
      <pubDate>Thu, 08 Oct 2026 18:00:00 GMT</pubDate>
      <description>We spent a week trying to make a very fast, very cheap model plan new apps as well as our careful one. It lost round after round, and losing showed us its real job: a quick first read of your idea. That&apos;s live now, and your first app is on screen in about half the time.</description>
    </item>
    <item>
      <title>A quarter of a million towers</title>
      <link>https://good.vibes.diy/blog/a-quarter-of-a-million-towers.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/a-quarter-of-a-million-towers.html</guid>
      <pubDate>Wed, 07 Oct 2026 19:00:00 GMT</pubDate>
      <description>The technical sequel to the three.js tutorial: how a library import becomes a pinned URL, why React leaves you no choice but a cleanup, what a frame of a few thousand towers actually costs, and the same city with a quarter of a million towers in one draw call.</description>
    </item>
    <item>
      <title>Every city gets an island</title>
      <link>https://good.vibes.diy/blog/every-city-gets-an-island.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/every-city-gets-an-island.html</guid>
      <pubDate>Wed, 07 Oct 2026 18:30:00 GMT</pubDate>
      <description>Part two of the browser three.js tutorial: give the city a memory. A kept city is four numbers and a handle, one document each — and the shared scene is an archipelago where every document is an island you can sail to, click, and load into your own.</description>
    </item>
    <item>
      <title>You can just make 3D</title>
      <link>https://good.vibes.diy/blog/you-can-just-make-3d.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/you-can-just-make-3d.html</guid>
      <pubDate>Wed, 07 Oct 2026 18:00:00 GMT</pubDate>
      <description>A step-by-step three.js tutorial where every example is a live scene turning in the page. Four tiny apps build up to a city at dusk you can orbit, reseed, and remix — nothing to install, no bundler, no folder of someone else&apos;s code.</description>
    </item>
    <item>
      <title>How we use Muse to get more done in parallel</title>
      <link>https://good.vibes.diy/blog/using-muse-to-get-more-done.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/using-muse-to-get-more-done.html</guid>
      <pubDate>Wed, 23 Sep 2026 04:15:00 GMT</pubDate>
      <description>Give Muse a clear task and its own worktree. Keep the main conversation available for decisions, then bring the result back through independent review.</description>
    </item>
    <item>
      <title>An app is your data. The screen is optional.</title>
      <link>https://good.vibes.diy/blog/apps-that-do-the-typing-for-you.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/apps-that-do-the-typing-for-you.html</guid>
      <pubDate>Sat, 19 Sep 2026 18:00:00 GMT</pubDate>
      <description>The apps that will run on smart glasses, in your car and in your earbuds are not new screens. They are your data and the rules you set for it, reachable from anywhere. We wrote a prompt to imagine fifty of them, and it is the clearest statement of what we are building. Here it is, whole, with notes on why each part is there.</description>
    </item>
    <item>
      <title>Good vibes only</title>
      <link>https://good.vibes.diy/blog/good-vibes-only.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/good-vibes-only.html</guid>
      <pubDate>Fri, 18 Sep 2026 20:00:00 GMT</pubDate>
      <description>We already have one rule for how we talk to the code generator: never tell it what not to do. This is the same rule for how we talk to people. Every bummer sentence has a dope version, and the dope version is the one that ships — with nine inversions from our own product, most of them shipped the day this was written.</description>
    </item>
    <item>
      <title>Borrowing the GPU</title>
      <link>https://good.vibes.diy/blog/borrowing-the-gpu.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/borrowing-the-gpu.html</guid>
      <pubDate>Wed, 16 Sep 2026 17:00:00 GMT</pubDate>
      <description>The technical sequel to the p5.js tutorial: how a library import becomes a pinned URL, why React leaves you no choice but instance mode, what a frame of 1,400 particles actually costs, and the same flow field pushed onto the GPU with a fragment shader.</description>
    </item>
    <item>
      <title>A picture is five numbers</title>
      <link>https://good.vibes.diy/blog/a-picture-is-five-numbers.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/a-picture-is-five-numbers.html</guid>
      <pubDate>Wed, 16 Sep 2026 16:30:00 GMT</pubDate>
      <description>Part two of the browser p5.js tutorial: give the painter a memory. Seed the randomness and a sketch redraws itself from five numbers forever — so saving a piece stores the numbers, not a PNG, and a shared wall of everyone&apos;s pieces is a grid of live sketches you can click to load.</description>
    </item>
    <item>
      <title>You can just make pictures</title>
      <link>https://good.vibes.diy/blog/you-can-just-make-pictures.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/you-can-just-make-pictures.html</guid>
      <pubDate>Wed, 16 Sep 2026 16:00:00 GMT</pubDate>
      <description>A step-by-step p5.js tutorial where every example is a live sketch painting itself in the page. Four tiny apps build up to a flow-field painter you can drag on, keep, and remix — nothing to install, no toolchain, no folder of someone else&apos;s code.</description>
    </item>
    <item>
      <title>Your app already talks to the model</title>
      <link>https://good.vibes.diy/blog/your-app-already-talks-to-the-model.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/your-app-already-talks-to-the-model.html</guid>
      <pubDate>Tue, 15 Sep 2026 18:00:00 GMT</pubDate>
      <description>Everywhere else on the web, calling an AI model from a browser leaks a key, so every model believes an AI call needs a server. Ours does not, and our building agent kept adding one anyway. Here is how we taught it the page&apos;s own habit in two sentences, without ever saying the word no.</description>
    </item>
    <item>
      <title>Ten strangers, ten phones, one evening</title>
      <link>https://good.vibes.diy/blog/ten-strangers-ten-phones.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/ten-strangers-ten-phones.html</guid>
      <pubDate>Fri, 11 Sep 2026 18:00:00 GMT</pubDate>
      <description>We put our home page in front of ten people we had never met, on their own phones, with a recorder running. Eight of the nine who made an account lost the first thing they typed. Here is what they built, what broke, and what we changed the same week.</description>
    </item>
    <item>
      <title>Send your vibe&apos;s data anywhere you want</title>
      <link>https://good.vibes.diy/blog/your-app-can-send-a-record-anywhere.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/your-app-can-send-a-record-anywhere.html</guid>
      <pubDate>Fri, 11 Sep 2026 16:00:00 GMT</pubDate>
      <description>A lawyer&apos;s first prompt asked for an intake form whose submissions land in Clio. Now any Vibes app can hand a record to a Zapier Catch Hook, and Zapier carries it into Clio, Slack, Google Sheets or an inbox. One Zap, one saved URL, nothing to build.</description>
    </item>
    <item>
      <title>A to-do list you share with your agent</title>
      <link>https://good.vibes.diy/blog/a-to-do-list-you-share-with-your-agent.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/a-to-do-list-you-share-with-your-agent.html</guid>
      <pubDate>Thu, 03 Sep 2026 20:00:00 GMT</pubDate>
      <description>One Vibes DIY user turned a small task app into the place their AI assistant keeps every household chore, bill dispute and follow-up. Here&apos;s the pattern: the app is the board you look at, and the same records are what the agent reads and writes.</description>
    </item>
    <item>
      <title>Nothing moved, and everything got smarter</title>
      <link>https://good.vibes.diy/blog/nothing-moved-everything-got-smarter.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/nothing-moved-everything-got-smarter.html</guid>
      <pubDate>Thu, 03 Sep 2026 16:00:00 GMT</pubDate>
      <description>The chat in front of your app stopped being a set of buttons and became one agent that reads your app, answers you, builds in two passes, and keeps working after you close the tab. It looks exactly the same.</description>
    </item>
    <item>
      <title>Redshifted</title>
      <link>https://good.vibes.diy/blog/redshifted.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/redshifted.html</guid>
      <pubDate>Wed, 26 Aug 2026 08:00:00 GMT</pubDate>
      <description>The AI-accelerated haven&apos;t gone silent. They&apos;ve shifted out of the visible spectrum. A word for what&apos;s happening to our friends, and what I&apos;m doing instead.</description>
    </item>
    <item>
      <title>Have your agent talk to my vibe</title>
      <link>https://good.vibes.diy/blog/have-your-agent-talk-to-my-vibe.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/have-your-agent-talk-to-my-vibe.html</guid>
      <pubDate>Sat, 22 Aug 2026 18:00:00 GMT</pubDate>
      <description>Instead of handing an AI agent your whole inbox, put one slice of the problem in a vibe and let the agent apply for a seat. You approve it, it works inside the rules your app already enforces, and revoking it is removing a grant.</description>
    </item>
    <item>
      <title>Everyone went home with an app</title>
      <link>https://good.vibes.diy/blog/everyone-went-home-with-an-app.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/everyone-went-home-with-an-app.html</guid>
      <pubDate>Fri, 21 Aug 2026 22:00:00 GMT</pubDate>
      <description>A volunteer team in Oregon organized the state&apos;s first in-person AI hackathon. We sponsored the credits. Here&apos;s what happened when fifty builders got seven hours and a deadline.</description>
    </item>
    <item>
      <title>Borrowing a WASM synth</title>
      <link>https://good.vibes.diy/blog/borrowing-a-wasm-synth.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/borrowing-a-wasm-synth.html</guid>
      <pubDate>Fri, 21 Aug 2026 13:00:00 GMT</pubDate>
      <description>The technical sequel to the Strudel tutorial: how runtime imports actually work in a vibe, stress-tested with zaltz — a C-compiled-to-WASM synth running in an AudioWorklet, dynamically loaded from the CDN, with the AGPL lineage story told properly.</description>
    </item>
    <item>
      <title>Publish your groove</title>
      <link>https://good.vibes.diy/blog/publish-your-groove.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/publish-your-groove.html</guid>
      <pubDate>Fri, 21 Aug 2026 12:00:00 GMT</pubDate>
      <description>Part two of the browser drum machine tutorial: give it a memory. One hook turns the step sequencer into a shared groovebook — your saves appear instantly, sync in the background, and publish live to everyone reading this post.</description>
    </item>
    <item>
      <title>You can just make music</title>
      <link>https://good.vibes.diy/blog/you-can-just-make-music.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/you-can-just-make-music.html</guid>
      <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
      <description>A step-by-step Strudel tutorial where every example is a live drum machine running in the page. One line of code fetches the whole music engine at play time — nothing to install, nothing to bundle, and your app ships only your own code.</description>
    </item>
    <item>
      <title>An agent for ten people</title>
      <link>https://good.vibes.diy/blog/an-agent-for-ten-people.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/an-agent-for-ten-people.html</guid>
      <pubDate>Wed, 19 Aug 2026 17:00:00 GMT</pubDate>
      <description>The most useful software in your life is the software nobody would fund: too small, too specific, ten people want it. Here&apos;s what we removed so that class of thing can actually get made.</description>
    </item>
    <item>
      <title>There is no mailing list</title>
      <link>https://good.vibes.diy/blog/no-mailing-list.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/no-mailing-list.html</guid>
      <pubDate>Sat, 08 Aug 2026 17:00:00 GMT</pubDate>
      <description>A vibe can tap one person on the shoulder — your move, your request was approved. The obvious follow-up, notify everyone using this app, turns out to be unbuildable as phrased: there&apos;s no roster to iterate, because who can see a thing is computed when they ask, not written down. What that constraint gives you instead is better than the API you wanted.</description>
    </item>
    <item>
      <title>Nine quiet minutes and a screenshot</title>
      <link>https://good.vibes.diy/blog/everybody-vibes.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/everybody-vibes.html</guid>
      <pubDate>Wed, 05 Aug 2026 18:00:00 GMT</pubDate>
      <description>Most agent output is written for the person who would have done the work by hand — branches, file paths, a running commentary of green checkmarks. everybody-vibes is the mode that strips all of it out: results and pictures in the conversation, options side by side when it&apos;s a matter of taste, every change parked as a draft a human flips, and every word of shop talk moved onto the pull request. Install it in one line.</description>
    </item>
    <item>
      <title>No negative tokenization</title>
      <link>https://good.vibes.diy/blog/no-negative-tokenization.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/no-negative-tokenization.html</guid>
      <pubDate>Tue, 28 Jul 2026 20:00:00 GMT</pubDate>
      <description>The one rule we enforce hardest on our code-generation prompts: never tell the model what not to do. A prohibition ships the exact spelling of the mistake into the context and raises its salience — so we teach only the good shape, fix the example instead of the rule, and point an automated gate at prompt edits that say &quot;don&apos;t.&quot; Behind the scenes of how you school a code generator.</description>
    </item>
    <item>
      <title>The curb cut and the robot</title>
      <link>https://good.vibes.diy/blog/the-curb-cut-and-the-robot.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-curb-cut-and-the-robot.html</guid>
      <pubDate>Tue, 28 Jul 2026 16:00:00 GMT</pubDate>
      <description>We built a no-footguns app platform for people who&apos;ve never deployed anything, and it converged — genuinely unplanned — on the shape of an autonomous deployment system for AI agents. That convergence is our pitch to experts: a platform for everyone is the only kind whose abstractions can&apos;t afford to leak, and the only kind you can safely hand to a fleet.</description>
    </item>
    <item>
      <title>Making Pickathon fast</title>
      <link>https://good.vibes.diy/blog/making-pickathon-fast.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/making-pickathon-fast.html</guid>
      <pubDate>Mon, 27 Jul 2026 23:00:00 GMT</pubDate>
      <description>The sequel to our festival-app detective story. The mystery ended with a twist: an empty app loaded almost as slowly as the real one, so the remaining fifteen seconds were ours — the platform&apos;s. This is the ledger of paying them down: a compiler shipped to people who only read, two innocent-looking import lines that dragged whole libraries along, a 60 KB fix we built, measured, and threw away, and the cache our own ad clicks could never hit.</description>
    </item>
    <item>
      <title>The case of the slow festival app</title>
      <link>https://good.vibes.diy/blog/the-case-of-the-slow-festival-app.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-case-of-the-slow-festival-app.html</guid>
      <pubDate>Mon, 27 Jul 2026 20:00:00 GMT</pubDate>
      <description>A festival schedule app got slower the more people loved it, then stopped loading entirely — days before the gates opened. Following the clues (a crash code, a database that read like a diary, one question asked 551,551 times, and a helper that had quietly gone blind) is the best case we can make that debugging is a mystery genre — and you&apos;re allowed to play detective.</description>
    </item>
    <item>
      <title>The day we gave shell-less agents hands on your data</title>
      <link>https://good.vibes.diy/blog/mcp-server-for-your-vibes.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/mcp-server-for-your-vibes.html</guid>
      <pubDate>Fri, 24 Jul 2026 00:00:00 GMT</pubDate>
      <description>A look back at how vibes-diy mcp came to be — the shell-vs-no-shell asymmetry that motivated it, and the design calls that gave Claude Desktop and Cowork a door into your vibe&apos;s live data.</description>
    </item>
    <item>
      <title>Where your data lives</title>
      <link>https://good.vibes.diy/blog/where-your-data-lives.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/where-your-data-lives.html</guid>
      <pubDate>Tue, 21 Jul 2026 18:00:00 GMT</pubDate>
      <description>Your Vibes app&apos;s database isn&apos;t a server you call over the network — it&apos;s a local replica on the device that answers instantly. Here&apos;s the whole path a write takes, in one diagram.</description>
    </item>
    <item>
      <title>From Local First to User First</title>
      <link>https://good.vibes.diy/blog/from-local-first-to-user-first.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/from-local-first-to-user-first.html</guid>
      <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
      <description>We didn&apos;t return to local-first for the manifesto — we returned because every loading screen we profiled ended at the same place: the network asking permission to show you your own data. The story of a cutover where almost every fix was a deletion.</description>
    </item>
    <item>
      <title>The first turn does less on purpose</title>
      <link>https://good.vibes.diy/blog/the-first-turn-does-less-on-purpose.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-first-turn-does-less-on-purpose.html</guid>
      <pubDate>Sun, 19 Jul 2026 16:00:00 GMT</pubDate>
      <description>We pulled access rules, sound effects, and backend wiring out of the first generation — and taught it to remember what it skipped. The app arrives faster, the skipped work comes back as an offer at exactly the right moment, and nothing gets locked in before you have the context to decide.</description>
    </item>
    <item>
      <title>Don&apos;t reply to bots</title>
      <link>https://good.vibes.diy/blog/dont-reply-to-bots.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/dont-reply-to-bots.html</guid>
      <pubDate>Wed, 15 Jul 2026 16:20:00 GMT</pubDate>
      <description>Our social bot builds you an app when you mention it — and it just replied, enthusiastically, to a Hacker News mirror bot. The fix wasn&apos;t a smarter classifier. It was putting the guard in the layer that can see the tell.</description>
    </item>
    <item>
      <title>The palette that resized your app</title>
      <link>https://good.vibes.diy/blog/the-palette-that-resized-your-app.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-palette-that-resized-your-app.html</guid>
      <pubDate>Wed, 15 Jul 2026 16:10:00 GMT</pubDate>
      <description>Clicking a color swatch made every app four times bigger. The trail led to a CSS variable name collision with Tailwind&apos;s engine, a months-old bug we&apos;d politely documented as a &apos;platform quirk,&apos; and a repair codemod that proves its own diff.</description>
    </item>
    <item>
      <title>Your loading screen is a brand deck</title>
      <link>https://good.vibes.diy/blog/your-loading-screen-is-a-brand-deck.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/your-loading-screen-is-a-brand-deck.html</guid>
      <pubDate>Wed, 15 Jul 2026 16:00:00 GMT</pubDate>
      <description>The first-build wait now plays the brand brief Jona Bechtolt of YACHT designed for us — as a pure-CSS storyboard cut from the PDF&apos;s own vectors. Along the way the loading screen learned semantics: a color face that means &apos;seconds away,&apos; recovery that settles instead of rewinding, and status labels mined from the build stream.</description>
    </item>
    <item>
      <title>The remix is the on-ramp</title>
      <link>https://good.vibes.diy/blog/the-remix-is-the-on-ramp.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-remix-is-the-on-ramp.html</guid>
      <pubDate>Mon, 13 Jul 2026 18:00:00 GMT</pubDate>
      <description>A drum machine turned into four apps in a night — each one a remix of the last. Then we made the homepage work the same way: the remix chain IS the tutorial.</description>
    </item>
    <item>
      <title>Apply now, verify in the background</title>
      <link>https://good.vibes.diy/blog/apply-now-verify-in-the-background.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/apply-now-verify-in-the-background.html</guid>
      <pubDate>Sat, 11 Jul 2026 18:50:00 GMT</pubDate>
      <description>Making cross-vibe navigation feel instant wasn&apos;t about faster answers — it was about asking the access question earlier, on a socket we already had, and remembering the answer honestly. A tour of the small freshness contract behind an instant-feeling hop.</description>
    </item>
    <item>
      <title>The speed knob that made every mock global</title>
      <link>https://good.vibes.diy/blog/the-speed-knob-that-made-every-mock-global.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-speed-knob-that-made-every-mock-global.html</guid>
      <pubDate>Sat, 11 Jul 2026 18:40:00 GMT</pubDate>
      <description>One Vitest flag — isolate: false — gives every test file a shared module registry to run faster, so the last mock quietly wins across files. Three files mocked one module three different ways, a partial mock leaked, and it bricked our npm release for two days. Here&apos;s the villain, and the three moves that fixed it.</description>
    </item>
    <item>
      <title>The meter read zero</title>
      <link>https://good.vibes.diy/blog/the-meter-read-zero.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-meter-read-zero.html</guid>
      <pubDate>Sat, 11 Jul 2026 18:30:00 GMT</pubDate>
      <description>A batch of latent-cost bugs — a green-check gate that a rebase-merge dodged, a cron that did nothing but spin up runners, a deploy that compiled the app twice, an unminified worker parked on Cloudflare&apos;s startup-CPU cliff, a lockfile check running once per shard, and a test pool tuned for cores we no longer had. All free and invisible while the repo was public. Going private billed them all at once, and turned it into a performance event.</description>
    </item>
    <item>
      <title>The invite that can&apos;t be an oracle</title>
      <link>https://good.vibes.diy/blog/the-invite-that-cant-be-an-oracle.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-invite-that-cant-be-an-oracle.html</guid>
      <pubDate>Sat, 11 Jul 2026 18:20:00 GMT</pubDate>
      <description>We built an email-invite growth loop where privacy is structural, not a later patch: the opt-out list shipped before the send button existed, the send endpoint returns the same &apos;ok&apos; whether or not you&apos;re a user, and a sandboxed app can ask to invite a friend but only the platform gets consent.</description>
    </item>
    <item>
      <title>The eval learned to read the UI</title>
      <link>https://good.vibes.diy/blog/the-eval-learned-to-read-the-ui.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-eval-learned-to-read-the-ui.html</guid>
      <pubDate>Sat, 11 Jul 2026 18:10:00 GMT</pubDate>
      <description>Our codegen eval graded generated apps with static regexes — until the failures got semantic. A regex can&apos;t tell who wrote a document, and it can&apos;t see a quiet refusal: an app that technically satisfies a social-sharing prompt but buries the share affordance in its UI. So the eval hired a judge that reads the generated App.jsx and grades what a user would actually experience.</description>
    </item>
    <item>
      <title>Ship it dark: the scariest change is the smallest line you write</title>
      <link>https://good.vibes.diy/blog/ship-it-dark.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/ship-it-dark.html</guid>
      <pubDate>Sat, 11 Jul 2026 18:00:00 GMT</pubDate>
      <description>We shipped social-graph notifications as a sequence of dark slices — schema first, then the wire, then the digest — so the PR that finally turned the feature ON was the smallest and least risky one in the stack. Merge ordering was the rollout guard, no feature flag required.</description>
    </item>
    <item>
      <title>The three doors</title>
      <link>https://good.vibes.diy/blog/the-three-doors.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-three-doors.html</guid>
      <pubDate>Sat, 11 Jul 2026 17:00:00 GMT</pubDate>
      <description>Three &apos;public&apos; schedule feeds — DEF CON, Oregon Country Fair, IETF side meetings — each turned out to be unreachable from where the app runs. The fix walked the data in through the app&apos;s own database. Here&apos;s how a workaround hardened into a genre, and why the real answer is a server-side fetch.</description>
    </item>
    <item>
      <title>Add a developer to your vibe</title>
      <link>https://good.vibes.diy/blog/add-a-developer-to-your-vibe.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/add-a-developer-to-your-vibe.html</guid>
      <pubDate>Sat, 11 Jul 2026 16:00:00 GMT</pubDate>
      <description>You can now let another account edit and ship one of your vibes — push code, publish, run codegen — without handing over your account. One command, or one row in the sharing panel. You keep the destructive and ownership levers.</description>
    </item>
    <item>
      <title>Followers can see it: Vibes grew a social graph</title>
      <link>https://good.vibes.diy/blog/vibes-has-a-social-graph.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/vibes-has-a-social-graph.html</guid>
      <pubDate>Sat, 11 Jul 2026 14:00:00 GMT</pubDate>
      <description>One platform-wide follow graph, and every app can build on it: a one-line audience label makes a doc visible to your followers, resolved live at read time — new followers see history instantly, an unfollow revokes instantly. Follows now ring the bell and land in the weekly digest — and a follow request to your private account reaches your phone.</description>
    </item>
    <item>
      <title>The gallery is in the HTML now</title>
      <link>https://good.vibes.diy/blog/the-gallery-is-in-the-html.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-gallery-is-in-the-html.html</guid>
      <pubDate>Sat, 11 Jul 2026 12:00:00 GMT</pubDate>
      <description>The front-page gallery used to wait for React, a WebSocket, and two feed requests before painting a single tile. Now the worker composes the same feed during server render, and the gallery is real pixels in the first HTML byte stream — wearing MTV-style credit plates.</description>
    </item>
    <item>
      <title>Your app is a database you can npm install</title>
      <link>https://good.vibes.diy/blog/npm-install-your-app.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/npm-install-your-app.html</guid>
      <pubDate>Sat, 11 Jul 2026 11:00:00 GMT</pubDate>
      <description>A 40-line Node script opens the same live Fireproof database as your deployed vibe — writes flow both ways in real time, with no REST API, no schema migration, and no API keys to manage. The vibe is the always-on peer; your script just drops in.</description>
    </item>
    <item>
      <title>Delete is just a put</title>
      <link>https://good.vibes.diy/blog/delete-is-just-a-put.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/delete-is-just-a-put.html</guid>
      <pubDate>Sat, 11 Jul 2026 10:00:00 GMT</pubDate>
      <description>We shipped a careful, provenance-tracked delete permission — and deleted it a few hours later. A delete is sugar for writing a tombstone, and anyone who can write a doc could always destroy it by overwriting. The fix wasn&apos;t a better gate; it was one less concept.</description>
    </item>
    <item>
      <title>You&apos;ve come a long way, baby</title>
      <link>https://good.vibes.diy/blog/youve-come-a-long-way-baby.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/youve-come-a-long-way-baby.html</guid>
      <pubDate>Tue, 07 Jul 2026 14:00:00 GMT</pubDate>
      <description>A year ago this platform was a React SPA with no backend at all — its entire server story was vending an OpenRouter key into your browser. Today it&apos;s a stream-based platform with live data, access rules, and server-side AI. The retrospective, with the credit where it&apos;s owed: Meno Abels hardened the architecture everything since is built on.</description>
    </item>
    <item>
      <title>Asked to build platform infrastructure, the agent picked a vibe</title>
      <link>https://good.vibes.diy/blog/the-agent-picked-a-vibe.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-agent-picked-a-vibe.html</guid>
      <pubDate>Tue, 07 Jul 2026 12:00:00 GMT</pubDate>
      <description>We asked an agent to build our social mention-builds bot — @-mention us on Bluesky and the platform builds your app and replies with a screenshot. It surveyed the codebase and chose a vibe as the production home: scheduled backend, credential vault, access control, dashboard, all product primitives. When your own agents reach for your product to run your platform, that&apos;s what feature-complete looks like.</description>
    </item>
    <item>
      <title>We shipped a perfect cache that zero real users could hit</title>
      <link>https://good.vibes.diy/blog/the-cache-nobody-hit.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-cache-nobody-hit.html</guid>
      <pubDate>Tue, 07 Jul 2026 10:00:00 GMT</pubDate>
      <description>The SWR cache for vibe HTML worked flawlessly — 230ms hits, correct stale-refresh lifecycle — for the bare URL nobody requests. Every real page view carried one query param, and both ends of the cache read it as personalization and bypassed. The fix wasn&apos;t more cache; it was teaching the eligibility gate that the platform&apos;s own version pin is a cache key, not a personal preference.</description>
    </item>
    <item>
      <title>The cruft isn&apos;t in the files — it&apos;s in the seams</title>
      <link>https://good.vibes.diy/blog/housecleaning-at-agent-speed.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/housecleaning-at-agent-speed.html</guid>
      <pubDate>Mon, 06 Jul 2026 14:00:00 GMT</pubDate>
      <description>Feature velocity is way up, so we braced for a mountain of AI-generated cruft and ran a whole-monorepo housecleaning audit: five parallel explorer agents plus a dead-code linter. The files came back mostly clean. The debt was hiding between them — in workflows, manifests, and docs nobody rewrites.</description>
    </item>
    <item>
      <title>Cloudflare ate our ETag</title>
      <link>https://good.vibes.diy/blog/cloudflare-ate-our-etag.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/cloudflare-ate-our-etag.html</guid>
      <pubDate>Mon, 06 Jul 2026 12:00:00 GMT</pubDate>
      <description>We shipped a whole conditional-request pipeline — input-derived ETags, a 304 fast path, an edge cache — and none of it ever fired, because Cloudflare silently strips validators from HTML. Three plausible fixes died on the wire before a zone-settings dump found all four culprits.</description>
    </item>
    <item>
      <title>Trust the target, bless the person</title>
      <link>https://good.vibes.diy/blog/the-owner-is-the-attacker.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-owner-is-the-attacker.html</guid>
      <pubDate>Mon, 06 Jul 2026 11:00:00 GMT</pubDate>
      <description>Designing outbound fetch for user backends died in one sentence: the owner is an attacker in some cases. So trust comes from somewhere that isn&apos;t the tenant — the target&apos;s own CORS policy, a platform list where adding a host is a PR, and blessing people instead of approving hosts forever.</description>
    </item>
    <item>
      <title>One pixel of fake scroll</title>
      <link>https://good.vibes.diy/blog/one-pixel-of-fake-scroll.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/one-pixel-of-fake-scroll.html</guid>
      <pubDate>Mon, 06 Jul 2026 10:00:00 GMT</pubDate>
      <description>iOS scrolls to the top when you tap the status bar — unless your whole app lives in a cross-origin iframe, where the gesture never arrives. We catch it anyway: a hidden pixel of overflow, parked at scrollTop 1, that only the native tap can move.</description>
    </item>
    <item>
      <title>Your backend can call the model now — and there&apos;s no key to leak</title>
      <link>https://good.vibes.diy/blog/backend-callai.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/backend-callai.html</guid>
      <pubDate>Sun, 05 Jul 2026 12:00:00 GMT</pubDate>
      <description>backend.js gets ctx.callAI: one await, text in, text out. No API key exists anywhere in your app — the platform places the call like a switchboard operator, meters it to the user who triggered it, and hands your server code the answer.</description>
    </item>
    <item>
      <title>Remix meta-hub into your own social media machine</title>
      <link>https://good.vibes.diy/blog/remix-meta-hub.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/remix-meta-hub.html</guid>
      <pubDate>Sun, 05 Jul 2026 10:00:00 GMT</pubDate>
      <description>Every post on this blog now ships itself to Instagram, Threads, and Facebook — published by an owner-only vibe that keeps the API tokens as database records and rotates them on a schedule. Because the publisher is a vibe, one remix makes the whole machine yours.</description>
    </item>
    <item>
      <title>The third implementation is a markdown file</title>
      <link>https://good.vibes.diy/blog/third-implementation-markdown-file.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/third-implementation-markdown-file.html</guid>
      <pubDate>Sun, 05 Jul 2026 00:00:00 GMT</pubDate>
      <description>We built iPhone calendar subscriptions into a festival picker, ported them to a bike-ride tracker, then distilled everything both apps taught us into a codegen skill — and proved it works by asking for the feature in one sentence.</description>
    </item>
    <item>
      <title>First paint is the app</title>
      <link>https://good.vibes.diy/blog/first-paint-is-the-app.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/first-paint-is-the-app.html</guid>
      <pubDate>Sat, 04 Jul 2026 18:00:00 GMT</pubDate>
      <description>How fast a user first sees their app is the product. In one July arc we cached the entire HTML serve at the edge, seeded SSR with real data, compiled the styles on the server, took the auth overlay off the critical path, started the first build before the browser even landed on the page, and made the reveal push-first instead of polled. Then dark mode handed us the invoice.</description>
    </item>
    <item>
      <title>Announcing beast-mode: follow-through for high-fan-out development</title>
      <link>https://good.vibes.diy/blog/beast-mode-skill-for-claude-code.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/beast-mode-skill-for-claude-code.html</guid>
      <pubDate>Sat, 04 Jul 2026 16:00:00 GMT</pubDate>
      <description>We extracted our agent working culture into a portable Claude Code skill. It doesn&apos;t make one change better — it makes ten parallel changes all land. Install it in any repo with one command.</description>
    </item>
    <item>
      <title>Ninety days, twelve headline features</title>
      <link>https://good.vibes.diy/blog/ninety-days-twelve-headlines.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/ninety-days-twelve-headlines.html</guid>
      <pubDate>Fri, 03 Jul 2026 14:00:00 GMT</pubDate>
      <description>Since April 1 the platform grew a live data layer, per-app access rules, a server side, in-app editing, a real CLI, DMs, server-rendered vibes, env vars and secrets — and this blog. The quarter in twelve headlines, with links to the deep dives.</description>
    </item>
    <item>
      <title>Pickathon made the fan-made planner official — your festival could be next</title>
      <link>https://good.vibes.diy/blog/pickathon-adopts-the-picker.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/pickathon-adopts-the-picker.html</guid>
      <pubDate>Thu, 02 Jul 2026 16:00:00 GMT</pubDate>
      <description>Pickathon liked the fan-built schedule planner so much they&apos;re now co-marketing it as Pick. Plan. Share. If you run a festival like Bumbershoot, Outside Lands, Sasquatch!, or Newport Folk, the same app is a remix away — you just point a coding agent at your schedule feed.</description>
    </item>
    <item>
      <title>Every PR plants a seed: how this blog gets written</title>
      <link>https://good.vibes.diy/blog/every-pr-plants-a-seed.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/every-pr-plants-a-seed.html</guid>
      <pubDate>Thu, 02 Jul 2026 14:00:00 GMT</pubDate>
      <description>Every unit of work that ships here drops a one-file capture note next to the code. Periodically we mine the pile and combine the good ones into posts. That&apos;s why reading this blog is the closest thing to watching the project happen in real time.</description>
    </item>
    <item>
      <title>270 PRs in 17 days — the speed was the safety</title>
      <link>https://good.vibes.diy/blog/270-prs-in-17-days.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/270-prs-in-17-days.html</guid>
      <pubDate>Thu, 02 Jul 2026 11:00:00 GMT</pubDate>
      <description>We pulled the stats on 17 days of merges: 270 PRs, ~223k lines of churn, a median PR of 196 lines merged in under an hour, 95% agent-authored. The surprise wasn&apos;t the volume — it&apos;s that velocity and safety turned out to be the same property.</description>
    </item>
    <item>
      <title>Not a loop, on purpose</title>
      <link>https://good.vibes.diy/blog/not-a-loop.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/not-a-loop.html</guid>
      <pubDate>Thu, 02 Jul 2026 09:00:00 GMT</pubDate>
      <description>Everyone assumes an AI app generator must be an agent loop — a model reading files with tools, editing, iterating. Ours is a pure function: database state in, one streamed response out. That purity is load-bearing, and it&apos;s a strength, not a lag.</description>
    </item>
    <item>
      <title>Every vibe just got a backend</title>
      <link>https://good.vibes.diy/blog/backend-js-server-side-vibes.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/backend-js-server-side-vibes.html</guid>
      <pubDate>Thu, 02 Jul 2026 00:00:00 GMT</pubDate>
      <description>One new file — backend.js — runs on our servers for your app: answer webhooks at your own /_api URL, react to every saved document, and run work on a timer. Server writes go through the exact same access rules as user writes, so your permission model stays in one place.</description>
    </item>
    <item>
      <title>From one CLAUDE.md to forty runbooks</title>
      <link>https://good.vibes.diy/blog/one-claude-md-to-forty-runbooks.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/one-claude-md-to-forty-runbooks.html</guid>
      <pubDate>Wed, 01 Jul 2026 09:00:00 GMT</pubDate>
      <description>A year of agent documentation, read straight from git history: a 103-line init file, a 326-line grab-bag, a hard split into version-controlled runbooks — and what each era says about the work we were shipping at the time.</description>
    </item>
    <item>
      <title>If tokens were free, we&apos;d precompute every chip</title>
      <link>https://good.vibes.diy/blog/precompute-every-chip.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/precompute-every-chip.html</guid>
      <pubDate>Tue, 30 Jun 2026 20:00:00 GMT</pubDate>
      <description>A suggestion chip is a transform of the vibe you&apos;re on, and clicking it is real codegen. So we cache the result — a repeat click becomes an instant read instead of regenerating. The interesting part isn&apos;t the cache; it&apos;s the deny-by-default gate that decides who is allowed to read it.</description>
    </item>
    <item>
      <title>From the group chat to the front counter</title>
      <link>https://good.vibes.diy/blog/group-chat-to-front-counter.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/group-chat-to-front-counter.html</guid>
      <pubDate>Tue, 30 Jun 2026 12:00:00 GMT</pubDate>
      <description>We&apos;ve always said &apos;make apps with your friends.&apos; True — but it undersold the thing. The same tool that builds a trivia app for the group chat takes the order for the taco truck, books the client, and retires the spreadsheet a small shop has been fighting for years. Here&apos;s the repositioning, and why &apos;we build apps&apos; is the weakest thing we could say.</description>
    </item>
    <item>
      <title>The edit button that was secretly a save loop</title>
      <link>https://good.vibes.diy/blog/editing-moved-into-the-app.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/editing-moved-into-the-app.html</guid>
      <pubDate>Mon, 29 Jun 2026 09:00:00 GMT</pubDate>
      <description>We made the code editor live inside the running app — no hop to a separate chat route. &apos;Make the Code tab editable&apos; sounded like a UI task. It was a distributed save loop in disguise, and the whole thing hinged on one decision: re-pin, don&apos;t navigate.</description>
    </item>
    <item>
      <title>Why our agents don&apos;t get a laptop</title>
      <link>https://good.vibes.diy/blog/agents-in-the-cloud.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/agents-in-the-cloud.html</guid>
      <pubDate>Sun, 28 Jun 2026 12:00:00 GMT</pubDate>
      <description>A capability that only works on a hand-configured laptop quietly pushes all the work back to the laptop. Here&apos;s why we made cloud containers the default home for agent QA — and three war stories from getting browser validation to run there.</description>
    </item>
    <item>
      <title>Edit a stranger&apos;s app, and it&apos;s yours</title>
      <link>https://good.vibes.diy/blog/the-vibe-owner-viewer-experience.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/the-vibe-owner-viewer-experience.html</guid>
      <pubDate>Sun, 28 Jun 2026 11:00:00 GMT</pubDate>
      <description>The /vibe page now meets you where you are: a non-owner edit forks the app to your handle in place, owners get a private draft they can publish in one tap, and small indicators always tell you whether you&apos;re the author, an admin, or a read-only guest.</description>
    </item>
    <item>
      <title>We only needed one Durable Object</title>
      <link>https://good.vibes.diy/blog/collapsing-durable-objects.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/collapsing-durable-objects.html</guid>
      <pubDate>Sun, 28 Jun 2026 10:00:00 GMT</pubDate>
      <description>We had three Durable Object classes that were really one handler surface opened against three shard keys. Here&apos;s how we collapsed them into a single class — and which &apos;separate-class&apos; argument fell apart the moment we pushed on it.</description>
    </item>
    <item>
      <title>We deleted our auth dependency. Nothing changed.</title>
      <link>https://good.vibes.diy/blog/defireproofing-auth.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/defireproofing-auth.html</guid>
      <pubDate>Sun, 28 Jun 2026 09:00:00 GMT</pubDate>
      <description>We moved our device-id PKI and Clerk token verifiers in-house, out of @fireproof/*, with zero call-site changes — gated by a byte-compatible golden harness so the lift was provably identical before we cut the dependency.</description>
    </item>
    <item>
      <title>We deleted the preview pane</title>
      <link>https://good.vibes.diy/blog/in-place-generation.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/in-place-generation.html</guid>
      <pubDate>Sun, 28 Jun 2026 08:00:00 GMT</pubDate>
      <description>We moved first-generation onto the deployed app itself — stream into the card, hot-swap the running iframe, de-blur the app forming behind it — and in doing so deleted the separate preview pane entirely. The risk was the simplification.</description>
    </item>
    <item>
      <title>Save a tree, skip the tests: leaner CI for docs-only PRs</title>
      <link>https://good.vibes.diy/blog/save-a-tree-skip-the-tests.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/save-a-tree-skip-the-tests.html</guid>
      <pubDate>Sun, 28 Jun 2026 06:30:00 GMT</pubDate>
      <description>A README typo doesn&apos;t need a Playwright suite and a Postgres cluster. Teaching docs-only PRs to skip the heavy CI work — without falling into the &apos;required check stuck pending&apos; trap.</description>
    </item>
    <item>
      <title>The NUL byte that broke every write (+7 more)</title>
      <link>https://good.vibes.diy/blog/small-fixes-real-lessons.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/small-fixes-real-lessons.html</guid>
      <pubDate>Sat, 27 Jun 2026 15:00:00 GMT</pubDate>
      <description>Eight little fixes from the build log — a NUL byte that took down every Postgres write, an iOS audio-unlock race, a markdown blank line that clobbered a file — each with a lesson bigger than the diff.</description>
    </item>
    <item>
      <title>Teaching an AI you&apos;re not &apos;the owner&apos;</title>
      <link>https://good.vibes.diy/blog/teaching-codegen-defaults.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/teaching-codegen-defaults.html</guid>
      <pubDate>Sat, 27 Jun 2026 09:00:00 GMT</pubDate>
      <description>Generated apps used to default to owner-gated permissions — broken for everyone but the creator. Here&apos;s how we flipped the default to author-owned, steered the model toward multiplayer without ever saying &apos;don&apos;t,&apos; and built a metric so the prompt could iterate itself.</description>
    </item>
    <item>
      <title>The vibe that locked out its owner</title>
      <link>https://good.vibes.diy/blog/retiring-isowner.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/retiring-isowner.html</guid>
      <pubDate>Tue, 23 Jun 2026 12:00:00 GMT</pubDate>
      <description>A vibe locked its own owner out of saving. The fix wasn&apos;t a better isOwner check — it was deleting isOwner and treating &apos;owner&apos; as a seeded, revocable role instead of an ambient super-user.</description>
    </item>
    <item>
      <title>How we batch-upgrade apps with screenshots</title>
      <link>https://good.vibes.diy/blog/upgrading-apps-with-screenshots.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/upgrading-apps-with-screenshots.html</guid>
      <pubDate>Tue, 09 Jun 2026 12:00:00 GMT</pubDate>
      <description>Every deployed Vibe serves both a live screenshot and its own source. That closes a visual feedback loop an agent can run alone — see the app, fix the code, push, look again — and fan out across dozens of apps at once.</description>
    </item>
    <item>
      <title>How we eval the generator</title>
      <link>https://good.vibes.diy/blog/how-we-eval-the-generator.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/how-we-eval-the-generator.html</guid>
      <pubDate>Tue, 09 Jun 2026 11:00:00 GMT</pubDate>
      <description>Every edit to the system prompt changes every app anyone generates. Here&apos;s the harness that measures generation quality — 46 prompts in three sets, scored 1–5, fanned out across a Workflow pipeline — so we know within a coffee break whether a change made things better or worse.</description>
    </item>
    <item>
      <title>Can one English prompt rebuild our festival app?</title>
      <link>https://good.vibes.diy/blog/can-a-prompt-rebuild-the-pickathon-app.html</link>
      <guid isPermaLink="true">https://good.vibes.diy/blog/can-a-prompt-rebuild-the-pickathon-app.html</guid>
      <pubDate>Tue, 09 Jun 2026 10:00:00 GMT</pubDate>
      <description>We tried to recreate Pickathon&apos;s built-out 2026 app — data model, views, and a fiddly access policy — from a single plain-English prompt. It got ~90% there on description alone; a URL and a one-sentence schema closed the rest.</description>
    </item>
  </channel>
</rss>
