A native iOS/iPadOS teleprompter and camera studio for creators — write or paste a script, read it as smoothly scrolling rich text (color, bold/italic, LaTeX math) overlaid on a live camera preview, and either record the take in-app or run prompt-only while filming with another camera.
Built entirely in Swift/SwiftUI as a SwiftPM package compiled with xtool
— without Xcode, without a Mac, and without a local Swift toolchain. See BUILD_NOTES.md
for the full story of how that worked and the tradeoffs it forced.
- Rich-text teleprompter rendered in a
WKWebViewfor pixel-identical, GPU-smooth scrolling — supports bold/italic/underline/color/highlight and LaTeX math via bundled, offline KaTeX (no CDN, no network dependency). - Two run modes: Record (the app is the camera and records the take) or Prompt-only (just the reader, for filming with a separate camera/app).
- Real Cinematic capture on supported hardware (iPhone 13+, iOS 26+) via
AVCaptureDeviceInput's Cinematic Video API, reached safely at runtime via selector/KVC probing so the project still builds on SDKs that don't expose those symbols yet. - Synthetic cinematic fallback everywhere else: live Vision person segmentation + Core Image
background blur, composited frame-by-frame and recorded with
AVAssetWriter. - Director/Companion sync — mirror the prompter and a live camera preview to a second iPhone/iPad over the same Wi-Fi with MultipeerConnectivity: no internet, no login, no pairing code.
- LAN script editor — edit scripts from a laptop browser on the same network via a hand-rolled HTTP
server built directly on Apple's
Networkframework (zero external dependencies), with an in-app QR code for the URL. - Local persistence with SwiftData; scripts organized into folders with search.
- Universal, adaptive layout for iPhone and iPad, portrait and landscape, Stage Manager–aware.
- iOS / iPadOS 17.0+
- Xcode/macOS not required to build — this is a pure SwiftPM project built with
xtool. (A Mac with Xcode also works fine if you have one; it's just not required.)
- Prebuilt: grab the unsigned
.ipafrom the Releases page, or the latestTeleprompterStudio-ipaartifact from theBuild IPAGitHub Actions workflow, and sideload it (e.g. withxtool dev build --signor Sideloadly). - Build it yourself: see below.
xtool dev build # build
xtool dev build --ipa # produce an unsigned .ipa
xtool dev build --sign # sign and install to a connected device (needs `xtool auth` login)
xtool dev # build + install + run in one stepBefore shipping to your own device, replace bundleID in xtool.yml and
AppIcon.png with your own — see BUILD_NOTES.md for the full
first-build checklist and every non-obvious decision behind the project layout.
Sources/TeleprompterStudio/
├── App/ entry point, root navigation
├── ScriptLibrary/ home: list/CRUD/paste, folders, search
├── Editor/ rich-text + LaTeX authoring
├── TeleprompterEngine/ WKWebView renderer + scroll controller
├── CameraKit/ AVFoundation session, real + synthetic cinematic
├── Recorder/ AVAssetWriter / movie output, prompt-only bypass
├── SyncKit/ MultipeerConnectivity Director/Companion sync
├── LANServer/ Network.framework HTTP server + web editor
├── DesignSystem/ shared design tokens
├── Models/ SwiftData models
└── SharedWebResources/ vendored marked.js / KaTeX, shared across in-app and LAN web views