AlloyLogger is the Arduino library that stores all your MCU data into Alloy Mesh Storage, automatically, with no extra parts.
First 100 GB free for the first 10,000 users — 100 GB lasts decades if you're logging microcontroller values.
#include <AlloyLogger.h> AlloyLogger alloy; void setup() { alloy.wifi("ssid", "pass"); alloy.begin("ALLOY_API_KEY", "robots/sbr"); } void loop() { alloy.log("bno055") .set("heading", heading) .set("pitch", pitch) .set("roll", roll); alloy.log("battery", volts); }
| A | B | C | D | |
|---|---|---|---|---|
| 1 | time | heading | roll | pitch |
| 2 | 0.1 | 182.4 | -1.2 | 0.6 |
| 3 | 0.2 | 183.1 | -1.0 | 0.7 |
| 4 | 0.3 | 184.9 | -0.7 | 0.9 |
| 5 | 0.4 | 186.2 | -0.4 | 1.1 |
| 6 | 0.5 | 187.0 | -0.1 | 2.4 |
| 7 | 0.6 | 187.4 | 0.1 | 4.9 |
| 8 | 0.7 | 187.6 | 0.3 | 8.2 |
| 9 | ||||
| 10 |
This is the entire pipeline, end to end. A single pitch reading leaves your ESP32, rides AlloyLogger into Alloy Mesh Storage, and comes back through the Alloy MCP as an answer in Claude Code. Watch the same 8.2° change shape at every layer.
Your control loop reads the IMU over I²C at 100 Hz. Each reading lives for one loop tick, then it's overwritten. Without a logger, it's gone.
i2c 0x28 · bno055 · 100 Hz pitch → 8.2°
log() names the value, formats one compact CSV row, and buffers it in RAM in microseconds; your loop never blocks. A background task on core 0 batches rows into per-channel chunks and uploads over TLS every 4 s, store-and-forward across WiFi drops. No SD card, no flash wear.
alloy.log("bno055") .set("pitch", pitch); // RAM buffer → core 0 → TLS · 4 s
Every power-on becomes one run under your mesh path. When it ends, Alloy assembles one indexed .mcap mission plus a meta.json semantics sidecar: replayable, scrubbable, and queryable in place with SQL.
| A | B | C | |
|---|---|---|---|
| 1 | time | heading | pitch |
| 2 | 0.5 | 187.0 | 2.4 |
| 3 | 0.6 | 187.4 | 4.9 |
| 4 | 0.7 | 187.6 | 8.2 |
One command connects Claude to your mesh. It gets real tools, list_missions, get_mission_summary, query_mesh_storage: read-only SQL over every run you have ever streamed.
Claude writes the SQL itself, pulls the rows, and answers from your data, comparing run #47 against every run before it. Same reading, five layers later.
Arduino IDE: Sketch → Include Library → Add .ZIP Library. Or via CLI. Depends on ArduinoJson.
$ arduino-cli lib install ArduinoJson $ git clone https://github.com/alloyrobotics/alloy-logger-arduino \ ~/Arduino/libraries/AlloyLogger
Create an Alloy account, then: Dashboard → Mesh Storage → API key. One key per rig is fine; use per-device keys for a fleet.
Connect WiFi, call begin() with your key and a mesh path, then log name → value pairs anywhere in your loop. That is the whole integration, and everything from here lives in Alloy.
alloy.wifi("ssid", "pass"); alloy.begin("ALLOY_API_KEY", "robots/sbr"); alloy.log("env").set("temp_c", t).set("humidity", h);
Every run lands in Alloy Mesh Storage, ready to talk to. Connect the Alloy MCP and ask Claude or ChatGPT in plain English, grounded in your real telemetry.
you › Why did run #47 fall over?