Skip to content

20261014 - Add a guided tutorial across Summary, Home and Configuration - #118

Closed
kazad wants to merge 2 commits into
mainfrom
20261014-guided-tutorial
Closed

kazad wants to merge 2 commits into
mainfrom
20261014-guided-tutorial

Conversation

@kazad

@kazad kazad commented Oct 14, 2026 •

Copy link
Copy Markdown

Author: Jonathan Fremerman (@jfremerman). This PR was opened through a shared Claude account signed in as @kazad, which is why GitHub shows that name as the opener. The commits are authored by @jfremerman, who directed, tested and signed off every change; Claude did the typing with him in the loop at each step.

Split out of #113 at the reviewer's request (4 of 4). Same code as commit eb1e309 there, rebased onto current main. This branch contains the other three (#115, #116 and #117 are merged into it), because the tour points at things those PRs add; once they merge, this PR reduces to the one tutorial commit.

What

/tutorial starts a guided tour drawn over the real Summary, Home and Configuration pages. Each step dims the page, lights one region, points an arrow at it and says a sentence or two in a card, with Previous, Next and Skip Tutorial. The wizard's last page recommends it, and Configuration gains a Tutorial section under Other that launches it at any time.

Why

A new owner finishes the setup wizard and lands on pages nobody has explained: which card opens what, what the dots on the radar display mean, which settings are worth touching, and how to tell a good signal from an overloaded one.

How it works

  • The server owns the steps (src/tutorial.py) and every step is a URL, so a reload or the Back button keeps the place and a stale or hand-edited link shows the plain page.
  • The owner moves between pages by clicking the lit card or tab, so the tour teaches the navigation it depends on.
  • Steps about the radar views and the signal meter carry an example picture.
  • The Summary steps only run on a network with more than one node; every run ends on a closing Summary step. 29 steps with Summary, 24 without.
  • While the wizard is in progress /tutorial redirects to it, because Home and Configuration both bounce there.
  • The card and arrows stay hidden until a smooth scroll has settled; laid out mid-scroll they flashed in the wrong place.
  • The overload step describes the reading and help box from 20261007 - Show when the radio is overloaded, now that it keeps running #110.

For the reviewer

  • ADS-B picture: static/tutorial/adsb-map.jpg is a real capture, used as is. Jonathan and Josh agreed to keep it uncropped.
  • signal-overload.png is rendered from the page with simulated readings and should be replaced with a real capture when there is one.
  • The Minimum SNR step states the default as 7; that default is set in retina-node and was not checked from this repository.
  • Known limits: the margins only fit the card beside the Configuration page in a window of about 1580 px or wider, narrower than that the card sits over part of the page; at phone width several steps have no arrow.

