-
released this
2026-07-13 17:38:41 +00:00 | 1 commits to main since this releaseFirst public release.
Added
- First-run setup wizard: detects whether ZeroTier is installed, starts the
service (elevated), and grants MeshBerth read access to the node by
bootstrapping a user-readable copy of the auth token — mostly automated,
with at most one elevated prompt per step. MeshBerth manages the ZeroTier
service but never installs ZeroTier itself. - Dashboard: node ID, online status, and version, plus service start / stop /
restart controls. - Networks: list joined networks, join by 16-digit network ID, leave (with
confirmation), and per-network detail (assigned addresses, managed routes,
DNS, type, device, MAC, MTU) with the four client-side toggles
(allowManaged,allowGlobal,allowDefault,allowDNS); click-to-copy
network IDs. - Optimistic UI updates on Networks: the client-side toggles and leave settle
from the backend's immediate response instead of waiting for the next poll tick. - Advanced page for node connectivity settings (primary/secondary/tertiary
ports, port mapping, TCP fallback relay, force TCP relay), applied via an
elevated, merge-safe local.conf edit and service restart. - Looking Glass: an aggregated IPv4/IPv6 route table across all joined
networks, with sortable columns and an instant keyword filter. - Peers view: reachable nodes with role (planet/moon/leaf), latency, and
direct/relayed paths. - Moons: list, orbit, and deorbit external ZeroTier roots from a dedicated
Moons page, via the local/moonAPI (no elevation) — for extra
coverage/resilience or a self-hosted backend. - Help page: a plain-language glossary of ZeroTier terms (VL1/VL2, planet,
moon, root, controller, leaf, managed addresses) plus a note that classic
ZeroTier One (VL1/VL2) provides no forward secrecy, recommending end-to-end
encryption inside the tunnel for sensitive traffic. - About page: version, license, and a plain-language summary of what
MeshBerth talks to (and doesn't). - Light/dark theming that follows the system by default, with a manual
override in Settings. - Instant keyword filtering on the Networks, Peers, and Looking Glass lists.
- Sortable columns on the Peers list (Node, Role, Latency, Best path) — click a
header to sort, click again to reverse, matching the Looking Glass table. - Settings: adaptive refresh intervals (faster while the window is visible,
slower when minimized to the tray), persisted locally. - System tray showing connection state with per-network quick disconnect;
closing the window minimizes to the tray and keeps the app running. The tray
icon is status-aware — its color reflects node state (online / degraded when
relayed / offline). - Startup behavior: start on login, start hidden, and show a tray icon — three
independent Settings toggles, all off by default. Enabling "Start on login"
for the first time also enables the other two so it behaves like a proper
background app; MeshBerth never starts hidden without a reachable tray. - Desktop notifications for node up/down, network join/leave, removal from a
network by its controller, and relay changes — a master
switch plus per-event toggles in Settings, all on by default, with
startup-baseline suppression and per-event rate limiting. - Desktop notifications for a network's client-setting changes (managed
addresses, global routes, default route, DNS) and for assigned
IP-address changes (v4/v6) — each a per-event toggle in Settings. - Connection-state banners for service-down and authentication failures, with
one-click recovery actions; last-known-good data is shown with a staleness
indicator rather than blanking the UI. - Linux packaging: AppImage, deb, and rpm bundles.
- Containerized build environment (
ci/Containerfile) that doubles as the CI
job image, so the developer host needs no toolchain installed. - Documentation suite under
doc/(architecture, build, first-run setup,
configuration, troubleshooting, features, tech stack, ZeroTier service API,
theming, contributing, dependency policy).
Changed
- Rebuilt the interface with a distinctive visual identity (the "Harbor"
design). - Enforced code documentation and linting across the codebase, gated in CI:
#![warn(missing_docs)]on the Rust crate (all public items documented) and
ESLint (TypeScript / Svelte / JSDoc) alongside svelte-check. Coding standards
are documented indoc/DEV-GUIDELINES.md.
Fixed
- Desktop notifications now reliably display. The notifier reuses a single
session D-Bus connection — a fresh per-notification connection was dropped the
instantNotifyreturned, so GNOME withdrew each notification before showing
it — passes an embedded icon and adesktop-entryhint, and keys a setting's
enable and disable separately so opposite toggles no longer rate-limit each
other. - Peers with duplicate path endpoints could fail to expand; each peer row now
expands independently of its paths' contents. - An empty secondary-port field on the Advanced page is now treated as
0
("auto"), notnull— it no longer silently blocks Apply. - Applying node connectivity settings now reports success from the apply
itself; the best-effort refresh immediately after (which can race the
service restart and briefly fail) no longer surfaces as an apply error. - Long lists (Networks, Peers, Looking Glass) no longer clip against the
bottom edge of the window on scroll — a trailing spacer and fade soften the
edge instead.
Security
- Elevated
local.confwrites now stage the merged file in a private,0700
directory ($XDG_RUNTIME_DIR, falling back to ameshberthsubdirectory of
the cache dir) under a random,O_EXCLname before the elevated copy, and
remove it afterward — closing a TOCTOU window where another local user
could pre-plant or symlink-swap a predictably-named staged file while the
elevation prompt is pending. - Responses from the local ZeroTier API are now capped at 512 KiB (checked
againstContent-Lengthand while streaming) so a hostile process squatting
on the ZeroTier port can't OOM the poller with an oversized or unbounded
body. - Enabled a strict webview Content-Security-Policy (
default-src 'self',
scopedconnect-src/img-src/style-src/script-src) instead of running
with CSP disabled. - Refuse to send the ZeroTier access token when a non-root process holds
127.0.0.1:9993— closes a token-disclosure window if the service is
stopped and a local user squats the port. - Pinned all Rust and npm dependencies to exact versions and added a
cargo-deny supply-chain gate (advisories, license allow-list,
crates.io-only sources, banned wildcards); tightened CI workflow
permissions to least privilege.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- First-run setup wizard: detects whether ZeroTier is installed, starts the