[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7013":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":24,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":29,"readmeContent":30,"aiSummary":31,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":32,"discoverSource":33},7013,"textream","f\u002Ftextream","f","Textream is a free macOS teleprompter app for streamers, interviewers, and presenters. It highlights your script in real-time as you speak, displayed in a beautiful Dynamic Island overlay. With extensible features.","https:\u002F\u002Ftextream.fka.dev\u002F",null,"Swift",3326,228,7,25,0,2,33,168,17,29.08,false,"master",true,[26,27,28],"macos","macos-app","streaming","2026-06-12 02:01:33","\u003Cp align=\"center\">\n  \u003Cimg src=\"Textream\u002FTextream\u002FAssets.xcassets\u002FAppIcon.appiconset\u002Ficon_256x256.png\" width=\"128\" height=\"128\" alt=\"Textream icon\">\n\u003C\u002Fp>\n\n\u003Ch1 align=\"center\">Textream\u003C\u002Fh1>\n\n\u003Cp align=\"center\">\n  \u003Cstrong>A free macOS teleprompter with real-time word tracking, classic auto-scroll, and voice-activated scrolling.\u003C\u002Fstrong>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  Built for streamers, interviewers, presenters, and podcasters.\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"#download\">Download\u003C\u002Fa> · \u003Ca href=\"#features\">Features\u003C\u002Fa> · \u003Ca href=\"#how-it-works\">How It Works\u003C\u002Fa> · \u003Ca href=\"#building-from-source\">Build\u003C\u002Fa>\n\u003C\u002Fp>\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fvideo.gif\" width=\"600\" alt=\"Textream demo\">\n\u003C\u002Fp>\n\n---\n\n## What is Textream?\n\nTextream is a free, open-source macOS app 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). It displays your text in a sleek **Dynamic Island-style overlay** at the top of your screen, a **draggable floating window**, or **fullscreen on a Sidecar iPad** — visible only to you, invisible to your audience.\n\nPaste your script, hit play, and start speaking. When you're done, the overlay closes automatically.\n\n## Download\n\n**[Download the latest .dmg from Releases](https:\u002F\u002Fgithub.com\u002Ff\u002Ftextream\u002Freleases\u002Flatest)**\n\nOr install with Homebrew:\n\n```bash\nbrew install f\u002Ftextream\u002Ftextream\n```\n\n> Requires **macOS 15 Sequoia** or later. Works on Apple Silicon and Intel.\n\n### First launch\n\nSince Textream is distributed outside the Mac App Store, macOS may block it on first open. Run this once in Terminal:\n\n```bash\nxattr -cr \u002FApplications\u002FTextream.app\n```\n\nThen right-click the app → **Open**. After the first launch, macOS remembers your choice.\n\n## Features\n\n### Guidance Modes\n\n| Mode | Description | Microphone |\n|---|---|---|\n| **Word Tracking** (default) | On-device speech recognition highlights each word as you say it. No cloud, no latency, works offline. Supports dozens of languages. | Required |\n| **Classic** | Auto-scrolls at a constant speed. No microphone needed. | Not needed |\n| **Voice-Activated** | Scrolls while you speak, pauses when you're silent or muted. Perfect for natural pacing. | Required |\n\n- **Scroll speed** — Adjustable 0.5–8 words\u002Fs for Classic and Voice-Activated modes.\n- **Speech language** — Choose your preferred speech recognition language for Word Tracking mode.\n- **Mouse scroll to catch up** — In Classic and Voice-Activated modes, scroll with your mouse to jump ahead or back. The timer pauses while you scroll and resumes from the new position.\n\n### Overlay Modes\n\n| Mode | Description |\n|---|---|\n| **Pinned to Notch** | A Dynamic Island–shaped overlay anchored below the MacBook notch. Sits above all apps. |\n| **Floating Window** | A draggable window you can place anywhere on screen. Always on top. |\n| **Fullscreen** | Fullscreen teleprompter on any display. Press **Esc** to stop. |\n\n#### Pinned to Notch options\n\n- **Follow Mouse** — The notch moves to whichever display your cursor is on.\n- **Fixed Display** — Pin the notch to a specific screen.\n\n#### Floating Window options\n\n- **Follow Cursor** — The window follows your mouse cursor. A floating stop button lets you dismiss it.\n- **Glass Effect** — Translucent frosted glass background with adjustable opacity (0–60%).\n\n#### Fullscreen options\n\n- **Display selection** — Choose which screen to show the fullscreen teleprompter on.\n- **Esc to stop** — Press the Escape key to dismiss the fullscreen overlay.\n\n### Size\n\n- **Width** — Adjustable overlay width (280–500 px).\n- **Height** — Adjustable text area height (100–400 px).\n\n### Font & Color\n\n| Setting | Options |\n|---|---|\n| **Font Family** | Sans, Serif, Mono, OpenDyslexic (dyslexia-friendly) |\n| **Font Size** | XS (14 pt), SM (16 pt), LG (20 pt), XL (24 pt) |\n| **Highlight Color** | White, Yellow, Green, Blue, Pink, Orange |\n\n### External Display & Sidecar\n\n| Mode | Description |\n|---|---|\n| **Off** | No external display output. |\n| **Teleprompter** | Fullscreen teleprompter on the selected external display or Sidecar iPad. |\n| **Mirror** | Flipped output for prompter mirror rigs. |\n\n- **Mirror axis** — Horizontal (standard for mirrors), Vertical, or Both (180° rotation).\n- **Target display** — Pick from connected external displays and Sidecar iPads.\n- **Hide from screen share** — Hides the overlay from screen recordings and video calls.\n\n### Remote Connection\n\nView your teleprompter on **any device** — phone, tablet, or another computer — via a local network browser connection.\n\n- **Enable in Settings → Remote** — Starts a lightweight HTTP + WebSocket server on your Mac.\n- **QR code** — Scan the generated QR code from your phone or tablet to open the teleprompter instantly.\n- **Real-time sync** — Words highlight, waveform animates, and progress updates in real time over WebSocket.\n- **No app needed** — Works in any modern browser. No installation required on the remote device.\n- **Configurable port** — Default port 7373, adjustable in advanced settings.\n- **Fully local** — All traffic stays on your local network. Nothing leaves your Wi-Fi.\n\n### Director Mode\n\nLet someone else control your teleprompter remotely. A director can write, edit, and push scripts to your teleprompter in real time from any browser.\n\n- **Enable in Settings → Director** — Starts a dedicated HTTP + WebSocket server (default port 7575).\n- **Remote web UI** — The director opens a mobile-friendly web page with a full-featured script editor.\n- **Live text editing** — The director types or pastes a script, hits Go, and your teleprompter starts immediately with word tracking.\n- **Read-locked highlighting** — Already-read text is highlighted and locked in the web editor. Only unread text remains editable.\n- **Real-time sync** — Word progress, waveform, mic status, and audio levels stream to the director's browser at 10 Hz.\n- **Single-page mode** — Director mode works with a single page of text. Multi-page scripts are not used.\n- **Editor disabled** — When director mode is active, the macOS editor is replaced with a QR code overlay so the director has full control.\n- **QR code** — Scan or share the QR code from Settings or the editor overlay to connect the director instantly.\n\n### File Support\n\n- **PowerPoint notes import** — Drop a .pptx file to extract presenter notes as pages. For Keynote or Google Slides, export to PowerPoint first.\n- **Save as .textream files** — Save your scripts as .textream files to reuse anytime. Keep your notes organized across presentations.\n- **Multi-page support** — Navigate between pages with automatic advance. In follow-cursor mode, pages auto-advance with a 3-second countdown.\n\n### Other\n\n- **Live waveform** — Visual voice activity indicator so you always know the mic is picking you up.\n- **Tap to jump** — Tap any word in the overlay to jump the tracker to that position.\n- **Pause & resume** — Go off-script, take a break, come back. The tracker picks up where you left off.\n- **Mute \u002F unmute** — Toggle the microphone on or off from the overlay in any mode.\n- **Completely private** — All processing happens on-device. No accounts, no tracking, no data leaves your Mac.\n- **Auto update checker** — Checks GitHub Releases for new versions on launch and from the Textream menu.\n- **Open source** — MIT licensed. Contributions welcome.\n\n## Who it's for\n\n| Use case | How Textream helps |\n|---|---|\n| **Streamers** | Read sponsor segments, announcements, and talking points without looking away from the camera. |\n| **Interviewers** | Keep your questions visible while maintaining natural eye contact with your guest. |\n| **Presenters** | Deliver keynotes, demos, and talks with confidence. Never lose your place. |\n| **Podcasters** | Follow show notes, ad reads, and topic outlines hands-free while recording. |\n\n## How It Works\n\n1. **Paste your script** — Drop your talking points, interview questions, or full script into the text editor.\n2. **Hit play** — The Dynamic Island overlay slides down from the top of your screen.\n3. **Start speaking** — Words highlight in real-time as you read. When you finish, the overlay closes automatically.\n\n## Building from Source\n\n### Requirements\n\n- macOS 15+\n- Xcode 16+\n- Swift 5.0+\n\n### Build\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Ff\u002Ftextream.git\ncd textream\u002FTextream\nopen Textream.xcodeproj\n```\n\nBuild and run with ⌘R in Xcode.\n\n### Project structure\n\n```\nTextream\u002F\n├── Textream.xcodeproj\n├── Info.plist\n└── Textream\u002F\n    ├── TextreamApp.swift              # App entry point, deep link handling\n    ├── ContentView.swift              # Main text editor UI + About view\n    ├── TextreamService.swift          # Service layer, URL scheme handling\n    ├── SpeechRecognizer.swift         # On-device speech recognition engine\n    ├── NotchOverlayController.swift   # Dynamic Island + floating overlay\n    ├── ExternalDisplayController.swift # Sidecar \u002F external display output\n    ├── NotchSettings.swift            # User preferences and presets\n    ├── SettingsView.swift             # Tabbed settings UI\n    ├── MarqueeTextView.swift          # Word flow layout and highlighting\n    ├── BrowserServer.swift            # Remote connection HTTP + WebSocket server\n    ├── DirectorServer.swift           # Director mode HTTP + WebSocket server\n    ├── PresentationNotesExtractor.swift # PPTX presenter notes extraction\n    ├── UpdateChecker.swift            # GitHub release update checker\n    └── Assets.xcassets\u002F               # App icon and colors\n```\n\n## URL Scheme\n\nTextream supports the `textream:\u002F\u002F` URL scheme for launching directly into the overlay:\n\n```\ntextream:\u002F\u002Fread?text=Hello%20world\n```\n\nIt also registers as a macOS Service, so you can select text in any app and send it to Textream via the Services menu.\n\n## Director Mode API\n\nThe 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.\n\n### Ports\n\n| Service | Default Port | Configurable in |\n|---|---|---|\n| **HTTP** (serves the built-in web UI) | `7575` | Settings → Director → Advanced |\n| **WebSocket** (bidirectional communication) | `7576` (HTTP port + 1) | Automatic |\n\n### Connecting\n\n1. Open a WebSocket connection to `ws:\u002F\u002F\u003Cmac-ip>:\u003Cws-port>` (e.g. `ws:\u002F\u002F192.168.1.42:7576`).\n2. The server immediately begins sending **state frames** as JSON at ~10 Hz once a script is active.\n3. Send **command frames** as JSON to control the teleprompter.\n\n### Commands (Client → App)\n\nSend JSON messages over the WebSocket:\n\n#### `setText` — Start reading a new script\n\n```json\n{\n  \"type\": \"setText\",\n  \"text\": \"Welcome everyone to today's live stream...\"\n}\n```\n\nReplaces the current text, starts word tracking, and opens the teleprompter overlay. This is equivalent to pressing **Go** in the built-in web UI.\n\n#### `updateText` — Edit unread text while active\n\n```json\n{\n  \"type\": \"updateText\",\n  \"text\": \"Welcome everyone to today's live stream We changed the rest of the script...\",\n  \"readCharCount\": 42\n}\n```\n\nUpdates the full script text while preserving the read position. `readCharCount` is the number of characters already read (locked). Only text after this offset is replaced. Use this for live editing during a read.\n\n#### `stop` — Stop the teleprompter\n\n```json\n{\n  \"type\": \"stop\"\n}\n```\n\nStops word tracking and dismisses the overlay.\n\n### State (App → Client)\n\nThe server broadcasts a JSON object on every tick (~100 ms):\n\n```json\n{\n  \"words\": [\"Welcome\", \"everyone\", \"to\", \"today's\", \"live\", \"stream\"],\n  \"highlightedCharCount\": 24,\n  \"totalCharCount\": 120,\n  \"isActive\": true,\n  \"isDone\": false,\n  \"isListening\": true,\n  \"fontColor\": \"#F5F5F7\",\n  \"lastSpokenText\": \"Welcome everyone to today's\",\n  \"audioLevels\": [0.12, 0.34, 0.08, ...]\n}\n```\n\n| Field | Type | Description |\n|---|---|---|\n| `words` | `string[]` | The script split into words (same order as displayed in the overlay). |\n| `highlightedCharCount` | `int` | Number of characters recognized so far. Use this to determine the read boundary. |\n| `totalCharCount` | `int` | Total character count of the full script. |\n| `isActive` | `bool` | `true` when the teleprompter overlay is visible and a script is loaded. |\n| `isDone` | `bool` | `true` when `highlightedCharCount >= totalCharCount` (finished reading). |\n| `isListening` | `bool` | `true` when the microphone is actively listening. |\n| `fontColor` | `string` | CSS color of the text in the overlay (user preference). |\n| `lastSpokenText` | `string` | Last recognized speech fragment. |\n| `audioLevels` | `double[]` | Array of audio level samples (0.0–1.0) for waveform visualization. |\n\nWhen the overlay is not active, the server sends a frame with `isActive: false` and empty arrays.\n\n### Example: Minimal Python Client\n\n```python\nimport asyncio, json, websockets\n\nasync def director():\n    async with websockets.connect(\"ws:\u002F\u002F192.168.1.42:7576\") as ws:\n        # Send a script\n        await ws.send(json.dumps({\n            \"type\": \"setText\",\n            \"text\": \"Hello everyone, welcome to the show.\"\n        }))\n\n        # Listen for state updates\n        async for msg in ws:\n            state = json.loads(msg)\n            pct = 0\n            if state[\"totalCharCount\"] > 0:\n                pct = state[\"highlightedCharCount\"] \u002F state[\"totalCharCount\"] * 100\n            print(f\"Progress: {pct:.0f}%  Done: {state['isDone']}\")\n            if state[\"isDone\"]:\n                break\n\n        # Stop\n        await ws.send(json.dumps({\"type\": \"stop\"}))\n\nasyncio.run(director())\n```\n\n## License\n\nMIT\n\n---\n\n\u003Cp align=\"center\">\n  Original idea by \u003Ca href=\"https:\u002F\u002Fx.com\u002Fsemihdev\">Semih Kışlar\u003C\u002Fa> — thanks to him!\u003Cbr>\n  Made by \u003Ca href=\"https:\u002F\u002Ffka.dev\">Fatih Kadir Akin\u003C\u002Fa>\n\u003C\u002Fp>\n","Textream 是一款免费的 macOS 提词器应用，专为直播者、采访者和演讲者设计。它通过实时高亮显示正在朗读的文字，并以美观的动态岛覆盖层形式展示，支持三种模式：逐字跟踪、经典自动滚动和语音激活滚动。采用 Swift 语言开发，具有高度可扩展性。该应用适合需要在屏幕上查看脚本但不希望观众看到提词内容的场景使用，如在线直播、视频会议或公开演讲等。此外，Textream 还支持 Sidecar 功能，可以在外接 iPad 上全屏显示，提供更加灵活多样的使用方式。","2026-06-11 03:10:07","top_language"]