Bug reports, feature requests, and pull requests are welcome.
Use the GitHub issue templates:
- Bug report — something isn't working
- Feature request — something you'd like added
Include the firmware version (shown in the web UI System page), which sensors you have connected, and serial logs if relevant.
- Fork the repo and create a branch from
main - Make your changes (see code style below)
- Test on real hardware if possible
- Open a PR with a description of what and why
Keep PRs focused — one feature or fix per PR.
The project compiles with -Wall -Wextra -Werror. Your changes must build cleanly.
Language standard: C++17
Key rules:
- No stringly-typed code — use enums and structs, not
const char*maps - RAII resource management — no manual
new/delete - Const correctness —
conston everything that shouldn't change - No raw
String(Arduino) in logic code — usestd::string - Prefer
std::optionalover sentinel values like-1ornullptr
Adding a sensor: Extend SensorBase — see Adding Sensors.
Build and test:
pio run # must build with zero warnings
pio run --target upload && pio device monitor- TypeScript strict mode — no
any - Define API response shapes with Zod schemas in
web/src/types/ - Components in
web/src/ - No external UI component libraries — Tailwind classes only
Dev server:
cd web
ESP32_IP=<device-ip> npm run devShort imperative summary line, present tense:
Add MLX90614 cloud detection threshold config
Fix NTP sync dropping after WiFi reconnect
Update Bortle description strings
No trailing period. No "WIP" commits in PRs — squash before opening.
Documentation lives in docs/ and is built with MkDocs Material. Edit the relevant .md file and the site redeploys automatically on merge to main.
Preview locally:
pip install mkdocs-material
mkdocs serve