Skip to content

20261007 - Add a guided tutorial and regroup the Configuration page - #113

Closed
kazad wants to merge 5 commits into
mainfrom
20261007-guided-tutorial-and-page-layout
Closed

kazad wants to merge 5 commits into
mainfrom
20261007-guided-tutorial-and-page-layout

Conversation

@kazad

@kazad kazad commented Oct 12, 2026

Copy link
Copy Markdown

What

A guided tutorial that walks a new owner through the Summary, Home and Configuration pages, together with the page changes the tour was written around: a regrouped Configuration page, updated Summary links, a larger Summary simulator and a reordered Home.

It is one branch with five commits, one per topic, so each can be read on its own. The first four each stand alone on main; the tutorial sits on top of all four.

Why

An owner who finishes the setup wizard 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. Writing the tour showed where the pages themselves were in the way, so those are fixed first.

The five commits

1. Group the Configuration page around how an owner uses a node

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 with a rule under it, and the side menu's group titles carry the same rule.
  • "Tower" is now "Cached Towers" and "Location" is now "Tower". A section has one name, written the same in the menu, its heading and the wizard hints.
  • Center Frequency moves from Capture into Tower's transmitter block, after Name.
  • Tower shows the receiver's name read-only. It is changed under Identifiers, which also shows the server's identifier for the node.
  • The form that Apply changes submits wraps exactly the Radar and ADS-B groups. A radar field left outside the form would be missing from the POST, which the server reads as that setting having been cleared, so tests/test_config_layout.py holds this.

2. Link Summary to the combined dashboard and to our own Discord

  • Resources: Offworld Labs, Retina Wiki, Network Map and Dashboard (app.retina.fm), Passive Radar News, blah2 Discord.
  • Help: the Retina Discord, then the support email. The blah2 Discord moved to Resources because it is that project's channel, not ours.
  • The banner button is "Network Map and Dashboard" and goes to the same address as the card. The separate Retina Dashboard button is gone.

3. Stack the Summary simulator and name it Doppler Mapping Tool

  • The sky and the delay-Doppler plot are stacked at full width, sky first, and the sky is drawn 1.3 times further out so the beam at its widest fits.
  • The beam reaches a fixed range instead of the edge of the drawing, and the aircraft's heading is smoothed along the drawn path.
  • The handle is labelled "Grab to Aim". A mouse or touch grab leaves no focus box; keyboard focus thickens the ring instead.

4. Put Controller last on Home and say how much the Tracker keeps

Cards run Passive Radar, Max-Hold, ADS-B Map, Tracker, Controller. The Tracker card says it keeps up to 4 hours of history.

5. Add a guided tutorial across Summary, Home and Configuration

  • /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, 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 link shows the plain page.
  • The owner moves between pages by clicking the lit card or tab.
  • The Summary steps only run on a network with more than one node. Every run ends on a closing Summary step. 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.
  • The step about overload describes the reading and help box from 20261007 - Show when the radio is overloaded, now that it keeps running #110.

