github Marvbuster/sphaira-connect v1.2.0
Sphaira Connect 1.2.0

one month ago

Sphaira Connect macOS v1.2 Build 1

Date: 2026-07-26 | Status: Done | Minimum macOS: 26.5
MARKETING_VERSION: 1.2 | CURRENT_PROJECT_VERSION: 1
Commit: 3063c66large remaining-time countdown, extracted view files

Summary

Adds a large, prominent remaining-time countdown while either mode is actively running — a
transfer in Sphaira Install, or an injection in RCM Payload. RCM injection did not previously
track throughput at all; it now feeds the same Core/ProgressTracker the installer uses.
RootView.swift was split further to stay under the 400-line contract limit as part of this work.

Caught in local testing before this ever shipped: the first pass placed the badge as a floating
overlay (it covered the mode switcher instead of the window growing to fit it), and animated its
raw, per-tick value directly — since a fresh sample arrives roughly every 100 ms but each animation
takes 300 ms, the badge never finished one transition before the next one interrupted it, looking
restless for the entire transfer rather than just at the start. Both are fixed below.

Features & Changes

Type Description
FEATURE Large remaining-time countdown, part of the normal content layout above the mode switcher (the window grows to fit it, exactly like the queue or the progress panel) whenever a transfer or injection is actively running — .monospacedDigit() plus .contentTransition(.numericText(countsDown: true)) for the native counting-down digit animation (Features/Views/CountdownBadgeView.swift, Features/Views/RootView.swift) — see [[ui/window-and-views]]
FEATURE The displayed countdown value refreshes at most once a second (RootView.refreshCountdown(with:)), decoupled from the underlying ~100 ms sample rate, so each animation has time to settle instead of being interrupted by the next one — a real "clock ticking down" instead of a scrubbing number. The raw per-tick estimate is additionally withheld (shown as an en dash) until ProgressTracker.tickCount reaches 3, so the exponential smoothing has a moment to settle before anything is displayed at all (Core/ProgressTracker.swift, Features/Views/RootView.swift) — see [[protocol/progress-tracking]]
FEATURE RCM injection now computes throughput: RCMInjectorModel.inject() feeds RCMTransport's cumulative (sent, total) callback into a Core/ProgressTracker, the same tracker and smoothing the installer already used (Features/RCMInjectorModel.swift) — see [[protocol/progress-tracking]]
CHANGE RootView's mode switcher (segmented Sphaira Install / RCM Payload picker with its matched-geometry highlight) extracted into ModeSwitcherView to keep RootView.swift under the 400-line limit from CONTRACT.md (Features/Views/ModeSwitcherView.swift)

Tests

63 tests passing (was 62) — adds tickCountCountsEmissions to ProgressTrackerTests. The rest of
this feature sits in the SwiftUI/Features layer, outside the SphairaCoreTests boundary (see
[[operations/testing-strategy]]); verified via a clean Debug and Release build. Not yet
re-confirmed against real hardware.

Installation

Open the DMG and drag the app into your Applications folder
(or unpack the ZIP). On first launch, right-click → Open:
the app is ad-hoc signed and not notarised, so Gatekeeper would
otherwise refuse to start it.

File SHA-256
Sphaira-Connect-1.2.0-arm64.dmg e2d007eb309ba78c652616172c5a38bbe91ce1f2a2b602c8a6ba9438fa0ed6ff
Sphaira-Connect-1.2.0-arm64.zip 85927a80a206c8f23f575adbfba73f0c095e4c65bfad868a4182e0b47e3694a1

Don't miss a new sphaira-connect release

NewReleases is sending notifications on new releases.