feat(Throw): add ceiling flight projection app - #293
Open
kyleve wants to merge 130 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.
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.Product behavior
Shipping hardening
Compiler-proved boundaries
These changes follow Where's main architecture patterns: create shared resources once, inject them, publish closed state, and keep persistence behind typed transactions.
Formal verification
The PR adds five Throw concerns to the repository's pinned TLC runner. Each concern includes historical broken controls and anti-vacuity reachability checks.
ProjectionActivationchecks scene demand, quiet and calibration gates, coordinator leases, context renewal, physical polling suspension, stale teardown, and convergence.PreferenceTransactionschecks source and observer commits, credential alignment, retry behavior, exact lease retirement, delayed callbacks, and observer/frame consistency.ProjectionContextTransitionchecks prepared context invalidation, the black-only frame exchange, exact semantic/projected pairing, and writer exclusion during fade-in.PollingPublicationchecks exact Core tokens, per-token revision order, recovery reads, stale frame rejection, query replacement, and final deactivation.BackgroundPreferencePersistencechecks producer admission, quiescent flush completion, cancellation-aware waiters, retry work, and controller-scene lifecycle generations.All current configurations are verified for their documented finite bounds and assumptions. Every broken control fails its named current invariant.
Compatibility and rollout
Throw/TODOs.mdretains the required physical projector, provider-contract, iOS 27 GM, and overnight acceptance work.Review focus
Testing
./test --everything --review— passed: 2,470 iOS unit tests and all 61 snapshot suites../test --no-generate ThrowCoreTests ThrowUITests— passed: 466 tests../test --no-generate ThrowTests— passed: 17 tests../test --no-generate ThrowUISnapshotTests --review— passed: 13 tests with byte-for-byte matching captures../test --architecture-only— passed: 30 rule tests and no violations../tla-check ProjectionActivation— passed all 31 cases; largest current bound explored 82,983 generated states../tla-check PreferenceTransactions— passed all 13 cases; largest current bound explored 181,368 generated states../tla-check ProjectionContextTransition— passed all 13 cases; largest current bound explored 102,734 generated states../tla-check PollingPublication— passed all 14 cases; largest current bound explored 79,350 generated states../tla-check BackgroundPreferencePersistence— passed all 7 cases; largest reachability bound explored 5,122,617 generated states../swiftformat --lint,./sf-symbols --lint,./xcstrings --lint,./shellcheck, and./attribution --check— passed.git diff --check— passed.