Skip to content

v2.8.0 — the map is yours to arrange

Choose a tag to compare

@maxg10 maxg10 released this 15 Sep 20:08
· 36 commits to main since this release

Two releases ago the app could not say who made it. This one is about the other
half of that conversation: the map is yours to arrange, and the plugins can
finally see the mesh as a network rather than a pile of nodes.

Panels go where you put them

Every plugin panel now has a grip. Drag it and the panel floats wherever you
left it, clamped so at least 48px of it stays on screen — a panel you cannot
reach is worse than one in the wrong place. Double-click the grip and it drops
back into the column. Positions are remembered per panel.

On a phone the same grip does something different on purpose. There is nowhere
to float to on a 390px screen, and a panel dragged off the edge is one you
cannot get back, so in the Map Layers drawer the grip reorders the list —
and that order is what the desktop column uses too. Set it once, it holds
everywhere. A Reset layout button appears as soon as anything has moved.

Mouse, finger and pen all go through one pointer stream, and the grip claims
that stream outright, so dragging a panel no longer pans the map underneath it
or scrolls the drawer out from under your thumb.

The panels were sitting on the zoom buttons

They had been, on every desktop width, for a long time. The host was pinned at
top: 125px, under a comment explaining that the zoom control occupies
"~54-114px". It occupies 98-163px: the 44px top bar was subtracted twice, once
by #map and again by .leaflet-top inside it. The first panel overlapped the
zoom buttons by 38px and the comment had never been true.

The double offset is gone, and the position is no longer a number anyone has to
maintain. The control stack is measured at runtime and published as a CSS
variable, re-measured on resize and whenever the corner changes size — so a
plugin that adds its own control there pushes the panels down by itself.

Plugins can see the mesh, not just the nodes

api.links.getAll() hands a plugin the edge list the core has always had:
neighbour reports between any two nodes, plus everything this mapper's own radio
hears at zero hops. Undirected, each pair once, ids ordered so a pair always
looks the same, with the reported SNR. api.links.onUpdate() fires when a
neighbour report changes the picture.

Two things the developer guide now says out loud, because they will bite
whoever builds on this: NEIGHBORINFO is off by default in the firmware, so
on many meshes this list starts empty — say so in your UI rather than drawing an
empty graph. And RF is not always symmetric; the edge list flattens that.

Two new plugins in the store

  • Lifelines — finds the single points of failure: the nodes that, if they
    went off the air, would cut other nodes off from the mesh. Click one and the
    map rings it in amber and everything that depends on it in red. Frontend only.
  • Ground Truth — compares every link and directly-heard node against its own
    past few weeks and reports the ones that quietly lost signal. Water in a
    connector does not announce itself; it shows up as four decibels that were
    never coming back. Reads the mapper's own history, read-only.

Smaller things

  • Release notes in the version dialog are readable now: heading hashes, bold
    markers and backticks are stripped instead of being shown as punctuation.
  • The map page no longer scrolls vertically by 44px. #map was 100vh tall
    underneath a 44px bar, which is 44px more than the window has.

Updating

cd ~/meshpulse && git pull origin main && ./install.sh && sudo systemctl restart meshpulse

Docker

docker compose pull && docker compose up -d

Fresh Install

git clone https://github.com/maxg10/meshpulse.git
cd meshpulse
./install.sh