<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Vibes DIY Blog: Building on Vibes</title>
  <subtitle>Backends, data, the command line and connections to the rest of your tools: posts for people who want to see how their app works and take it further.</subtitle>
  <link href="https://good.vibes.diy/blog/builders/feed.xml" rel="self"/>
  <link href="https://good.vibes.diy/blog/builders/"/>
  <id>https://good.vibes.diy/blog/builders/</id>
  <updated>2026-11-11T23:30:00.000Z</updated>
  <entry>
    <title>Put your app on your own site, or your own computer</title>
    <link href="https://good.vibes.diy/blog/run-your-app-anywhere.html"/>
    <id>https://good.vibes.diy/blog/run-your-app-anywhere.html</id>
    <updated>2026-11-11T23:30:00.000Z</updated>
    <published>2026-11-11T23:30:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>Two new ways to run an app you made on Vibes DIY somewhere else. Paste one line into any web page and the app appears there. Or run one command and the app, its data and its backend run on your own laptop or server.</summary>
  </entry>
  <entry>
    <title>Make an app for your GitHub repo</title>
    <link href="https://good.vibes.diy/blog/make-an-app-for-your-github-repo.html"/>
    <id>https://good.vibes.diy/blog/make-an-app-for-your-github-repo.html</id>
    <updated>2026-10-30T18:00:00.000Z</updated>
    <published>2026-10-30T18:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>A vibe can now connect to a GitHub repo and answer your team&apos;s pull requests on it. Describe the bot you want, connect a repo in one click, and its reviews land on GitHub as the pull requests open. Two of our test apps show the range: one turns your copy into pig Latin, one checks your house coding rules line by line.</summary>
  </entry>
  <entry>
    <title>Make vibes from Muse</title>
    <link href="https://good.vibes.diy/blog/make-vibes-from-muse.html"/>
    <id>https://good.vibes.diy/blog/make-vibes-from-muse.html</id>
    <updated>2026-10-24T18:00:00.000Z</updated>
    <published>2026-10-24T18:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>Muse now makes vibes from the chat you already have open. Sign the Vibes DIY command-line tool in once on the machine Muse runs on, and from then on you can ask for a new app, a change to one you have, or a look at its data.</summary>
  </entry>
  <entry>
    <title>A quarter of a million towers</title>
    <link href="https://good.vibes.diy/blog/a-quarter-of-a-million-towers.html"/>
    <id>https://good.vibes.diy/blog/a-quarter-of-a-million-towers.html</id>
    <updated>2026-10-07T19:00:00.000Z</updated>
    <published>2026-10-07T19:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Every city gets an island</title>
    <link href="https://good.vibes.diy/blog/every-city-gets-an-island.html"/>
    <id>https://good.vibes.diy/blog/every-city-gets-an-island.html</id>
    <updated>2026-10-07T18:30:00.000Z</updated>
    <published>2026-10-07T18:30:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Borrowing the GPU</title>
    <link href="https://good.vibes.diy/blog/borrowing-the-gpu.html"/>
    <id>https://good.vibes.diy/blog/borrowing-the-gpu.html</id>
    <updated>2026-09-16T17:00:00.000Z</updated>
    <published>2026-09-16T17:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>A picture is five numbers</title>
    <link href="https://good.vibes.diy/blog/a-picture-is-five-numbers.html"/>
    <id>https://good.vibes.diy/blog/a-picture-is-five-numbers.html</id>
    <updated>2026-09-16T16:30:00.000Z</updated>
    <published>2026-09-16T16:30:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Send your vibe&apos;s data anywhere you want</title>
    <link href="https://good.vibes.diy/blog/your-app-can-send-a-record-anywhere.html"/>
    <id>https://good.vibes.diy/blog/your-app-can-send-a-record-anywhere.html</id>
    <updated>2026-09-11T16:00:00.000Z</updated>
    <published>2026-09-11T16:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Have your agent talk to my vibe</title>
    <link href="https://good.vibes.diy/blog/have-your-agent-talk-to-my-vibe.html"/>
    <id>https://good.vibes.diy/blog/have-your-agent-talk-to-my-vibe.html</id>
    <updated>2026-08-22T18:00:00.000Z</updated>
    <published>2026-08-22T18:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Borrowing a WASM synth</title>
    <link href="https://good.vibes.diy/blog/borrowing-a-wasm-synth.html"/>
    <id>https://good.vibes.diy/blog/borrowing-a-wasm-synth.html</id>
    <updated>2026-08-21T13:00:00.000Z</updated>
    <published>2026-08-21T13:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Publish your groove</title>
    <link href="https://good.vibes.diy/blog/publish-your-groove.html"/>
    <id>https://good.vibes.diy/blog/publish-your-groove.html</id>
    <updated>2026-08-21T12:00:00.000Z</updated>
    <published>2026-08-21T12:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>There is no mailing list</title>
    <link href="https://good.vibes.diy/blog/no-mailing-list.html"/>
    <id>https://good.vibes.diy/blog/no-mailing-list.html</id>
    <updated>2026-08-08T17:00:00.000Z</updated>
    <published>2026-08-08T17:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Where your data lives</title>
    <link href="https://good.vibes.diy/blog/where-your-data-lives.html"/>
    <id>https://good.vibes.diy/blog/where-your-data-lives.html</id>
    <updated>2026-07-21T18:00:00.000Z</updated>
    <published>2026-07-21T18:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Add a developer to your vibe</title>
    <link href="https://good.vibes.diy/blog/add-a-developer-to-your-vibe.html"/>
    <id>https://good.vibes.diy/blog/add-a-developer-to-your-vibe.html</id>
    <updated>2026-07-11T16:00:00.000Z</updated>
    <published>2026-07-11T16:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Followers can see it: Vibes grew a social graph</title>
    <link href="https://good.vibes.diy/blog/vibes-has-a-social-graph.html"/>
    <id>https://good.vibes.diy/blog/vibes-has-a-social-graph.html</id>
    <updated>2026-07-11T14:00:00.000Z</updated>
    <published>2026-07-11T14:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Your app is a database you can npm install</title>
    <link href="https://good.vibes.diy/blog/npm-install-your-app.html"/>
    <id>https://good.vibes.diy/blog/npm-install-your-app.html</id>
    <updated>2026-07-11T11:00:00.000Z</updated>
    <published>2026-07-11T11:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Your backend can call the model now — and there&apos;s no key to leak</title>
    <link href="https://good.vibes.diy/blog/backend-callai.html"/>
    <id>https://good.vibes.diy/blog/backend-callai.html</id>
    <updated>2026-07-05T12:00:00.000Z</updated>
    <published>2026-07-05T12:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
  <entry>
    <title>Every vibe just got a backend</title>
    <link href="https://good.vibes.diy/blog/backend-js-server-side-vibes.html"/>
    <id>https://good.vibes.diy/blog/backend-js-server-side-vibes.html</id>
    <updated>2026-07-02T00:00:00.000Z</updated>
    <published>2026-07-02T00:00:00.000Z</published>
    <author><name>Vibes DIY</name></author>
    <summary>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.</summary>
  </entry>
</feed>
