Skip to content

Teleprompter

P3DROVFX edited this page Oct 12, 2026 · 1 revision

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).

Quick start

  1. Settings → Dynamic Island → enable the Dynamic Island, then open the Teleprompter subpage and switch it on.
  2. Type or paste your script in the Script field and press Start reading — or use one of the shortcuts below.
  3. 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.
  4. When the script ends the island gives itself back to its normal role after a few seconds (finishHoldSeconds, default 4; 0 keeps it until you stop it).

Ways to start

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…

Behaviour designed for reading

  • 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.

Options

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.

Under the hood

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

Related pages

← Back to Home

Clone this wiki locally