← All builds

product · macOS app · 2026

Reading your notes on a call without anyone seeing them.

Your script floats above every app, even full-screen ones. As you speak, it highlights the word you're on and scrolls to keep your line near the top. Screen sharing and recordings that use ScreenCaptureKit, including Zoom, Google Meet, OBS, and QuickTime, don't see it.

Role Builder · Team Solo, built with Claude Code · Timeline September to October 2026

VoicePrompter listening at word 108 of 139, with the prompter highlighting the spoken word

The problem

I was practicing presenting and interviewing and wanted my notes on screen, without cluttering the screen I was sharing. The teleprompters I found either fell short or wanted me to pay.

What I did

  • Built a native Swift app: an overlay that floats on every Space, and a main window with every setting in a sidebar.
  • Transcribed speech on the device with Apple's recognizer, restarting the session about every 50 seconds so results stay short and fast.
  • Wrote the alignment. Each update matches the last 8 spoken words against the script, with fuzzy matching for misheard words and guards so it never jumps on weak evidence.
  • Hid the overlay from capture, then tested it. It's hidden from ScreenCaptureKit, screenshots, and window lists, and still visible to older recorders, which the README says plainly.
  • Added global hotkeys that need no Accessibility permission, double-click to jump to a word, and click-through so clicks reach the app underneath.

Results

~0.3 msper update on an 8,800-word script
8spoken words matched each update
2permissions: mic and speech
4capture tools it hides from

What I'd do differently

Measure latency from the start. The speech recognizer dominates the delay, and I built the latency test only after the app worked. A full, uninterrupted latency run is still on my list.

Artifacts

Source on GitHub ↗

The main window while listening: status, position in the script, and prompter settings.
The main window while listening: status, position in the script, and prompter settings.
The prompter further in. Read text dims and the current word turns gold. Captured with protection off.
The prompter further in. Read text dims and the current word turns gold. Captured with protection off.