Add a switchable cockpit-profile selector (Garmin G1000 / Cessna Citation X / GA steam) and recreate the Citation X Honeywell Primus 2000 avionics line-for- line from the X-Plane Citation X + FMS manuals: - CitPFD: attitude w/ FD command bars, speed tape (Vmo barber-pole, Vfe, low- speed red/amber bands), AOA index, altitude tape + trend, VSI, round HSI with CDI/course pointer + VOR/ADF bearing pointers, radar altimeter, minimums, STD/BARO/CRS/HDG bezel. - CitEICAS: twin FAN%/ITT bar gauges, OIL °C/PSI, FUEL (flow/qty PPH·LBS), ELECTRICAL, HYDRAULICS, slat chevron, STAB trim, FLAPS, CAS message stack, softkeys NORM/FUEL-HYD/ELEC/CTRL-POS/ENG + control-position overlay. - CitMFD: Honeywell heading-up arc map, FMS route (magenta active/white future), TCAS, terrain/WX, range arc, ETE/SAT/TAS/GSPD block, clock + ET/FT timer, V-SPEEDS reference card, MFD-setup overlays (TRAFFIC/TERRAIN/APTS/VOR). - CitAP: HDG/NAV/APP/BC · ALT/VNAV/BANK/STBY · FLC/C-O/VS · pitch wheel · AP/YD/M-TRIM/PFD-SEL, FMA bar + lamps from per-mode *_status datarefs. - CitRMU: COM/NAV active+standby tuning, transponder, ADF, TCAS range/mode, IDENT + Nav Source Selector (NAV1/2/FMS, VOR/ADF/FMS bearing source). Integration: all avionics stream live via the X-Plane Web API (new datarefs for N1/N2/ITT, radar-alt, AOA, hydraulics, trim, flaps/slats/gear, control positions, ADF, mach, yaw-damper); the existing fms-sync.lua drives the Citation's built-in FMS (aircraft-agnostic XPLM FMS SDK). Demo seeds added so every panel renders offline. Verified headless via Playwright (no console errors; G1000/GA profiles unaffected). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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)
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
- Make sure X-Plane is running and you're in a flight.
- On a tablet/laptop on the same Wi-Fi, open:
http://<PC-LAN-IP>:8080- Find the IP: macOS
ipconfig getifaddr en0· Windowsipconfig(IPv4).
- Find the IP: macOS
- 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.
- Tip: on iPad, "Add to Home Screen" → it opens full-screen like a real app.
Development (hot reload)
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:
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 (~10–20 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_BITSinAutopilotPanel.jsx) are best-effort and can differ per aircraft. - LAN only by design. Don't expose port 8080 to the public internet.