SpawnCity · engineering

Phone 1 is the simulation/view station. Phone 2 is the dedicated remote controller. In SIM mode the exact shared C++ fc::Runtime executes as WebAssembly. The two phones talk directly over WebRTC; GitHub Pages remains purely static.

Loading flight core…

Two-phone control · serverless P2P

Open controller page
P2P disconnected. Missing/stale control always forces throttle 0 and ARM OFF.

Local fallback keyboard

W/S pitch · A/D roll · Q/E yaw · R/F throttle · Space arm request. Select LOCAL FALLBACK above to use it.

Physical airframe model · component derived

Component bill of mass / placement
These are explicit nominal BOM inputs, not hidden fitted mass/inertia. Replace them with measured component values; motor/prop positions derive from motor span.
UNVALIDATED · nominal coefficients; no independent real-flight holdout evidence
Mass, center of mass and the complete inertia tensor are derived from the component BOM. Electrical authority comes from battery sag/current limits → motor Kv/R/back-EMF → prop Ct/Cq → Box3D forces. REAL LOG fitting still reserves the final 30% as unseen holdout.

Environment / faults

REAL flight log / digital-twin calibration

CSV or JSON. Required: time_s and motor1_us..motor4_us. Identification also consumes x,y,z, vx,vy,vz, roll_deg,pitch_deg,yaw_deg, battery_v and current_a whenever present. Inputs are applied as zero-order holds over their actual logged time intervals.
No real log loaded.

Point VIEW at the controller QR

No server and no code copying. On the controller phone tap CONNECT. Then point this VIEW camera at its QR. The VIEW answer appears automatically as a QR for the controller to scan.

SCAN CONTROLLER
The OFFER is detected automatically.
SHOW ANSWER
After detection, hold this answer QR toward the controller phone.
Camera not started yet.
Manual fallback only
Controller OFFER
VIEW ANSWER