textream README

The project's README from github.com/f/textream. As one markdown file: README.md.

Textream icon

Textream

A free teleprompter for Mac, iPhone, and iPad.

Built for streamers, interviewers, presenters, and podcasters.

Download · iPhone & iPad · Features · How It Works · Build · Privacy

Textream demo


What is Textream?

Textream is a free, open-source teleprompter that guides you through your script with three modes: word tracking (highlights each word as you say it), classic (constant-speed auto-scroll), and voice-activated (scrolls while you speak, pauses when you're silent). The Mac app displays your text in a sleek Dynamic Island-style overlay, a draggable floating window, or fullscreen on a Sidecar iPad. The iPhone and iPad app adds near-camera reading and presenter-only camera recording.

Paste your script, hit play, and start speaking. When you're done, the overlay closes automatically.

Download

Download Textream from the App Store for Mac, iPhone, and iPad.

Or download the latest .dmg from GitHub Releases.

Or install with Homebrew:

brew install textream

Requires macOS 15 Sequoia or later. Works on Apple Silicon and Intel.

iOS 26 Companion

The Textream companion for iPhone and iPad is part of the same universal App Store listing as the Mac app.

Features

Guidance Modes

Mode Description Microphone
Word Tracking (default) macOS speech recognition highlights each word as you say it. Depending on your Mac, language, and system availability, recognition may happen on-device or Apple may process microphone audio. Required
Classic Auto-scrolls at a constant speed. No microphone needed. Not needed
Voice-Activated Scrolls while you speak, pauses when you're silent or muted. Perfect for natural pacing. Required

Overlay Modes

Mode Description
Pinned to Notch A Dynamic Island–shaped overlay anchored below the MacBook notch. Sits above all apps.
Floating Window A draggable window you can place anywhere on screen. Always on top.
Fullscreen Fullscreen teleprompter on any display. Press Esc to stop.

Pinned to Notch options

Floating Window options

Fullscreen options

Size

Font & Color

Setting Options
Font Family Sans, Serif, Mono, OpenDyslexic (dyslexia-friendly)
Font Size XS (14 pt), SM (16 pt), LG (20 pt), XL (24 pt)
Highlight Color White, Yellow, Green, Blue, Pink, Orange

External Display & Sidecar

Mode Description
Off No external display output.
Teleprompter Fullscreen teleprompter on the selected external display or Sidecar iPad.
Mirror Flipped output for prompter mirror rigs.

Remote Connection

View your teleprompter on any device — phone, tablet, or another computer — via a local network browser connection.

Director Mode

Let someone else control your teleprompter remotely. A director can write, edit, and push scripts to your teleprompter in real time from any browser.

File Support

Other

Who it's for

Use case How Textream helps
Streamers Read sponsor segments, announcements, and talking points without looking away from the camera.
Interviewers Keep your questions visible while maintaining natural eye contact with your guest.
Presenters Deliver keynotes, demos, and talks with confidence. Never lose your place.
Podcasters Follow show notes, ad reads, and topic outlines hands-free while recording.

How It Works

  1. Paste your script — Drop your talking points, interview questions, or full script into the text editor.
  2. Hit play — The Dynamic Island overlay slides down from the top of your screen.
  3. Start speaking — Words highlight in real-time as you read. When you finish, the overlay closes automatically.

Building from Source

Requirements

For the macOS app:

For the iOS companion:

The macOS target uses Swift 5 language mode. The new iOS target uses Swift 6 with complete concurrency checking.

Build

git clone https://github.com/f/textream.git
cd textream/Textream
open Textream.xcodeproj

Choose the Textream scheme for macOS or TextreamiOS for iOS, select a compatible destination, then build and run with ⌘R in Xcode. The TextreamiOS scheme also includes the iOS unit tests.

Install on an iPhone or iPad with Xcode

You can install and try the development build on your own device with a personal Apple Account; a paid Apple Developer Program membership is not required for local testing.

  1. Install Xcode 26 or later, clone this repository, and open Textream/Textream.xcodeproj.
  2. In Xcode → Settings → Accounts, add your Apple Account.
  3. Connect your unlocked iPhone or iPad to the Mac. Trust the computer if the device asks, then wait for it to appear in Xcode's run-destination menu.
  4. Select the Textream project, select the TextreamiOS target, and open Signing & Capabilities.
  5. Leave Automatically manage signing enabled and choose your personal team. If Xcode reports that dev.fka.textream is unavailable, change the bundle identifier to a unique value such as com.yourname.textream.dev.
  6. Select the TextreamiOS scheme and your connected device in the Xcode toolbar, then press ⌘R or choose Product → Run.
  7. If prompted, enable Developer Mode on the device in Settings → Privacy & Security → Developer Mode, restart the device, confirm Developer Mode after restart, and run the app from Xcode again.
  8. Accept the camera, microphone, speech-recognition, and Photos permissions only for the features you want to test.

This installs a development-signed build directly from your Mac; it does not publish anything to the App Store or TestFlight.

To try mirror mode, choose Read, enable Mirror in landscape, select an axis, and start the prompter. Rotate the device to landscape and use the small ↔ button at the top right to adjust mirror axis, reading position, text size, scroll speed, or hide the playback controls while the prompt is running.

Run the iOS test suite with Product → Test or ⌘U. Camera capture, microphone input, recording, and Photos saving should be verified on a physical device because Simulator doesn't provide the same hardware behavior.

Project structure

Textream/
├── Textream.xcodeproj
├── Info.plist
├── Textream/                         # macOS app
│   ├── TextreamApp.swift              # App entry point, deep link handling
│   ├── ContentView.swift              # Main text editor UI + About view
│   ├── TextreamService.swift          # Service layer, URL scheme handling
│   ├── SpeechRecognizer.swift         # macOS speech recognition integration
│   ├── NotchOverlayController.swift   # Dynamic Island + floating overlay
│   ├── ExternalDisplayController.swift # Sidecar / external display output
│   ├── NotchSettings.swift            # User preferences and presets
│   ├── SettingsView.swift             # Tabbed settings UI
│   ├── MarqueeTextView.swift          # Word flow layout and highlighting
│   ├── BrowserServer.swift            # Remote connection HTTP + WebSocket server
│   ├── DirectorServer.swift           # Director mode HTTP + WebSocket server
│   ├── PresentationNotesExtractor.swift # PPTX presenter notes extraction
│   ├── UpdateChecker.swift            # GitHub release update checker
│   └── Assets.xcassets/               # macOS app icon and colors
├── TextreamiOS-Info.plist             # iOS permissions and orientations
├── TextreamiOS/                       # iOS app, capture, speech, models, and views
│   └── Resources/                     # iOS assets and OpenDyslexic font
└── TextreamiOSTests/                  # iOS prompt and matching tests

URL Scheme

Textream supports the textream:// URL scheme for launching directly into the overlay:

textream://read?text=Hello%20world

It also registers as a macOS Service, so you can select text in any app and send it to Textream via the Services menu.

Director Mode API

The Director Mode exposes an HTTP server and a WebSocket server on your local network. You can build your own director client using the protocol below.

Ports

Service Default Port Configurable in
HTTP (serves the built-in web UI) 7575 Settings → Director → Advanced (1024–65534)
WebSocket (bidirectional communication) 7576 (HTTP port + 1) Automatic

Connecting

  1. Fetch the built-in Director page from http://<mac-ip>:<http-port> and extract the current 64-character AUTH_TOKEN embedded in its script. The token changes whenever the Director server restarts.
  2. Open a WebSocket connection to ws://<mac-ip>:<ws-port> (e.g. ws://192.168.1.42:7576).
  3. Within five seconds, send {"type":"auth","text":"<token>"} as the first WebSocket frame. The server closes clients that skip or fail authentication.
  4. Send command frames to control the teleprompter. Once a script is active, the server broadcasts state frames as JSON at approximately 10 Hz.

Director Mode is intended for trusted local networks. HTTP and WebSocket traffic is not encrypted, so do not expose either port to the public internet or log/share the token.

Commands (Client → App)

Send JSON messages over the WebSocket:

auth — Authenticate the connection

{
  "type": "auth",
  "text": "<64-character token from the Director page>"
}

This must be the first frame on every connection. It does not start a read.

setText — Start reading a new script

{
  "type": "setText",
  "text": "Welcome everyone to today's live stream..."
}

Replaces the current text, starts word tracking, and opens the teleprompter overlay. This is equivalent to pressing Go in the built-in web UI.

updateText — Edit unread text while active

{
  "type": "updateText",
  "text": "Welcome everyone to today's live stream We changed the rest of the script...",
  "readCharCount": 42
}

Updates the full script text while preserving the confirmed read position. Set readCharCount to the latest highlightedCharCount received from Textream; do not calculate this offset independently. Textream clamps it to the Mac’s recognized count and the new script length. Keep the prefix before that offset unchanged and edit only unread text after it.

stop — Stop the teleprompter

{
  "type": "stop"
}

Stops word tracking and dismisses the overlay.

State (App → Client)

The server broadcasts a JSON object on every tick (~100 ms):

{
  "words": ["Welcome", "everyone", "to", "today's", "live", "stream"],
  "highlightedCharCount": 24,
  "totalCharCount": 120,
  "isActive": true,
  "isDone": false,
  "isListening": true,
  "fontColor": "#F5F5F7",
  "cueColor": "#F5F5F7",
  "lastSpokenText": "Welcome everyone to today's",
  "audioLevels": [0.12, 0.34, 0.08, ...]
}
Field Type Description
words string[] The script split into words (same order as displayed in the overlay).
highlightedCharCount int Number of characters recognized so far. Use this to determine the read boundary.
totalCharCount int Total character count of the full script.
isActive bool true when the teleprompter overlay is visible and a script is loaded.
isDone bool true when highlightedCharCount >= totalCharCount (finished reading).
isListening bool true when the microphone is actively listening.
fontColor string CSS color of the text in the overlay (user preference).
cueColor string CSS color of bracketed stage directions (user preference).
lastSpokenText string Last recognized speech fragment.
audioLevels double[] Array of audio level samples (0.0–1.0) for waveform visualization.

When the overlay is not active, the server sends a frame with isActive: false and empty arrays.

Example: Minimal Python Client

import asyncio, json, re, urllib.request
import websockets

HOST = "192.168.1.42"
HTTP_PORT = 7575

def director_token():
    with urllib.request.urlopen(f"http://{HOST}:{HTTP_PORT}", timeout=3) as response:
        html = response.read().decode("utf-8")
    match = re.search(r"AUTH_TOKEN='([0-9a-f]{64})'", html)
    if not match:
        raise RuntimeError("Director token not found")
    return match.group(1)

async def director():
    async with websockets.connect(f"ws://{HOST}:{HTTP_PORT + 1}") as ws:
    

textream (f/textream)

Searching Database…

这是什么?Textream 是一款免费开源的提词器应用,适用于 Mac、iPhone 和 iPad,在你讲话时实时高亮你的讲稿,以灵动岛样式悬浮层、浮动窗口或全屏形式显示。
这只是 Mac 应用,还是我的手机上也能用?Textream 主要是原生 macOS 应用,但同一个 App Store 页面还包含 iPhone/iPad 伴侣应用,支持贴近镜头朗读和只录演讲者的视频录制。
我需要什么 macOS 版本?你需要 macOS 15 Sequoia 或更高版本;它在 Apple Silicon 和 Intel Mac 上都能运行。
Word Tracking 模式总是在设备端处理音频吗?不一定——取决于你的 Mac、语言和系统可用性,用于 Word Tracking 的 macOS 语音识别可能在设备端运行,Apple 也可能远程处理麦克风音频。
Textream 会收集我的数据或把讲稿发送到服务器吗?不会——没有账户、广告、分析,也没有 Textream 运营的云服务;讲稿和设置都保存在本地,不过如上所述,语音识别音频可能会发送给 Apple。
远程连接功能是什么?它会在你的 Mac 上启动一个轻量级本地 HTTP+WebSocket 服务器,你用手机或平板扫码即可查看提词器,支持实时逐词高亮,远端设备无需安装应用。
导演模式是什么?它允许别人远程控制讲稿:导演打开一个适合手机操作的网页编辑器,输入或粘贴文本,然后实时推送到你的提词器上并带逐词追踪。
能导入幻灯片或复用讲稿吗?可以,你可以拖入 .pptx 文件把演讲者备注提取为页面,讲稿也能保存为 .textream 文件或重新加载。
讲稿可以用哪些悬浮样式显示?可选择灵动岛式挖孔悬浮层、可拖动的浮动窗口或全屏显示,还支持输出到外接显示器或 Sidecar iPad,并带有面向提词器玻璃装置的镜像模式。
Creator
f
Size
31.3 MB
Stars
4K
Age
8mo
Commits · 90 Days