-
-
-
-
-
-
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)}}
+
+
MeshTender only has
guest access, which anyone gets with a blank password, so it can't manage this repeater. Grant it admin with
setperm, then connect from the console again.
+
+ {{end}}
+
+
+
+
+
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}}
{{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.
{{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;