From 9c5c8f4cfe96643c59553c76d2a506ab7cea4dab Mon Sep 17 00:00:00 2001 From: Jonathon Leight Date: Mon, 26 Oct 2026 16:20:54 -0400 Subject: [PATCH] Repeater page redesign --- internal/core/templates/add_repeater.html | 24 +++--- internal/core/templates/command_log.html | 12 +-- internal/core/templates/delete_repeater.html | 5 +- internal/core/templates/edit_repeater.html | 6 +- internal/core/templates/repeater.html | 74 +++++++------------ internal/core/templates/repeater_docs.html | 11 +-- .../core/templates/repeater_maintenance.html | 7 +- .../core/templates/transfer_repeater.html | 1 - internal/marketing/templates/landing.html | 16 ++-- internal/web/static/app.css | 5 +- 10 files changed, 61 insertions(+), 100 deletions(-) diff --git a/internal/core/templates/add_repeater.html b/internal/core/templates/add_repeater.html index aa85bfa..733b10b 100644 --- a/internal/core/templates/add_repeater.html +++ b/internal/core/templates/add_repeater.html @@ -24,29 +24,27 @@ {{/* ---- Step 1: choose connection method ---- */}}
-
-
- + {{else if eq .Step "consent"}} {{/* ---- Step 2: consent (wording adapts to the chosen method) ---- */}} diff --git a/internal/core/templates/command_log.html b/internal/core/templates/command_log.html index 526cb94..95b3184 100644 --- a/internal/core/templates/command_log.html +++ b/internal/core/templates/command_log.html @@ -2,14 +2,7 @@ {{define "header"}}{{template "repeater-header" .Nav}}{{end}} {{define "content"}} {{template "repeater-tabs" .Nav}} -
-
-

- Commands grouped by console session (one modem connection). “Confirmed” means a reply came back; - no reply doesn't mean the command failed — it may have run without us hearing the response. -

-
-
+

Every command sent from the console, by session. No reply doesn't mean a command failed: it may have run without its reply reaching us.

