Native Apple clients for the Silo self-hosted media server.
This repo builds iOS, tvOS, and the early macOS target. It preserves the existing Apple bundle IDs, keychain groups, and signing IDs for TestFlight and install continuity, but user-facing names, docs, and server references now use Silo.
Try the latest beta builds of the iOS and tvOS apps:
iosApp/iosApp/- shared SwiftUI app code for iOS, tvOS, and macOSiosApp/TopShelf/- tvOS Top Shelf extensioniosApp/Tests/- XCTest targetsiosApp/Resources/- shared Apple resourcesiosApp/Signing/- checked-in signing defaults plus local override sampleiosApp/project.yml- XcodeGen project source of truthfastlane/- iOS/tvOS release automationdocs/tvos-player/- Apple TV playback notes
- Xcode 16+
xcodegen- Ruby 3.2 with Bundler for release automation
- A running Silo server for local auth, browsing, and playback validation
Generate the Xcode project from the checked-in XcodeGen spec:
cd iosApp
xcodegen generate
open Silo.xcodeprojBuild without local signing:
cd iosApp
xcodebuild build \
-project Silo.xcodeproj \
-scheme Silo \
-destination 'platform=iOS Simulator,name=iPhone 17 Pro' \
CODE_SIGN_IDENTITY='' CODE_SIGNING_ALLOWED=NO
xcodebuild build \
-project Silo.xcodeproj \
-scheme SiloTV \
-destination 'platform=tvOS Simulator,name=Apple TV 4K (3rd generation)' \
CODE_SIGN_IDENTITY='' CODE_SIGNING_ALLOWED=NO
xcodebuild build \
-project Silo.xcodeproj \
-scheme SiloMac \
-destination 'platform=macOS' \
CODE_SIGN_IDENTITY='' CODE_SIGNING_ALLOWED=NOThe checked-in .vscode configuration provides recommended extensions,
unsigned build and test tasks, and SweetPad integration for building, running,
debugging, simulator management, and Swift code intelligence without using the
Xcode UI.
-
Install Xcode and select its command-line toolchain:
sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer sudo xcodebuild -runFirstLaunch
-
Install XcodeGen:
brew install xcodegen
-
Open the repository root in VS Code and accept its extension recommendations.
-
Run
Tasks: Run Task→Silo: Generate Xcode project. -
In the SweetPad sidebar, select a scheme and an installed destination.
-
Run
SweetPad: Set up Swift code intelligence (BSP)once from the command palette, then open a Swift file. The generatedbuildServer.jsonis machine-specific and intentionally ignored.
Use Cmd+Shift+B for the default unsigned iOS build. Use the Testing sidebar
or Tasks: Run Test Task for XCTest. The test task prompts for a simulator
destination so each developer can use an installed device without committing
machine-specific configuration.
SweetPad uses Xcode's compiler, SDKs, signing tools, and simulators under the hood, so the full Xcode application remains required even when its UI is not part of the daily workflow.
Local signing overrides are intentionally ignored.
- Copy
iosApp/Signing/Local.xcconfig.sampletoiosApp/Signing/Local.xcconfig. - Override bundle identifiers, entitlements, or development team values as needed.
- Run
xcodegen generatefromiosApp/.
Personal Apple Developer teams cannot join the production App Group, so Top Shelf rows stay empty under that setup.
Fastlane lanes are defined in fastlane/Fastfile. All Apple IDs, team IDs, signing repo URLs, and App Store Connect credentials must come from CI environment variables.
Silo Apple is licensed under AGPL-3.0-or-later with an additional
permission under AGPL section 7 allowing distribution through the Apple App
Store and TestFlight despite those platforms' signing, DRM, and
redistribution terms. See LICENSE and
APPSTORE-EXCEPTION.md.
The Silo name, logo, and wordmark are trademarks of Silo Media L.L.C. and are not covered by the AGPL. You're free to fork and redistribute the code, but forks and redistributions must not use the Silo brand as their identity and must remove or replace the brand assets. Publishing a Silo-branded app to an app store requires written permission. See TRADEMARK.md for what's permitted — including referential use like "compatible with Silo."
FFmpeg, Nuke, fastlane, and other third-party dependencies retain their own licenses. See THIRD_PARTY_NOTICES.md.



