Vibes DIY
Vibes DIY / Blog
From the build log

Ninety days, twelve headline features

Three months ago a vibe was a front end you generated in a chat window. Since April 1, main has taken about 3,500 commits — 785 of them feature commits — and a vibe is now a synced multiplayer database, an access policy, a server, and an app you edit from inside itself. Here's the quarter in twelve headlines, each with a link to its deep dive.

Title card: '90 days · 12 headlines' set over an aerial photo of a container port, in the Vibes DIY teal-and-goldenrod style.
A quarter of shipping, stacked up. Twelve headlines below; hundreds of smaller boxes not pictured.

1. Firefly — every vibe got a live database

The quarter opened with Firefly: per-vibe databases with React hooks and cross-client sync. Open the same app on two phones and a write on one appears on the other — no backend code, no polling. Everything else on this list stands on it.

A shared meadow vibe on mobile: a dozen-plus colorful flowers scattered across a soft green gradient, with a faint 'tap the grass to plant a flower' hint at the bottom
Firefly in one image: a meadow where every signed-in visitor plants flowers everyone sees, live. (From Teaching an AI you're not "the owner"; live at blog-demo-garden.)

2. access.js — the permission model is a file in your app

Who may read and write what used to be platform policy; now it's a file your app ships. access.js is parsed at push time, gates reads and writes server-side, and grant changes propagate live — open queries re-run the moment someone's access changes. Along the way we retired the account-based isOwner shortcut for handle-based grants, which took locking an owner out of their own vibe to get right. The codegen prompts learned the same lesson: apps default to author-owned, multiplayer data, not owner-gated silos.

3. backend.js — every vibe got a server

One more file next to App.jsx: export fetch to answer webhooks at your app's own /_api URL, onChange to react after any write commits, or scheduled to run on a timer. The design decision that matters: server writes go through your app's own access.js, acting as the identity that triggered them — so the permission model stays in one place. Full story: Every vibe just got a backend.

A live vibe showing a heartbeat card: 5 seconds since last tick, written by the server as the owner.
A live vibe whose server writes a heartbeat every minute while the page just watches.

4. Editing moved into the app

We deleted the preview pane. Generation and editing now happen on the /vibe route, inside the running app — you watch the build stream into the page you're standing on, and the edit button stopped being a secret save loop. The chat route is no longer where apps live; the app is.

Get posts like this in your inbox

One email field. Real updates. No algorithm required.

The edit card streaming a build: a pinned 'building your app… · 3 msgs · ~124 lines' line above the streaming transform text, with the app rendering behind it.
An edit streaming straight into the running app — the build forms in place, behind the card that asked for it.

5. Remix, Clone, and the owner/viewer experience

Any vibe you can see, you can make yours: /remix forks an app into your account with its chat history seeded, Clone skips the chat entirely and lands you on your own /vibe route. Visitors get the same switch the owner uses — a "Make it your own…" box, suggestion chips, one-tap Home / Edit / Share. Edit a stranger's app, and it's yours.

The expanded /vibe switch on mobile: a 'Make it your own…' box, three suggestion chips, and Home / Edit / Share controls below the running app
The /vibe switch, expanded on mobile — the same surface for a first-time visitor and the owner. (App: bloom-says.)

6. The vibes-diy CLI

The vibes-diy CLI grew from a deploy script into a full round-trip: generate an app from a prompt, pull its source to disk, edit in your own editor (or your own agent), push it back live, and read or write its data from the terminal.

shnpx vibes-diy@latest generate "a shared grocery list" --app-slug groceries
cd groceries                # generate already wrote App.jsx + access.js here
# …edit in your own editor, or point your own agent at the files…
npx vibes-diy@latest push   # back to the live URL

Started in the browser instead? pull <handle>/<slug> brings that app's source to disk the same way. Web-generated apps and CLI edits share one source of truth, so you can start in the browser and finish in the terminal.

7. DMs and notifications

Vibes users can now message each other: a Messages inbox, per-thread unread counts, and direct channels built on the same Firefly substrate as app data. Around it, a real notification system — build completions, access requests, DMs — with per-user settings for each type.

8. We deleted our auth dependency

The device-id PKI, keybag, and token verifiers moved in-house from @fireproof/* into @vibes.diy/identity — proven byte-for-byte identical behind an unchanged facade before the cut, with zero call-site changes. CA-signature enforcement for device ids is now on in production. The how: We deleted our auth dependency. Nothing changed.

9. Server-side rendering for vibes

Vibes now render on the server via Cloudflare Worker Loaders — including multi-file apps with their relative-import graph resolved (#2845). Live in the preview environment as of this week: shared links paint content instead of a loading grid.

10. Env vars and secrets for apps

Apps can carry configuration now: settings-page env vars delivered as a live overlay with a useEnv() hook, and a write-only Secrets card — set, rotate, remove, never read back (#3047). The missing piece for vibes that talk to third-party APIs.

11. The generator got an eval harness

Prompt changes stopped being vibes-based (ironic, we know). The codegen system prompts are now generated from shared template parts, guarded by golden hashes, and every substantive change runs through an eval: one-shot and agentic modes, cross-model matrices, and scored side-by-sides. How we eval the generator.

Single-user Quest Tracker generated from the as-is prompt
The as-is prompt yields a private, single-user tracker.
Team TeamTrack with a LEAD badge generated from the enhanced prompt
Two sentences of team-language yield a shared, role-gated app.
One pair from the eval set — same domain, two prompts. The harness scores differences like this instead of eyeballing them.

12. This blog

The publishing pipeline you're reading is itself a feature of the quarter: markdown posts, generated index and feeds, branded title cards, and a workflow where every PR drops a blog seed so the stories get captured while they're true. Twenty-four posts since June 9.

The good.vibes.diy blog index: a grid of post cards with duotone title-card art, each with a date and summary
The blog index — the quarter, documenting itself.

And the ninety days ahead

Some of the next quarter is already visible: an iOS app that answers callAI with Apple's on-device models (shipping now), and billing groundwork running in shadow mode. And the proof that the whole stack holds up isn't a demo — it's that Pickathon adopted a fan-built vibe as its official festival planner.

If you want the meta-story of how one team ships at this rate, that's 270 PRs in 17 days.

Build on all twelve

Describe an app, get a synced multiplayer vibe with its own access rules and backend — then remix from there.

Start building →

Enjoyed this? Get the next post by email

One email field. Real updates. No algorithm required.

Prefer a feed? RSS · Atom