Skip to content

Latest commit

 

History

History
446 lines (418 loc) · 41.4 KB

File metadata and controls

446 lines (418 loc) · 41.4 KB

CHANGELOG

v0.5.9

  • Matrix: listen for synapse on port 41448 by @l5yth in #607
  • Web: collapse federation map ledgend by @l5yth in #604
  • Web: fix stale node queries by @l5yth in #603
  • Matrix: move short name to display name by @l5yth in #602
  • Ci: update ruby to 4 by @l5yth in #601
  • Web: display traces of last 28 days if available by @l5yth in #599
  • Web: establish menu structure by @l5yth in #597
  • Matrix: fixed the text-message checkpoint regression by @l5yth in #595
  • Matrix: cache seen messages by rx_time not id by @l5yth in #594
  • Web: hide the default '0' tab when not active by @l5yth in #593
  • Matrix: fix empty bridge state json by @l5yth in #592
  • Web: allow certain charts to overflow upper bounds by @l5yth in #585
  • Ingestor: support ROUTING_APP messages by @l5yth in #584
  • Ci: run nix flake check on ci by @l5yth in #583
  • Web: hide legend by default by @l5yth in #582
  • Nix flake by @benjajaja in #577
  • Support BLE UUID format for macOS Bluetooth devices by @apo-mak in #575
  • Web: add mesh.qrp.ro as seed node by @l5yth in #573
  • Web: ensure unknown nodes for messages and traces by @l5yth in #572
  • Chore: bump version to 0.5.9 by @l5yth in #569

v0.5.8

  • Web: add secondary seed node jmrp.io by @l5yth in #568
  • Data: implement whitelist for ingestor by @l5yth in #567
  • Web: add ?since= parameter to all apis by @l5yth in #566
  • Matrix: fix docker build by @l5yth in #565
  • Matrix: fix docker build by @l5yth in #564
  • Web: fix federation signature validation and create fallback by @l5yth in #563
  • Chore: update readme by @l5yth in #561
  • Matrix: add docker file for bridge by @l5yth in #556
  • Matrix: add health checks to startup by @l5yth in #555
  • Matrix: omit the api part in base url by @l5yth in #554
  • App: add utility coverage tests for main.dart by @l5yth in #552
  • Data: add thorough daemon unit tests by @l5yth in #553
  • Chore: bump version to 0.5.8 by @l5yth in #551

v0.5.7

  • Data: track ingestors heartbeat by @l5yth in #549
  • Harden instance selector navigation URLs by @l5yth in #550
  • Data: hide channels that have been flag for ignoring by @l5yth in #548
  • Web: fix limit when counting remote nodes by @l5yth in #547
  • Web: improve instances map and table view by @l5yth in #546
  • Web: fix traces submission with optional fields on udp by @l5yth in #545
  • Chore: bump version to 0.5.7 by @l5yth in #542
  • Handle zero telemetry aggregates by @l5yth in #538
  • Web: fix telemetry api to return current in amperes by @l5yth in #541
  • Web: fix traces rendering by @l5yth in #535
  • Normalize numeric node roles to canonical labels by @l5yth in #539
  • Use INSTANCE_DOMAIN env for ingestor by @l5yth in #536
  • Web: further refine the federation page by @l5yth in #534
  • Add Federation Map by @apo-mak in #532
  • Add contact link to the instance data by @apo-mak in #533
  • Matrix: create potato-matrix-bridge by @l5yth in #528

