Files
meshcore-spec/src/13-payload-raw-custom.md
T
swaitsandClaude Opus 4.7 d785e35919 feat(mdbook): publish spec via mdBook on GitHub Pages
Set up the protocol spec as an mdBook and add a GitHub Actions
workflow that builds it on every push/PR and deploys to GitHub
Pages on main. The repo is now both a machine-readable corpus and
a browsable, searchable site.

Structure changes (one-time, mechanical):

- Rename the spec source directory from `spec/` to `src/` to match
  mdBook's default convention. All 21 chapter files move; their
  internal relative cross-links are unchanged.
- Add `src/SUMMARY.md` as the mdBook table of contents, grouping
  chapters under Wire Format, Payloads, Cryptography & Identity,
  and Routing & Higher-Layer Protocols.
- Add `book.toml` at repo root: title, author, search enabled,
  fold enabled, edit-on-GitHub links, navy theme.
- Add `.github/workflows/mdbook.yml`: build on push + PR, deploy
  on push to main only (configure-pages + upload-pages-artifact +
  deploy-pages from actions/).
- Add `/book/` to .gitignore.

Reference updates so the old path is fully retired:

- Every `spec_ref` in `corpus/**/*.json` rewritten from `spec/` to
  `src/` (54 files).
- Schema description text and example path in
  `corpus/schema/test-vector.schema.json`.
- `README.md`: prominent link to the published site near the top;
  "What's Here" updated for the new layout.
- `CONTRIBUTING.md`: spec-editing instructions point at `src/`
  and note the SUMMARY.md requirement.
- `CLAUDE.md`: directory-layout notes updated.

CHANGELOG.md historical entries intentionally keep their `spec/`
paths since those record what the paths were at the time of those
commits.

After this lands, the user needs to enable GitHub Pages in repo
settings with source = "GitHub Actions" (one-time, manual). The
workflow will then publish to https://swaits.github.io/meshcore-spec/
on every push to main.

Verified locally: `mdbook build` produces a clean book/ tree with
all 21 chapters rendered and the SUMMARY-driven sidebar populated.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 09:36:28 -06:00

1.2 KiB

MeshCore Protocol Specification

Section 13: Payload — Raw Custom

Overview

The RAW_CUSTOM payload carries application-defined raw bytes with no prescribed structure. It is intended for applications that implement their own encryption, framing, or payload formats on top of the MeshCore transport.

Payload Type

Header payload type field: 0x0F (RAW_CUSTOM)

Wire Format

 0
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     Raw Data (1-184 bytes)    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Fields

Field Offset Size Type Description
data 0 1-184 bytes raw Application-defined payload

Routing

In the current reference implementation, RAW_CUSTOM packets are only processed when received via direct routing. They are NOT flood-routed.

Constraints

  • Payload MUST be at least 1 byte.
  • Maximum payload: 184 bytes (MAX_PACKET_PAYLOAD).
  • Maximum total data: limited by sizeof(Packet::payload) which is MAX_PACKET_PAYLOAD (184).

Cross-References

  • Test vectors: corpus/payloads/raw-custom/

Reference Implementation

  • Mesh::createRawData() in src/Mesh.cpp — Encoding
  • Mesh::onRecvPacket(), case PAYLOAD_TYPE_RAW_CUSTOM — Processing (direct only)