{
  "id": "meshcore-hub",
  "name": "MeshCore Hub",
  "kind": "gateway",
  "status": "active",
  "maturity": "beta",
  "description": "Self-hosted MeshCore network collection platform that ingests decoded packet events over MQTT, persists messages and telemetry, and provides a web dashboard, REST API, authentication, metrics and remote observer support.",
  "image": "logo.svg",
  "screenshots": [
    {
      "file": "dashboard.png",
      "caption": "MeshCore Hub network dashboard"
    }
  ],
  "maintainers": [
    {
      "name": "IPNet Mesh",
      "url": "https://github.com/ipnet-mesh"
    }
  ],
  "repository": "https://github.com/ipnet-mesh/meshcore-hub",
  "website": "https://ipnt.uk/",
  "documentation": "https://github.com/ipnet-mesh/meshcore-hub/tree/main/docs",
  "license": "GPL-3.0-only",
  "languages": [
    "python",
    "javascript"
  ],
  "platforms": [
    "docker",
    "linux",
    "web"
  ],
  "interfaces": [
    "web",
    "api",
    "headless"
  ],
  "connections": [
    "mqtt",
    "serial",
    "usb",
    "http",
    "websocket"
  ],
  "node_roles": [
    "companion",
    "repeater",
    "room-server"
  ],
  "capabilities": [
    "messaging",
    "contacts",
    "monitoring",
    "telemetry",
    "packet-analysis",
    "mapping",
    "automation",
    "notifications",
    "bridging"
  ],
  "install": [
    {
      "type": "docker-compose",
      "package": "ghcr.io/ipnet-mesh/meshcore-hub",
      "url": "https://github.com/ipnet-mesh/meshcore-hub#getting-started",
      "command": "docker compose -f docker-compose.yml -f docker-compose.dev.yml --profile all up -d"
    },
    {
      "type": "source",
      "url": "https://github.com/ipnet-mesh/meshcore-hub"
    }
  ],
  "popularity": {
    "githubStars": 51,
    "githubForks": 9,
    "githubWatchers": 2,
    "githubOpenIssues": 3,
    "githubContributors": 6,
    "latestReleaseDownloads": 0,
    "lastChecked": "2026-07-21",
    "releaseDownloads": 0
  },
  "verification": {
    "sourceAvailable": true,
    "releasesAvailable": true,
    "signedReleases": false,
    "ciBuilds": true,
    "hasDocumentation": true,
    "lastChecked": "2026-07-21",
    "notes": [
      "Uses meshcore-packet-capture observers to decode RF traffic and publish normalized events to MQTT.",
      "PostgreSQL is becoming the required database backend; SQLite remains temporarily supported during migration."
    ]
  },
  "tags": [
    "collector",
    "mqtt",
    "self-hosted",
    "observability",
    "multi-observer"
  ],
  "last_reviewed": "2026-06-23",
  "source": {
    "path": "data/software/meshcore-hub/software.yaml",
    "updatedAt": "2026-07-21T08:04:18Z"
  },
  "latest_version": "0.16.2",
  "released": "2026-07-20",
  "releases": [
    {
      "version": "v0.16.2",
      "name": "v0.16.2",
      "datetime": "2026-07-20T14:13:53Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.16.2",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat(routes): add per-route max_path_length cap by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/321\r\n* chore(deps): update actions/setup-python action to v7 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/320\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.1...v0.16.2",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat(routes): add per-route max_path_length cap by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/321\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/321</a></li>\n<li>chore(deps): update actions/setup-python action to v7 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/320\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/320</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.1...v0.16.2\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.1...v0.16.2</a></p>\n"
    },
    {
      "version": "v0.16.1",
      "name": "v0.16.1",
      "datetime": "2026-07-19T22:16:58Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.16.1",
      "prerelease": false,
      "notes": "## What's Changed\r\n* fix(routes): clearing observers in the edit modal now persists by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/319\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.0...v0.16.1",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>fix(routes): clearing observers in the edit modal now persists by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/319\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/319</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.0...v0.16.1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.16.0...v0.16.1</a></p>\n"
    },
    {
      "version": "v0.16.0",
      "name": "v0.16.0",
      "datetime": "2026-07-19T21:09:36Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.16.0",
      "prerelease": false,
      "notes": "## What's Changed\r\n* chore(deps): update anomalyco/opencode action to v1.17.18 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/303\r\n* chore(deps): update dependency daisyui to v5.6.16 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/302\r\n* Add GitHub funding link to FUNDING.yml by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/304\r\n* chore(deps): update dependency daisyui to v5.6.18 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/305\r\n* chore(deps): update tailwindcss monorepo to v4.3.3 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/309\r\n* chore(deps): update anomalyco/opencode action to v1.18.3 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/307\r\n* feat: Route Health Monitoring by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/308\r\n* feat: HTTP Cache-Control, dashboard TTL bump, and route event-hash dedup by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/310\r\n* fix: route_result not refreshing after route edit (plus cache invalidation infra) by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/311\r\n* chore(deps): update fontsource monorepo to v5.3.0 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/312\r\n* feat: dashboard route widgets + cache TTL consolidation by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/313\r\n* feat: precompute route health + consolidated migration + observer badge fix by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/314\r\n* UI polish: modal save spinners + route list sort by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/315\r\n* chore(routes): default window_hours=48 and max_hop_span=8 by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/316\r\n* chore(routes): default packet_count_threshold=5 and 3× clear multiplier by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/317\r\n* feat(dashboard): limit Route Health widget to community routes by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/318\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.10...v0.16.0",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>chore(deps): update anomalyco/opencode action to v1.17.18 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/303\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/303</a></li>\n<li>chore(deps): update dependency daisyui to v5.6.16 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/302\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/302</a></li>\n<li>Add GitHub funding link to FUNDING.yml by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/304\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/304</a></li>\n<li>chore(deps): update dependency daisyui to v5.6.18 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/305\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/305</a></li>\n<li>chore(deps): update tailwindcss monorepo to v4.3.3 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/309\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/309</a></li>\n<li>chore(deps): update anomalyco/opencode action to v1.18.3 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/307\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/307</a></li>\n<li>feat: Route Health Monitoring by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/308\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/308</a></li>\n<li>feat: HTTP Cache-Control, dashboard TTL bump, and route event-hash dedup by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/310\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/310</a></li>\n<li>fix: route_result not refreshing after route edit (plus cache invalidation infra) by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/311\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/311</a></li>\n<li>chore(deps): update fontsource monorepo to v5.3.0 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/312\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/312</a></li>\n<li>feat: dashboard route widgets + cache TTL consolidation by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/313\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/313</a></li>\n<li>feat: precompute route health + consolidated migration + observer badge fix by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/314\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/314</a></li>\n<li>UI polish: modal save spinners + route list sort by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/315\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/315</a></li>\n<li>chore(routes): default window_hours=48 and max_hop_span=8 by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/316\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/316</a></li>\n<li>chore(routes): default packet_count_threshold=5 and 3× clear multiplier by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/317\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/317</a></li>\n<li>feat(dashboard): limit Route Health widget to community routes by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/318\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/318</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.10...v0.16.0\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.10...v0.16.0</a></p>\n"
    },
    {
      "version": "v0.15.10",
      "name": "v0.15.10",
      "datetime": "2026-07-07T21:31:59Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.10",
      "prerelease": false,
      "notes": "## What's Changed\r\n* chore(deps): update dependency daisyui to v5.6.14 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/300\r\n* chore(deps): update anomalyco/opencode action to v1.17.15 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/299\r\n* feat(web): group observer filter badges by area tag by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/301\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.9...v0.15.10",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>chore(deps): update dependency daisyui to v5.6.14 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/300\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/300</a></li>\n<li>chore(deps): update anomalyco/opencode action to v1.17.15 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/299\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/299</a></li>\n<li>feat(web): group observer filter badges by area tag by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/301\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/301</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.9...v0.15.10\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.9...v0.15.10</a></p>\n"
    },
    {
      "version": "v0.15.8",
      "name": "v0.15.8",
      "datetime": "2026-07-04T14:21:41Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.8",
      "prerelease": false,
      "notes": "## What's Changed\r\n* Updated Observer Documentation/Examples by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/296\r\n* feat: add packet breakdown charts to dashboard by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/297\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.7...v0.15.8",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>Updated Observer Documentation/Examples by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/296\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/296</a></li>\n<li>feat: add packet breakdown charts to dashboard by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/297\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/297</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.7...v0.15.8\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.7...v0.15.8</a></p>\n"
    },
    {
      "version": "v0.15.7",
      "name": "v0.15.7",
      "datetime": "2026-07-04T09:58:30Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.7",
      "prerelease": false,
      "notes": "## What's Changed\r\n* fix(web): 2x2 dashboard charts on mobile landscape & path-node popover scroll by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/295\r\n* chore(deps): update dependency daisyui to v5.6.13 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/294\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.6...v0.15.7",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>fix(web): 2x2 dashboard charts on mobile landscape &amp; path-node popover scroll by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/295\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/295</a></li>\n<li>chore(deps): update dependency daisyui to v5.6.13 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/294\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/294</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.6...v0.15.7\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.6...v0.15.7</a></p>\n"
    },
    {
      "version": "v0.15.6",
      "name": "v0.15.6",
      "datetime": "2026-07-03T23:13:52Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.6",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat: persist path_hash_bytes column and add packet list filter by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/293\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.5...v0.15.6",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat: persist path_hash_bytes column and add packet list filter by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/293\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/293</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.5...v0.15.6\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.5...v0.15.6</a></p>\n"
    },
    {
      "version": "v0.15.5",
      "name": "v0.15.5",
      "datetime": "2026-07-03T21:46:44Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.5",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat(web): expandable JSON tree, packet path flow, chart polish by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/292\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.4...v0.15.5",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat(web): expandable JSON tree, packet path flow, chart polish by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/292\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/292</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.4...v0.15.5\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.4...v0.15.5</a></p>\n"
    },
    {
      "version": "v0.15.4",
      "name": "v0.15.4",
      "datetime": "2026-07-03T15:30:57Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.4",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat(web): locale-aware number formatting + filter panel redesign by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/291\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.3...v0.15.4",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat(web): locale-aware number formatting + filter panel redesign by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/291\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/291</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.3...v0.15.4\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.3...v0.15.4</a></p>\n"
    },
    {
      "version": "v0.15.3",
      "name": "v0.15.3",
      "datetime": "2026-07-03T13:42:18Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.3",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat(dashboard): enrich recent adverts card and add packets widget by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/290\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.2...v0.15.3",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat(dashboard): enrich recent adverts card and add packets widget by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/290\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/290</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.2...v0.15.3\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.2...v0.15.3</a></p>\n"
    },
    {
      "version": "v0.15.1",
      "name": "v0.15.1",
      "datetime": "2026-07-02T22:35:19Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.1",
      "prerelease": false,
      "notes": "## What's Changed\r\n* chore(deps): update anomalyco/opencode action to v1.17.11 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/279\r\n* feat(collector): observer allow/deny ingestion filter by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/281\r\n* fix(tests): introspect mounted paths via OpenAPI schema, unpin fastapi by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/282\r\n* chore(deps): update dependency daisyui to v5.6.6 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/283\r\n* chore(deps): update tailwindcss monorepo to v4.3.2 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/284\r\n* chore(deps): update dependency daisyui to v5.6.10 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/286\r\n* chore(deps): update anomalyco/opencode action to v1.17.13 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/285\r\n* UI cosmetic polish and IBM Plex typography by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/287\r\n* feat(web): panel accent redesign, mobile nav two-column, light-mode polish by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/288\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.0...v0.15.1",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>chore(deps): update anomalyco/opencode action to v1.17.11 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/279\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/279</a></li>\n<li>feat(collector): observer allow/deny ingestion filter by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/281\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/281</a></li>\n<li>fix(tests): introspect mounted paths via OpenAPI schema, unpin fastapi by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/282\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/282</a></li>\n<li>chore(deps): update dependency daisyui to v5.6.6 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/283\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/283</a></li>\n<li>chore(deps): update tailwindcss monorepo to v4.3.2 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/284\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/284</a></li>\n<li>chore(deps): update dependency daisyui to v5.6.10 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/286\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/286</a></li>\n<li>chore(deps): update anomalyco/opencode action to v1.17.13 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/285\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/285</a></li>\n<li>UI cosmetic polish and IBM Plex typography by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/287\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/287</a></li>\n<li>feat(web): panel accent redesign, mobile nav two-column, light-mode polish by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/288\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/288</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.0...v0.15.1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.15.0...v0.15.1</a></p>\n"
    },
    {
      "version": "v0.15.0",
      "name": "v0.15.0",
      "datetime": "2026-06-25T13:04:07Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.15.0",
      "prerelease": false,
      "notes": "## What's Changed\r\n* chore(deps): update actions/checkout action to v7 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/272\r\n* feat(spam): score messages at ingest and hide likely spam by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/275\r\n* chore(deps): update anomalyco/opencode action to v1.17.9 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/274\r\n* fix(web): stop pre-wrap inflating message table row height by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/276\r\n* chore(deps): update actions/cache action to v6 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/277\r\n* chore(deps): update anomalyco/opencode action to v1.17.10 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/278\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.14.0...v0.15.0",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>chore(deps): update actions/checkout action to v7 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/272\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/272</a></li>\n<li>feat(spam): score messages at ingest and hide likely spam by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/275\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/275</a></li>\n<li>chore(deps): update anomalyco/opencode action to v1.17.9 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/274\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/274</a></li>\n<li>fix(web): stop pre-wrap inflating message table row height by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/276\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/276</a></li>\n<li>chore(deps): update actions/cache action to v6 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/277\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/277</a></li>\n<li>chore(deps): update anomalyco/opencode action to v1.17.10 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/278\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/278</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.14.0...v0.15.0\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.14.0...v0.15.0</a></p>\n"
    },
    {
      "version": "v0.14.0",
      "name": "v0.14.0",
      "datetime": "2026-06-19T18:22:39Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.14.0",
      "prerelease": false,
      "notes": "## What's Changed\r\n* ci: prune old untagged GHCR package versions by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/256\r\n* Add optional PostgreSQL backend (v0.14.0) by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/243\r\n* Added migrate service to overlay network by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/259\r\n* chore(deps): update postgres docker tag to v18 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/258\r\n* Reverted to Postgres 17 by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/260\r\n* fix: sink NULL last_seen nodes to bottom of node list by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/263\r\n* fix: normalize date-bucket keys for Postgres dashboard charts by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/264\r\n* fix: normalize packets feature flag check to !== false by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/265\r\n* Added explicit pull policies for core services by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/266\r\n* fix: ensure CI required checks run on all PRs by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/268\r\n* docs: tidy database docs and deprecate SQLite by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/267\r\n* chore(deps): update anomalyco/opencode action to v1.17.8 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/269\r\n* docs: centralise env vars and split deployment/observer/maintenance docs by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/271\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.4...v0.14.0",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>ci: prune old untagged GHCR package versions by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/256\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/256</a></li>\n<li>Add optional PostgreSQL backend (v0.14.0) by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/243\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/243</a></li>\n<li>Added migrate service to overlay network by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/259\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/259</a></li>\n<li>chore(deps): update postgres docker tag to v18 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/258\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/258</a></li>\n<li>Reverted to Postgres 17 by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/260\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/260</a></li>\n<li>fix: sink NULL last_seen nodes to bottom of node list by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/263\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/263</a></li>\n<li>fix: normalize date-bucket keys for Postgres dashboard charts by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/264\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/264</a></li>\n<li>fix: normalize packets feature flag check to !== false by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/265\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/265</a></li>\n<li>Added explicit pull policies for core services by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/266\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/266</a></li>\n<li>fix: ensure CI required checks run on all PRs by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/268\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/268</a></li>\n<li>docs: tidy database docs and deprecate SQLite by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/267\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/267</a></li>\n<li>chore(deps): update anomalyco/opencode action to v1.17.8 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/269\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/269</a></li>\n<li>docs: centralise env vars and split deployment/observer/maintenance docs by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/271\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/271</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.4...v0.14.0\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.4...v0.14.0</a></p>\n"
    },
    {
      "version": "v0.13.4",
      "name": "v0.13.4",
      "datetime": "2026-06-14T22:39:25Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.13.4",
      "prerelease": false,
      "notes": "## What's Changed\r\n* Added nix-shell support by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/250\r\n* chore(tests): speed up pytest from >2min to ~12s by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/251\r\n* chore(ci): optimise GitHub workflows by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/252\r\n* fix(docker): correct OCI source label to ipnet-mesh/meshcore-hub by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/254\r\n* chore(deps): update actions/cache action to v5 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/253\r\n* fix: forward/cache repeated query params (observer filters) by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/255\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.3...v0.13.4",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>Added nix-shell support by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/250\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/250</a></li>\n<li>chore(tests): speed up pytest from &gt;2min to ~12s by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/251\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/251</a></li>\n<li>chore(ci): optimise GitHub workflows by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/252\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/252</a></li>\n<li>fix(docker): correct OCI source label to ipnet-mesh/meshcore-hub by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/254\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/254</a></li>\n<li>chore(deps): update actions/cache action to v5 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/253\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/253</a></li>\n<li>fix: forward/cache repeated query params (observer filters) by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/255\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/255</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.3...v0.13.4\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.3...v0.13.4</a></p>\n"
    },
    {
      "version": "v0.13.3",
      "name": "v0.13.3",
      "datetime": "2026-06-14T19:10:34Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.13.3",
      "prerelease": false,
      "notes": "## What's Changed\r\n* fix(web): collapse newlines in rendered message text by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/249\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.2...v0.13.3",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>fix(web): collapse newlines in rendered message text by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/249\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/249</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.2...v0.13.3\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.2...v0.13.3</a></p>\n"
    },
    {
      "version": "v0.13.2",
      "name": "v0.13.2",
      "datetime": "2026-06-14T18:14:14Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.13.2",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat(web): system announcement banner and maintenance mode by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/245\r\n* Updated Python Requirements by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/247\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.1...v0.13.2",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat(web): system announcement banner and maintenance mode by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/245\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/245</a></li>\n<li>Updated Python Requirements by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/247\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/247</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.1...v0.13.2\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.1...v0.13.2</a></p>\n"
    },
    {
      "version": "v0.13.1",
      "name": "v0.13.1",
      "datetime": "2026-06-14T12:11:45Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.13.1",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat(web): observer filter as toggle badges on adverts/messages by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/244\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.0...v0.13.1",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat(web): observer filter as toggle badges on adverts/messages by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/244\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/244</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.0...v0.13.1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.13.0...v0.13.1</a></p>\n"
    },
    {
      "version": "v0.13.0",
      "name": "v0.13.0",
      "datetime": "2026-06-14T09:27:31Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.13.0",
      "prerelease": false,
      "notes": "## What's Changed\r\n* feat: Raw Packets — capture, browse, classify, and link wire packets (v0.13.0) by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/237\r\n* Update tailwindcss monorepo to v4.3.1 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/236\r\n* chore(deps): update dependency esbuild to v0.28.1 by @renovate[bot] in https://github.com/ipnet-mesh/meshcore-hub/pull/235\r\n* Add packet-groups API endpoint for deduplicated packet list by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/238\r\n* Packet-detail page with path-hash node lookup by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/240\r\n* Updated Agent instructions by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/241\r\n* Fix observed_by filter to use event_observers junction table by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/242\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.3...v0.13.0",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>feat: Raw Packets — capture, browse, classify, and link wire packets (v0.13.0) by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/237\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/237</a></li>\n<li>Update tailwindcss monorepo to v4.3.1 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/236\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/236</a></li>\n<li>chore(deps): update dependency esbuild to v0.28.1 by @renovate[bot] in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/235\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/235</a></li>\n<li>Add packet-groups API endpoint for deduplicated packet list by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/238\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/238</a></li>\n<li>Packet-detail page with path-hash node lookup by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/240\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/240</a></li>\n<li>Updated Agent instructions by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/241\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/241</a></li>\n<li>Fix observed_by filter to use event_observers junction table by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/242\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/242</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.3...v0.13.0\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.3...v0.13.0</a></p>\n"
    },
    {
      "version": "v0.12.3",
      "name": "v0.12.3",
      "datetime": "2026-06-11T22:26:37Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.12.3",
      "prerelease": false,
      "notes": "## What's Changed\r\n* fix(web): show node last_seen instead of adopted_at on profile by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/232\r\n* fix(web): resolve TDZ error on profile page from shadowed signal var by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/234\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.2...v0.12.3",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>fix(web): show node last_seen instead of adopted_at on profile by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/232\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/232</a></li>\n<li>fix(web): resolve TDZ error on profile page from shadowed signal var by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/234\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/234</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.2...v0.12.3\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.2...v0.12.3</a></p>\n"
    },
    {
      "version": "v0.12.2",
      "name": "v0.12.2",
      "datetime": "2026-06-11T12:40:56Z",
      "url": "https://github.com/ipnet-mesh/meshcore-hub/releases/tag/v0.12.2",
      "prerelease": false,
      "notes": "## What's Changed\r\n* perf(web): cancel in-flight requests on navigation; consolidate dashboard stats by @jinglemansweep in https://github.com/ipnet-mesh/meshcore-hub/pull/231\r\n\r\n\r\n**Full Changelog**: https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.1...v0.12.2",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>perf(web): cancel in-flight requests on navigation; consolidate dashboard stats by @jinglemansweep in <a href=\"https://github.com/ipnet-mesh/meshcore-hub/pull/231\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/pull/231</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.1...v0.12.2\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/ipnet-mesh/meshcore-hub/compare/v0.12.1...v0.12.2</a></p>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-07-20T18:07:03.007Z"
}
