Vibe presenting
Vibe coding took the boilerplate out of building software. Vibe presenting takes the deck out of giving a talk.
- Talk, don't build. There is no deck. What you say is the source, and you never touch a slide.
- Show, don't tell. A slide shows the point instead of repeating it: an interface, a number, a drawing, a duel, your own GIF. Never a paragraph.
- Live means live. Slides land mid-sentence. Now and then one misses. That is part of the show.
#vibepresenting
What it does
- Listens as you talk, in English or Swedish, in any browser and on phones.
- Decides every few words whether this moment deserves a slide, without waiting for you to finish the sentence.
- Puts the picture up in a second or two:
- a drawing streamed onto the screen as it is written;
- one big interface element (a poll, a rating, a login that folds away);
- a figure you just said;
- moving type, or your own words quoted back.
- Draws the figures you say. "From 12 to 700", "one in five", "700 builders in 12 cities and 3 countries": read from your own words, never from the model's memory, and shown as a change, a share of a group or a row of figures.
- Keeps it varied. It never shows two interface cards in a row. It does not bring back a card type, or another look for a card, within a few slides. It skips pictures of what was just shown.
- Plays your own media. It finds the GIF or photo from your library that fits what you are saying.
- Answers for you. Say "Bill, how many…?" and it searches the web and puts up one slide with its source.
- Runs anywhere: a laptop on a projector, or a phone plugged into a TV.
How it works
flowchart LR
mic([Microphone]) --> stt["Speech to text<br/>AssemblyAI streaming"]
stt --> engine["Stage engine<br/>(browser)"]
engine -- "figures, cues, signposts<br/>no model call" --> screen([Slide on screen])
engine --> director["Director<br/>Nemotron 3.5 Lightning"]
engine --> race["Drawing race<br/>Kimi-K3 · gpt-oss-120b · Nemotron 3 Ultra"]
director -- "scene or your own GIF" --> screen
race -- "drawing, card or another look" --> screen
- Listen. Audio streams to AssemblyAI (
universal-3-6-pro), which returns words about a second after they are spoken. You pick the language under the mic.
- Read ahead without a model. The stage engine acts on unfinished speech. Some things fire with no network call at all:
- A figure you say ("700 builders", "80 percent") becomes a number slide the instant it is heard.
- A signpost ("here's the problem") shortens the wait.
- A prepared moment fires on its cue words.
- Decide and draw in parallel. Every few words, two things happen at once.
- The director (Nemotron 3.5 Lightning) judges whether the point deserves a slide.
- The drawing race asks three models on Token Factory, and the first usable picture wins. Its first line is a verdict:
- same picture;
- nothing to show;
- an interface element;
- a drawing, which streams as HTML and CSS into a sandboxed iframe with no scripts.
- Two rules keep the race honest. A quick "nothing to show" from a faster model never cuts off the best model while it is still drawing. A card that would be one too many becomes a big number, a duel, moving type or a quote instead.
- Prepare, if you want. Write a few sentences about your talk beforehand. Nemotron 3 Ultra turns them into ready slides with cue words.
- Bring your own media. Drop a whole folder. The file's own bytes say what it is (a "gif" from Giphy is often WebP or MP4), never its name. Nemotron 3.5 Super VL watches six frames of each, Tavily looks it up on meme and GIF sites, and Nemotron 3 Ultra decides what it is and what the internet uses it to say: "Blinking White Guy" means disbelief. A meme name is only kept when a page confirms it. Qwen3 Embedding then ranks the library against what you are saying.
- Ask for a fact. Tavily searches the web, and Nemotron 3 Ultra turns the results into one sourced slide.
NVIDIA models on Nebius Token Factory
| Job | Model | Why this one |
|---|
| Director: show or hold, which layout | nvidia/Nemotron-3_5-Lightning | Fast and steady enough to run every few spoken words |
| Preparing slides, sourced facts | nvidia/Nemotron-3-Ultra-550b-a55b | Serious reasoning where a second of latency is fine |
| Watching your own media | nvidia/Nemotron-3.5-Super-VL | Six frames spread over a GIF or clip |
| Naming it and its meaning | nvidia/Nemotron-3-Ultra-550b-a55b + Tavily | Meme, film or show, confirmed on a web page |
| Third runner in the drawing race | nvidia/Nemotron-3-Ultra-550b-a55b | A steady first token when shared models stall |
| Library ranking | Qwen/Qwen3-Embedding-8B | Embeddings on the same API |
| Drawing | moonshotai/Kimi-K3, openai/gpt-oss-120b | Raced with Nemotron 3 Ultra; the first answer wins |
Where Token Factory sped us up.
- One API for everything. Every call goes through a single OpenAI-compatible endpoint,
https://api.tokenfactory.nebius.com/v1. Racing three drawing models or moving a role to another model is a change of model id, with no new SDK and no new keys.
- Roles resolve at runtime. Each role gets the best model available from
/models, and NEBIUS_MODEL_<ROLE> overrides it.
- JSON from Nemotron. The reasoning models are called with
chat_template_kwargs: { enable_thinking: false } so they return plain JSON.
Speech to text is the one part that does not run on Token Factory, which has no speech model yet. See the feedback in docs/submission.md.
Run it yourself
You need Node.js 22 (see .nvmrc) and a browser with a microphone.
git clone https://github.com/Baltsar/do-it-live.git
cd do-it-live
nvm use
npm install
Create .env.local:
This is the beginning of the README. Read the rest at the original. Read the full README ↗