name: TVAnarchy options: bundleIdPrefix: local.lilith createIntermediateGroups: true deploymentTarget: macOS: "14.0" iOS: "17.0" packages: VLCKit: url: https://github.com/tylerjonesio/vlckit-spm exactVersion: 3.6.0 # Reuse the shared Lilith dark-first design system (dependency-free tokens). # Absolute path: stable from both this worktree and main on this machine. LilithDesignTokens: path: /Users/natalie/Code/@packages/@swift/@ui/tokens configs: Debug: debug Release: release configFiles: Debug: Config/BuildVersion.xcconfig Release: Config/BuildVersion.xcconfig settings: base: SWIFT_VERSION: "5.0" # Swift 6.2 compiler, language mode 5 (relaxed concurrency) MACOSX_DEPLOYMENT_TARGET: "14.0" # Compile-time opt-in for the built-in adult feature. Present here → the # Adult tab, the native PornService, and the adult browse/gating surfaces are # compiled in. Drop this flag (or build a target without it) for a clean # build with no adult surfaces at all — the defensive bits that keep porn OUT # of the Home/queue (`isAdult`, QueueStore stripping, the default category # exclude) stay unconditional, so a flag-off build never leaks adult content; # it simply offers no way to browse it. Applies to all targets. SWIFT_ACTIVE_COMPILATION_CONDITIONS: ENABLE_ADULT # MARKETING_VERSION + CURRENT_PROJECT_VERSION come from Config/BuildVersion.xcconfig # (generated by tools/stamp-build.sh before each build). Semver auto-bumps patch from # the latest vX.Y.Z git tag + commits since; cut releases with tools/release.sh [vX.Y.Z]. CODE_SIGNING_ALLOWED: "NO" # local dev, unsigned CODE_SIGNING_REQUIRED: "NO" ENABLE_HARDENED_RUNTIME: "NO" # needs Process/ssh + localhost+overlay network, no sandbox targets: TVAnarchyCore: type: framework platform: macOS sources: [Sources/TVAnarchyCore] dependencies: - sdk: MediaPlayer.framework # system transport + Now Playing (NowPlayingController) - sdk: Security.framework # Keychain for VPN provider logins (VPNCredentialStore) - sdk: CoreAudio.framework # HDMI audio routing for local VLC playback settings: base: PRODUCT_BUNDLE_IDENTIFIER: local.lilith.TVAnarchyCore GENERATE_INFOPLIST_FILE: "YES" TVAnarchy: type: application platform: macOS sources: - path: Sources/TVAnarchy excludes: - Resources/** - path: Sources/TVAnarchy/Resources/base-2.91.wsz buildPhase: resources dependencies: - target: TVAnarchyCore info: path: Sources/TVAnarchy/Info.plist properties: CFBundleDisplayName: TVAnarchy # XcodeGen regenerates this Info.plist from these properties on every # `xcodegen generate`, so the version MUST live here (a hand-edit to the # plist gets clobbered). Version vars come from Config/BuildVersion.xcconfig. CFBundleShortVersionString: "$(MARKETING_VERSION)" CFBundleVersion: "$(CURRENT_PROJECT_VERSION)" LSMinimumSystemVersion: "14.0" LSApplicationCategoryType: public.app-category.video NSAppTransportSecurity: NSAllowsLocalNetworking: true # talk to VLC on 127.0.0.1 over http NSCameraUsageDescription: Scan a fleet-join QR code with this Mac's camera. settings: base: PRODUCT_BUNDLE_IDENTIFIER: local.lilith.TVAnarchy GENERATE_INFOPLIST_FILE: "NO" ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon # Sources/TVAnarchy/Assets.xcassets # The human version (CFBundleShortVersionString) comes from MARKETING_VERSION # via info.properties above — reliable. The dynamic git SHA / build time live # in a generated Swift constant (Sources/TVAnarchyCore/BuildStamp.swift, # gitignored) written by tools/stamp-build.sh, which build-install.sh runs # BEFORE `xcodegen generate`. A compiled constant can't be lost the way a # post-build Info.plist edit was (TARGET_BUILD_DIR there pointed at an # intermediate, so the stamp never reached the copied app plist). TVAnarchyiOS: type: application platform: iOS sources: [Sources/TVAnarchyiOS] dependencies: - package: VLCKit product: VLCKitSPM # SPM product; the iOS slice's module is `MobileVLCKit` - package: LilithDesignTokens product: LilithDesignTokens info: path: Sources/TVAnarchyiOS/Info.plist properties: CFBundleDisplayName: TVAnarchy CFBundleShortVersionString: "$(MARKETING_VERSION)" CFBundleVersion: "$(CURRENT_PROJECT_VERSION)" UILaunchScreen: {} UISupportedInterfaceOrientations: - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight # The bridge is plain HTTP over localhost (plum) / the WireGuard mesh # (black) — never the open internet — so arbitrary loads are allowed. NSAppTransportSecurity: NSAllowsArbitraryLoads: true NSLocalNetworkUsageDescription: Connect to your media bridge on the local network. NSCameraUsageDescription: Scan the fleet setup QR shown by your Mac. settings: base: PRODUCT_BUNDLE_IDENTIFIER: local.lilith.TVAnarchyiOS GENERATE_INFOPLIST_FILE: "NO" ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon TARGETED_DEVICE_FAMILY: "1,2" IPHONEOS_DEPLOYMENT_TARGET: "17.0" # Unlike the macOS targets (unsigned local dev), the iOS app installs on # a physical iPhone, which requires a real signing identity. CODE_SIGNING_ALLOWED: "YES" CODE_SIGNING_REQUIRED: "YES" CODE_SIGN_STYLE: Automatic CODE_SIGN_IDENTITY: "Apple Development" DEVELOPMENT_TEAM: 8SX7UH9HF4 TVAnarchyiOSUITests: type: bundle.ui-testing platform: iOS sources: [Tests/TVAnarchyiOSUITests] dependencies: - target: TVAnarchyiOS settings: base: PRODUCT_BUNDLE_IDENTIFIER: local.lilith.TVAnarchyiOSUITests GENERATE_INFOPLIST_FILE: "YES" TEST_TARGET_NAME: TVAnarchyiOS IPHONEOS_DEPLOYMENT_TARGET: "17.0" CODE_SIGNING_ALLOWED: "NO" CODE_SIGNING_REQUIRED: "NO" TVAnarchyCoreTests: type: bundle.unit-test platform: macOS sources: [Tests/TVAnarchyCoreTests] dependencies: - target: TVAnarchyCore settings: base: PRODUCT_BUNDLE_IDENTIFIER: local.lilith.TVAnarchyCoreTests GENERATE_INFOPLIST_FILE: "YES" schemes: TVAnarchy: build: targets: TVAnarchy: all test: targets: - TVAnarchyCoreTests gatherCoverageData: false TVAnarchyiOS: build: targets: TVAnarchyiOS: all test: targets: - TVAnarchyiOSUITests gatherCoverageData: false