Pass predictions were a third view inside the Weather Satellite Decoder card on
the Digital modes tab — reached by opening a decoder panel, then switching
views. Knowing when a bird comes over is a planning question; it had nothing to
do with the FT8 and WEFAX panels it sat beside.
What moved
They are now their own page at /satellites, reached from Tools alongside
Statistics, Recorder, Settings and About — the occasional destinations that
live behind that menu instead of taking a slot in the operating strip.
The prediction code leaves sat.ts for its own plugin that loads with the
page, so the decoder card no longer carries it. The card keeps Live and
History; its Predictions button is gone.
Nav placement
Adding a sixth button to the strip wrapped the phone nav onto two rows and cost
the desktop strip its labels at 1280px, so the tab is hidden from the strip the
same way its four peers already are. Measured against main, the visible strip
and the icons-only threshold are identical at 390px and 1280px.
Lifecycle
The countdowns tick once a second, so they stop when the page is hidden, and
each visit reloads — passes go stale while the page is closed. The old cleanup
hook hanging off the decoder sub-tab bar is gone with the view it cleaned up.
Server
/satellites gets an index route in api/assets.rs, so a deep link or a
refresh serves the SPA shell rather than a 404 — the same handler every other
tab route has.
Verification
A new browser test (tests/satellite-predictions.mjs, wired into npm run test:browser) covers the move: the page renders current and upcoming
passes at its own address, the countdown ticks, leaving clears it, returning
reloads, the tab is behind Tools rather than in the strip, and the decoder card
no longer offers Predictions. The fixture learned to serve /sat_passes.
typecheck, lint, 47 unit tests, the browser suite, cargo clippy --all-targets
and cargo fmt --check are all clean. browser-smoke.mjs fails identically on main on this machine (a map layout assertion), so it is untouched by this
change.
Closes #47.
Pass predictions were a third view inside the Weather Satellite Decoder card on
the Digital modes tab — reached by opening a decoder panel, then switching
views. Knowing when a bird comes over is a planning question; it had nothing to
do with the FT8 and WEFAX panels it sat beside.
## What moved
They are now their own page at `/satellites`, reached from **Tools** alongside
Statistics, Recorder, Settings and About — the occasional destinations that
live behind that menu instead of taking a slot in the operating strip.
The prediction code leaves `sat.ts` for its own plugin that loads with the
page, so the decoder card no longer carries it. The card keeps Live and
History; its Predictions button is gone.
## Nav placement
Adding a sixth button to the strip wrapped the phone nav onto two rows and cost
the desktop strip its labels at 1280px, so the tab is hidden from the strip the
same way its four peers already are. Measured against `main`, the visible strip
and the icons-only threshold are identical at 390px and 1280px.
## Lifecycle
The countdowns tick once a second, so they stop when the page is hidden, and
each visit reloads — passes go stale while the page is closed. The old cleanup
hook hanging off the decoder sub-tab bar is gone with the view it cleaned up.
## Server
`/satellites` gets an index route in `api/assets.rs`, so a deep link or a
refresh serves the SPA shell rather than a 404 — the same handler every other
tab route has.
## Verification
A new browser test (`tests/satellite-predictions.mjs`, wired into
`npm run test:browser`) covers the move: the page renders current and upcoming
passes at its own address, the countdown ticks, leaving clears it, returning
reloads, the tab is behind Tools rather than in the strip, and the decoder card
no longer offers Predictions. The fixture learned to serve `/sat_passes`.
typecheck, lint, 47 unit tests, the browser suite, `cargo clippy --all-targets`
and `cargo fmt --check` are all clean. `browser-smoke.mjs` fails identically on
`main` on this machine (a map layout assertion), so it is untouched by this
change.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01SyX26FCpMQxiBoC7r5K1A7
Pass predictions were a third view inside the Weather Satellite Decoder card,
under Digital modes — a planning tool filed behind a decoder toggle, beside the
FT8 and WEFAX panels it has nothing to do with. Nothing about knowing when a
bird comes over belongs there.
Move them to /satellites, reached from Tools alongside Statistics, Recorder,
Settings and About: occasional destinations that live behind that menu rather
than taking a slot in the operating strip. Adding a sixth strip button wrapped
the phone nav onto two rows and cost the desktop strip its labels at 1280px, so
the tab is hidden from the strip exactly the way its four peers already are —
the nav is byte-for-byte what it was.
The prediction code moves out of sat.ts into its own plugin that loads with the
page, so the decoder card no longer carries it. Countdowns stop when the page
is hidden and each visit reloads, since passes go stale while it is closed.
The server grows a /satellites index route so a deep link or a refresh serves
the SPA shell rather than a 404.
Closes#47
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SyX26FCpMQxiBoC7r5K1A7
Signed-off-by: Stan Grams <sjg@haxx.space>
sjg
merged commit f396e8f235 into main2026-08-07 00:06:00 +02:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Closes #47.
Pass predictions were a third view inside the Weather Satellite Decoder card on
the Digital modes tab — reached by opening a decoder panel, then switching
views. Knowing when a bird comes over is a planning question; it had nothing to
do with the FT8 and WEFAX panels it sat beside.
What moved
They are now their own page at
/satellites, reached from Tools alongsideStatistics, Recorder, Settings and About — the occasional destinations that
live behind that menu instead of taking a slot in the operating strip.
The prediction code leaves
sat.tsfor its own plugin that loads with thepage, so the decoder card no longer carries it. The card keeps Live and
History; its Predictions button is gone.
Nav placement
Adding a sixth button to the strip wrapped the phone nav onto two rows and cost
the desktop strip its labels at 1280px, so the tab is hidden from the strip the
same way its four peers already are. Measured against
main, the visible stripand the icons-only threshold are identical at 390px and 1280px.
Lifecycle
The countdowns tick once a second, so they stop when the page is hidden, and
each visit reloads — passes go stale while the page is closed. The old cleanup
hook hanging off the decoder sub-tab bar is gone with the view it cleaned up.
Server
/satellitesgets an index route inapi/assets.rs, so a deep link or arefresh serves the SPA shell rather than a 404 — the same handler every other
tab route has.
Verification
A new browser test (
tests/satellite-predictions.mjs, wired intonpm run test:browser) covers the move: the page renders current and upcomingpasses at its own address, the countdown ticks, leaving clears it, returning
reloads, the tab is behind Tools rather than in the strip, and the decoder card
no longer offers Predictions. The fixture learned to serve
/sat_passes.typecheck, lint, 47 unit tests, the browser suite,
cargo clippy --all-targetsand
cargo fmt --checkare all clean.browser-smoke.mjsfails identically onmainon this machine (a map layout assertion), so it is untouched by thischange.
🤖 Generated with Claude Code
https://claude.ai/code/session_01SyX26FCpMQxiBoC7r5K1A7