Testing

  • Full suite on this branch merged with current main (which has gained 20261008 - Stop blah2 before restarting the SDRplay service #111 and 20261008 - Rename routes/mode.py to routes/sdr.py #112 since the branch was made): 1090 passed, 1 failed. The one failure is tests/test_node_name.py::test_an_unwritable_location_reports_rather_than_raises, which fails in the sandbox the suite ran in because it runs as root there, and fails the same way on untouched main. ruff check . and the vulture hook pass. The branch merges without conflicts.
  • New tests: tests/test_config_layout.py, tests/test_home_services.py and tests/test_tutorial.py; tests/test_fleet.py gains the links and simulator tests.
  • In a browser, off-device: every step walked at 1920, 1280 and 390 px wide, checking that each highlight covers its target and does not overlap a neighbour.
  • On a test node with an RSPduo attached, deployed over SSH on top of main as of 20261005 - Say what each notch filter blocks and when to leave it on #109 plus 20261007 - Show when the radio is overloaded, now that it keeps running #110: the service restarted cleanly with no traceback or HTTP 500 in its log, all 29 step pages loaded with something to highlight, the page layouts matched, the settings files were unchanged and the radar stack stayed up. The tour was then looked over by eye in a browser on that node.

Not verified

  • Applying a changed setting through the rearranged form on hardware. The tests cover which fields the form posts; no setting was changed on the node by the automated checks.
  • The wizard's last page on hardware. The wizard was not run on the node.
  • The overload help box during a real overload.
  • The 24-step single-node run in a browser. It is covered by tests only.
  • This branch merged with 20261008 - Stop blah2 before restarting the SDRplay service #111 and 20261008 - Rename routes/mode.py to routes/sdr.py #112 on hardware. The node test predates them.
  • The tutorial's statement that the Minimum SNR default is 7. That default is set in retina-node and was not checked from this repository.

For the reviewer

  • The Retina Discord link is an invite that expires on 6 November 2026. It needs replacing with a permanent invite before a release carries this.
  • The example pictures in static/tutorial are real captures, used unaltered, except signal-overload.png, which is rendered from the page with simulated readings and should be replaced with a real capture when there is one. Please confirm you are content for the captures to be public.
  • Known limits of the tour: 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.
  • Known limit of the simulator: steered far to one side at its widest, the beam still runs off the bottom of the panel.
  • This is five topics on one branch, which departs from one topic per branch. The commits are ordered so it can be split if you prefer.

Docs

  • New: docs/features/tutorial.md, added to the map in docs/README.md.
  • Updated: docs/features/config-editor.md (new Page layout section, renamed sections), docs/features/fleet-and-naming.md (Resources and Help links), docs/architecture.md (simulator, Home cards, tutorial), docs/features/setup-wizard.md, docs/features/device-state-and-telemetry.md and docs/features/remote-access.md (renamed sections).

After this

  • A permanent Retina Discord invite.
  • A real overload capture for the tutorial.
  • The setup wizard is due an update to match the regrouped Configuration page (naming the node, cached towers, a simpler calibration explanation).

🤖 Generated with Claude Code

https://claude.ai/code/session_01AoHZhvWU7Ge89Cm6YgrExB


Generated by Claude Code

claude added 5 commits October 7, 2026 14:55
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
The Retina network map and the Retina dashboard are now one site, so the
Summary page offered two links where there is one place to go, and the
banner button still named the map alone. The only chat link under Help was
the blah2 project's Discord, which is not where to ask about a Retina node.

Resources is now Offworld Labs, Retina Wiki, Network Map and Dashboard
(app.retina.fm), Passive Radar News and the blah2 Discord, running from ours
out to the wider field. Help is our own channels only: the Retina Discord
first, then the support email. The banner button is Network Map and
Dashboard and goes to the same address as the card.

The Retina Discord link is an invite that expires on 6 November 2026. It
needs replacing with a permanent invite before a release carries this.

tests/test_fleet.py covers the banner link, the Resources order, Help
holding our own channels only and the blah2 Discord being a resource. Docs:
fleet-and-naming.md (Resources and Help links).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AoHZhvWU7Ge89Cm6YgrExB
The simulator on the Summary page drew the sky and the delay-Doppler plot
side by side, each too small to read, and at its widest the antenna's beam
ran off the edge of the sky panel. Nothing said the beam could be steered,
and after a mouse grab the handle kept a black focus box.

The two panels are now stacked at full width, sky first. The sky is drawn
1.3 times further out, so the node, the tower and the beam at its widest fit
in the panel with room around them, and the beam reaches a fixed range
instead of the edge of the drawing. The aircraft's heading is smoothed along
the drawn path, which at the larger size had shown as a sawtooth in the
Doppler trace. The handle is labelled "Grab to Aim" and the label moves with
it. It is revealed by the script, so the page without JavaScript does not
promise something that cannot be done. A mouse or touch grab no longer
leaves a focus box; keyboard focus thickens the ring instead, so the handle
is still findable by Tab. The section is titled Doppler Mapping Tool.

One limit remains: steered far to one side at its widest, the beam still
runs off the bottom of the panel.

tests/test_fleet.py covers the section title, the stacked layout, the view
box, the label being hidden until the script runs and the missing focus box.
The drawing itself was checked in a browser, not by the tests. Docs:
architecture.md (the simulator's geometry and the handle).

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

Home listed Controller third, between the live radar views and the map.
Controller is the way into everything the other cards do not cover, so it
reads better as the last card: Passive Radar, Max-Hold, ADS-B Map, Tracker,
Controller. The Tracker card now says it keeps up to 4 hours of history.

tests/test_home_services.py is new and holds the order and the Tracker
wording. Docs: architecture.md (Home's service cards).

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
@kazad
kazad requested a review from Purple10101 October 12, 2026 13:07

@Purple10101 Purple10101 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this. Before I review in depth, could you split it into four PRs, one topic each? The commits already line up:

  1. Group the Configuration page (3206489)
  2. Summary links and the Doppler Mapping Tool (cafb558 + f84f2a6)
  3. Home card order (f498ced)
  4. The guided tutorial (eb1e309). This one depends on the other three, so please open it last, on top of them.

PRs 1-3 each apply cleanly to current main and pass the full suite on their own.

Two things will block merging, so it's worth fixing them while you split:

  • PR 2: the Retina Discord invite expires on 6 November. It needs to be a permanent invite before this merges, not just before a release. fleet-and-naming.md already says it must be permanent.
  • PR 4: static/tutorial/adsb-map.jpg shows where a real node is. Please crop it so the receiver marker and the town names can't be seen.

I've tested this branch on a node and found issues that need fixing in the Configuration and tutorial changes. I'll leave detailed notes on each PR once they're open.

kazad commented Oct 14, 2026

Copy link
Copy Markdown
Author

Split into four PRs as requested: #115 (Configuration page), #116 (Summary links and the Doppler Mapping Tool), #117 (Home card order) and #118 (the guided tutorial, which carries the other three until they merge). All four are rebased onto current main and each passes the full suite on its own. Jonathan and Josh agreed to keep the ADS-B picture as it is; the permanent Retina Discord invite is still to come on #116. Closing this one in favour of those.


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.

3 participants