{
  "id": "agessaman-meshcore-packet-capture",
  "name": "MeshCore Packet Capture",
  "kind": "monitoring",
  "status": "active",
  "maturity": "stable",
  "description": "Standalone Python script for capturing and analyzing packets from MeshCore companion radios. Connects via BLE, serial or TCP and outputs structured data to console, file and MQTT broker. Designed for companion radios only; for repeaters and room servers use meshcoretomqtt instead.",
  "maintainers": [
    {
      "name": "agessaman",
      "url": "https://github.com/agessaman"
    }
  ],
  "repository": "https://github.com/agessaman/meshcore-packet-capture",
  "license": "MIT",
  "languages": [
    "python"
  ],
  "platforms": [
    "linux",
    "macos",
    "windows"
  ],
  "interfaces": [
    "cli"
  ],
  "connections": [
    "ble",
    "serial",
    "tcp",
    "mqtt"
  ],
  "node_roles": [
    "companion"
  ],
  "capabilities": [
    "monitoring",
    "packet-analysis",
    "telemetry"
  ],
  "install": [
    {
      "type": "pypi",
      "package": "meshcore-packet-capture",
      "url": "https://pypi.org/project/meshcore-packet-capture/",
      "command": "pipx install meshcore-packet-capture"
    },
    {
      "type": "source",
      "url": "https://github.com/agessaman/meshcore-packet-capture"
    }
  ],
  "popularity": {
    "githubStars": 73,
    "githubForks": 20,
    "githubWatchers": 1,
    "githubOpenIssues": 8,
    "githubContributors": 9,
    "lastChecked": "2026-07-21",
    "releaseDownloads": 0,
    "latestReleaseDownloads": 0
  },
  "verification": {
    "sourceAvailable": true,
    "releasesAvailable": true,
    "signedReleases": false,
    "ciBuilds": true,
    "hasDocumentation": true,
    "lastChecked": "2026-07-21",
    "notes": [
      "For companion radios only; repeaters/room servers should use meshcoretomqtt.",
      "Based on the original meshcoretomqtt project by Cisien.",
      "Available on PyPI; includes systemd/launchd managed service installer."
    ]
  },
  "tags": [
    "packet-capture",
    "monitoring",
    "mqtt"
  ],
  "last_reviewed": "2026-07-03",
  "source": {
    "path": "data/software/agessaman-meshcore-packet-capture/software.yaml",
    "updatedAt": "2026-07-21T08:04:18Z"
  },
  "latest_version": "2.0.0",
  "released": "2026-06-22",
  "releases": [
    {
      "version": "v2.0.0",
      "name": "v2.0.0",
      "datetime": "2026-06-22T21:21:15Z",
      "url": "https://github.com/agessaman/meshcore-packet-capture/releases/tag/v2.0.0",
      "prerelease": false,
      "notes": "Realigns configuration, install, and runtime layout with meshcoretomqtt.\r\n\r\n### Added\r\n- TOML configuration under `/etc/meshcore-packet-capture/` (`config.toml` + `config.d/*.toml`, deep-merged; `[[broker]]` merges by name).\r\n- Python installer (`python3 -m installer`) with install / update / migrate, systemd & launchd units, Docker, service account, and BLE/serial/TCP setup.\r\n- PyPI distribution: `pipx install meshcore-packet-capture` + `meshcore-packet-capture` CLI.\r\n- Bundled broker presets (`presets/`, installed as `config.d/10-*.toml`).\r\n- Unlimited sequentially-numbered MQTT brokers.\r\n- JWT auth via pure-Python Ed25519 (pynacl), per-broker owner/email, token TTL.\r\n- Device stats (core/radio/packets) in MQTT status messages.\r\n- macOS BLE support via a per-user LaunchAgent.\r\n\r\n### Changed\r\n- App installs to `/opt`, config to `/etc`, state to `/var/lib` (FHS).\r\n- `.env`/`.env.local` are now a legacy fallback, overridden by TOML.\r\n- Requires Python 3.11+ and `meshcore >= 2.2.31`.\r\n- Default advert interval standardized at 47 hours.\r\n- Docker image no longer bundles Node.js (JWT signing is pure-Python).\r\n\r\n### Upgrading\r\nRun the installer to migrate a legacy `~/.meshcore-packet-capture` install to the new `/opt` + `/etc` layout; your `.env`/`.env.local` is converted to `config.d/99-user.toml`. The old directory is left in place for rollback.\r\n\r\n## New Contributors\r\n* @vergoh made their first contribution in https://github.com/agessaman/meshcore-packet-capture/pull/26\r\n* @maxious made their first contribution in https://github.com/agessaman/meshcore-packet-capture/pull/32\r\n\r\n**Full Changelog**: https://github.com/agessaman/meshcore-packet-capture/compare/v0.4...v2.0.0",
      "notesHtml": "<p>Realigns configuration, install, and runtime layout with meshcoretomqtt.</p>\n<h3>Added</h3>\n<ul>\n<li>TOML configuration under <code>/etc/meshcore-packet-capture/</code> (<code>config.toml</code> + <code>config.d/*.toml</code>, deep-merged; <code>[[broker]]</code> merges by name).</li>\n<li>Python installer (<code>python3 -m installer</code>) with install / update / migrate, systemd &amp; launchd units, Docker, service account, and BLE/serial/TCP setup.</li>\n<li>PyPI distribution: <code>pipx install meshcore-packet-capture</code> + <code>meshcore-packet-capture</code> CLI.</li>\n<li>Bundled broker presets (<code>presets/</code>, installed as <code>config.d/10-*.toml</code>).</li>\n<li>Unlimited sequentially-numbered MQTT brokers.</li>\n<li>JWT auth via pure-Python Ed25519 (pynacl), per-broker owner/email, token TTL.</li>\n<li>Device stats (core/radio/packets) in MQTT status messages.</li>\n<li>macOS BLE support via a per-user LaunchAgent.</li>\n</ul>\n<h3>Changed</h3>\n<ul>\n<li>App installs to <code>/opt</code>, config to <code>/etc</code>, state to <code>/var/lib</code> (FHS).</li>\n<li><code>.env</code>/<code>.env.local</code> are now a legacy fallback, overridden by TOML.</li>\n<li>Requires Python 3.11+ and <code>meshcore &gt;= 2.2.31</code>.</li>\n<li>Default advert interval standardized at 47 hours.</li>\n<li>Docker image no longer bundles Node.js (JWT signing is pure-Python).</li>\n</ul>\n<h3>Upgrading</h3>\n<p>Run the installer to migrate a legacy <code>~/.meshcore-packet-capture</code> install to the new <code>/opt</code> + <code>/etc</code> layout; your <code>.env</code>/<code>.env.local</code> is converted to <code>config.d/99-user.toml</code>. The old directory is left in place for rollback.</p>\n<h2>New Contributors</h2>\n<ul>\n<li>@vergoh made their first contribution in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/26\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/26</a></li>\n<li>@maxious made their first contribution in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/32\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/32</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/agessaman/meshcore-packet-capture/compare/v0.4...v2.0.0\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/compare/v0.4...v2.0.0</a></p>\n"
    },
    {
      "version": "v0.4",
      "name": "v0.4",
      "datetime": "2026-03-28T18:38:53Z",
      "url": "https://github.com/agessaman/meshcore-packet-capture/releases/tag/v0.4",
      "prerelease": false,
      "notes": "## What's Changed\r\n* Add device listing for FreeBSD by @samm-git in https://github.com/agessaman/meshcore-packet-capture/pull/9\r\n* Enhance advert state management to avoid adverts on every launch and update install.sh to 1.2.1 by @agessaman in https://github.com/agessaman/meshcore-packet-capture/pull/14\r\n* Enhance packet capture and installation scripts for MeshCore 1.14.0 compatibility by @agessaman in https://github.com/agessaman/meshcore-packet-capture/pull/16\r\n* Align advert and control parsing with MeshCore by @robekl in https://github.com/agessaman/meshcore-packet-capture/pull/19\r\n* Preserve decoded advert metadata by @robekl in https://github.com/agessaman/meshcore-packet-capture/pull/20\r\n* Harden advert parsing against partial payloads by @robekl in https://github.com/agessaman/meshcore-packet-capture/pull/22\r\n* Avoid duplicate packet publishes from RAW events by @robekl in https://github.com/agessaman/meshcore-packet-capture/pull/21\r\n\r\n## New Contributors\r\n* @samm-git made their first contribution in https://github.com/agessaman/meshcore-packet-capture/pull/9\r\n* @robekl made their first contribution in https://github.com/agessaman/meshcore-packet-capture/pull/19\r\n\r\n**Full Changelog**: https://github.com/agessaman/meshcore-packet-capture/compare/v0.3...v0.4",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>Add device listing for FreeBSD by @samm-git in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/9\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/9</a></li>\n<li>Enhance advert state management to avoid adverts on every launch and update install.sh to 1.2.1 by @agessaman in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/14\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/14</a></li>\n<li>Enhance packet capture and installation scripts for MeshCore 1.14.0 compatibility by @agessaman in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/16\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/16</a></li>\n<li>Align advert and control parsing with MeshCore by @robekl in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/19\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/19</a></li>\n<li>Preserve decoded advert metadata by @robekl in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/20\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/20</a></li>\n<li>Harden advert parsing against partial payloads by @robekl in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/22\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/22</a></li>\n<li>Avoid duplicate packet publishes from RAW events by @robekl in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/21\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/21</a></li>\n</ul>\n<h2>New Contributors</h2>\n<ul>\n<li>@samm-git made their first contribution in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/9\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/9</a></li>\n<li>@robekl made their first contribution in <a href=\"https://github.com/agessaman/meshcore-packet-capture/pull/19\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/pull/19</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/agessaman/meshcore-packet-capture/compare/v0.3...v0.4\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/agessaman/meshcore-packet-capture/compare/v0.3...v0.4</a></p>\n"
    },
    {
      "version": "v0.3",
      "name": "v0.3",
      "datetime": "2025-12-20T22:51:53Z",
      "url": "https://github.com/agessaman/meshcore-packet-capture/releases/tag/v0.3",
      "prerelease": false,
      "notes": "- Refactored auth token signing to use the radio to sign JWTs, with fallbacks to a python implementation (typically unnecessary unless then firmware is 6+ months old). Removes dependency on meshcore-decoder.\r\n- Improved BLE timeout and reconnect handling.\r\n- Fixes pairing process in pairing_helper.py on MacOS\r\n- Improvements in install.sh",
      "notesHtml": "<ul>\n<li>Refactored auth token signing to use the radio to sign JWTs, with fallbacks to a python implementation (typically unnecessary unless then firmware is 6+ months old). Removes dependency on meshcore-decoder.</li>\n<li>Improved BLE timeout and reconnect handling.</li>\n<li>Fixes pairing process in pairing_helper.py on MacOS</li>\n<li>Improvements in install.sh</li>\n</ul>\n"
    },
    {
      "version": "v0.2",
      "name": "v0.2",
      "datetime": "2025-10-21T04:57:18Z",
      "url": "https://github.com/agessaman/meshcore-packet-capture/releases/tag/v0.2",
      "prerelease": false,
      "notes": "- This release includes preliminary installer support for Windows—the installer works, but it won't automatically find and pair nodes due to limitations in scripting the Windows BLE stack. The installer will automatically create the necessary configuration files.\r\n- Added firmware, model, and packet-capture version to status updates in MQTT brokers\r\n- improved handling of timeouts and more descriptive error logging\r\n\r\nThanks to those who have tried the script so far, your feedback has been really helpful.",
      "notesHtml": "<ul>\n<li>This release includes preliminary installer support for Windows—the installer works, but it won't automatically find and pair nodes due to limitations in scripting the Windows BLE stack. The installer will automatically create the necessary configuration files.</li>\n<li>Added firmware, model, and packet-capture version to status updates in MQTT brokers</li>\n<li>improved handling of timeouts and more descriptive error logging</li>\n</ul>\n<p>Thanks to those who have tried the script so far, your feedback has been really helpful.</p>\n"
    },
    {
      "version": "v0.1",
      "name": "v0.1 - Initial Release",
      "datetime": "2025-10-16T03:19:22Z",
      "url": "https://github.com/agessaman/meshcore-packet-capture/releases/tag/v0.1",
      "prerelease": false,
      "notes": "- **Multi-Connection Support**: BLE, Serial, and TCP connections\r\n- **Packet Analysis**: Route types, payload parsing, and RF metrics (SNR/RSSI)\r\n- **Multi-Broker MQTT**: Up to 4 MQTT brokers simultaneously\r\n- **JWT Authentication**: Device private key authentication with automatic renewal\r\n- **Connection Management**: Automatic reconnection and health monitoring\r\n- **Output Options**: Console, file, and MQTT publishing\r\n- **Service Installation**: Automated systemd/launchd service setup\r\n- **Docker Support**: Containerized deployment\r\n- **Topic Templates**: Dynamic MQTT topics with IATA and device placeholders\r\n- **Packet Hashing**: SHA-256 packet identification\r\n- **Advert Parsing**: MeshCore advertisement data support\r\n- **TLS/WebSocket**: Encrypted MQTT connections with WebSocket transport",
      "notesHtml": "<ul>\n<li><strong>Multi-Connection Support</strong>: BLE, Serial, and TCP connections</li>\n<li><strong>Packet Analysis</strong>: Route types, payload parsing, and RF metrics (SNR/RSSI)</li>\n<li><strong>Multi-Broker MQTT</strong>: Up to 4 MQTT brokers simultaneously</li>\n<li><strong>JWT Authentication</strong>: Device private key authentication with automatic renewal</li>\n<li><strong>Connection Management</strong>: Automatic reconnection and health monitoring</li>\n<li><strong>Output Options</strong>: Console, file, and MQTT publishing</li>\n<li><strong>Service Installation</strong>: Automated systemd/launchd service setup</li>\n<li><strong>Docker Support</strong>: Containerized deployment</li>\n<li><strong>Topic Templates</strong>: Dynamic MQTT topics with IATA and device placeholders</li>\n<li><strong>Packet Hashing</strong>: SHA-256 packet identification</li>\n<li><strong>Advert Parsing</strong>: MeshCore advertisement data support</li>\n<li><strong>TLS/WebSocket</strong>: Encrypted MQTT connections with WebSocket transport</li>\n</ul>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-07-05T17:14:30.883Z"
}
