Contributor setup
Each component is an independent repository. Run Git and project commands from that repository, inspect git status first, and preserve unrelated local work.
Backend
Section titled “Backend”Requires Go 1.26+, PostgreSQL, and the tools named in its README. Copy .env.example to the ignored .env; every value is required.
make helpmake swaggermake buildgo test ./...Edit Ent schemas under internal/platform/ent/schema/ and regenerate via the owning Make target. Database start, migration application, seeding, cleanup, and release targets modify external or persistent state—review and run them deliberately.
Frontend
Section titled “Frontend”Configure VITE_API_URL and VITE_CLERK_PUBLISHABLE_KEY from .env.example, then:
npm cinpm run devnpm run lintnpm testnpm run buildKeep backend CORS/Clerk origins synchronized. Add shadcn primitives with its CLI rather than recreating them.
Flutter app
Section titled “Flutter app”The provisioning app is currently WIP.
flutter pub getflutter analyzeflutter testWhen implementing provisioning, keep UUIDs, commands, response framing, chunk buffering, and secret handling synchronized with firmware src/ble.cpp.
Device firmware
Section titled “Device firmware”Copy the secrets template locally, then run pio run or make build. Do not commit secrets.h. Upload, serial monitor, tag, and release operations need hardware or external authorization and should never be part of an incidental verification run.
Documentation
Section titled “Documentation”The docs repository uses Node 24:
npm cinpm run sync:api -- ../backend/docs/swagger.yamlnpm run validateRun API synchronization after Swagger generation. CI compares the committed snapshot with open-aiq/backend main. Do not hand-edit generated API endpoint pages or the snapshot.