[{"data":1,"prerenderedAt":240},["ShallowReactive",2],{"blog-xplane-proxy":3},{"id":4,"title":5,"author":6,"body":7,"category":224,"date":225,"description":226,"extension":227,"meta":228,"navigation":229,"path":230,"readingTime":231,"seo":232,"stem":233,"tags":234,"__hash__":239},"blog\u002Fblog\u002Fxplane-proxy.md","X-Plane Proxy: Exposing X-Plane's WebSocket API Across Your Network","CockpitConnect",{"type":8,"value":9,"toc":215},"minimark",[10,15,28,36,39,43,58,61,71,75,85,94,98,101,104,108,111,116,130,135,153,175,179,193,196,200,211],[11,12,14],"h2",{"id":13},"the-problem","The Problem",[16,17,18,19,23,24,27],"p",{},"X-Plane 12 ships with a built-in WebSocket server at ",[20,21,22],"code",{},"\u002Fapi\u002Fv3",". It's the modern way to read datarefs and send commands — fast, event-driven, and well documented. There's just one catch: it only binds to ",[20,25,26],{},"127.0.0.1",".",[16,29,30,31,35],{},"That means if your cockpit software — a hardware bridge, an EFB app, a logging tool, anything — runs on a ",[32,33,34],"strong",{},"different machine"," than X-Plane, it simply cannot reach the API. No setting to change, no config file to edit. It's localhost-only by design.",[16,37,38],{},"For a single-PC setup this is fine. But a lot of home cockpit builders run their simulator on a dedicated SimPC and their hardware controllers, displays, and bridge software on separate machines. In that setup you're stuck.",[11,40,42],{"id":41},"the-solution","The Solution",[16,44,45,46,49,50,53,54,57],{},"We built ",[32,47,48],{},"xplane-proxy",": a small, standalone Node.js utility that runs on the same machine as X-Plane and re-exposes both the WebSocket API and the HTTP REST API (",[20,51,52],{},"\u002Fapi\u002Fv1\u002Fdatarefs",") on ",[20,55,56],{},"0.0.0.0"," — so any machine on your local network can connect as if it were localhost.",[16,59,60],{},"No installation required. Download a single binary for your platform, run it, and point your bridge at the proxy's IP and port instead of X-Plane directly.",[62,63,68],"pre",{"className":64,"code":66,"language":67},[65],"language-text","[2026-05-29T10:00:00.000Z] X-Plane proxy listening on 0.0.0.0:8087\n[2026-05-29T10:00:00.000Z] Forwarding to X-Plane at 127.0.0.1:8086\n[2026-05-29T10:00:01.200Z] Client connected — opening ws:\u002F\u002F127.0.0.1:8086\u002Fapi\u002Fv3\n[2026-05-29T10:00:01.215Z] X-Plane WebSocket connected\n[2026-05-29T10:00:01.220Z] → X-Plane: dataref_subscribe_values — 3 dataref(s) [1042, 1043, 1107]\n[2026-05-29T10:00:01.250Z] → Client: dataref_update_values (3 key(s))\n","text",[20,69,66],{"__ignoreMap":70},"",[11,72,74],{"id":73},"what-it-proxies","What It Proxies",[16,76,77,80,81,84],{},[32,78,79],{},"WebSocket"," — Every path is forwarded. Each incoming client gets its own dedicated upstream connection to X-Plane, so multiple clients work independently. One subtle detail: a client's WebSocket ",[20,82,83],{},"open"," event fires as soon as the proxy accepts the upgrade — before the proxy has finished its own handshake with X-Plane. The proxy buffers any messages that arrive during that gap and flushes them the moment X-Plane's connection is ready, so subscriptions are never silently dropped.",[16,86,87,90,91,93],{},[32,88,89],{},"HTTP"," — All requests are forwarded transparently. This covers REST API calls like dataref ID lookups (",[20,92,52],{},"), which CockpitConnect uses to resolve dataref names to numeric IDs before subscribing.",[11,95,97],{"id":96},"why-we-open-sourced-it","Why We Open-Sourced It",[16,99,100],{},"xplane-proxy has no CockpitConnect-specific logic. It's a generic network proxy for X-Plane's API — useful to anyone building tools that talk to X-Plane from a remote machine. Keeping it inside the CockpitConnect codebase would have been selfish, and the flight simulation community has a long tradition of sharing tools openly.",[16,102,103],{},"It's published on GitHub under the MIT license. Single-file prebuilt binaries for Windows, Linux x64, and Linux ARM64 are on the Releases page — no Node.js installation needed.",[11,105,107],{"id":106},"getting-started","Getting Started",[16,109,110],{},"Download the binary for your platform, run it on the X-Plane machine, and you're done.",[16,112,113],{},[32,114,115],{},"Windows (PowerShell)",[62,117,121],{"className":118,"code":119,"language":120,"meta":70,"style":70},"language-powershell shiki shiki-themes github-light github-dark",".\\xplane-proxy-win-x64.exe\n","powershell",[20,122,123],{"__ignoreMap":70},[124,125,128],"span",{"class":126,"line":127},"line",1,[124,129,119],{},[16,131,132],{},[32,133,134],{},"Linux",[62,136,140],{"className":137,"code":138,"language":139,"meta":70,"style":70},"language-sh shiki shiki-themes github-light github-dark","chmod +x xplane-proxy-linux-x64\n.\u002Fxplane-proxy-linux-x64\n","sh",[20,141,142,147],{"__ignoreMap":70},[124,143,144],{"class":126,"line":127},[124,145,146],{},"chmod +x xplane-proxy-linux-x64\n",[124,148,150],{"class":126,"line":149},2,[124,151,152],{},".\u002Fxplane-proxy-linux-x64\n",[16,154,155,156,159,160,163,164,167,168,167,171,174],{},"The proxy listens on port ",[20,157,158],{},"8087"," by default and forwards to X-Plane on ",[20,161,162],{},"8086",". Both are configurable via environment variables (",[20,165,166],{},"XPLANE_HOST",", ",[20,169,170],{},"XPLANE_PORT",[20,172,173],{},"PROXY_PORT",") if you need non-standard ports.",[11,176,178],{"id":177},"for-cockpitconnect-users","For CockpitConnect Users",[16,180,181,182,185,186,189,190,192],{},"If your bridge runs on a different machine than X-Plane, set the ",[32,183,184],{},"X-Plane WebSocket Host"," in CockpitConnect's settings to your SimPC's local IP address (e.g. ",[20,187,188],{},"192.168.1.110",") and the port to ",[20,191,158],{},". That's it — the proxy handles the rest.",[16,194,195],{},"The proxy also gives you visibility into what's being sent: you can see every dataref subscription and command that flows between the bridge and X-Plane, which makes diagnosing issues considerably easier.",[11,197,199],{"id":198},"source-code","Source Code",[16,201,202,203,210],{},"The full source is on GitHub: ",[204,205,209],"a",{"href":206,"rel":207},"https:\u002F\u002Fgithub.com\u002Fcockpitconnect\u002Fxplane-proxy",[208],"nofollow","github.com\u002Fcockpitconnect\u002Fxplane-proxy",". Contributions and issues welcome.",[212,213,214],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":70,"searchDepth":149,"depth":149,"links":216},[217,218,219,220,221,222,223],{"id":13,"depth":149,"text":14},{"id":41,"depth":149,"text":42},{"id":73,"depth":149,"text":74},{"id":96,"depth":149,"text":97},{"id":106,"depth":149,"text":107},{"id":177,"depth":149,"text":178},{"id":198,"depth":149,"text":199},"build","2026-05-29","X-Plane 12's WebSocket API only listens on localhost. We built a small open-source proxy so your cockpit hardware can reach it from any machine on your LAN.","md",{},true,"\u002Fblog\u002Fxplane-proxy",5,{"title":5,"description":226},"blog\u002Fxplane-proxy",[235,236,237,238],"X-Plane","Open Source","Tools","Build","oc7tmKa7mStuk_2G6yqzJHPynWTjpaWGtbkm45AQ3To",1780073293104]