A minimal floating teleprompter for macOS (and Linux/Windows) built with Python and PyQt6. The window sits at the top-centre of your screen, above every other app, so you can read your script while presenting, recording, or on a video call.
Floating window — sits on top of any app (here shown over a Zoom call):
Settings window — paste your script, tune speed, font, colours, and key bindings:
- Always-on-top floating window — stays visible over Zoom, Meet, Keynote, browsers, etc.
- Glowing border — customisable colour, easy to spot at a glance
- Page-based display — shows a fixed number of words at a time; the block flips to the next page when the current word crosses the boundary
- Auto-scroll — advances one word at a time at a configurable WPM (default 120)
- Manual navigation — step forward/back one word, or jump a full page
- Fully configurable — WPM, words per view, font size, window height, all four colours, and key bindings
- Auto-sizing width — the window is exactly as wide as needed for the longest page of words; no wasted space, no clipping
- Persistent settings — everything is saved automatically to
~/.teleprompter_settings.json
- Python 3.11+
- uv (package manager)
# Clone or download the project, then:
cd Teleprompter
uv syncuv run teleprompterThis opens the Settings window. Paste your script, configure as needed, then click ▶ Launch.
| Input | Action |
|---|---|
Space |
Start / pause auto-scroll |
→ Right Arrow |
Next word (pauses auto-scroll) |
← Left Arrow |
Previous word (pauses auto-scroll) |
↓ Down Arrow |
Skip forward one full page (pauses auto-scroll) |
↑ Up Arrow |
Skip back one full page (pauses auto-scroll) |
| Scroll down | Skip forward one full page |
| Scroll up | Skip back one full page |
Esc |
Close the teleprompter |
| Click & drag | Reposition the window |
⚙ button |
Bring the Settings window to front |
✕ button |
Close the teleprompter |
Tip: The navigation keys (next, previous, pause) can be rebound in the Settings → Controls tab.
If auto-scroll is running and you press → / ← / ↑ / ↓ or scroll, auto-scroll pauses. Press Space to resume from the current word.
Open automatically on launch, or click ⚙ on the teleprompter.
- Paste or type your script directly
- Load file — import any
.txt,.md,.rst, or.srtfile - Live word count displayed as you type
| Setting | Description | Default |
|---|---|---|
| Words per minute | Auto-scroll speed | 120 |
| Words per view | Words shown per page | 10 |
| Font size | Size of the text | 28 px |
| Height | Height of the floating window | 120 px |
| Width | Auto-calculated — fits the widest page | — |
| Glow / border | Colour of the glowing edge | #00BFFF |
| Current word | Highlight colour | #00FFFF |
| Upcoming words | Text colour | #E8E8FF |
| Background | Window fill colour | #0D0D1A |
- Remap the Next word, Previous word, and Pause/Resume keys
- Toggle scroll-wheel navigation on/off
- Quick-reference table for all shortcuts
Words are shown in non-overlapping pages. With words_per_view = 5:
Page 1: [dim] [dim] [CURRENT] word word
Page 2: word word word word word
...
- Dim grey — words already spoken on the current page
- Cyan / bold / larger — the word being spoken now
- White — upcoming words on the current page
When auto-scroll advances past the last word on a page, the display flips immediately to the next page.
src/teleprompter/
main.py — entry point
config.py — settings dataclass, saved to ~/.teleprompter_settings.json
prompter.py — floating teleprompter window
settings.py — settings & script editor window
pyproject.toml
- macOS fullscreen apps —
WindowStaysOnTopHintkeeps the window above regular windowed apps. If another app enters true macOS fullscreen, the teleprompter may be hidden on that Space. Use windowed (non-fullscreen) mode for your other apps to avoid this. - Settings are saved automatically whenever you click Apply changes, ▶ Launch, or close the Settings window.

