Repository navigation
Teleprompter
The Dynamic Island doubles as a teleprompter: your script scrolls by itself inside the island — one to four lines at the top of the screen, right under the webcam — so you can read an interview, a recording or a video call without a second window and without looking away from the lens. Hover the island and it grows into a card with the controls.
It needs the Dynamic Island to be on, and the feature is off by default (dynamicIsland.widgets.teleprompter.enable).
- Settings → Dynamic Island → enable the Dynamic Island, then open the Teleprompter subpage and switch it on.
- Type or paste your script in the Script field and press Start reading — or use one of the shortcuts below.
- A 3 → 2 → 1 countdown (configurable) runs, then the text scrolls at your speed. Hover the island for the card: pause / resume, restart, stop, loop, mirror, speed up/down (steps of five px/s) and the time remaining.
- When the script ends the island gives itself back to its normal role after a few seconds (
finishHoldSeconds, default 4;0keeps it until you stop it).
| Entry point | How |
|---|---|
| Settings → Dynamic Island → Teleprompter | The script field, or the one saved there |
| Copy some text | The island's Copied! banner gets a teleprompter button |
| Clipboard panel | An action in the panel's action row, and a drag handle on every entry |
| Drag text onto the island | Select text anywhere and drop it on the island — it opens a drop area while you drag |
| Terminal / script | qs -c ii ipc call teleprompter start "Your text" |
qs -c ii ipc call teleprompter start "text to read"
qs -c ii ipc call teleprompter startSaved # the script saved in Settings
qs -c ii ipc call teleprompter pause | resume | togglePause | restart | stop
qs -c ii ipc call teleprompter status # JSON: phase, scroll position, speed, lines…- The island stays put. While a session runs the teleprompter is pinned to the island's centre, so notifications and other activities don't swap the face under your eyes, and (with Stay on screen while reading) it overrides auto-hide and the fullscreen hide. Hovering it does not open the Dashboard, and clicking the script does nothing.
-
One scroll position for two faces. The contracted strip and the hover card both draw the same
scrollY, so growing the island never makes the text jump. - Height follows your choice live. The strip's height is arithmetic — lines × a fixed line height + padding — so changing Lines on the island in Settings resizes the island as you watch. The hover card is always wider than the strip, so opening it never reads as the island shrinking.
- Honest timing. The scroller measures real elapsed time, not the timer interval, so a stalled compositor slows the text by the time that actually passed instead of letting it drift.
- A short script ends early. If the whole script fits in view it counts as finished as soon as the countdown clears.
All of them live in Settings → Dynamic Island → Teleprompter, with a live preview — the real faces drawn at scale in a mock island with a demo session, until a real session takes the stage (hover the preview to see it morph).
| Option | Default | |
|---|---|---|
| Lines on the island | 2 (1–4) | Height of the strip |
| Lines in the hover card | 5 | Height of the card |
| Island width | 520 | |
| Text size | 22 | Clamped 12–48 |
| Bold, expressive text | on | |
| Scroll speed | 45 px/s | |
| Loop the script | off | Back to the top instead of finishing |
| Countdown before reading | 3 s | 0 disables |
| Mirror the text | off | Flip horizontally for beam-splitter prompter glass |
| Progress line | on | |
| Stay on screen while reading | on | Overrides auto-hide and fullscreen hide |
| Finish hold | 4 s | How long a finished script keeps the island |
Keys are in Config.options.dynamicIsland.widgets.teleprompter; the service reads and clamps every value in one place (services/Teleprompter.qml), and the faces and Settings only ever talk to the service.
| Piece | Role |
|---|---|
services/Teleprompter.qml |
Session state (running, paused, phase: idle → countdown → scrolling → finished; scrollY), the motion engine (advance(dtMs), stepCountdown()), IPC |
modules/ii/dynamicIsland/core/sources/TeleprompterSource.qml |
Registers the activity and its size override |
modules/ii/dynamicIsland/activities/teleprompter/ |
TeleprompterText (strip) and TeleprompterExpanded (card) |
modules/settings/configs/features/ |
The settings subpage and its preview |
scripts/tests/test_teleprompter_contract.py, tests/teleprompter/
|
Contract tests and offscreen engine tests |
- Bar & Dynamic Island
- Screen Capture & Recording
- Launcher & Search — the clipboard panel