Labstream is a native Apple-platform media client for your own Plex, Jellyfin, or Emby server.
Labstream does not provide, host, sell, or bundle movies, TV, music, or other media. It connects only to servers you choose, and offline downloads are for media you are authorized to access and download under the applicable server/service terms.
The repository contains native targets for Apple Vision Pro, iPhone/iPad, Apple TV, and Mac. The
visionOS target owns the spatial shell and Cinema experience, LabstreamMobile is one universal
iPhone/iPad target, LabstreamTV is a streaming-only TV target, and LabstreamMac is the native
Mac target.
They share the SwiftUI app core, custom AVFoundation player, and
PMSKit backend layer while owning platform-specific shells, input, and system integration.
Distribution status: Labstream is publicly distributed as source for local builds. The neutral universal-purchase App Store Connect record now has processed 1.6.1 (build 1) builds for visionOS, iOS/iPadOS, tvOS, and macOS in invitation-only internal TestFlight. Product metadata and initial privacy-safe screenshots are staged, but there is no public App Store release. Platform versions remain pre-release until their individual hardware, review-access, storefront, and App Review gates pass. See the release and App Store status.
Development status: This is an active, pre-release project rather than a compatibility promise. Plex, Jellyfin, and Emby paths are implemented, but backend, server-version, media, and platform combinations do not all have equal live-device validation. Expect incomplete behavior and regressions while platform parity, hardware validation, performance measurement, and release acceptance remain ongoing work.
- Features
- Supported backends
- Platform status
- Tech stack
- Quick start
- Project structure
- Documentation
- Contributing
- Privacy and bug reports
- License
These are implemented product areas, not a claim that every item is complete on every platform and backend. See the platform and backend status tables below for the current support boundaries.
- Custom AVFoundation player surface shared across visionOS, iOS/iPadOS, tvOS, and macOS.
- Direct Play / Maximum attempts copy or direct-stream paths where viable.
- Explicit quality rungs request capped server streams when needed.
- Resume, seek, retry, subtitles, chapters, playback speed, buffering state, and Stats for Nerds.
- On visionOS, Cinema mode expands playback into an app-owned immersive surface with the same transport controls.
- Watch progress, mark-watched behavior, Up Next, and episode autoplay.
- Home, library, search, and detail surfaces for personal media.
- TV hierarchy navigation from show to season to episode.
- Music browsing and playback for supported backend music libraries.
- Backend-aware sign-in and server/session restore.
Downloads and offline playback are available on visionOS, iOS/iPadOS, and macOS. The tvOS target deliberately omits the complete download capability and Offline product surface.
- Offline downloads with metadata, poster/side-asset support, integrity checks, and route-specific recovery: static/original and server-prepared static files use checkpoints, while live remux/transcode streams reconcile safely but may need retry/restart after interruption.
- Direct original downloads only when Labstream expects the file to be locally playable.
- Server-prepared or server-rendered compatible files when the original is not a safe offline target.
- Canonical app builds store tokens and server credentials in Keychain. The Plex account token is the one synchronizable Keychain item; per-device client identity, Jellyfin/Emby tokens, and server selection remain device-local. Per-worktree Mac development builds use isolated, backup-excluded credential files instead.
- Diagnostic logging is off by default and local-only. When enabled, events are kept in a bounded in-memory ring and small rotating redacted files; reports leave the device only after a user action.
- Built-in bug-report diagnostics redact tokens, client identifiers, hostnames/IPs, full URLs, usernames, library paths, filenames, and media titles.
| Backend | Sign-in | Core support |
|---|---|---|
| Plex | Plex PIN/OAuth and server discovery | Implemented across browse, search, playback, progress, music, and downloads/offline; primary live-test backend. |
| Jellyfin | Server URL plus Jellyfin auth or Quick Connect | Browse, search, playback, progress, music, and downloads/offline paths are implemented; live coverage varies by server and media. |
| Emby | Emby Connect PIN or manual server login | Browse, search, playback, progress, music, and downloads/offline paths are implemented; live coverage varies by server and media. |
Labstream is unofficial and independent. It is not affiliated with, endorsed by, sponsored by, or officially supported by Plex, the Jellyfin project, or Emby Media.
| Platform | Target / scheme | Current status |
|---|---|---|
| Apple Vision Pro / visionOS 26 | Labstream |
Spatial release candidate with the app-owned immersive Cinema surface. Physical-headset and release acceptance remain open. |
| iPhone / iOS 26.1+ | LabstreamMobile |
Native compact-width release candidate. Local simulator and signed-device builds are supported; physical/TestFlight acceptance remains open. |
| iPad / iPadOS 26.1+ | LabstreamMobile |
The same universal release-candidate binary, using the regular-width sidebar layout. Physical/TestFlight acceptance remains open. |
| Apple TV / tvOS 26+ | LabstreamTV |
Native streaming-only release candidate with a ten-foot shell and custom Siri Remote player interactions. Downloads and Offline are absent; physical-device, accessibility, system-integration, and release acceptance remain open. |
| Mac / macOS 26 | LabstreamMac |
Native release candidate with shared sign-in, playback, media-key, and background-download code. App Store signing, sandbox behavior, and live Mac acceptance remain open release gates. |
- SwiftUI app shells targeting visionOS 26, iOS/iPadOS 26.1+, tvOS 26+, and macOS 26.
- Swift 6 with strict concurrency.
- Custom AVFoundation playback and offline playback paths.
PMSKit, a local Swift package for Plex/Jellyfin/Emby request builders, models, diagnostics primitives, policy state machines, and narrow reusable networking/storage infrastructure.- MkDocs Material documentation built from the checked-in
docs/source.
- macOS with Xcode 27 plus the SDK/runtime for each target being built: visionOS 26, iOS/iPadOS 26.1+, or tvOS 26+.
- A compatible simulator runtime for visionOS, iPhone/iPad, or Apple TV work, or paired physical hardware for the device acceptance being performed.
- Python 3.11+ and
uvfor documentation and repository tooling checks. - A Plex, Jellyfin, or Emby server you control or have permission to access.
LabstreamMac builds directly for an Apple-silicon Mac running macOS 26; it has no simulator lane.
docs/DEVELOPMENT.md is the canonical executable workflow:
- Before the first visionOS build or linked visionOS worktree, select or create and record the initial visionOS simulator. Mobile-only and tvOS-only work do not require this bootstrap.
- Build the primary
LabstreamvisionOS scheme, the universalLabstreamMobileiPhone/iPad scheme, or theLabstreamTVApple TV scheme. - Complete the exact-product install, observable launch/log/screenshot smoke, and simulator shutdown.
- Run the core validation commands and clean up any linked-worktree simulators.
- Apple Vision Pro: complete the first-use pairing, Developer Mode, Xcode account/signing, install, and launch procedure.
- iPhone/iPad: use the canonical signed hardware install procedure.
- Apple TV: simulator procedures are documented today; physical Apple TV deployment and acceptance remain open release gates in the tvOS target guide.
- Mac: use the host validation procedure.
All four production targets use org.labstream.Labstream. The Mac host helper defaults to a
per-worktree development bundle identifier so local builds do not collide; see the
macOS target guide.
Labstream/
├── Labstream/ # app-owned source, split by capability and platform ownership
│ ├── Shared/ # universal app core, backend facades, player, music, and shared UI
│ ├── Capabilities/
│ │ └── Downloads/ # visionOS, mobile, and Mac offline engine/UI; absent from tvOS
│ └── Platforms/
│ ├── visionOS/ # vision app entry point, Cinema, scoped system media, SharePlay
│ ├── Mobile/ # universal iPhone/iPad entry point and mobile player integration
│ ├── macOS/ # single-window Mac entry point and desktop player integration
│ └── tvOS/ # streaming-only TV entry point and Debug fixture ownership
├── PMSKit/ # reusable requests, models, policies, infrastructure, and tests
├── docs/ # current docs plus plans, research, evidence, and archive lanes
├── scripts/ # local validation, simulator, deploy, and probe helpers
└── .woodpecker/ # portable CI definitions
- Documentation source and local site build:
docs/ - Release and App Store status:
docs/RELEASES.md - Development setup:
docs/DEVELOPMENT.md - iOS/iPadOS target:
docs/MOBILE-IOS.md - tvOS target:
docs/TVOS.md - macOS target:
docs/MACOS.md - Architecture overview:
docs/ARCHITECTURE.md - Backend model:
docs/BACKENDS.md - Playback:
docs/PLAYBACK-ARCHITECTURE.md - Downloads/offline:
docs/DOWNLOADS-OFFLINE.md - Diagnostics/privacy:
docs/DIAGNOSTICS-PRIVACY.md - Compile performance:
docs/COMPILE-PERFORMANCE.md - Manual validation checklist:
TESTING-CHECKLIST.md
Public pages at the top of docs/ describe the current app. Internal documents use explicit unpublished lanes: active implementation plans and acceptance journals in docs/plans/, unresolved investigations in docs/research/, immutable audit/profiling observations in docs/evidence/, and completed or superseded context in docs/archive/. The repository-root TESTING-CHECKLIST.md is the deliberate operational exception and remains the current manual validation matrix.
Start with docs/CONTRIBUTING.md. In short:
- keep backend-specific wire behavior explicit;
- put reusable request, model, and policy decisions in
PMSKit, keeping its few effectful networking/storage utilities narrow and injectable; - keep SwiftUI,
AVPlayerownership, target lifecycle, background-session delegation, Keychain, and app persistence in the app target; - never commit tokens, server URLs, private IPs, media titles, local signing files, or diagnostic artifacts.
For a quick module size readout, run:
scripts/loc.shLabstream does not send analytics, diagnostics, or media-server data to the developer. If something breaks, the app can generate a local redacted diagnostic report that you review before posting to GitHub.
- Bug guide:
docs/REPORTING-BUGS.md - Bug form: https://github.com/jlipworth/Labstream/issues/new?template=bug_report.yml
- Privacy policy:
PRIVACY.md - Security reports:
SECURITY.md— vulnerabilities must use the private route - Community conduct:
CODE_OF_CONDUCT.md
Labstream is licensed under the GNU General Public License v3.0. See LICENSE for the full text.
Third-party package licenses and required notices are bundled under Labstream/Shared/Resources/ThirdPartyNotices.
The project also carries a GPLv3 section 7 additional permission for linking and distributing the
visionOS, iOS/iPadOS, tvOS, and macOS applications through Apple App Store and TestFlight paths.
See APP-STORE-EXCEPTION.md for its exact scope.
Copyright (C) 2026 Jonathan Lipworth