Initial commit: X-Plane G1000 web cockpit + bridge + Tauri desktop app

- server/: Node bridge (datarefs/commands, navdata, CIFP procedures, flight plan)
- web/: React cockpit (PFD/MFD/Map, VFR six-pack, AFCS, FMS CDU), PWA, collapsible sidebar
- desktop/: Tauri 2 launcher (Bun sidecar, system tray, updater) + Linux build via Docker
- scripts/: prep-desktop, build-linux, Gitea release + latest.json

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-01 15:07:03 +02:00
commit ebc33a78b7
110 changed files with 14671 additions and 0 deletions
+76
View File
@@ -0,0 +1,76 @@
# X-Plane Glass Cockpit (Web)
Bring X-Plane 12 instruments — a G1000-style **PFD**, an **MFD**, and an
**autopilot** panel — to any iPad, tablet or laptop on your network. Pure web,
no app install on the tablets. Just open a browser.
```
X-Plane 12 Node bridge (this repo) your devices
┌──────────┐ ws ┌────────────────────┐ ws/http ┌──────────┐
│ Web API │◀──────▶│ resolves dataref │◀───────────▶│ iPad │
│ :8086 │ REST │ IDs, streams values │ │ laptop │
│ (local) │ │ serves the React UI │ │ phone │
└──────────┘ └────────────────────┘ └──────────┘
binds 0.0.0.0:8080
```
## Why a bridge?
X-Plane's built-in web server (v12.1.1+) only listens on `localhost`, dataref
IDs change every session, and CORS blocks browsers. The bridge runs **on the
same PC as X-Plane**, talks to it locally, and re-broadcasts everything to your
LAN — to as many tablets as you like at once.
## Requirements
- **X-Plane 12.1.1 or newer** (the web API ships built-in; nothing to enable).
- **Node.js 18+** on the PC running X-Plane (`node --version`).
## Setup (run these on the X-Plane PC)
```bash
cd X-PLANE-MOD
npm install # also installs the web app's deps
npm run build # builds the React UI into web/dist
npm start # starts the bridge on http://0.0.0.0:8080
```
## Open it
1. Make sure X-Plane is running and you're in a flight.
2. On a tablet/laptop on the **same Wi-Fi**, open:
`http://<PC-LAN-IP>:8080`
- Find the IP: macOS `ipconfig getifaddr en0` · Windows `ipconfig` (IPv4).
3. The status pill top-right shows **X-PLANE** (green) when data is flowing,
**NO SIM** if the bridge is up but X-Plane isn't reachable, **OFFLINE** if
the tablet can't reach the bridge.
4. Tip: on iPad, "Add to Home Screen" → it opens full-screen like a real app.
## Development (hot reload)
```bash
npm run dev:bridge # terminal 1 — the bridge on :8080
npm run dev:web # terminal 2 — Vite dev server with HMR (proxies to bridge)
```
Open the URL Vite prints. Edits to `web/src/**` reload instantly.
## Configuration
All env vars are optional (defaults shown):
| Var | Default | Meaning |
|-----|---------|---------|
| `BRIDGE_PORT` | `8080` | Port the UI/LAN server listens on |
| `XPLANE_HOST` | `localhost` | Where X-Plane's web API is |
| `XPLANE_PORT` | `8086` | X-Plane web API port |
## Adding instruments / datarefs
Everything is driven by [`server/config.js`](server/config.js):
- **`DATAREFS`** — values streamed to the UI (alias → `sim/...` name).
- **`WRITABLE_DATAREFS`** — values the UI may set (knobs/bugs).
- **`COMMANDS`** — buttons the UI may press (mode toggles).
Add a `sim/...` name there, then read `values.<alias>` in any component. For
**G1000-specific** gauges, add that aircraft's `laminar/...` or
`sim/cockpit2/...` datarefs the same way.
## Notes & limits
- Update rate is X-Plane's (~1020 Hz) — fine for instruments, this isn't a
scenery stream.
- The autopilot buttons fire X-Plane's own commands, so the sim stays the
source of truth. Mode-highlight bits (`AP_BITS` in `AutopilotPanel.jsx`) are
best-effort and can differ per aircraft.
- LAN only by design. Don't expose port 8080 to the public internet.