v0.5.6

  • Web: display sats in view by @l5yth in #523
  • Web: display air quality in separate chart by @l5yth in #521
  • Ci: Add macOS and Ubuntu builds to Flutter workflow by @l5yth in #519
  • Web: add current to charts by @l5yth in #520
  • App: fix notification icon by @l5yth in #518
  • Spec: update test fixtures by @l5yth in #517
  • App: generate proper icons by @l5yth in #516
  • Web: fix favicon by @l5yth in #515
  • Web: add ?since= parameter to api/messages by @l5yth in #512
  • App: implement notifications by @l5yth in #511
  • App: add theme selector by @l5yth in #507
  • App: further harden refresh logic and prefer local first by @l5yth in #506
  • Ci: fix app artifacts for tags by @l5yth in #504
  • Ci: build app artifacts for tags by @l5yth in #503
  • App: add persistance by @l5yth in #501
  • App: instance and chat mvp by @l5yth in #498
  • App: add instance selector to settings by @l5yth in #497
  • App: add scaffholding gitignore by @l5yth in #496
  • Handle reaction app packets without reply id by @l5yth in #495
  • Render reaction multiplier counts by @l5yth in #494
  • Add comprehensive tests for Flutter reader by @l5yth in #491
  • Map numeric role ids to canonical Meshtastic roles by @l5yth in #489
  • Update node detail hydration for traces by @l5yth in #490
  • Add mobile Flutter CI workflow by @l5yth in #488
  • Align OCI labels in docker workflow by @l5yth in #487
  • Add Meshtastic reader Flutter app by @l5yth in #483
  • Handle pre-release Docker tagging by @l5yth in #486
  • Web: remove range from charts labels by @l5yth in #485
  • Floor override frequencies to MHz integers by @l5yth in #476
  • Prevent message ids from being treated as node identifiers by @l5yth in #475
  • Fix 1 after emojis in reply. by @Alexkurd in #464
  • Add frequency and preset to node table by @l5yth in #472
  • Subscribe to traceroute app pubsub topic by @l5yth in #471
  • Aggregate telemetry over the last 7 days by @l5yth in #470
  • Address missing id field ingestor bug by @l5yth in #469
  • Merge secondary channels by name by @l5yth in #468
  • Rate limit host device telemetry by @l5yth in #467
  • Add traceroutes to frontend by @l5yth in #466
  • Feat: implement traceroute app packet handling across the stack by @l5yth in #463
  • Bump version and update changelog by @l5yth in #462

