Thanks for your interest! This project controls real hardware (flight controllers, radios), so contributions follow a few safety-driven rules.
git clone https://github.com/SoCloseSociety/radiomaster.git
cd radiomaster
npm install
npm run dev # http://localhost:3000No hardware is required for most development: every tab has an empty/disconnected state, and the protocol/template/validation libraries are covered by unit tests with a mocked serial port.
All three must pass locally (CI enforces them):
npm run lint # ESLint (eslint-config-next 16, React Compiler rules)
npm test # Vitest unit tests
npm run build # Next.js production buildThese encode real incidents documented in tasks/lessons.md:
- Never bypass
src/lib/api-guards.ts. Every Betaflight CLI command sent to a flight controller goes through its allowlist.motorvalues are capped at a safe test throttle, anddfu/erase/baredefaultsare rejected. - One Save Rule. Generated Betaflight CLI batches must contain exactly one
save, as the last command. - EdgeTX writes go through
src/lib/edgetx-injector.ts. Model files must bemodelN.ymland listed inMODELS/models.ymlβ anything else is invisible to the radio. - Never leave the FC in CLI mode. CLI mode blocks arming;
sendBetaflightCLIguarantees anexitand any new code path must too. - Backup before destructive SD operations.
If a PR touches src/lib/msp-protocol.ts, betaflight-cli.ts, config-templates.ts or edgetx-injector.ts, please explain in the PR description how you verified it (unit tests at minimum; hardware read-back if you have the gear).
- TypeScript strict, no
any - Files
kebab-case.ts, componentsPascalCase, constantsUPPER_SNAKE_CASE - UI strings are in French (the dashboard's audience), code comments in English or French
- Match the existing patterns: API routes return
{ success, ...payload }with proper HTTP status codes
Use the issue templates. For hardware-related bugs, include: OS version, radio model + EdgeTX version, FC board + Betaflight version, and the dashboard's API response if visible.