Commit Graph
132 Commits
Author SHA1 Message Date
gadgethd 7b6e860b57 fix(topology): keep map instance stable after load 2026-08-06 13:57:38 +00:00
gadgethd be0a68995a feat(topology): render live repeater links on UK map 2026-08-06 13:37:09 +00:00
gadgethd 1c3841cc52 chore(website): spring-clean public pages 2026-08-06 13:04:39 +00:00
gadgethd 52820d004b fix(map): keep live feed viewport visible 2026-08-06 12:44:54 +00:00
gadgethd 45698318e5 feat(map): spring-clean live feed and repeater rendering 2026-08-06 11:47:46 +00:00
gadgethd 1e5bc3b299 feat(owner): clean up spring dashboard 2026-08-06 11:25:07 +00:00
gadgethd f5a2a2b93a feat(feed): load historical channel messages 2026-08-06 05:13:22 +00:00
gadgethd 61fdcd9d11 feat: first-class MeshCore channel decryption
- channelRegistry: 39 validated channel secrets committed as the service
  default (Public + 38 community/hashtag channels recovered via the
  derivation audit); MESHCORE_CHANNEL_SECRETS env appends on top
- shared buildSummary/identifyChannel (single implementation for ingest
  and offline tools)
- tools/backfillDecrypt: keyset-paginated retroactive decryption of the
  stored raw_hex corpus (idempotent, resumable)
- feed: channel scope sidebar now lists every decrypted channel
2026-08-06 01:00:05 +00:00
gadgethd f6f8290c70 Color live paths by packet identity and extend TTL 2026-08-04 11:38:49 +01:00
gadgethd 5dd15d94c1 feat(pathing): add physics gates and held-path refinement 2026-08-04 11:04:04 +01:00
gadgethd 469c84ed13 feat(pathing): slow-mode packet resolution — wait out propagation window
Backend: schedule ONE final multi-observer resolution per path-bearing
packet after the propagation window closes (default 60s, calibrated on
real first->last observer spread p50 11s / p95 34s / p99 50s; median 17
observers per packet). The final runs with the COMPLETE observer set and
pushes into the resolve cache after invalidation, so the next API read
serves the full-propagation answer. mode=slow on /path-beta/resolve-multi
returns 202 {status:pending, remainingMs} while inside the window; new
/path-beta/slow-mode status endpoint; observability table
path_slow_resolutions (migration 034). Env knobs:
PATH_SLOW_MODE_ENABLED / PATH_SLOW_MODE_WINDOW_MS / PATH_SLOW_MODE_MIN_HOPS
/ PATH_SLOW_MODE_PENDING_MAX. Best-effort: restart loss is harmless.

Frontend: pinned packets resolve in slow mode (bounded 202 retry), local
path renders meanwhile, upgraded when the final lands. Live feed unchanged.

