# f/textream architecture

> Architecture diagram of the GitHub repository f/textream, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/f/textream
- Repository: https://github.com/f/textream

## Overview

Textream is a cross-platform teleprompter: users prepare scripts, choose a guidance mode, then read from an overlay or fullscreen prompt while speech tracking or timed scrolling advances the text. On iOS, a prompt session can also capture presenter video and audio, save completed recordings to Photos, and retain recordings for retry or gallery management. The Mac app adds presentation-note import, external displays, and browser-based remote and director control. The graph reflects the README and the sampled source; several feature connections rely on documented capabilities because their implementation was not sampled.

Main entry points: [`Textream/Textream/TextreamService.swift`](https://github.com/f/textream/blob/master/Textream/Textream/TextreamService.swift) (Prompt service), [`Textream/TextreamiOS/Models/PromptSessionController.swift`](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Models/PromptSessionController.swift) (Session controller), [`Textream/TextreamiOS/Capture/CaptureController.swift`](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Capture/CaptureController.swift) (Capture controller), [`Textream/TextreamiOS/Views/RootView.swift`](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Views/RootView.swift) (App screens)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_mac_prompt["Mac prompting"]
  node_mac_editor["Script editor<br/>[ContentView.swift]"]
  node_mac_service["Prompt service"]
  node_mac_overlay["Notch overlay"]
  node_mac_speech["Speech tracking"]
  node_mac_dictation["Voice activity"]
  node_mac_notes["Notes import"]
  node_mac_external["External display"]
end

subgraph group_mac_remote["Mac integrations"]
  node_mac_browser["Browser server"]
  node_mac_director["Director server"]
end

subgraph group_ios_prompt["iOS prompting"]
  node_ios_app["iOS app"]
  node_ios_root["App screens<br/>[RootView.swift]"]
  node_ios_session_view["Prompt session"]
  node_ios_controller["Session controller"]
  node_ios_processor["Prompt processing"]
  node_ios_follower["Speech follower"]
end

subgraph group_ios_record["iOS recording"]
  node_ios_capture["Capture controller"]
  node_recordings_store[("Saved recordings")]
  node_gallery["Recordings gallery"]
end

node_user(("Presenter"))
node_browser_user(("Remote browser"))
node_camera_mic(("Camera and mic"))
node_photos[("Photos library")]

node_user -->|"edits script"| node_mac_editor
node_mac_editor -->|"starts prompt"| node_mac_service
node_mac_service -->|"shows text"| node_mac_overlay
node_mac_service -->|"updates text"| node_mac_speech
node_mac_overlay -->|"reads progress"| node_mac_speech
node_mac_overlay -.->|"uses voice activity"| node_mac_dictation
node_user -->|"imports notes"| node_mac_notes
node_mac_service -->|"extracts notes"| node_mac_notes
node_mac_service -->|"shows prompt"| node_mac_external
node_mac_service -->|"publishes content"| node_mac_browser
node_mac_service -->|"publishes content"| node_mac_director
node_browser_user -->|"opens prompt"| node_mac_browser
node_browser_user -->|"edits script"| node_mac_director
node_ios_app -->|"shows app"| node_ios_root
node_user -->|"chooses mode"| node_ios_root
node_ios_root -->|"opens session"| node_ios_session_view
node_ios_session_view -->|"prepares session"| node_ios_controller
node_ios_controller -->|"processes prompt"| node_ios_processor
node_ios_controller -->|"prepares speech"| node_ios_follower
node_ios_controller -->|"controls capture"| node_ios_capture
node_ios_follower -->|"provides progress"| node_ios_controller
node_ios_capture -->|"captures audio and video"| node_camera_mic
node_ios_capture -->|"saves recording"| node_photos
node_ios_capture -->|"keeps pending copy"| node_recordings_store
node_ios_root -->|"shows recordings"| node_gallery
node_gallery -->|"reads recordings"| node_recordings_store

click node_mac_editor "https://github.com/f/textream/blob/master/Textream/Textream/ContentView.swift"
click node_mac_service "https://github.com/f/textream/blob/master/Textream/Textream/TextreamService.swift"
click node_mac_overlay "https://github.com/f/textream/blob/master/Textream/Textream/NotchOverlayController.swift"
click node_mac_speech "https://github.com/f/textream/blob/master/Textream/Textream/SpeechRecognizer.swift"
click node_mac_dictation "https://github.com/f/textream/blob/master/Textream/Textream/VoiceActivityDetector.swift"
click node_mac_notes "https://github.com/f/textream/blob/master/Textream/Textream/PresentationNotesExtractor.swift"
click node_mac_external "https://github.com/f/textream/blob/master/Textream/Textream/ExternalDisplayController.swift"
click node_mac_browser "https://github.com/f/textream/blob/master/Textream/Textream/BrowserServer.swift"
click node_mac_director "https://github.com/f/textream/blob/master/Textream/Textream/DirectorServer.swift"
click node_ios_app "https://github.com/f/textream/blob/master/Textream/TextreamiOS/TextreamiOSApp.swift"
click node_ios_root "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Views/RootView.swift"
click node_ios_session_view "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Views/PromptSessionView.swift"
click node_ios_controller "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Models/PromptSessionController.swift"
click node_ios_processor "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Models/PromptTextProcessor.swift"
click node_ios_follower "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Speech/SpeechFollower.swift"
click node_ios_capture "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Capture/CaptureController.swift"
click node_recordings_store "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Capture/SavedRecordingsStore.swift"
click node_gallery "https://github.com/f/textream/blob/master/Textream/TextreamiOS/Views/SavedRecordingsGallery.swift"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_mac_editor,node_mac_service,node_mac_overlay,node_mac_speech,node_mac_dictation,node_mac_notes,node_mac_external,node_browser_user toneBlue
class node_mac_browser,node_mac_director,node_photos toneAmber
class node_ios_app,node_ios_root,node_ios_session_view,node_ios_controller,node_ios_processor,node_ios_follower toneMint
class node_ios_capture,node_recordings_store,node_gallery toneRose
class node_user,node_camera_mic toneIndigo
```

## Components

### Mac prompting

- [Script editor](https://github.com/f/textream/blob/master/Textream/Textream/ContentView.swift): `Textream/Textream/ContentView.swift`
- [Prompt service](https://github.com/f/textream/blob/master/Textream/Textream/TextreamService.swift): `Textream/Textream/TextreamService.swift`
- [Notch overlay](https://github.com/f/textream/blob/master/Textream/Textream/NotchOverlayController.swift): `Textream/Textream/NotchOverlayController.swift`
- [Speech tracking](https://github.com/f/textream/blob/master/Textream/Textream/SpeechRecognizer.swift): `Textream/Textream/SpeechRecognizer.swift`
- [Voice activity](https://github.com/f/textream/blob/master/Textream/Textream/VoiceActivityDetector.swift): `Textream/Textream/VoiceActivityDetector.swift`
- [Notes import](https://github.com/f/textream/blob/master/Textream/Textream/PresentationNotesExtractor.swift): `Textream/Textream/PresentationNotesExtractor.swift`
- [External display](https://github.com/f/textream/blob/master/Textream/Textream/ExternalDisplayController.swift): `Textream/Textream/ExternalDisplayController.swift`

### Mac integrations

- [Browser server](https://github.com/f/textream/blob/master/Textream/Textream/BrowserServer.swift): `Textream/Textream/BrowserServer.swift`
- [Director server](https://github.com/f/textream/blob/master/Textream/Textream/DirectorServer.swift): `Textream/Textream/DirectorServer.swift`

### iOS prompting

- [iOS app](https://github.com/f/textream/blob/master/Textream/TextreamiOS/TextreamiOSApp.swift): `Textream/TextreamiOS/TextreamiOSApp.swift`
- [App screens](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Views/RootView.swift): `Textream/TextreamiOS/Views/RootView.swift`
- [Prompt session](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Views/PromptSessionView.swift): `Textream/TextreamiOS/Views/PromptSessionView.swift`
- [Session controller](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Models/PromptSessionController.swift): `Textream/TextreamiOS/Models/PromptSessionController.swift`
- [Prompt processing](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Models/PromptTextProcessor.swift): `Textream/TextreamiOS/Models/PromptTextProcessor.swift`
- [Speech follower](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Speech/SpeechFollower.swift): `Textream/TextreamiOS/Speech/SpeechFollower.swift`

### iOS recording

- [Capture controller](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Capture/CaptureController.swift): `Textream/TextreamiOS/Capture/CaptureController.swift`
- [Saved recordings](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Capture/SavedRecordingsStore.swift): `Textream/TextreamiOS/Capture/SavedRecordingsStore.swift`
- [Recordings gallery](https://github.com/f/textream/blob/master/Textream/TextreamiOS/Views/SavedRecordingsGallery.swift): `Textream/TextreamiOS/Views/SavedRecordingsGallery.swift`

### Other components

- **Presenter**
- **Remote browser**
- **Camera and mic**
- **Photos library**

## Connections

- Presenter → Script editor: edits script
- Script editor → Prompt service: starts prompt
- Prompt service → Notch overlay: shows text
- Prompt service → Speech tracking: updates text
- Notch overlay → Speech tracking: reads progress
- Notch overlay → Voice activity: uses voice activity
- Presenter → Notes import: imports notes
- Prompt service → Notes import: extracts notes
- Prompt service → External display: shows prompt
- Prompt service → Browser server: publishes content
- Prompt service → Director server: publishes content
- Remote browser → Browser server: opens prompt
- Remote browser → Director server: edits script
- iOS app → App screens: shows app
- Presenter → App screens: chooses mode
- App screens → Prompt session: opens session
- Prompt session → Session controller: prepares session
- Session controller → Prompt processing: processes prompt
- Session controller → Speech follower: prepares speech
- Session controller → Capture controller: controls capture
- Speech follower → Session controller: provides progress
- Capture controller → Camera and mic: captures audio and video
- Capture controller → Photos library: saves recording
- Capture controller → Saved recordings: keeps pending copy
- App screens → Recordings gallery: shows recordings
- Recordings gallery → Saved recordings: reads recordings