v0.5.5

  • Added comprehensive helper unit tests by @l5yth in #457
  • Added reaction-aware handling by @l5yth in #455
  • Env: add map zoom by @l5yth in #454
  • Charts: render aggregated telemetry charts for all nodes by @l5yth in #453
  • Nodes: render charts detail pages as overlay by @l5yth in #452
  • Fix telemetry parsing for charts by @l5yth in #451
  • Nodes: improve charts on detail pages by @l5yth in #450
  • Nodes: add charts to detail pages by @l5yth in #449
  • Aggregate frontend snapshots across views by @l5yth in #447
  • Remove added 1 if reply with emoji by @Alexkurd in #443
  • Refine node detail view layout by @l5yth in #442
  • Enable map centering from node table coordinates by @l5yth in #439
  • Add node detail route and page by @l5yth in #441
  • Ensure Meshtastic nodeinfo patch runs before importing interfaces by @l5yth in #440
  • Filter zero-valued fields from API responses by @l5yth in #438
  • Add debug payload tracing and ignored packet logging by @l5yth in #437
  • Tighten map auto-fit behaviour by @l5yth in #435
  • Fetch encrypted chat log entries for log tab by @l5yth in #434
  • Add encrypted filter to messages API by @l5yth in #432
  • Guard NodeInfo handler against missing IDs by @l5yth in #431
  • Add standalone full-screen map, chat, and nodes views by @l5yth in #429
  • Ensure chat history fetches full message limit by @l5yth in #428
  • Fix ingestion of nodeinfo packets missing ids (#426) by @l5yth in #427
  • Chore: update license headers by @l5yth in #424
  • Chore: bump version to 0.5.5 by @l5yth in #423

v0.5.4

  • Handle naming when primary channel has a name by @l5yth in #422
  • Handle edge case when primary channel has a name by @l5yth in #421
  • Add preset mode to logs by @l5yth in #420
  • Parallelize federation tasks with worker pool by @l5yth in #419
  • Allow filtering chat and logs by node name by @l5yth in #417
  • Gem: Add erb as dependency removed from std by @l5yth in #416
  • Implement support for replies and reactions app by @l5yth in #411
  • Ingestor: Ignore direct messages on default channel by @l5yth in #414
  • Agents: Add instructions by @l5yth in #410
  • Display encrypted messages in frontend log window by @l5yth in #409
  • Add chat log entries for telemetry, position, and neighbor events by @l5yth in #408
  • Handle missing instance domain outside production by @l5yth in #405
  • Add tabbed chat panel with channel grouping by @l5yth in #404
  • Normalize numeric client roles using Meshtastic CLI enums by @l5yth in #402
  • Ensure Docker images publish versioned tags by @l5yth in #403
  • Document environment configuration variables by @l5yth in #400
  • Document federation refresh cadence by @l5yth in #401
  • Add Prometheus monitoring documentation by @l5yth in #399
  • Config: Read PROM_REPORT_IDS from environment by @nicjansma in #398
  • Feat: Mesh-Ingestor: Ability to provide already-existing interface instance by @KenADev in #395
  • Fix: Mesh-Ingestor: Fix error for non-existing datetime.UTC reference by @KenADev in #396
  • Chore: bump version to 0.5.4 by @l5yth in #388

v0.5.3

  • Add telemetry formatting utilities and extend node overlay by @l5yth in #387
  • Prune blank values from API responses by @l5yth in #386
  • Add full support to telemetry schema and API by @l5yth in #385
  • Respect PORT environment override by @l5yth in #384
  • Add instance selector dropdown for federation deployments by @l5yth in #382
  • Harden federation announcements by @l5yth in #381
  • Ensure private mode disables federation by @l5yth in #380
  • Ensure private mode disables chat messaging by @l5yth in #378
  • Disable federation features when FEDERATION=0 by @l5yth in #379
  • Expose PRIVATE environment configuration across tooling by @l5yth in #377
  • Fix frontend coverage export for Codecov by @l5yth in #376
  • Restrict /api/instances results to recent records by @l5yth in #374
  • Expose FEDERATION environment option across tooling by @l5yth in #375
  • Chore: bump version to 0.5.3 by @l5yth in #372

v0.5.2

  • Align theme and info controls by @l5yth in #371
  • Fixes POST request 403 errors on instances behind Cloudflare proxy by @varna9000 in #368
  • Delay initial federation announcements by @l5yth in #366
  • Ensure well-known document stays in sync on startup by @l5yth in #365
  • Guard federation DNS resolution against restricted networks by @l5yth in #362
  • Add federation ingestion limits and tests by @l5yth in #364
  • Prefer reported primary channel names by @l5yth in #363
  • Decouple message API node hydration by @l5yth in #360
  • Fix ingestor reconnection detection by @l5yth in #361
  • Harden instance domain validation by @l5yth in #359
  • Ensure INSTANCE_DOMAIN propagates to containers by @l5yth in #358
  • Chore: bump version to 0.5.2 by @l5yth in #356
  • Gracefully retry federation announcements over HTTP by @l5yth in #355

v0.5.1

  • Recursively ingest federated instances by @l5yth in #353
  • Remove federation timeout environment overrides by @l5yth in #352
  • Close unrelated short info overlays when opening short info by @l5yth in #351
  • Improve federation instance error diagnostics by @l5yth in #350
  • Harden federation domain validation and tests by @l5yth in #347
  • Handle malformed instance records gracefully by @l5yth in #348
  • Fix ingestor device mounting for non-serial connections by @l5yth in #346
  • Ensure Docker deployments persist keyfile and well-known assets by @l5yth in #345
  • Add modem preset display to node overlay by @l5yth in #340
  • Display message frequency and channel in chat log by @l5yth in #339
  • Bump fallback version string to v0.5.1 by @l5yth in #338
  • Docs: update changelog for 0.5.0 by @l5yth in #337
  • Fix ingestor docker import path by @l5yth in #336

v0.5.0

  • Ensure node overlays appear above fullscreen map by @l5yth in #333
  • Adjust node table columns responsively by @l5yth in #332
  • Add LoRa metadata fields to nodes and messages by @l5yth in #331
  • Add channel metadata capture for message tagging by @l5yth in #329
  • Capture radio metadata for ingestor payloads by @l5yth in #327
  • Fix FrozenError when filtering node query results by @l5yth in #324
  • Ensure frontend reports git-aware version strings by @l5yth in #321
  • Ensure web Docker image ships application sources by @l5yth in #322
  • Refine stacked short info overlays on the map by @l5yth in #319
  • Refine environment configuration defaults by @l5yth in #318
  • Fix legacy configuration migration to XDG directories by @l5yth in #317
  • Adopt XDG base directories for app data and config by @l5yth in #316
  • Refactor: streamline ingestor environment variables by @l5yth in #314
  • Adjust map auto-fit padding and default zoom by @l5yth in #315
  • Ensure APIs filter stale data and refresh node details from latest sources by @l5yth in #312
  • Improve offline tile fallback initialization by @l5yth in #307
  • Add fallback for offline tile rendering errors by @l5yth in #306
  • Fix map auto-fit handling and add controller by @l5yth in #311
  • Fix map initialization bounds and add coverage by @l5yth in #305
  • Increase coverage for configuration and sanitizer helpers by @l5yth in #303
  • Add comprehensive theme and background front-end tests by @l5yth in #302
  • Document sanitization and helper modules by @l5yth in #301
  • Add in-repo Meshtastic protobuf stubs for tests by @l5yth in #300
  • Handle CRL lookup failures during federation TLS by @l5yth in #299
  • Ensure JavaScript workflow runs frontend tests by @l5yth in #298
  • Unify structured logging across application and ingestor by @l5yth in #296
  • Add Apache license headers to missing sources by @l5yth in #297
  • Update workflows for ingestor, sinatra, and frontend by @l5yth in #295
  • Fix IPv6 instance domain canonicalization by @l5yth in #294
  • Handle federation HTTPS CRL verification failures by @l5yth in #293
  • Adjust federation announcement interval to eight hours by @l5yth in #292
  • Restore modular app functionality by @l5yth in #291
  • Refactor config and metadata helpers into PotatoMesh modules by @l5yth in #290
  • Update default site configuration defaults by @l5yth in #288
  • Add regression test for queue drain concurrency by @l5yth in #287
  • Ensure Docker config directories are created for non-root user by @l5yth in #286
  • Clarify numeric address requirement for network target parsing by @l5yth in #285
  • Ensure mesh ingestor queue resets active flag when idle by @l5yth in #284
  • Clarify BLE connection description in README by @l5yth in #283
  • Configure web container for production mode by @l5yth in #282
  • Normalize INSTANCE_DOMAIN configuration to require hostnames by @l5yth in #280
  • Avoid blocking startup on federation announcements by @l5yth in #281
  • Fix production Docker builds for web and ingestor images by @l5yth in #279
  • Improve instance domain detection logic by @l5yth in #278
  • Implement federation announcements and instances API by @l5yth in #277
  • Fix federation signature handling and IP guard by @l5yth in #276
  • Add persistent federation metadata endpoint by @l5yth in #274
  • Add configurable instance domain with reverse DNS fallback by @l5yth in #272
  • Document production deployment configuration by @l5yth in #273
  • Add targeted API endpoints and expose version metadata by @l5yth in #271
  • Prometheus metrics updates on startup and for position/telemetry by @nicjansma in #270
  • Add hourly reconnect handling for inactive mesh interface by @l5yth in #267
  • Dockerfile fixes by @nicjansma in #268
  • Added prometheus /metrics endpoint by @nicjansma in #262
  • Add fullscreen toggle to map view by @l5yth in #263
  • Relocate JS coverage export script into web directory by @l5yth in #266
  • V0.4.0 version string in web UI by @nicjansma in #265
  • Add energy saving cycle to ingestor daemon by @l5yth in #256
  • Chore: restore apache headers by @l5yth in #260
  • Docs: add matrix to readme by @l5yth in #259
  • Force dark theme default based on sanitized cookie by @l5yth in #252
  • Document mesh ingestor modules with PDoc-style docstrings by @l5yth in #255
  • Handle missing node IDs in Meshtastic nodeinfo packets by @l5yth in #251
  • Document Ruby helper methods with RDoc comments by @l5yth in #254
  • Add JSDoc documentation across client scripts by @l5yth in #253
  • Fix mesh ingestor telemetry and neighbor handling by @l5yth in #249
  • Refactor front-end assets into external modules by @l5yth in #245
  • Add tests for helper utilities and asset routes by @l5yth in #243
  • Docs: add ingestor inline docstrings by @l5yth in #244
  • Add comprehensive coverage tests for mesh ingestor by @l5yth in #241
  • Add inline documentation to config helpers and frontend scripts by @l5yth in #240
  • Update changelog by @l5yth in #238

v0.4.0

  • Reformat neighbor overlay layout by @l5yth in #237
  • Add legend toggle for neighbor lines by @l5yth in #236
  • Hide Air Util Tx column on mobile by @l5yth in #235
  • Add overlay for clickable neighbor links on map by @l5yth in #234
  • Hide humidity and pressure columns on mobile by @l5yth in #232
  • Remove last position timestamp from map info overlay by @l5yth in #233
  • Improve live node positions and expose precision metadata by @l5yth in #231
  • Show neighbor short names in info overlays by @l5yth in #228
  • Add telemetry environment metrics to node UI by @l5yth in #227
  • Reduce neighbor line opacity by @l5yth in #226
  • Visualize neighbor connections on map canvas by @l5yth in #224
  • Add clear control to filter input by @l5yth in #225
  • Handle Bluetooth shutdown hangs gracefully by @l5yth in #221
  • Adjust mesh priorities and receive topics by @l5yth in #220
  • Add BLE and fallback mesh interface handling by @l5yth in #219
  • Add neighbor info ingestion and API endpoints by @l5yth in #218
  • Add debug logs for unknown node creation and last-heard updates by @l5yth in #214
  • Update node last seen when events are received by @l5yth in #212
  • Improve debug logging for node and telemetry data by @l5yth in #213
  • Normalize stored message debug output by @l5yth in #211
  • Stop repeating ingestor node info snapshot and timestamp debug logs by @l5yth in #210
  • Add telemetry API and ingestion support by @l5yth in #205
  • Add private mode to hide chat and message APIs by @l5yth in #204
  • Handle offline-ready map fallback by @l5yth in #202
  • Add linux/armv7 container builds and configuration options by @l5yth in #201
  • Update Docker documentation by @l5yth in #200
  • Update node last seen when ingesting encrypted messages by @l5yth in #198
  • Fix api in readme by @l5yth in #197

v0.3.0

  • Add connection recovery for TCP interface by @l5yth in #186
  • Bump version to 0.3 by @l5yth in #191
  • Pgrade styles and fix interface issues by @l5yth in #190
  • Some updates in the front by @dkorotkih2014-hub in #188
  • Update last heard on node entry change by @l5yth in #185
  • Populate chat metadata for unknown nodes by @l5yth in #182
  • Update role color theme to latest palette by @l5yth in #183
  • Add placeholder nodes for unknown senders by @l5yth in #181
  • Update role colors and ordering for firmware 2.7.10 by @l5yth in #180
  • Handle plain IP addresses in mesh TCP detection by @l5yth in #154
  • Handle encrypted messages by @l5yth in #173
  • Add fallback display names for unnamed nodes by @l5yth in #171
  • Ensure routers render above other node types by @l5yth in #169
  • Move lint checks after tests in CI by @l5yth in #168
  • Handle proto values in nodeinfo payloads by @l5yth in #167
  • Remove raw payload storage from database schema by @l5yth in #166
  • Add POSITION_APP ingestion and API support by @l5yth in #160
  • Add support for NODEINFO_APP packets by @l5yth in #159
  • Derive SEO metadata from existing config values by @l5yth in #153
  • Tests: create helper script to dump all mesh data from serial by @l5yth in #152
  • Limit chat log to recent entries by @l5yth in #151
  • Require time library before formatting ISO timestamps by @l5yth in #149
  • Define docker compose network by @l5yth in #148
  • Fix sqlite3 native extension on Alpine by @l5yth in #146
  • Fix web app startup binding by @l5yth in #147
  • Ensure sqlite3 builds from source on Alpine by @l5yth in #145
  • Support mock serial interface in CI by @l5yth in #143
  • Fix Docker workflow matrix for supported platforms by @l5yth in #142
  • Add clickable role filters to the map legend by @l5yth in #140
  • Rebuild chat log on each refresh by @l5yth in #139
  • Fix: retain alpine runtime libs after removing build deps by @l5yth in #138
  • Fix: support windows ingestor build by @l5yth in #136
  • Fix: use supported ruby image by @l5yth in #135
  • Feat: Add comprehensive Docker support by @trose in #122
  • Chore: bump version to 0.2.1 by @l5yth in #134
  • Fix dark mode tile styling on new map tiles by @l5yth in #132
  • Switch map tiles to OSM HOT and add theme filters by @l5yth in #130
  • Add footer version display by @l5yth in #128
  • Add responsive controls for map legend by @l5yth in #129
  • Update changelog by @l5yth in #119

v0.2.0

  • Update readme for 0.2 by @l5yth in #118
  • Add PotatoMesh logo to header and favicon by @l5yth in #117
  • Harden API auth and request limits by @l5yth in #116
  • Add client-side sorting to node table by @l5yth in #114
  • Add short name overlay for node details by @l5yth in #111
  • Adjust python ingestor interval to 60 seconds by @l5yth in #112
  • Hide location columns on medium screens by @l5yth in #109
  • Handle message updates based on sender info by @l5yth in #108
  • Prioritize node posts in queued API updates by @l5yth in #107
  • Add auto-refresh toggle to UI by @l5yth in #105
  • Adjust Leaflet popup styling for dark mode by @l5yth in #104
  • Add site info overlay by @l5yth in #103
  • Add long name tooltip to short name badge by @l5yth in #102
  • Ensure node numeric aliases are derived from canonical IDs by @l5yth in #101
  • Chore: clean up repository by @l5yth in #96
  • Handle SQLite busy errors when upserting nodes by @l5yth in #100
  • Configure Sinatra logging level from DEBUG flag by @l5yth in #97
  • Add penetration tests for authentication and SQL injection by @l5yth in #95
  • Document Python and Ruby source modules by @l5yth in #94
  • Add tests covering mesh helper edge cases by @l5yth in #93
  • Fix py code cov by @l5yth in #92
  • Add Codecov reporting to Python CI by @l5yth in #91
  • Skip null identifiers when selecting packet fields by @l5yth in #88
  • Create python yml ga by @l5yth in #90
  • Add unit tests for mesh ingestor script by @l5yth in #89
  • Add coverage for debug logging on messages without sender by @l5yth in #86
  • Handle concurrent node snapshot updates by @l5yth in #85
  • Fix ingestion mapping for message sender IDs by @l5yth in #84
  • Add coverage for API authentication and payload edge cases by @l5yth in #83
  • Add JUnit test reporting to Ruby CI by @l5yth in #82
  • Configure SimpleCov reporting for Codecov by @l5yth in #81
  • Update codecov job by @l5yth in #80
  • Fix readme badges by @l5yth in #79
  • Add Codecov upload step to Ruby workflow by @l5yth in #78
  • Add Apache license headers to source files by @l5yth in #77
  • Add integration specs for node and message APIs by @l5yth in #76
  • Docs: update for 0.2.0 release by @l5yth in #75
  • Create ruby workflow by @l5yth in #74
  • Add RSpec smoke tests for app boot and database init by @l5yth in #73
  • Align refresh controls with status text by @l5yth in #72
  • Improve mobile layout by @l5yth in #68
  • Normalize message sender IDs using node numbers by @l5yth in #67
  • Style: condense node table by @l5yth in #65
  • Log debug details for messages without sender by @l5yth in #64
  • Fix nested dataclass serialization for node snapshots by @l5yth in #63
  • Log node object on snapshot update failure by @l5yth in #62
  • Initialize database on startup by @l5yth in #61
  • Send mesh data to Potatomesh API by @l5yth in #60
  • Convert boolean flags for SQLite binding by @l5yth in #59
  • Use packet id as message primary key by @l5yth in #58
  • Add message ingestion API and stricter auth by @l5yth in #56
  • Feat: parameterize community info by @l5yth in #55
  • Feat: add dark mode toggle by @l5yth in #54

v0.1.0

  • Show daily node count in title and header by @l5yth in #49
  • Add daily date separators to chat log by @l5yth in #47
  • Feat: make frontend responsive for mobile by @l5yth in #46
  • Harden mesh utilities by @l5yth in #45
  • Filter out distant nodes from Berlin map view by @l5yth in #43
  • Display filtered active node counts in #MediumFast subheading by @l5yth in #44
  • Limit chat log and highlight short names by role by @l5yth in #42
  • Fix string/integer comparison in node query by @l5yth in #40
  • Escape chat message and node entries by @l5yth in #39
  • Sort chat entries by timestamp by @l5yth in #38
  • Feat: append messages to chat log by @l5yth in #36
  • Normalize future timestamps for nodes by @l5yth in #35
  • Optimize web frontend and Ruby app by @l5yth in #32
  • Add messages API endpoint with node details by @l5yth in #33
  • Clamp node timestamps and sync last_heard with position time by @l5yth in #31
  • Refactor: replace deprecated utcfromtimestamp by @l5yth in #30
  • Add optional debug logging for node and message operations by @l5yth in #29
  • Data: enable serial collection of messages on channel 0 by @l5yth in #25
  • Add first_heard timestamp by @l5yth in #23
  • Add persistent footer with contact information by @l5yth in #22
  • Sort initial chat entries by last-heard by @l5yth in #20
  • Display position time in relative 'time ago' format by @l5yth in #19
  • Adjust marker size and map tile opacity by @l5yth in #18
  • Add chat box for node notifications by @l5yth in #17
  • Color markers by role with grayscale map by @l5yth in #16
  • Default missing node role to client by @l5yth in #15
  • Show live node count in nodes page titles by @l5yth in #14
  • Filter stale nodes and add live search by @l5yth in #13
  • Remove raw node JSON column by @l5yth in #12
  • Add JSON ingest API for node updates by @l5yth in #11
  • Ignore Python pycache directories by @l5yth in #10
  • Feat: load nodes from json for tests by @l5yth in #8
  • Handle dataclass fields in node snapshots by @l5yth in #6
  • Add index page and /nodes route for node map by @l5yth in #4