Ping map design
Files and images attached to this public thread are only available to signed-in users.
Sign inI recommend A: a fixed map with a compact host dock. It keeps the route prominent while making each host’s current ping and history easy to compare. Two medium-mode agents contributed UI planning and iOS feasibility research.

- A — Fixed dock: map occupies roughly two-thirds of the screen; host rows below; Start/Stop stays visible. Best fit for your brief.
- B — Resizable sheet: expand the host list when needed. Better for many hosts, but expansion covers the map.
- C — Comparison strip: larger sparklines in horizontally scrolling cards. More room per host, but some hosts are offscreen.
For all three, I propose:
- “Worst host” coloring by default, with a tap on a host showing its individual track.
- Green below 100 ms, amber 100–500 ms, red above 500 ms, and charcoal dashed for a 1000 ms timeout.
- Tap a route point to inspect every host’s result there.
- Stop preserves the trace; host editing happens inline while stopped.
Background recording is best effort. iOS supports background location updates, but uninterrupted one-second ICMP sampling cannot be guaranteed. Missing measurements will appear as gaps—not false timeouts.
These are illustrative concepts, not a working app. I saved the proposal in DESIGN.md; the combined planning notes include sources and development stages.
Which direction should we develop: A, B, or C?
The bundle ID is nz.co.fastchicken.signalMapper, in both Debug and Release.
Option A is implemented locally: map-first layout, colored route, real ICMP probes, GPS association, per-target sparklines, Start/Stop and saved recordings.
For ferry coverage, a responding target keeps the route from falsely showing a total outage:
+var bestLatency: Double? {+ readings.compactMap { $0.outcome.latency }.min()Use the fastest successful reply; the reply count still exposes partial host failures.+}Verified: all 10 simulator tests pass, including real IPv4/IPv6 loopback ICMP and recording restoration. The unsigned iPhone Release build passes. Lint has no errors and eight style/complexity warnings.
These are inspected screenshots of the running app with synthetic ferry-route data:




Still outstanding: signing and a physical-iPhone trial, especially locked-phone sampling, cellular handoffs and battery use. Background 1 Hz sampling remains best effort. Nothing is committed, pushed or installed on your phone.
Added a navy, colored-route icon to the app bundle for both Debug and Release. The bundle ID remains nz.co.fastchicken.signalMapper.
Simulator and unsigned iPhone builds pass, and I checked the installed home-screen icon:
![]()
Changes are local and uncommitted.
Updated the defaults, in order:
quic.nz100.80.110.128google.com
Saved custom targets remain unchanged. Tailscale must be connected on the iPhone for the home target. Also, google.com isn’t pinned to Australia; its endpoint may vary.
Verified all three rows on a fresh install. All 10 tests pass with an iOS 27 deployment-target override; the existing app/test target mismatch still needs fixing. Changes are local and uncommitted.

Added ITSAppUsesNonExemptEncryption = false to the app’s Info.plist. This declares no non-exempt encryption, which allows normal Apple-provided encryption.
Verified the Release build succeeds and its bundle contains the flag. Your next archive/upload should stop prompting for the encryption questionnaire; already-uploaded builds won’t change.
Changes are local and uncommitted.
Added all three locally:
- Save/load snapshots: the … menu now has Save snapshot and Saved recordings. Starting again—or loading another trip—offers Save, Continue without saving, or Cancel. Loaded snapshots are read-only; Start always begins a fresh trip.
- Keep awake: the screen stays on while SignalMapper is foregrounded, including when reviewing recordings. Leaving the app restores normal auto-lock; manual locking still works.
- Export full map: share a PNG covering the entire recorded area, independent of the current zoom. It adapts to wide/tall routes and includes colors, gaps, dates and a legend. Export also works while recording.
+var snapshot = recording+snapshot.id = UUID()+snapshot.name = nameEach snapshot gets independent files, so later trips cannot modify it.Verified: 15 tests passed, unsigned Release iPhone build succeeded, and rendered UI/PNG output was inspected. SwiftLint has no errors, with 11 warnings. Tests used an iOS 27 override for the existing deployment-target mismatch. Physical-phone auto-lock/battery checks remain outstanding.
Changes are local and uncommitted, not uploaded to TestFlight. Combined implementation and verification notes.
Screenshots show simulator flows; ferry exports use illustrative data.







