feat(Throw): add ceiling flight projection app - #293
Open
kyleve wants to merge 91 commits into
Open
Conversation
Add the iOS 26 Throw app, typed projection and layer foundations, explicit ADS-B providers including user-owned RapidAPI credentials, shared external-display runtime, controller experience, and deterministic test coverage.
kyleve
commented
Aug 25, 2026
| guard externalDisplayRegistration == nil else { return } | ||
|
|
||
| let configuration = Self.externalDisplayConfiguration() | ||
| let accessory = UISceneAccessory.externalNonInteractive( |
Owner
Author
There was a problem hiding this comment.
Posted by an AI agent on kve’s behalf.
Review focus: this registration path compiles against the installed iOS 27 beta SDK, but the final UISceneAccessory lifecycle contract still needs GM-SDK and physical connect/disconnect plus controller-window recreation validation. That release gate is recorded in Throw/TODOs.md.
Treat the always-available on-device output as ready when selected, while retaining preview-opened state as informational feedback. Show the full-screen Exit control on entry, keep it available to VoiceOver, and cover both behaviors with unit and image snapshots.
Add a macOS command that builds, signs, installs, and launches Throw on an exact paired iPhone or iPad. Preserve the Where installer safety contract with shared fake-device coverage, dependency-free help, a non-mutating dry run, and documented signing setup.
Keep the on-device projection escape control in the tree instead of auto-hiding it behind an undiscoverable tap target. Use a large persistent button and the standard accessibility escape action.
Avoid the iOS 27 Label-inside-LabeledContent layout bug that greedily expands a wrapped status value. Mirror the established device-status workaround with an explicit HStack and a decorative accessibility-hidden symbol.
Commit Xcode’s extracted CFBundleName entry alongside the manually authored Throw Info.plist strings so catalog extraction remains stable.
Replace the coarse v1 map with a deterministic v2 archive generated from pinned Natural Earth 1:10m and 2025 Census boundary and primary-road sources. Add typed wide, standard, and local detail tiers; source provenance; bounded path densification; cancel-safe shared loading; and category-specific dim rendering behind aircraft. Update documentation, generator coverage, Core/UI tests, and reviewed snapshots.
Replace the tiny aircraft and hairline arc with a larger aircraft and bold projection ribbon. Keep the opaque black field, warm-white mark, and safe margins for small Home Screen sizes.
Render projection labels in a smaller monospaced style at reduced luminance so aircraft marks remain the primary visual signal. Update projection snapshots and guard the styling relationship with a focused unit test.
Add FR24 position and inline route decoding, device-only credential settings, cadence controls, onboarding, dashboard status, and provider-specific failure handling. Normalize route availability across providers so unresolved aircraft dim consistently, and filter FR24 ground positions through the shared ground-aircraft policy. Refine projection label prominence and document flight-activity cues in Projection Appearance.
Ship Throw with a valid privacy manifest declaring CA92.1 for its app-only preferences. Verify the exact declaration in the built Throw.app so resource wiring regressions fail the app test bundle.
Bind each SwiftUI controller root to its UIWindowScene and deliver typed foreground, background, and disconnect events to the process runtime. The runtime owns the foreground controller-scene identity set and exposes only its aggregate presence to ThrowSession, keeping external-display demand separate. Guard against restoring application-level lifecycle callbacks and cover two-scene interleavings deterministically.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
adsb.lol, localreadsb, ADS-B Exchange Personal through RapidAPI, and Flightradar24../Throw/install.Why
Throw needs one reliable path from aircraft data to a restrained projector surface. Every controller and output scene must share one runtime.
The projection also needs geographic context without online map tiles. Bundled data keeps Map rendering private, deterministic, and available offline.
Product behavior
Projection and output
ProjectionSurface.Aircraft and geography
Projection Views
Privacy and credentials
Architecture
ThrowRuntimeand one sharedThrowSessionfor every controller and output scene.AirAndSpaceRuntimeowns one aircraft poller, semantic Flights frames, route enrichment, and consecutive-sample motion state.ProjectionExperienceCoordinatorowns selection, prewarming, rotation, readiness deadlines, and per-experience health.Design decisions
AnyViewboundary.Compatibility
Review focus
Rollout and follow-ups
Throw/TODOs.mdtracks remaining projector, Apple TV, provider, dense-traffic, quiet-hours, and overnight acceptance work.Testing
./ide --no-open— passed../test ThrowUITests— 101 tests passed../test ThrowCoreTests— 235 tests passed../test --everything --review— 2,328 iOS unit tests and all 58 shared snapshot suites passed../test SnapshotKitTestingTests --only 'SnapshotKitTestingTests/SnapshotReferenceDiffTests'— 11 tests passed../swiftformat --lint,./sf-symbols --lint,./xcstrings --lint,./shellcheck, and./attribution --check— passed.git diff --check— passed.