Site: the developer docs (phase 4), with the Debug Builds and the Debug Console first
CI / build (pull_request) Successful in 8m38s
Site / build (pull_request) Successful in 9s

/dev/ has Debug Builds and the Debug Console (builds and the token, the
console and its protocol, files and screenshots, driving the UI, crashes and
Safe Mode, the command reference), Build, test and release (including how an
update works), the architecture decisions and the milestone plans.

Generated from the repository by site/tools/gen_dev_docs.py: the ADRs, the
milestones, the README's sections, and the command reference, read from the
firmware's own `help` text. The pages are committed (Zola cannot read outside
its folder); the Site workflow checks they are current, and now also runs
when src/main.cpp changes. M0, M1 and CONTEXT.md are not published.
README: the gnss commands that the table lacked.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
This commit is contained in:
2026-10-06 21:25:33 +02:00
co-authored by Claude Sonnet 5.5
parent 8f95bee744
commit 3b4100dc6a
43 changed files with 2284 additions and 6 deletions
@@ -0,0 +1,43 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 760 196" role="img" aria-label="The Update File: a 160-byte header, then the firmware image. Bytes 0 to 79 are signed: the magic RORO-OTA, the format, the header size, the image size, the image's SHA-256 and the version. Then the signature's length, the signature itself, and reserved bytes up to 160. The signature is ECDSA P-256 over the SHA-256 of bytes 0 to 79, checked before anything is written. The image follows, hashed while it is written, and must match the hash in bytes 16 to 47.">
<g font-family="JetBrains Mono, ui-monospace, monospace" fill="currentColor">
<text x="16" y="22" font-size="13" font-weight="600">Update File (.ota)</text>
<text x="16" y="40" font-size="11" class="uf-dim">a 160-byte header, little-endian, then the image</text>
<rect class="uf-signed" x="16" y="72" width="380" height="40" rx="4"/>
<rect class="uf-cell" x="16" y="72" width="64" height="40"/>
<rect class="uf-cell" x="80" y="72" width="40" height="40"/>
<rect class="uf-cell" x="120" y="72" width="40" height="40"/>
<rect class="uf-cell" x="160" y="72" width="52" height="40"/>
<rect class="uf-cell" x="212" y="72" width="100" height="40"/>
<rect class="uf-cell" x="312" y="72" width="84" height="40"/>
<rect class="uf-cell" x="396" y="72" width="40" height="40"/>
<rect class="uf-cell" x="436" y="72" width="92" height="40"/>
<rect class="uf-cell" x="528" y="72" width="32" height="40"/>
<rect class="uf-image" x="560" y="72" width="184" height="40"/>
<g font-size="10" text-anchor="middle">
<text x="48" y="96">RORO-OTA</text>
<text x="100" y="96">fmt</text>
<text x="140" y="96">hdr</text>
<text x="186" y="96">size</text>
<text x="262" y="96">image SHA-256</text>
<text x="354" y="96">version</text>
<text x="416" y="96">len</text>
<text x="482" y="96">signature</text>
<text x="544" y="96">0…</text>
<text x="652" y="96">the image, ~1.6 MB</text>
</g>
<g font-size="10" class="uf-dim" text-anchor="middle">
<text x="16" y="64">0</text><text x="80" y="64">8</text><text x="120" y="64">10</text><text x="160" y="64">12</text>
<text x="212" y="64">16</text><text x="312" y="64">48</text><text x="396" y="64">80</text><text x="436" y="64">82</text>
<text x="528" y="64">154</text><text x="560" y="64">160</text>
</g>
<path d="M16 120 V128 H396 V120" fill="none" stroke="var(--accent)" stroke-width="1.5"/>
<text x="206" y="150" font-size="11" text-anchor="middle" class="uf-hot">signed: ECDSA P-256 over SHA-256(bytes 0–79)</text>
<text x="206" y="168" font-size="11" text-anchor="middle" class="uf-dim">checked before a single byte is written</text>
<path d="M560 120 V128 H744 V120" fill="none" stroke="currentColor" stroke-opacity=".5" stroke-width="1.5"/>
<text x="652" y="150" font-size="11" text-anchor="middle" class="uf-dim">hashed while it's written;</text>
<text x="652" y="168" font-size="11" text-anchor="middle" class="uf-dim">must match bytes 16–47</text>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.0 KiB