{
  "id": "meshcore-go",
  "name": "meshcore-go",
  "short_name": "meshcore-go",
  "kind": "library",
  "status": "active",
  "maturity": "alpha",
  "description": "Pure Go implementation of the MeshCore protocol. Provides encode/decode for all protocol payload types, cryptography, identity/key management, the companion protocol (frame layer, commands/responses, push notifications), serial/TCP transports, a high-level client, hardware modem abstraction with KISS framing, and a node runtime with routing and peer management.",
  "maintainers": [
    {
      "name": "meshcore-go",
      "url": "https://github.com/meshcore-go"
    }
  ],
  "repository": "https://github.com/meshcore-go/meshcore-go",
  "website": "https://github.com/meshcore-go/meshcore-go",
  "documentation": "https://pkg.go.dev/github.com/meshcore-go/meshcore-go",
  "license": "MIT",
  "languages": [
    "go"
  ],
  "platforms": [
    "linux",
    "macos",
    "windows",
    "esp32"
  ],
  "interfaces": [
    "api",
    "cli",
    "headless"
  ],
  "connections": [
    "ble",
    "serial",
    "usb",
    "tcp",
    "websocket"
  ],
  "node_roles": [
    "companion",
    "repeater",
    "room-server"
  ],
  "capabilities": [
    "messaging",
    "contacts",
    "channels",
    "node-configuration",
    "remote-administration",
    "monitoring",
    "telemetry",
    "packet-analysis",
    "bridging",
    "key-management"
  ],
  "install": [
    {
      "type": "go-install",
      "package": "github.com/meshcore-go/meshcore-go",
      "url": "https://pkg.go.dev/github.com/meshcore-go/meshcore-go",
      "command": "go get github.com/meshcore-go/meshcore-go"
    },
    {
      "type": "github-release",
      "url": "https://github.com/meshcore-go/meshcore-go/releases"
    },
    {
      "type": "source",
      "url": "https://github.com/meshcore-go/meshcore-go"
    }
  ],
  "popularity": {
    "githubStars": 11,
    "githubForks": 2,
    "githubWatchers": 0,
    "githubOpenIssues": 1,
    "githubContributors": 2,
    "latestReleaseDownloads": 0,
    "lastChecked": "2026-07-21",
    "releaseDownloads": 0
  },
  "verification": {
    "sourceAvailable": true,
    "releasesAvailable": true,
    "signedReleases": false,
    "ciBuilds": true,
    "hasDocumentation": true,
    "lastChecked": "2026-07-21",
    "notes": [
      "Multi-module Go workspace with companion, hardware and transport submodules."
    ]
  },
  "tags": [
    "sdk",
    "protocol",
    "go",
    "node-runtime",
    "companion-client"
  ],
  "last_reviewed": "2026-06-29",
  "source": {
    "path": "data/software/meshcore-go/software.yaml",
    "updatedAt": "2026-07-21T08:04:18Z"
  },
  "latest_version": "1.0.9",
  "released": "2026-06-28",
  "releases": [
    {
      "version": "v1.0.9",
      "name": "v1.0.9",
      "datetime": "2026-06-28T23:14:47Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.9",
      "prerelease": false,
      "notes": "## Highlights\n\n### CayenneLPP Polyline (type 240)\nFull Polyline codec, byte-compatible with [ElectronicCats/CayenneLPP](https://github.com/ElectronicCats/CayenneLPP):\n- `AddPolyline` / `AddPolylineFactor` encoders — Douglas-Peucker & perpendicular-distance simplification, error-feedback delta quantization, signed-nibble packing.\n- Variable-length polyline decoding in `LPPDecode`, new `LPPCoordinate` / `LPPPolylineValue` types and `LPPPrecision` / `LPPSimplification` enums.\n- `NewLPPEncoderSize` to match a specific `CayenneLPP(size)` buffer.\n- Output verified byte-identical to the C++ reference on every input it can encode; also handles two inputs that crash the upstream library.\n\n### Routing fix\n- `node`: 0-hop direct neighbours now route **direct** instead of flooding — a non-nil zero-length path is a known route, so we test `path != nil` rather than `len(path) > 0`.\n\n### Other\n- Decode end-marker aligned to MeshCore's `LPPReader` (stop on `channel == 0`, any type).\n- `go.work.sum` cleanup; submodule deps bumped to v1.0.9.\n\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.8...v1.0.9",
      "notesHtml": "<h2>Highlights</h2>\n<h3>CayenneLPP Polyline (type 240)</h3>\n<p>Full Polyline codec, byte-compatible with <a href=\"https://github.com/ElectronicCats/CayenneLPP\" target=\"_blank\" rel=\"noopener noreferrer\">ElectronicCats/CayenneLPP</a>:</p>\n<ul>\n<li><code>AddPolyline</code> / <code>AddPolylineFactor</code> encoders — Douglas-Peucker &amp; perpendicular-distance simplification, error-feedback delta quantization, signed-nibble packing.</li>\n<li>Variable-length polyline decoding in <code>LPPDecode</code>, new <code>LPPCoordinate</code> / <code>LPPPolylineValue</code> types and <code>LPPPrecision</code> / <code>LPPSimplification</code> enums.</li>\n<li><code>NewLPPEncoderSize</code> to match a specific <code>CayenneLPP(size)</code> buffer.</li>\n<li>Output verified byte-identical to the C++ reference on every input it can encode; also handles two inputs that crash the upstream library.</li>\n</ul>\n<h3>Routing fix</h3>\n<ul>\n<li><code>node</code>: 0-hop direct neighbours now route <strong>direct</strong> instead of flooding — a non-nil zero-length path is a known route, so we test <code>path != nil</code> rather than <code>len(path) &gt; 0</code>.</li>\n</ul>\n<h3>Other</h3>\n<ul>\n<li>Decode end-marker aligned to MeshCore's <code>LPPReader</code> (stop on <code>channel == 0</code>, any type).</li>\n<li><code>go.work.sum</code> cleanup; submodule deps bumped to v1.0.9.</li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.8...v1.0.9\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.8...v1.0.9</a></p>\n"
    },
    {
      "version": "v1.0.8",
      "name": "v1.0.8",
      "datetime": "2026-06-12T01:39:40Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.8",
      "prerelease": false,
      "notes": "# meshcore-go — v1.0.8\r\n\r\nMostly about getting us in line with MeshCore 1.16. There's one breaking change\r\n(SNR is now float32), so callers will need a small update.\r\n\r\n## 1.16 protocol\r\n\r\n- Companion serial protocol updated for 1.16: added `CMD_SEND_RAW_PACKET` (65),\r\n  default flood scope get/set (63/64, RESP 28) and the unscoped-flood sub-type,\r\n  and new push codes for LoginFail, ContactDeleted and ContactsFull.\r\n- Bumped MaxFrameSize 172 → 176 and now advertise protocol v3 so the firmware\r\n  sends V3 message-recv frames.\r\n- Renamed a few Companion constants to match firmware: `CmdSetRadioTxPower`,\r\n  `CmdGetBattAndStorage`, `CmdSetFloodScopeKey`, `RespBattAndStorage`.\r\n- ACKs now dedup by packet hash like everything else (1.16 dropped the separate\r\n  ACK-CRC table). Retransmitted ACKs get forwarded again instead of being\r\n  silently dropped.\r\n- KISS: treat a `TX_DONE` result of `0x00` as a failed transmit. Firmware 1.16\r\n  sends that on radio-busy / airtime timeout. Baseline is now 1.16+.\r\n- Text retransmits are recomposed per attempt (attempt encoded in the flags\r\n  byte, plus a `[0x00][attempt]` tail past attempt 3) so each retry has a unique\r\n  hash and survives dedup. ACK CRC is recomputed each attempt. Added\r\n  `BuildTextPlaintextWithAttempt`.\r\n\r\n## Other changes\r\n\r\n- SNR is now real dB (`float32`) everywhere instead of raw quarter-dB `int8`.\r\n  RSSI is unchanged and the raw path-SNR bytes are still preserved. **This is\r\n  breaking** — see below.\r\n- Added TX stats: `Node.TxStats()` returns a `TxStats` struct, plumbed through\r\n  the transport/modem/tx-engine layers.\r\n- Added `HasSignalInfo` through the modem/transport/peer path so we only apply\r\n  SNR/RSSI when the source actually has it (helps the TCP transport).\r\n- Peers can now carry multi-byte path hashes via `OutPathHashSize` (1, 2 or 4;\r\n  0 means default of 1); `SetOutPath` takes an optional hash size.\r\n- New `WithLearnedPathsOnly()` option to restrict advert paths to learned ones.\r\n- Name truncation now respects UTF-8 boundaries.\r\n\r\n## Breaking\r\n\r\n- SNR fields went `int8` → `float32` (real dB). `PeerTable.Update` is now\r\n  `Update(adv, snr float32, rssi int8, hasSignalInfo bool, pathHashes []byte)` —\r\n  update the call sites and stop treating SNR as raw quarter-dB.",
      "notesHtml": "<h1>meshcore-go — v1.0.8</h1>\n<p>Mostly about getting us in line with MeshCore 1.16. There's one breaking change\n(SNR is now float32), so callers will need a small update.</p>\n<h2>1.16 protocol</h2>\n<ul>\n<li>Companion serial protocol updated for 1.16: added <code>CMD_SEND_RAW_PACKET</code> (65),\ndefault flood scope get/set (63/64, RESP 28) and the unscoped-flood sub-type,\nand new push codes for LoginFail, ContactDeleted and ContactsFull.</li>\n<li>Bumped MaxFrameSize 172 → 176 and now advertise protocol v3 so the firmware\nsends V3 message-recv frames.</li>\n<li>Renamed a few Companion constants to match firmware: <code>CmdSetRadioTxPower</code>,\n<code>CmdGetBattAndStorage</code>, <code>CmdSetFloodScopeKey</code>, <code>RespBattAndStorage</code>.</li>\n<li>ACKs now dedup by packet hash like everything else (1.16 dropped the separate\nACK-CRC table). Retransmitted ACKs get forwarded again instead of being\nsilently dropped.</li>\n<li>KISS: treat a <code>TX_DONE</code> result of <code>0x00</code> as a failed transmit. Firmware 1.16\nsends that on radio-busy / airtime timeout. Baseline is now 1.16+.</li>\n<li>Text retransmits are recomposed per attempt (attempt encoded in the flags\nbyte, plus a <code>[0x00][attempt]</code> tail past attempt 3) so each retry has a unique\nhash and survives dedup. ACK CRC is recomputed each attempt. Added\n<code>BuildTextPlaintextWithAttempt</code>.</li>\n</ul>\n<h2>Other changes</h2>\n<ul>\n<li>SNR is now real dB (<code>float32</code>) everywhere instead of raw quarter-dB <code>int8</code>.\nRSSI is unchanged and the raw path-SNR bytes are still preserved. <strong>This is\nbreaking</strong> — see below.</li>\n<li>Added TX stats: <code>Node.TxStats()</code> returns a <code>TxStats</code> struct, plumbed through\nthe transport/modem/tx-engine layers.</li>\n<li>Added <code>HasSignalInfo</code> through the modem/transport/peer path so we only apply\nSNR/RSSI when the source actually has it (helps the TCP transport).</li>\n<li>Peers can now carry multi-byte path hashes via <code>OutPathHashSize</code> (1, 2 or 4;\n0 means default of 1); <code>SetOutPath</code> takes an optional hash size.</li>\n<li>New <code>WithLearnedPathsOnly()</code> option to restrict advert paths to learned ones.</li>\n<li>Name truncation now respects UTF-8 boundaries.</li>\n</ul>\n<h2>Breaking</h2>\n<ul>\n<li>SNR fields went <code>int8</code> → <code>float32</code> (real dB). <code>PeerTable.Update</code> is now\n<code>Update(adv, snr float32, rssi int8, hasSignalInfo bool, pathHashes []byte)</code> —\nupdate the call sites and stop treating SNR as raw quarter-dB.</li>\n</ul>\n"
    },
    {
      "version": "v1.0.7",
      "name": "v1.0.7",
      "datetime": "2026-06-12T01:21:32Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.7",
      "prerelease": false,
      "notes": "## What's Changed\r\n* v1.0.7 by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/8\r\n\r\nDO NOT USE, Use 1.0.8 instead\r\n\r\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.6...v1.0.7",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>v1.0.7 by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/8\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/8</a></li>\n</ul>\n<p>DO NOT USE, Use 1.0.8 instead</p>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.6...v1.0.7\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.6...v1.0.7</a></p>\n"
    },
    {
      "version": "v1.0.6",
      "name": "v1.0.6",
      "datetime": "2026-05-10T23:40:26Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.6",
      "prerelease": false,
      "notes": "## What's Changed\n* Refactor transmission handling and update dependencies by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/7\n\n\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.5...v1.0.6",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>Refactor transmission handling and update dependencies by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/7\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/7</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.5...v1.0.6\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.5...v1.0.6</a></p>\n"
    },
    {
      "version": "v1.0.5",
      "name": "v1.0.5",
      "datetime": "2026-05-06T23:49:25Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.5",
      "prerelease": false,
      "notes": "## What's Changed\n* Enhance TX flow control and add LoRa airtime estimation features by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/6\n\n\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.4...v1.0.5",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>Enhance TX flow control and add LoRa airtime estimation features by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/6\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/6</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.4...v1.0.5\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.4...v1.0.5</a></p>\n"
    },
    {
      "version": "v1.0.4",
      "name": "v1.0.4",
      "datetime": "2026-05-04T01:13:55Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.4",
      "prerelease": false,
      "notes": "## What's Changed\n* Implement packet retry mechanism and enhance radio transmission queuing by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/4\n* v1.0.4 by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/5\n\n\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.3...v1.0.4",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>Implement packet retry mechanism and enhance radio transmission queuing by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/4\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/4</a></li>\n<li>v1.0.4 by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/5\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/5</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.3...v1.0.4\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.3...v1.0.4</a></p>\n"
    },
    {
      "version": "v1.0.3",
      "name": "v1.0.3",
      "datetime": "2026-04-30T23:24:59Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.3",
      "prerelease": false,
      "notes": "## What's Changed\n* v1.0.3 by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/3\n\n\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.2...v1.0.3",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>v1.0.3 by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/3\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/3</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.2...v1.0.3\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.2...v1.0.3</a></p>\n"
    },
    {
      "version": "v1.0.2",
      "name": "v1.0.2",
      "datetime": "2026-04-29T23:43:32Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.2",
      "prerelease": false,
      "notes": "## What's Changed\n* v1.0.2 by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/2\n\n\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.1...v1.0.2",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>v1.0.2 by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/2\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/2</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.1...v1.0.2\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.1...v1.0.2</a></p>\n"
    },
    {
      "version": "v1.0.1",
      "name": "v1.0.1",
      "datetime": "2026-04-29T09:46:52Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.1",
      "prerelease": false,
      "notes": "## What's Changed\n* v1.0.1 by @tuzzmaniandevil in https://github.com/meshcore-go/meshcore-go/pull/1\n\n## New Contributors\n* @tuzzmaniandevil made their first contribution in https://github.com/meshcore-go/meshcore-go/pull/1\n\n**Full Changelog**: https://github.com/meshcore-go/meshcore-go/compare/v1.0.0...v1.0.1",
      "notesHtml": "<h2>What's Changed</h2>\n<ul>\n<li>v1.0.1 by @tuzzmaniandevil in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/1</a></li>\n</ul>\n<h2>New Contributors</h2>\n<ul>\n<li>@tuzzmaniandevil made their first contribution in <a href=\"https://github.com/meshcore-go/meshcore-go/pull/1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/pull/1</a></li>\n</ul>\n<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/compare/v1.0.0...v1.0.1\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/compare/v1.0.0...v1.0.1</a></p>\n"
    },
    {
      "version": "v1.0.0",
      "name": "v1.0.0",
      "datetime": "2026-04-28T03:11:35Z",
      "url": "https://github.com/meshcore-go/meshcore-go/releases/tag/v1.0.0",
      "prerelease": false,
      "notes": "**Full Changelog**: https://github.com/meshcore-go/meshcore-go/commits/v1.0.0",
      "notesHtml": "<p><strong>Full Changelog</strong>: <a href=\"https://github.com/meshcore-go/meshcore-go/commits/v1.0.0\" target=\"_blank\" rel=\"noopener noreferrer\">https://github.com/meshcore-go/meshcore-go/commits/v1.0.0</a></p>\n"
    }
  ],
  "changelogSource": "github",
  "changelogUpdatedAt": "2026-07-03T22:14:02.306Z"
}