Testing

  • Full suite on this branch (with the other three merged in): 1096 passed, 1 failed (test_an_unwritable_location_reports_rather_than_raises, the root-only sandbox failure that also fails on untouched main). ruff check . and the vulture hook pass.
  • New: tests/test_tutorial.py (step order and numbering, one or two sentences per step, every target present on its page, image sizes matching the files, the single-node run, the wizard redirect, stale links).
  • In a browser, off-device: every step walked at 1920, 1280 and 390 px wide, checking each highlight covers its target and does not overlap a neighbour.
  • On a test node with an RSPduo attached (combined 20261007 - Add a guided tutorial and regroup the Configuration page #113 build, before 20261008 - Stop blah2 before restarting the SDRplay service #111, 20261008 - Rename routes/mode.py to routes/sdr.py #112 and 20261013 - Show the Tracker at +/-300 Hz by default and flag tracks beyond it #114 merged): the service restarted cleanly with no traceback or HTTP 500, all 29 step pages loaded with something to highlight, every example image was served, settings files unchanged, radar stack stayed up; the tour was then looked over by eye on that node.
  • Not verified: the 24-step single-node run in a browser (tests only); the wizard's last page on hardware; the overload help box during a real overload; this branch rebased onto current main on hardware.

Docs

New docs/features/tutorial.md, added to the map in docs/README.md; docs/architecture.md, docs/features/config-editor.md, docs/features/fleet-and-naming.md and docs/features/setup-wizard.md updated.

After this

A real overload capture, and the setup wizard update to match the regrouped Configuration page.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AoHZhvWU7Ge89Cm6YgrExB


Generated by Claude Code

kazad commented Oct 14, 2026

Copy link
Copy Markdown
Author

Note on attribution: this PR is Jonathan Fremerman's (@jfremerman). It was opened through a shared Claude account that is signed in as @kazad, so GitHub lists that account as the opener. The commits have been re-authored under @jfremerman, who directed, tested on hardware and signed off each change, with the Co-Authored-By trailer recording Claude's part. Nothing here was created unsupervised.


Generated by Claude Code

jfremerman and others added 2 commits October 15, 2026 10:22
The Configuration page had grown a section at a time, and its order no
longer matched how an owner works through a node. Node Claim sat near the
bottom of a long Administration group, the centre frequency lived in Capture
while the tower it belongs to was two sections up, and the side menu's group
headings looked the same as the links under them.

The page is now five groups: Node (Identifiers, Mode, Node Claim, Network),
Radar (Cached Towers, Tower, Capture, Tracking), ADS-B (ADS-B Truth,
tar1090), Other (SSH Access, Setup Wizard) and Support (Cloud Services,
Remote Support, How We Reach You). Each group is titled in the page itself
with a rule running out to the right, the side menu's group titles carry the
same rule, and a section has one name, written the same in the menu, in its
heading and in the wizard hints that point at it. What was "Tower" is
"Cached Towers" and what was "Location" is "Tower". Center Frequency moves
into Tower's transmitter block, after Name, because it is a property of the
tower and not of the capture. Tower shows the receiver's name read-only; it
is changed under Identifiers, which also shows the server's identifier for
the node beside the local one.

The form Apply changes submits now wraps exactly the Radar and ADS-B groups.
That is the property the regrouping must not break: a radar field left
outside the form is missing from the POST, which the server reads as that
setting having been cleared.

tests/test_config_layout.py is new and holds the order, the group titles,
the form's membership and the centre frequency's new home. test_app.py,
test_claim.py, test_contact.py and test_node_name.py follow the renamed
sections. Docs: config-editor.md gains a Page layout section and uses the
new names throughout; setup-wizard.md, device-state-and-telemetry.md and
remote-access.md follow the renames.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AoHZhvWU7Ge89Cm6YgrExB
A new owner finishes the setup wizard and lands on pages nobody has
explained: which card opens what, what the dots on the radar display mean,
which Configuration settings are worth touching and how to tell a good
signal from an overloaded one.

/tutorial starts a tour drawn over the real pages. Each step dims the page,
lights one region, points an arrow at it and says a sentence or two in a
card placed in the margin, with Previous, Next and Skip Tutorial. The server
owns the steps (src/tutorial.py) and every step is a URL, so a reload or the
Back button keeps the place, and a stale or hand-edited link shows the plain
page. Moving between pages is done by the owner clicking the lit card or
tab, so the tour teaches the navigation it depends on. Steps about the radar
views and the signal meter carry an example picture, so the step can point
at what to look for. The Summary steps only run on a network with more than
one node; every run ends on a closing Summary step that points back at
Resources and Help. There are 29 steps with the Summary steps and 24
without.

The wizard's last page recommends the tour, and Configuration gains a
Tutorial section under Other that launches it at any time. While the wizard
is in progress /tutorial redirects to it, because Home and Configuration
both bounce there and a tour would lose its place.

The card and arrows stay hidden until a smooth scroll has settled. Laid out
mid-scroll they flashed up in the wrong place before jumping to the right
one.

The example pictures in static/tutorial are real screenshots, apart from
signal-overload.png, which is rendered from the page with simulated readings
and should be replaced with a real capture when there is one. The Minimum
SNR step states the default as 7; that default is set in retina-node and was
not verified from this repository. The margins only fit the card beside the
Configuration page in a window of about 1580 px or wider; narrower than that
the card sits over part of the page, and at phone width several steps have
no arrow.

tests/test_tutorial.py is new: step order and numbering, one or two
sentences per step, every target present on its page, image sizes matching
the files, the single-node run, the wizard redirect and stale links. The
overlay's drawing is not covered by the tests: it was checked in a browser
at 1920, 1280 and 390 px wide, and by eye on a test node with a radio
attached. Docs: new
features/tutorial.md, added to the map in docs/README.md; architecture.md,
config-editor.md, fleet-and-naming.md and setup-wizard.md updated.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AoHZhvWU7Ge89Cm6YgrExB

Copy link
Copy Markdown
Contributor

Re-opened as #120 under @jfremerman so the PR and the commits carry the same author, as requested. Same branch and code.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants