One repo, many unrelated programming projects. Each top-level directory is a
self-contained project: its own toolchain, its own build command, its own
CLAUDE.md. Nothing at the root knows how to build anything.
| Project | What it is | Build |
|---|---|---|
flipper/ |
Flipper Zero apps (.fap, C, ufbt) |
cd flipper/apps/<app> && ufbt |
aio-board/ |
AIO Board V1.4 expansion hardware (ESP32-S2, CC1101, nRF24) | firmware TBD; hardware canon only |
nm-rf-hat/ |
Custom Bruce firmware for CYD (ESP32-2432S028) + NM-RF-HAT | cd nm-rf-hat && ./build.sh |
cyberpunkunicorn-os/ |
CyberUnicorn 5000™: our own OS for CYD + NM-RF-HAT (Bruce-based, rainbow skin, custom apps, sensor hub) | cd cyberpunkunicorn-os && ./build.sh |
unicorn-os-circuitpython/ |
Unicorn OS: CircuitPython launcher for Feather ESP32-S3 TFT + 8x8 LED panel (archive; being ported to C++) | none; copy launcher/ to CIRCUITPY |
sensor-node/ |
ESP32 ESP-NOW sensor node (BME280/BMP280, SHT3x, battery) reporting to the CyberUnicorn 5000 Sensors hub | cd sensor-node && ./build.sh |
cp -r _template my-thing && cd my-thing
Then fill in my-thing/CLAUDE.md and add a row to the table above. Rules:
- Self-contained. A project builds from inside its own directory. No root build script, no shared lockfile, no cross-project imports.
- Its own
CLAUDE.md. Claude Code loads the nearestCLAUDE.mdabove the file being edited, so per-project files are what keep a polyglot repo workable — one root file would be 90% irrelevant noise on any given task. The root file routes; it never restates. - Its own CI job, path-filtered. Touching
flipper/must not run a Rust build. See.github/workflows/. - Pin the toolchain version in the project's
CLAUDE.md. Embedded and systems SDKs break across releases; "latest" is not a version.