There is no Debug Build any more (ADR 0010, issue #68, Q188 to Q195). The console and the test commands are compiled into every firmware. It listens only while Settings > Debug Console is on, which isn't the default; off, neither its task nor its 4 KB ring exists. The token is made by the device and shown on that page; a client proves it knows it by answering a challenge with an HMAC, so it never crosses the network, and five wrong answers close the console for a minute. DBG in the Status Bar while it listens. Over USB serial only: debug on, debug token <value>, debug token new. scripts/flash.sh --debug uses them to set a device up with the developer's token. scripts/rdbg.py takes the token from -t, $RORO_DEBUG_TOKEN or the file, answers the challenge, and fetches a release's ELF to decode a crash. Gone: the cardputer-adv-debug environment, RORO_DEBUG, the +debug version, scripts/debug_flags.py, update install ... force, and the rule that a Debug Build doesn't install releases. Old clients and old firmwares don't talk to each other. Against the builds it replaces: 30 KB more flash and 88 bytes more static RAM than the release, 4 KB less RAM than the Debug Build. 468 host tests. Checked on the device: off by default, login, the pause after wrong tokens, Safe Mode with the console, the setting surviving an update, debug off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
The roro9stack site
Source of https://roro9stack.net (docs/milestones/W1.md): a Zola site. The home page, an Install page with a browser flasher, and the list of releases so far; the user guide, how-tos, FAQ and developer docs come next.
config.toml base_url, the repository and API addresses
content/ the pages (Markdown, with their template named in the front matter)
templates/ base, home, install, downloads, 404; illustrations/ is generated
data/ the App cards and the screenshots' captions
static/ css, js, fonts (self-hosted), img, screens (real screenshots), vendor/esp-web-tools
tools/ make_illustrations.py, check_site.py
Build and look
docker run --rm -u "$(id -u):$(id -g)" -v "$PWD:/repo" -w /repo/site ghcr.io/getzola/zola:v0.22.0 build # writes ./public
docker run --rm -u "$(id -u):$(id -g)" -p 1111:1111 -v "$PWD:/repo" -w /repo/site ghcr.io/getzola/zola:v0.22.0 serve --interface 0.0.0.0
python3 site/tools/check_site.py public # what the pages promise, kept
Or zola build with a Zola of your own, in site/ (or zola --root site build from the root). The output goes to public/ at the root of the repository, not into site/: output_dir in config.toml, and git ignores that directory. The build reads the latest release and the list of releases from the Gitea API (load_data); if the server can't be reached, the pages say so instead of failing.
Publishing
The web server pulls main and runs zola build, as for the blog. CI (.gitea/workflows/site.yml) builds the site and runs the checks when site/, docs/, README.md or CONTEXT.md change; the firmware workflow skips a change that touches only those.
Things to know
-
The Install page needs Caddy's help. Gitea's release downloads carry no CORS header, so the page asks the API from the browser only if Caddy, in front of Gitea, allows this origin:
@releases { method GET HEAD path /twisla/roro9stack/releases/download/* /api/v1/repos/twisla/roro9stack/releases* } header @releases Access-Control-Allow-Origin "https://roro9stack.net" header @releases Vary OriginWithout it the page says it can't reach the release server and points to the esptool steps.
-
No third-party requests. Fonts and the flasher library are served from here;
tools/check_site.pyfails the build if a page loads anything from another origin. -
Illustrations.
templates/illustrations/*.htmlare generated bytools/make_illustrations.py; run it again rather than editing them. -
Updating the flasher library: see
static/vendor/esp-web-tools/README.txt. -
Fonts are DM Mono and Hanken Grotesk, under the SIL Open Font License (the licences are in
static/fonts/).