-
Notifications
You must be signed in to change notification settings - Fork 0
Getting Started
This page is for contributors setting up A Playa Named Gus locally.
- macOS with a modern Xcode install (Xcode 26.5 baseline) that supports the iOS, tvOS, visionOS, macOS, and watchOS SDKs.
- Xcode command line tools selected with
xcode-select. - XcodeGen installed locally.
- A Jellyfin server for manual smoke testing (or the bundled demo server — see below).
Deployment targets: iOS 18.0, tvOS 18.0, visionOS 2.0, macOS 15.0, watchOS 11.0.
Install XcodeGen once:
brew install xcodegengit clone https://github.com/eslutz/A-Playa-Named-Gus.git
cd 'A Playa Named Gus'
xcodegen generateA Playa Named Gus.xcodeproj is generated output and is intentionally not committed. The source of truth is project.yml.
Run xcodegen generate after adding, removing, or renaming source/resource files. XcodeGen globs the file tree when the project is generated, so new files are invisible to xcodebuild until regeneration.
xcodebuild -resolvePackageDependencies -project 'A Playa Named Gus.xcodeproj' -scheme 'A Playa Named Gus'Runtime dependencies are jellyfin-sdk-swift and — on iOS/iPadOS only — the Readium toolkit for in-app EPUB reading (ADR 0009). XcodeGen is a build-time dev tool, not a shipped dependency.
First list the destinations installed on the current machine:
xcodebuild -showdestinations -project 'A Playa Named Gus.xcodeproj' -scheme 'A Playa Named Gus'Example build commands (names match a stock Xcode 26.5 install — verify with -showdestinations, as simulator names drift between Xcode versions):
xcodebuild -project 'A Playa Named Gus.xcodeproj' -scheme 'A Playa Named Gus' -destination 'platform=iOS Simulator,name=iPhone 17' build
xcodebuild -project 'A Playa Named Gus.xcodeproj' -scheme 'A Playa Named Gus' -destination 'platform=iOS Simulator,name=iPad Pro 11-inch (M5)' build
xcodebuild -project 'A Playa Named Gus.xcodeproj' -scheme 'A Playa Named Gus' -destination 'platform=tvOS Simulator,name=Apple TV 4K (3rd generation)' build
xcodebuild -project 'A Playa Named Gus.xcodeproj' -scheme 'A Playa Named Gus' -destination 'platform=macOS' buildFor visionOS, target by simulator ID because more than one "Apple Vision Pro" simulator can exist:
xcodebuild -project 'A Playa Named Gus.xcodeproj' -scheme 'A Playa Named Gus' -destination 'platform=visionOS Simulator,id=<UUID>' buildBuild the watchOS companion with its own scheme:
xcodebuild -project 'A Playa Named Gus.xcodeproj' -scheme 'Gus watchOS' -destination 'generic/platform=watchOS Simulator' buildThe A Playa Named Gus scheme is build-only. Use the per-platform test schemes for the test action. The Gus <platform> Unit Tests schemes run the Swift Testing bundles only (these are the CI lanes); the Gus <platform> Tests schemes also run the narrow launch UI tests.
xcodebuild test -project 'A Playa Named Gus.xcodeproj' -scheme 'Gus iOS Unit Tests' -destination 'platform=iOS Simulator,name=iPhone 17'
xcodebuild test -project 'A Playa Named Gus.xcodeproj' -scheme 'Gus tvOS Unit Tests' -destination 'platform=tvOS Simulator,name=Apple TV 4K (3rd generation)'
xcodebuild test -project 'A Playa Named Gus.xcodeproj' -scheme 'Gus macOS Unit Tests' -destination 'platform=macOS'
xcodebuild test -project 'A Playa Named Gus.xcodeproj' -scheme 'Gus visionOS Unit Tests' -destination 'platform=visionOS Simulator,id=<UUID>'Run a single Swift Testing test with:
xcodebuild test -project 'A Playa Named Gus.xcodeproj' -scheme 'Gus iOS Unit Tests' -destination 'platform=iOS Simulator,name=iPhone 17' -only-testing:GusTests/<Suite>/<test>If Swift Testing selector matching is uncertain, run the whole GusTests target:
xcodebuild test -project 'A Playa Named Gus.xcodeproj' -scheme 'Gus iOS Unit Tests' -destination 'platform=iOS Simulator,name=iPhone 17' -only-testing:GusTestsScripts/format.sh
swiftformat Sources Tests --lint
jq empty Resources/Localizable.xcstringsScripts/demo-server.sh runs a local Jellyfin container over the rights-cleared sample_media/ folder (git-ignored). Debug builds sign straight in via the --gus-demo-server launch argument or the Connect screen's demo button. See Documentation/AppStore/demo-server.md.
Use a real or demo Jellyfin server and verify:
- Connect to a server.
- Sign in or use Quick Connect.
- Browse Home, Search, Library, Item Detail, Settings, and Downloads.
- Start video playback; play a song or audiobook through the audio player.
- Verify track selection, chapters, next-up prompt, Now Playing, AirPlay, and PiP where the platform supports them.
- Verify direct play of a compatible file (HEVC/HDR/surround preserved) and instant audio/subtitle switching on it; verify a text-subtitle selection on an incompatible file triggers a transcode with subtitles in the manifest.
- Let an episode reach its natural end: it should auto-play the next episode (Settings → Playback toggle) or close the player.
- Change Settings → Playback → Streaming Quality and confirm a lower cap forces a transcode.
- On macOS, confirm video opens in its own resizable player window (green-button fullscreen works).
- On non-tvOS platforms, start, pause, resume, delete, and play from an offline download.
- On visionOS, enter Gus Cinema and test spatial/stereo fallback behavior where device support exists.
When locating a built .app, scope find to the correct product directory such as Debug-iphonesimulator or Debug-appletvsimulator. A broad find build can return another platform's product and cause simulator install failures.
A Playa Named Gus - an Apple-first, multiplatform Jellyfin client for iOS, iPadOS, tvOS, visionOS, and macOS with a watchOS companion - SwiftUI - © 2026 Eric Slutz - PolyForm Noncommercial 1.0.0. The repository, AGENTS.md, and Documentation/ROADMAP.md remain the canonical source of truth.
Project
Operations