{{if .Sessions}}
    {{range .Sessions}} @@ -46,8 +39,7 @@ {{end}} {{else}}
    -

    No commands have been sent yet.

    + {{template "empty-state" (dict "Compact" true "Title" "No commands yet" "Line" "Commands sent from the console show up here.")}}
    {{end}} -{{template "icon-arrow-left" "me-1"}}Back to dashboard {{end}} diff --git a/internal/core/templates/delete_repeater.html b/internal/core/templates/delete_repeater.html index 0928d7d..8deeb60 100644 --- a/internal/core/templates/delete_repeater.html +++ b/internal/core/templates/delete_repeater.html @@ -1,7 +1,10 @@ {{define "title"}}Delete {{.Repeater.Name}} · MeshTender{{end}} {{define "header"}}
    -

    Delete “{{.Repeater.Name}}”?

    +
    + +

    Delete “{{.Repeater.Name}}”?

    +
    {{end}} {{define "content"}} diff --git a/internal/core/templates/edit_repeater.html b/internal/core/templates/edit_repeater.html index 4963813..8025773 100644 --- a/internal/core/templates/edit_repeater.html +++ b/internal/core/templates/edit_repeater.html @@ -2,15 +2,15 @@ {{define "header"}}
    -
    Edit repeater
    -

    {{.Repeater.Name}}

    + +

    Edit {{.Repeater.Name}}

    {{end}} {{define "content"}}
    -

    The public key identifies the repeater and can't be changed — delete and re-add to change it.

    +

    The public key is the repeater's identity, so it can't be edited here.

    {{.Repeater.PublicKeyHex}}
    diff --git a/internal/core/templates/repeater.html b/internal/core/templates/repeater.html index d28da5b..d34d7de 100644 --- a/internal/core/templates/repeater.html +++ b/internal/core/templates/repeater.html @@ -6,60 +6,39 @@
    -
    -
    -

    Details

    -
    -
    -
    -
    -
    Status
    -
    - {{if .Repeater.Confirmed}} - {{if .Repeater.Corroborated}}Corroborated - {{else if .Repeater.SelfConfirmed}}Self-confirmed - {{else}}Confirmed{{end}} - {{else}}Unconfirmed{{end}} -
    -
    -
    -
    Access level
    -
    - {{if .Repeater.AccessKnown}}{{if .Repeater.IsAdmin}}admin{{else}}guest only{{end}}{{else}}unknown{{end}} -
    -
    - {{if not .IsOwner}} -
    -
    Owner
    -
    {{.Repeater.OwnerName}}
    -
    - {{end}} -
    -
    Added
    -
    {{ts .Repeater.CreatedAt "date"}}
    -
    -
    - -
    -
    Radio settings
    -
    {{.Radio}}
    -
    - - {{if and .IsOwner .Repeater.Confirmed .Repeater.AccessKnown (not .Repeater.IsAdmin)}} -
    -
    - MeshTender only has guest access here. Guest is available to anyone with a blank password, so there's no point operating at this level — re-run setperm <your key> 3 on the repeater to grant admin, then re-test. + {{if and .IsOwner .Repeater.Confirmed .Repeater.AccessKnown (not .Repeater.IsAdmin)}} + + {{end}} +
    +

    Details

    +
    +
    +
    Status + {{if .Repeater.Confirmed}}Confirmed{{else}}Not confirmed{{end}}
    +
    + {{if .Repeater.Corroborated}}Reached over the air by {{range $i, $n := .Repeater.Corroborators}}{{if $i}}, {{end}}{{$n}}{{end}}. + {{else if .Repeater.SelfConfirmed}}You've reached it over the air; no one else has yet. + {{else if .Repeater.Confirmed}}Reached over the air through MeshTender. + {{else}}No one has reached it over the air through MeshTender yet. Connecting to it from the console confirms it.{{end}}
    +
    MeshTender's access + {{if .Repeater.AccessKnown}}{{if .Repeater.IsAdmin}}Admin{{else}}Guest only{{end}}{{else}}Not known yet{{end}}
    + {{if not .IsOwner}} +
    Owner{{.Repeater.OwnerName}}
    {{end}} +
    Added{{ts .Repeater.CreatedAt "date"}}
    +
    Radio{{.Radio}}
    {{if .IsOwner}}
    -

    Organizations

    - +

    Organizations

    Each one's recommended configuration for this repeater, for where it stands.
    +
    {{if .Orgs}}
    @@ -70,13 +49,13 @@ {{.OrgName}}
    {{end}}
    {{else}} -

    Not shared with any organization.

    + {{template "empty-state" (dict "Compact" true "Title" "Not shared with any organization" "Line" "Repeaters are shared with the organizations you join; you can opt one out on its Sharing tab.")}} {{end}}
    @@ -150,5 +129,4 @@
    -{{template "icon-arrow-left" "me-1"}}All repeaters {{end}} diff --git a/internal/core/templates/repeater_docs.html b/internal/core/templates/repeater_docs.html index 12be758..f506cb1 100644 --- a/internal/core/templates/repeater_docs.html +++ b/internal/core/templates/repeater_docs.html @@ -10,11 +10,7 @@

    Public documentation {{if .Repeater.ExposePublicPage}}· visible on the public page{{else}}· not published yet{{end}}

    -

    - What this node is and how to service it — safe for anyone who can reach the public page. - Shown on the public page when one is published. - Do not put gate codes, lock combinations, or other site-access secrets here — use the internal section below for those. -

    +

    What it is and how to service it: hardware, antenna, power, firmware. Anyone can read it. Keep gate codes and other site-access secrets in the internal notes below. Markdown works.

    @@ -25,10 +21,7 @@

    Internal notes · people with access only

    -

    - Sensitive site-access details — gate codes, lock combinations, landlord/contact info, climbing notes. - Only the owner, stewards, and people you've shared with can read this. Never shown on the public page. -

    +

    Site access: gate codes, lock combinations, who to call. Only you, its stewards and people you share it with can read these; they're never public.

    diff --git a/internal/core/templates/repeater_maintenance.html b/internal/core/templates/repeater_maintenance.html index d69f1e7..a36ac9f 100644 --- a/internal/core/templates/repeater_maintenance.html +++ b/internal/core/templates/repeater_maintenance.html @@ -6,10 +6,7 @@

    Log maintenance

    -

    - Record physical service work — antenna swaps, battery/solar changes, firmware updates, site visits — - so the history outlives any one person. Anyone with access can log an entry. -

    +

    Antenna swaps, battery and solar work, firmware updates, site visits: a history that outlives any one person. Anyone with access can add to it.

    @@ -56,7 +53,7 @@
{{else}}
-