Tests: 4 new slowMode unit tests (dedupe, disable, bound, window timing).
Backend build clean, 257/258 (1 pre-existing workerPool timing flake on
base too); frontend build clean, 74/74.
2026-08-04 10:41:09 +01:00
gadgethd 7bcabcc426 fix(map): keep live path arcs above terrain 2026-08-04 03:07:37 +01:00
gadgethd 262a8a2515 fix(map): bind live paths to resolved packets 2026-08-04 02:12:16 +01:00
gadgethd d7e5b0ff92 fix(map): stream hop animation along stable arcs 2026-08-04 01:50:14 +01:00
gadgethd bcaa35fd27 fix(map): remove inferred nodes and restore historic hops 2026-08-03 22:47:50 +01:00
gadgethd 209989832e fix(map): reduce live-path line TTL to 5s 2026-08-03 22:07:33 +01:00
gadgethd a76ab1e16b fix(map): terrain-aware live paths + airborne hop marker 2026-08-03 22:00:38 +01:00
gadgethd f103029af7 fix(map): never shift the map on node selection 2026-08-03 21:39:43 +01:00
gadgethd 884e2cfa40 test(map): update TTL assertion to 15s 2026-08-03 21:13:03 +01:00
gadgethd 143bc97100 fix(map): reduce live-path line TTL to 15s 2026-08-03 21:10:06 +01:00
gadgethd 5ba192856e fix(map): retain branched live paths 2026-08-03 20:42:50 +01:00
gadgethd 2d740ec07c fix(map): one-click node info — remove center-snap, enlarge click hitbox 2026-08-03 20:14:22 +01:00
gadgethd 1464e94075 feat(frontend): render canonical blue paths 2026-08-03 15:12:56 +01:00
gadgethd 9b5d378f1a feat: add on-demand repeater RF coverage 2026-08-03 15:12:10 +01:00
gadgethd 7ccff988d4 fix: retain concurrent live paths through TTL 2026-08-03 15:12:05 +01:00
gadgethd 693b990001 fix: animate live map paths as aerial arcs 2026-08-03 15:12:05 +01:00
gadgethd 325f30cbc0 feat: animate live paths as 3D arcs 2026-08-03 15:12:05 +01:00
gadgethd 49efd69b1e enable RF coverage with 3D terrain 2026-08-02 20:39:15 +01:00
gadgethd 1e7cd3bbff fix RF coverage terrain artifacts 2026-08-02 19:31:38 +01:00
gadgethd f808298dfd fix RF race test on mobile 2026-08-02 18:52:54 +01:00
gadgethd 31dfe37b1f fix RF overlay initial load race 2026-08-02 18:49:03 +01:00
gadgethd 4553647f54 feat: integrate HopReach RF coverage 2026-08-02 14:11:11 +01:00
gadgethd e6439fa435 chore: clean upgrade formatting 2026-08-02 03:40:53 +01:00
gadgethd 30b1117f31 fix: restore IATA metadata and lazy path resolution 2026-08-02 03:40:11 +01:00
gadgethd 5db382e181 feat: complete codebase reliability upgrade 2026-08-02 03:40:11 +01:00
gadgethd d93e817313 fix(ui): restore and improve UKMesh repeater tree modal
- Extract shared path-modal styles into pages/path-modal.css so the feed
  modal regains its panel styling (regression from 83d770a: rules only in
  stats-page.css, which the feed page never imports)
- Embed the path map in the modal above the tree
- Tree readability: Unknown hop for unresolved trace hops, matched/ambiguous/
  unmatched dot variants, decluttered meta, honest hop summary header
- Include the July-29 feed refactor (FeedDialogs/FeedPathViews/feedModel/
  feedState/PacketPathMap) already live in the deployed build
2026-08-01 22:42:45 +01:00
gadgethd 83d770a2b2 fix(ui): UKMesh visual QA fixes — cookie banner, map labels, feed, charts, site pages
Deployed fixes from visual QA of ukmesh.com / app.ukmesh.com / healthcheck.ukmesh.com:

- Cookie consent: static full-width bottom bar with reserved page spacing (no longer overlays content)
- Landing: Live Map nav marked external with arrow, hero buttons and secondary text contrast
- Map app: readable place labels in both themes, packet feed top row no longer clipped,
  aligned feed columns, bordered header tool buttons
- Site pages: dark-themed Region select, brighter topology graph, Repeaters empty state,
  Companions bar scale legend, themed Spam controls/checkbox, Install badges
