Ping map design

High
Unlisted
can you plan our an iOS app for me. Use medium sized subagents to do the work. The current folder is empty, please use it. The app should be a single screen. The idea is that I can add 2 or more IP addresses or domain names, and the app will ping them (ICMP) every second, and report on the ping time. I want it to record the GPS location of the phone at the time. On a map, show a track of where the phone was (GPS location) and the ping. under 100ms is good, over 500 is bad. No response in 1000ms == dead. Color appropriately. Start stop button to turn it on/off. Run in the background as much as possible The map is the primary info, showing the current location and the trace as I move. the current ping - and a sparkline of previous results - for each IP etc under that. Start by proposing some UI ideas, then we can move to developing them
Ran 1 tool⁠
Message from thread
Ran 1 tool⁠
Message from thread

I 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.

Three UI concepts: fixed dock, resizable sheet, and comparison strip

  • 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?

yeah that looks awesome. Option A please if it helps, the focus is less on which host is a problem. I’m trying to map my network connectivity during a ferry ride...
Edited 5 files⁠
can you use `nz.co.fastchicken.signalMapper` as the bundle ID please

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:

ConnectivityModels.swift SignalMapper
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:

Recording — illustrative route
Recording — illustrative route
Stopped — route retained
Stopped — route retained
No replies — explicit timeout state
No replies — explicit timeout state
Target editor
Target editor

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.

Run instructions · Combined design and agent findings

can you make a quick icon for it and add that to the bundle?

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:

SignalMapper icon installed in the simulator

Changes are local and uncommitted.

ok, lets make the default hosts the following: quic.nz 100.80.110.128 google.com Thats one in NZ, one on my home network over tailscale, and on in australia

Updated the defaults, in order:

  • quic.nz
  • 100.80.110.128
  • google.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.

Fresh install with the three default targets

can you mark the bundle to say it doesn’t use encription. Test Flight keeps asling me

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.

ok this works great. Can you add the following: * the option to save before starting again (and loading up again). No need to continue - these should be snapshots * keep the phone on while the app is running. * export a screenshot of the map - the whole area covered. The map can be wide/tall/big as needed, it doesn’t need to be square.
Message from thread

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.
RecordingStore.swift SignalMapper
var snapshot = recordingsnapshot.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.

Running app — illustrative preview
Running app — illustrative preview
Recording actions
Recording actions
Save before starting again
Save before starting again
Saved recordings
Saved recordings
Loaded read-only snapshot — simulated Wellington location
Loaded read-only snapshot — simulated Wellington location
Full crossing export — illustrative
Full crossing export — illustrative
Wide export — illustrative
Wide export — illustrative
Tall export — illustrative
Tall export — illustrative
1 / 8