QubePrompter: Why We Built a Free Browser Teleprompter
Recording a talking-head video sounds simple until you try it: eyes drift off the lens, retakes pile up, and editors reject your files. We built a free tool that fixes all three — entirely in the browser.
Rishi Thakkar
Founder & Engineer · 2026-07-21
We publish short video updates regularly, and the recording workflow bothered us more than it should have. Reading from notes meant eyes drifting off the lens. Flubbing a line meant either re-recording the whole take or stitching clips together in an editor. And the recordings that browsers and phones produce often get rejected by mobile editing apps entirely.
Each of these is a small friction. Together, they turn a two-minute video into a thirty-minute chore. So we built QubePrompter — a free teleprompter with built-in camera recording that runs entirely in the browser. No signup, no watermark, no uploads.
This post is about the engineering decisions behind it, because even a small tool deserves deliberate architecture.
One File, Zero Dependencies
QubePrompter is a single HTML file. No framework, no build step, no package.json. That constraint wasn't nostalgia — it was a deliberate choice for a tool that needs to load instantly on a phone, work offline-ish, and be maintainable years from now without dependency archaeology.
The browser platform has quietly become capable enough for this. Everything the tool does — camera capture, audio device selection, video recording, wake locks, fullscreen — is a standard web API. The only asset beyond the HTML file is a WebAssembly build of FFmpeg, and even that loads lazily, only at the moment you save a recording.
The Interesting Problem: Recording While Prompting
Most free teleprompters scroll text. Some record video. Very few do both at once, and that combination is where the actual value lives.
QubePrompter renders the scrolling script over the live camera preview, dimmed with a gradient so the text stays readable. The reading guide — an amber arrow — sits near the top of the screen, which on a phone means your eyes stay close to the front camera. Viewers get something close to eye contact.
The recording itself uses the MediaRecorder API with one subtle but important detail: pausing. Tap the screen mid-take and both the script and the recording pause together. Resume, and they continue together. Because MediaRecorder stitches paused segments into a single file, every pause becomes a clean jump cut — no editing required. Fumble a sentence, pause, breathe, resume from the guide arrow. The output looks deliberately edited.
Microphones That Don't Lie
Anyone who records video regularly has been burned by this: you connect a good external microphone, record ten minutes, and discover the take used the laptop's built-in mic.
The web platform makes this failure mode easy to ship. If you request an audio device with an ideal constraint, the browser treats it as a suggestion — and silently falls back to the default device when anything changes. We use deviceId: { exact: ... } instead: either the take records from the microphone you tested, or it fails loudly before you waste a recording.
Device IDs also rotate when hardware is replugged, so the tool remembers the microphone's name and re-finds it after a reconnect. Small details, but they're the difference between a tool you trust and a tool you double-check.
The MP4 Problem
Browser recordings are streaming files: the metadata that editors need to seek through the video (the "moov atom") either sits at the end of the file or is missing entirely. Mobile editing apps reject these files outright.
The standard fix is to run the recording through FFmpeg on a server. We didn't want a server — uploads are slow on mobile data, and a privacy promise that ends with "we upload your video to fix it" isn't much of a promise.
Instead, QubePrompter ships a self-hosted build of ffmpeg.wasm. At save time, it remuxes the recording on-device: copies the H.264 video stream untouched, transcodes audio to AAC, and moves the index to the front of the file with +faststart. No re-encoding, so it takes seconds even on a phone — and the output opens in every editor we've tested.
If the WebAssembly module fails to load, the tool degrades gracefully and saves the original recording. A fallback path isn't an edge case; it's part of the design.
Privacy as an Architecture Decision
QubePrompter has no backend. Scripts persist in localStorage. Recordings live in memory until you save them to your device. Nothing is uploaded anywhere, because there is nowhere to upload to.
This isn't a policy we adopted — it's a property of the architecture. The strongest privacy guarantee is a system that cannot violate it.
Why Free?
Because the marginal cost is zero and the tool is genuinely useful. QubePrompter is a static file on a CDN; a thousand users cost us the same as ten. We use it ourselves daily, and shipping it publicly is a better demonstration of how we build software than any paragraph on our services page.
That's the same philosophy we bring to client work: understand the real friction, architect deliberately even when the surface area is small, and make the failure modes explicit.