A vertical, full-screen feed with a voice agent that narrates the card you're on — and shuts up the instant you swipe. Build a hands-free local guide, a shoppable reel, a narrated dashboard. The engine is open source. The year of gotchas that make it feel right is the kit.
MIT engine · free written teardown · kit $199 founding, opens Aug 1
A swipe feed is the inverse of a normal voice assistant. There, the user speaks and waits. Here, the agent must narrate the on-screen card the instant it lands — and go silent the moment you swipe again.
Narrate in a 3–4 second hook, not a paragraph. A card that takes ten seconds to describe is a card the user already swiped past.
On swipe, cut the audio instantly and re-narrate the new card. A soft fade reads as the agent ignoring you.
A fast scroll fires a flood of updates. Un-debounced, they starve the user's turn — and the agent stops being able to hear you.
These are real frames from a feed running in production — the same engine you get free, the same voice tuning the kit teaches.

100dvh cards, snap-scroll, orientation-aware framing, preloaded neighbors. The whole feed engine is 316 lines with zero domain logic — point it at any list of cards. That engine is the free core.

Settle on a card and the agent speaks a short hook. Swipe and it cuts instantly and re-narrates. The mic stays open the whole time — talk over it, ask a question, it yields. This is the narration-sync problem solved: the exact thing that separates "magic" from "janky."

The reference build runs three feeds off one engine — events, news, and real-estate listings — each with its own voice agent and filters. Repoint it at your cards and ship a local guide, a shoppable reel, or a narrated dashboard.

The kit ships a fixed six-type chart library — trend, ranked bars, a bar-chart race, and more — so a card's hero can be a live chart instead of a photo, with the same voice reading the story behind the number. Built on sample data, labeled prototype — the honest state, not a promise.
Every part of the product, laid out — titles and all. The locked ones tell you exactly what you'd get, because the title is the point.
// settle (debounced) → the agent narrates the card function scheduleSettle(index) { clearTimeout(state.settleTimer); state.settleTimer = setTimeout(() => { if (state.active === index && state.status === "ready") emit("settle", { index, item: state.view[index] }); }, SETTLE_MS); } // swipe fires immediately → the agent interrupts itself feedEl.addEventListener("scroll", () => { if (!state.isScrolling) { state.isScrolling = true; emit("swipe", { from: state.active }); } });
A real feed, running in production right now — hundreds of live listings and working voice. Tap the green button and talk to it. No signup to browse.
"Three weeks in at roughly 20% focus — and only that fast because I reused prompts from an earlier ElevenLabs→Bubble build. Without that head start: one to two days planning, several days testing, several more optimizing."
— the builder. The kit is that head start.
Shipped, and survived contact with production.
An informed correction — the right way, honestly flagged as not-yet-built where it isn't.
The narration-sync problem, the architecture, the method — the parts that aren't code. One email, one link, no spam.