No maintenance has been logged yet.

+ {{template "empty-state" (dict "Compact" true "Title" "Nothing logged yet" "Line" "Entries you add above show up here, newest first.")}}
{{end}} {{end}} diff --git a/internal/core/templates/transfer_repeater.html b/internal/core/templates/transfer_repeater.html index 0c8ecc5..09fabe8 100644 --- a/internal/core/templates/transfer_repeater.html +++ b/internal/core/templates/transfer_repeater.html @@ -121,5 +121,4 @@
-{{template "icon-arrow-left" "me-1"}}Back to sharing {{end}} diff --git a/internal/marketing/templates/landing.html b/internal/marketing/templates/landing.html index e448b16..f3ea974 100644 --- a/internal/marketing/templates/landing.html +++ b/internal/marketing/templates/landing.html @@ -26,7 +26,7 @@

For members

- {{template "landing-tag" "companion"}} + {{template "need-tag" "companion"}}

Check in from the app you already use

Register the companion you carry, then check in to your organization's weekly net by sending a flood advert. Follow the roster and the news as it comes in, and read your organization's docs and recommended setup any time.

@@ -36,7 +36,7 @@

For repeater owners

- {{template "landing-tag" "usb"}} + {{template "need-tag" "usb"}}

Set up a new repeater to your organization's spec

Plug a freshly flashed repeater into your computer and pick your organization's profile. MeshTender writes the radio, name, region for where it stands and settings in one pass, like the flasher's Repeater Setup, without typing any of it.

@@ -44,7 +44,7 @@
- {{template "landing-tag" "none"}} + {{template "need-tag" "none"}}

Document it, and share it without passwords

Keep each repeater's notes and maintenance history, publish a public page with its stewards, and decide who may run which commands on it: a single-use invite, a trusted steward, or your organization.

@@ -54,7 +54,7 @@

For organizations

- {{template "landing-tag" "none"}} + {{template "need-tag" "none"}}

One configuration for the whole region

Publish your radio settings and configuration profiles, and draw regions on a map. Members see the exact commands for where their repeater stands, and new repeaters get them at setup.

@@ -64,7 +64,7 @@

With a KISS modem

- {{template "landing-tag" "modem"}} + {{template "need-tag" "modem"}}

Manage repeaters over the air

For admins, stewards and net control: plug a MeshCore radio flashed as a KISS modem into your computer to run CLI commands on repeaters from the browser, confirm they're reachable, apply your organization's configuration, and run a net on the air. Every command and reply is logged.

@@ -87,10 +87,10 @@ {{end}} -{{/* landing-tag says what a feature needs. Pass "companion", "usb", "none" or +{{/* need-tag says what a feature needs. Pass "companion", "usb", "none" or "modem". */}} -{{define "landing-tag"}} -
+{{define "need-tag"}} +
{{if eq . "companion"}}{{template "icon-radio" "me-1"}}Just your companion app {{else if eq . "usb"}}{{template "icon-plug" "me-1"}}Just the repeater and a USB cable {{else if eq . "modem"}}{{template "icon-antenna" "me-1"}}Needs a KISS modem diff --git a/internal/web/static/app.css b/internal/web/static/app.css index 5c2bb4a..9000fd2 100644 --- a/internal/web/static/app.css +++ b/internal/web/static/app.css @@ -291,8 +291,9 @@ code.pubkey { background: var(--tblr-primary-lt); color: var(--tblr-primary-text-emphasis); } -/* What a landing feature needs ("Just your companion app", "Needs a KISS modem"). */ -.landing-tag { +/* What a feature needs ("Just your companion app", "Needs a KISS modem"), on the + landing page and the add-repeater wizard. */ +.need-tag { display: inline-flex; align-items: center; font-size: 0.875rem;