- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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