- Health: firmware chart label dedupe/rotation with Include Unknown toggle
- Docs: mobile code blocks scrollable
- Health Check: No data yet empty states, contrast, status pill a11y
- Healthcheck overrides: merged empty-state and a11y changes into deployed bind-mounted files
2026-08-01 16:48:27 +01:00
gadgethd 1c8aadb339 Expand owner, packet, and map experiences 2026-07-28 23:17:28 +01:00
gadgethd 1ebc496965 Map UI redesign, live-path visibility, feed latency, and security hardening (#19)
* Fix map node freshness consistency

* Harden output, ingest, caches, and WebSocket limits

* Enforce public visibility across derived data

* Harden proxy and operator deployment boundary

* Make owner grants authoritative and reconcile ACLs safely

* Bound path, spam, and statistics analysis

* Make link and coverage jobs crash-safe

* Implement strategic security remediation

* Fix production cutover configuration

* Fix disabled viewshed worker health signal

* Serve stale stats during background refresh

* Retain stale stats through refresh windows

* Bound analytics work to protect ingestion

* Prioritize summary warmup over chart scans

* Throttle path history rebuilds

* Bound path history result memory

* Stream path history aggregation

* Give bounded path rebuild one CPU

* Serve stale charts during bounded refresh

* Prioritize startup stats before chart scans

* Bound path history segment cardinality

* Pin path rebuild context to privacy generation

* Self-host original frontend fonts

* Allow bounded path rebuild to complete

* Improve live map UI and low-latency group feed

- Dock node details on the right with selection highlight and collapsible layers
- Add node legend, 24h activity sparkline, copy-link, and layout/overlap fixes
- Keep all repeaters visible during Live Path focus
- Send GroupText feed packets immediately over WebSocket (no batch delay)
- Cache expensive stats/observer activity more aggressively to protect ingest
- Remove stale local planning/audit markdown from the tree

* fix(ci): supply OPERATOR_SITE_TOKEN for compose validation

Workers/Compose CI failed because docker-compose requires
OPERATOR_SITE_TOKEN. Add CI placeholders for that and MQTT_PASSWORD.
2026-07-27 02:39:12 +01:00
gadgethdandClaude Opus 4.8 5ea700c485 Improve text contrast for accessibility (issue #3) (#16)
Keep the dark theme but fix low-contrast, small text reported in the
repeater tree window and elsewhere:

- globals.css: --text-muted #71839b -> #8697b0. It was the only text
  token failing WCAG AA (down to 3.8:1 on the lighter panels); now
  5.0-6.6:1 on every background. primary/secondary left unchanged.
- Bump 9-10px muted/secondary labels to 11-12px (repeater-tree
  metadata, node drawer, timeline, watchlist, planner, detail panel).
- Replace hard-coded greys (#9ca3af zoom hint, #aaa popup label) with
  var(--text-muted) so they track the palette.
- Add an axe color-contrast e2e assertion on /feed to guard regressions.

Fixes #3

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 00:58:14 +01:00
gadgethd 93cc3e1b38 Expand network intelligence and harden operations (#9)
Consolidates the stacked backend, privacy, network-intelligence, frontend, operations, mobile, and owner-cache changes after resolving main conflicts and passing the full CI suite.
2026-07-23 20:50:47 +01:00
gadgethd e49b9bfb1a fix(frontend): give mobile layouts room (#12) 2026-07-19 20:21:06 +01:00
gadgethd 0b62c3b6e6 fix(frontend): keep mobile navigation collapsible (#11) 2026-07-19 19:51:40 +01:00
gadgethd 12da1689e4 Fix mobile layouts across frontend (#10)
Bound mobile navigation, controls, searches, and overlays while adding route-wide responsive browser coverage.
2026-07-18 19:16:01 +01:00
BenandClaude Sonnet 4.6 edc8206a22 Add ML path learner, Anubis bot protection, planned coverage, companion page, and misc improvements
- ml-path-learner: new Python worker that trains a prefix→node ML model from gold paths and writes scores to ml_path_prefix_scores
- lazyResolver: integrate ML scores and edge priors into tiered candidate ranking; bidirectional pass-2 propagation; global cross-group direct anchors
- Anubis: add sidecar bot-protection containers for all public HTTP services; botPolicy.yaml
- Planned coverage: new API route + frontend map layers for placing hypothetical repeaters and computing coverage
- Map: light/dark theme toggle; map-tools button group (LOS, Repeater, theme); plan-repeater mode with click-to-place/remove and polling
- Frontend: remove inferred nodes from map display (backend inference kept for internal use)
- Stats page: observer region summary, channel traffic, companion activity endpoints and UI
- UKCompanionPage: new companion activity page
- Teesside site: extracted into standalone build context (teesside-site/)
- healthcheck overrides: share.html, sw.js, region filter support, SVG score ring updates
- DB: dedicated analytics pool; DATABASE_SKIP_SCHEMA_INIT flag; path hash prefix indexes; lateral join fixes for node_link_radio_reports
- docker-compose: ml-path-learner service; anubis sidecars; DATABASE_SKIP_SCHEMA_INIT on all workers; OBSERVER_RETENTION_SECONDS; REGIONS_FILE
- backend-site: internal operator dashboard routes
- docker/mesh-health-check-entrypoint.sh: extract channel secret from MESHCORE_CHANNEL_SECRETS at startup
- scripts: observer key generation, observer registration, healthcheck tunnel check
- vacuum-compressed-chunks.sh: maintenance script

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-03 01:33:48 +00:00
Ben 9dd1e7ae62 Add feed repeater tree modal 2026-04-13 17:13:33 +00:00
BenandClaude Opus 4.6 7994e13175 Add SEO, improve path resolution, per-node antenna heights, and UI refinements
Backend: derive observer IATA from packet topic instead of node table,
send messages separately in WS initial state, add tiered prefix/edge
priors to lazy path resolver for more accurate hash disambiguation.

Frontend: add SeoHead, JsonLd, and vite-seo plugin for per-route meta
tags and structured data. Add earth-curvature correction to custom LOS
tool. Owner portal last-hop chart supports hiding/showing individual
series with cookie persistence. Feed page and path map refactored.
Cache-busting build filenames. Track firstSeenTs on aggregated packets.

Infra: serve robots.txt and sitemap.xml via nginx, add manifest.json,
reduce Mosquitto log verbosity. Viewshed worker supports per-node
antenna heights, configurable profile step, and SNR-median calibration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 17:22:31 +00:00
BenandClaude Opus 4.6 7ba12893b9 Remove gitignored TeessieDashboard import that breaks fresh builds
The teesside page directory is gitignored but main.tsx still imported
TeessieDashboard, causing TS2307 on any clean clone. Remove the import
and redirect the teesside index route to /install inside Layout.

Fixes #1

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-27 17:20:30 +00:00
BenandClaude Sonnet 4.6 587093d48a Add multi-node LOS overlay with terrain profile and custom LOS tool
- Multi-node LOS: multiple repeaters can have LOS active simultaneously,
  each auto-expiring after 15 seconds; LOS persists after popup closes
- Custom LOS tool: desktop-only map button to sample terrain between two
  points (click map or repeater); renders per-segment green/clear or
  red/obstructed based on terrain height; prohibited nodes are excluded
- Terrain exaggeration: deck.gl altitudes multiplied by exaggeration factor
  (2×) to match MapLibre's visual terrain mesh
- LOS line rendering: bloom+core PathLayer tube effect with ScatterplotLayer
  endpoint markers; popup z-index fix so it renders above deck.gl canvas
- Terrain sampler: client-side Terrarium PNG tile decoder for elevation sampling
- DB schema: terrain_profile_json JSONB column added to node_links
- Nginx: terrain tile serving block added
- Docker: terrain tiles volume mount added

Excluded: PacketDetailPanel, UKFeedPage, styles/globals.css (unrelated local
changes), backfill_profiles.py (server-side utility, not intended for repo)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-24 01:15:39 +00:00
BenandClaude Sonnet 4.6 015dfd2bab Fix terrain toggle, preference restore, and low-zoom crash
- Load terrain source and hillshade dynamically (only when 3D mode is on)
  to prevent tile loading at idle, fixing low-zoom WebGL crash
- Restore terrain correctly on page reload by applying inside map load handler
- Clean up source, hillshade, and sky layers fully when terrain is toggled off
- Raise minZoom to 6 to prevent crash at extreme zoom-out
- Reduce terrain exaggeration to 3x as a stable middle ground

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-23 01:12:41 +00:00