Simulation  ·  2026

Flight Studio

Local-first flight planning and WebGL2 simulation for rockets, multirotors, fixed-wing and VTOL.

4 Vehicle classes
0.5.0 Version
full Offline
163 Test files

4 Vehicle classes

Simulation

2026

Key decisions

  • The safety boundary is stated on the project hub, in the persistent app footer, in the README and in every export header, because a simulation output that escapes into a real launch decision without its provenance attached is the failure mode that matters.
  • Every run writes a content-addressed artifact with inputs, solver version and outputs hashed together, so an identical run resolves to an identical address and a changed assumption is visible as a changed hash.
  • A Review Pack signs a run and its inputs with a locally held Ed25519 key, and browser-created reviewers are explicitly untrusted, so only a locally verified signing identity can move a review to complete.
  • All four vehicle classes share the integrator and result contract in src/engine/solvers/shared.ts and diverge only at the per-vehicle force model, because four independent integrators would drift apart exactly where cross-vehicle screening needs identical numerics.

The safety boundary comes first

Flight Studio produces simulation and engineering-screening estimates. It is not flight control, not launch authorisation, not legal advice, not airworthiness approval and not certification. It has no physical-vehicle transport, no arming, no firmware flashing, no live command and no mission-upload surface at all. Bundled demonstration data is illustrative or explicitly maturity-labelled.

That boundary is not a disclaimer page visited once. It is rendered on the project hub, pinned in the footer of every screen — “Local-First · Simulation Only · Not Flight Control” — stated in the README, and written into the header of every artifact the tool exports, including the Pre-Flight Brief that closes with “not launch authorization or a safety certification”. A simulation output that escapes into a real launch decision without its provenance attached is the failure mode that matters in this domain.

Four vehicle classes, one solver surface

Model rockets, multirotors, fixed-wing aircraft and VTOL share the integrator, telemetry contract and screening disclaimer in src/engine/solvers/shared.ts and diverge only at the force model — fixed-wing.ts, multirotor.ts and vtol.ts beside the original rocket core. Around that surface sit the multiphysics labs (src/engine/multiphysics: planar-channel flow, linear truss, structural dynamics, electro-thermal), airfoil polars and a Prandtl lifting-line wing screen, a control-system lab and a sensor estimator. Every trajectory ships with Monte Carlo uncertainty bands — the brief reports P10, P50 and P90 apogee next to the nominal run.

The frontend renders trajectories, stability margins and envelope screening in WebGL2 (src/webgl-flight-scene.tsx, with the replay and assembly-inspection viewports carrying their own GLSL programs). The same React 19 / Vite build runs as an offline-capable PWA — a hand-written service worker registered through src/platform/service-worker-coordinator.ts — and inside Tauri 2, where the flight-studio-native Rust crate holds the allowlisted IPC boundary. That crate also carries the heavy solvers: a solid FEA suite (linear, buckling, modal, thermal-stress, heat-conduction and load-path modules), planar-channel CFD, an automatic solid mesh kernel, and GeoTIFF/MBTiles terrain for offline world data.

Reproducibility as a feature

Every run writes a content-addressed artifact in src-tauri/src/storage.rs — inputs, solver version and outputs hashed together with SHA-256, atomically deduplicated and verified on read, so an identical run resolves to an identical address and a changed assumption is visible as a changed hash. Metadata lives in SQLite through rusqlite, and jobs.rs persists execution checkpoints so an interrupted solve can be recovered automatically.

A Review Pack bundles a run with its inputs and signs it locally with an Ed25519 key (src-tauri/src/review.rs). Private keys sit behind DPAPI at rest, portable backups use Argon2id and XChaCha20-Poly1305, and a per-project policy can require one to four trusted approvals before Review Complete unlocks — browser-created reviewers are explicitly untrusted and never count. Self-asserted signer identity claims are integrity-bound to the signed payload and labelled “Not Independently Verified” wherever they render, so a result handed to someone else arrives with a verifiable statement of exactly what produced it and no claim about who vouched for it beyond what the keys prove.

A screening estimate that escapes into a real launch decision without its provenance attached is the failure mode that matters in this domain. Every number this tool emits carries the assumptions that produced it.