Skip to main content

Axiometa hardware truths and upload methods, for your editor and your AI.

Project description

axiometa-cli

Hardware truths and upload methods, for a repo that is not ours.

You are deep in an existing project and adding Axiometa hardware to it. Your editor is your editor, your AI is your AI, your files are yours. This provides the two things neither of them can derive: what the board actually is, and how to get firmware onto it.

It creates nothing in your repo — no manifest, no config file, no convention about where a sketch lives. Every command is stateless.

pip install axiometa-cli
axiometa login <key>                                 # from Studio -> account menu -> Headless
axiometa provision                                   # once per machine
axiometa board genesis-one                           # pins, buses, fqbn, silicon gotchas
axiometa part  genesis-one AX22-0005                 # one part's pins, library, init, rules
axiometa upload ./firmware -b genesis-one --parts AX22-0005

Hardware truths

An Axiometa board is a custom board package. Its pins, its esp32:esp32:axiometa_* target and its parts match nothing in a stock core, so none of it is inferable — and a wrong pin map compiles cleanly and fails silently in hardware.

boards what exists, and what language each speaks
board <id> ports and pin naming, shared vs unique buses, which pins read analog, fqbn, build options, silicon gotchas
parts <id> the catalog: every module, display, onboard radio, host part
part <id> <part> one part's real pins, i2c address, library name+version, locked init, coding rules

Add --json to any of them. That is the form an agent wants.

Upload methods

provision install the private toolchain (~7 GB, 15-20 min, once per machine)
devices what is plugged in
compile <dir> -b <board> build with the right target, profile and libraries
upload <dir> -b <board> build and put it on the board

--parts AX22-0005,AX22-0031 names what the build uses, which decides the libraries. You name them because there is no manifest to read them from, and guessing from #includes is how a build ends up with the wrong library. --option PartitionScheme=app_max_no_ota sets a build option.

MCP

axiometa mcp

The same tools over stdio, for clients that speak MCP. Six: list_boards, get_board, list_parts, get_part, compile, upload. File editing and shell are the client's own job, so they are not here.

It holds no prompt and does no reasoning. Your AI writes the code.

It cannot collide with your Arduino setup

Axiometa boards are a custom board package laid into a pinned ESP32 core (3.3.6 — 3.3.7/3.3.8 carry a NimBLE regression that boot-loops Matter sketches on ESP32-S3). Installing that into a shared arduino-cli would rewrite boards.txt, replace your core version, and add libraries to your sketchbook.

So we never touch yours. Everything lives in one prefix:

~/.axiometa/toolchain/
  bin/arduino-cli          our own pinned binary — never the one on your PATH
  arduino-cli.yaml         our own config, passed as --config-file on every invocation
  data/                    our cores + our patched boards.txt
  user/libraries/          our libraries
  venv/                    our mpremote / adafruit-nrfutil

Your arduino-cli, your core version, your arduino-cli.yaml, your sketchbook and your Python environment are never read and never written. Uninstall is rm -rf ~/.axiometa. AXIOMETA_HOME moves the prefix.

Where the knowledge comes from

The CLI ships no board data. It fetches GET /api/knowledge/boards from its own service (server/, deployed separately) and caches it under ~/.cache/axiometa/, re-fetching only when the content hash changes. A board or part added upstream reaches every installed CLI with no release.

That fetch needs a key. Studio mints one per signed-in account (account menu -> Axiometa Headless); axiometa login <key> stores it, or set AXIOMETA_KEY.

The token is HMAC-signed and carries a public key_id:

axm_<base64url(user_id:key_id:issued_at)>.<hmac-sha256>

Signature first, database second. The HMAC proves authenticity with no lookup, so a forgery is rejected before anything touches the database. The key_id is then what makes a single key revocable and what usage counts against — the two questions a signature cannot answer. The raw token is stored nowhere; it is shown once, at creation.

Both deployments need the same AXIOMETA_HEADLESS_SECRET. Schema: backend/sql/headless.sql. Supabase is optional on the service — without it the signature still gates access and usage simply is not recorded, because a knowledge fetch must never fail over an analytics table. With no secret set at all the service stays open rather than locking everyone out over a missing env var.

Board knowledge is authored once, in backend/knowledge/. build_knowledge.py is the only bridge: it copies the hardware payload here and deletes anything carrying a %%TOKEN%% — those are build-time substitutions belonging to a browser product this one is not part of. Deleted, not reworded: hardware knowledge is pins, buses, addresses, libraries, init and timing, and a placeholder for someone else's build step is none of those. Everything else passes through as written. Run --check in CI.

Boards

Board Silicon Upload
Genesis One / Genesis Mini ESP32-S3 upload
XIAO Shield (ESP32-S3) ESP32-S3 upload
XIAO Shield (nRF52840) nRF52840 upload (Seeed nRF52 core)
Pi HAT RP2040 upload (mpremote over the Pi UART)

Verbs are facts of the (board, language), read from board.json — not a list in this README.

Python 3.9+. pyserial is the only dependency; the build tools install into the private prefix.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

axiometa_cli-2.0.2.tar.gz (43.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

axiometa_cli-2.0.2-py3-none-any.whl (47.4 kB view details)

Uploaded Python 3

File details

Details for the file axiometa_cli-2.0.2.tar.gz.

File metadata

  • Download URL: axiometa_cli-2.0.2.tar.gz
  • Upload date:
  • Size: 43.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.10

File hashes

Hashes for axiometa_cli-2.0.2.tar.gz
Algorithm Hash digest
SHA256 b724cf8636ec853c86ba95554f3cb539e9a2fa9ca5408919b568af844679dd1b
MD5 b664a21320c224a14026f26a10e3ff5d
BLAKE2b-256 0f44b0f0f6a5e24c485dfae466678eb91e72c9aa10a1397720a6dbb538b57f5f

See more details on using hashes here.

File details

Details for the file axiometa_cli-2.0.2-py3-none-any.whl.

File metadata

  • Download URL: axiometa_cli-2.0.2-py3-none-any.whl
  • Upload date:
  • Size: 47.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.10

File hashes

Hashes for axiometa_cli-2.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 d6f6a33bc262a62c3aa3cc443ed10e7ff789649e6e6eb423f5a08628ba2fe614
MD5 ff85d6a370a75a28f90636035cb9b632
BLAKE2b-256 e167948da886f00e8acfe5cc8ae61ad9358679376a1a910602c1d6e4b256aa90

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page