what it does
write your script once, run it across as many windows as you want:
- one script, n windows: a markdown editor with live preview drives any number of frameless viewer windows
- precise cross-window scroll sync: every window stays on the same spot, even at different font sizes, because sync is by logical position (a source line plus how far you are through that paragraph), not pixel scroll
- auto-scroll: play, pause, speed, and back-to-top controls move the shared script position while every viewer follows
- recording count-in: a configurable countdown appears in the preview and viewer windows before playback starts
- per-viewer font, top-anchored: each window sizes its own text; they match on the top line, which is what actually helps when your screens aren’t physically centered
- viewer colors: app-wide text and background colors make the prompt easier to tune for different recording setups
- capture-safe viewer windows: the floating prompt can sit over the screen you record without appearing in that recording
- persistence: viewers and the editor frame reopen exactly where you left them
- trial and license flow: the app has a 14-day trial and a one-time license model through its own site
- native file workflow: New, Open, Open Recent, Save, Save As, and quit all respect unsaved changes through the macOS File menu
- in-app updates: Sparkle checks the signed appcast so future releases can arrive without a manual download
- public release path: the current notarized DMG lives in a public releases repo, with a product-owned Homebrew tap for terminal installs
why i built it
i record a lot of tutorials and talking-head videos, and i wanted a teleprompter that could run more than one window at once: a large prompter for my face cam and a thin strip sitting over my editor, both scrolling together. every teleprompter i found is single-window. it’s also the standalone, multi-window cousin of linesmith, my vs code teleprompter.
the other reason: it’s my first swift app. i wanted to learn the language by building something real i’d actually use, not a toy.
how it’s built
a quick tour:
- swift + swiftui + appkit: swiftui for the shell, appkit where it counts
- one shared scroll engine: the editor, the preview, and every viewer scroll
through the same
NSTextView-based line-mapping engine, after swiftui’sscrollPositionproved too coarse and a beat behind - fractional sync position: the sync unit is
line + fraction through the paragraph, so long wrapped paragraphs can’t let two windows drift apart - pixel-paced auto-scroll: the engine advances through the viewer being read, then maps that offset back into the shared source-line position so the selected window feels smooth
- echo suppression for “who’s driving”: any window broadcasts as it scrolls and ignores the one scroll it caused by following, which beat the scroll-phase and hover approaches that kept getting stuck
- borderless AppKit windows: viewers are frameless
NSWindows with the capture-exclusion, always-on-top, opacity, and click-through behavior handled at the window layer - mac distribution: Developer ID signing, notarization, a DMG release, an appcast-backed Sparkle update path, and a Homebrew cask path for installing from the terminal
- release hardening: file access, keychain writes, undo history, rendered preview updates, and scroll indexing were tightened before the 1.3 auto-scroll release
- public site: multiprompter.app is an Astro site with docs, changelog, support, and a product scene based on the real app UI
what’s next
- prove the updater in the wild: 1.3 is the first release intended to reach 1.2 users through Sparkle
- keep recording with it: the count-in default, speed display, and pacing model should be judged against real takes
- phase 2: voice tracking: your voice drives the same scroll position the windows already share
the windows sharing one position is the whole app. everything after this, voice tracking included, is just another thing that moves that position.