{{define "base"}} {{block "title" .}}MeshTender{{end}} Skip to main content
{{block "content" .}}{{end}}
{{end}} {{/* footerbody is the one footer used by every layout, so the legal links can't go missing on a surface. /privacy and /terms are served by the root host only, hence absolute URLs: the app and auth hosts have no such routes. The source link is the AGPL section 13 offer — the source of the program you are interacting with, reachable from every page. */}} {{define "footerbody"}}
MeshTender — tend your mesh.
{{end}} {{/* rootnav is the public/root-host topbar: brand + Organizations, with the sign-in/create-account actions collapsing to a single Dashboard button once signed in (the root identity beacon sets .UserName). Shared by rootbase and landingbase so every root page has an identical topbar. */}} {{define "rootnav"}} {{end}} {{/* rootbase is the public/root-host page layout: the shared rootnav topbar plus the standard page chrome (header block, content, footer). The marketing surface defaults to this so every root page matches the rest of the site. */}} {{define "rootbase"}} {{template "title" .}} Skip to main content
{{template "rootnav" .}}
{{template "content" .}}
{{end}} {{/* authbase is a standalone, centered layout for the sign-in / sign-up pages — no navbar or page chrome, just a brand logo above the page's content card. Pages opt in with {{define "base"}}{{template "authbase" .}}{{end}}. It still carries footerbody: the legal links and the AGPL section 13 source offer are owed on every surface, and someone signing in is as much a user of this server as someone already signed in. */}} {{define "authbase"}} {{template "title" .}}
{{template "content" .}}
{{end}} {{/* landingbase is the public marketing layout: a transparent navbar with sign-in / sign-up actions, the page content, and a simple footer. Pages opt in via the "Layout":"landingbase" render key. */}} {{define "landingbase"}} {{template "title" .}} {{template "rootnav" .}} {{template "content" .}} {{end}} {{/* revokedoc explains how to revoke MeshTender's access. Dot is the revoke command string. */}} {{define "revokedoc"}}
How to revoke MeshTender's access later

Granting access is a standing trust: MeshTender keeps admin on your repeater until you remove it — deleting the repeater from this site does not revoke it. To revoke, run this on the repeater (via its BLE/USB companion app or another admin client):

{{.}}

With no level argument, that removes MeshTender from the repeater's ACL entirely.

{{end}} {{/* repstatus renders confirmation provenance + access badges for a *store.Repeater. */}} {{define "repstatus"}} {{- if not .Confirmed -}} Unconfirmed {{- end -}} {{- if and .AccessKnown (not .IsAdmin)}}guest only{{end -}} {{end}} {{/* map-styles / map-scripts are the vendored map stack, in one place rather than hand-listed by each of the ten pages that render a map — which is how the Leaflet list they replaced managed to drift. Include map-styles above the map container and map-scripts before the page's own map call. Order matters: maplibre-gl.js defines the global the adapter and basemap.js both reach for, and basemap.js defines meshCreateMap, which meshmap.js and regionmap.js build on. terra-draw is only needed where a shape is drawn, so map-draw-scripts is separate — no reason to ship 244KB to a page that just shows dots. */}} {{define "map-styles"}} {{end}} {{define "map-scripts"}} {{end}} {{define "map-draw-scripts"}} {{end}}