Important
This project has moved to friuns2/codexui. Please use the new repository for the latest updates: https://github.com/friuns2/codexui.
Codex Desktop's full UI β chat, skills, file editing, code execution β accessible from any browser on any device. No Electron window required.
One script. Full Web UI. Anywhere. π
βββββββ βββββββ βββββββ βββββββββββ βββ βββ ββββββββββββββββββ βββ ββββββ
βββββββββββββββββββββββββββββββββββββββββ βββ βββββββββββββββββββ βββ ββββββ
βββ βββ ββββββ βββββββββ ββββββ βββ ββ βββββββββ ββββββββ βββ ββββββ
βββ βββ ββββββ βββββββββ ββββββ ββββββββββββββββ ββββββββ βββ ββββββ
βββββββββββββββββββββββββββββββββββββ ββββ ββββββββββββββββββββββββββ ββββββββββββ
βββββββ βββββββ βββββββ βββββββββββ βββ ββββββββ βββββββββββββββ βββββββ βββ
E N A B L E R
OpenAI's Codex Desktop is a powerful AI coding agent β but it's locked inside an Electron window on a single machine. What if you could access it from any browser, on any device, anywhere on your network?
We reverse-engineered the minified Electron bundle and built scripts that patch the app at runtime to expose the full Codex UI over HTTP + WebSocket. The same scripts also unlock a hidden SSH remote execution engine that was already compiled into the binary but never wired up.
One command. Full Web UI. Plus SSH remote control. No recompilation.
Yes, that's a phone. Yes, that's Codex. Yes, it's running on a Mac across the network.
π€― This is not a mockup. This is a real Codex Desktop instance running on macOS, patched with our Web UI Enabler scripts, accessed from a mobile phone browser over Tailscale. Every feature works β chat, skills, file editing, code execution β all from your pocket.
# Run directly from npm (no clone needed)
npx -y codex-web-ui --port 5999Open http://127.0.0.1:5999/ and you're flying.
With the Web UI enabled, Codex breaks free from the Electron window β and with SSH mode unlocked, it reaches any machine you own:
| π― Use Case | π‘ Description |
|---|---|
| π± Code From Your Phone | Open Codex in any mobile browser β full chat, skills, file editing, code execution |
| π» Use Any Browser | Chrome, Firefox, Safari, Arc β no Electron install needed on the client |
| π Access Over the Network | Tailscale, LAN, VPN β access your Codex instance from anywhere securely |
| π₯οΈ Control Your Mac Remotely | SSH into your MacBook from anywhere and let Codex operate it as if you're sitting in front of it |
| π§ Orchestrate Linux Servers | Point Codex at your Ubuntu/Debian/Arch boxes and run AI-powered coding sessions remotely |
| πͺ Manage Windows via WSL | Connect through WSL2 SSH and bring Codex intelligence to your Windows dev environment |
| π Command Your Homelab | Proxmox, TrueNAS, Raspberry Pi clusters β Codex becomes your AI sysadmin |
| βοΈ Cloud Fleet Management | AWS EC2, Oracle Cloud, DigitalOcean droplets β manage entire fleets from one Codex window |
| π§ Web Service Orchestration | Nginx configs, Docker containers, systemd services β edit and deploy across machines |
| π§ͺ Remote CI/CD Pipelines | Trigger builds, inspect logs, fix failing tests on remote CI runners in real-time |
| π‘ IoT & Edge Devices | SSH into Raspberry Pis, Jetson Nanos, or any edge device and code directly on them |
| ποΈ Multi-Machine Refactoring | Coordinate code changes across microservices running on different hosts simultaneously |
TL;DR: Codex in your browser + SSH to any machine = your entire infrastructure as one AI-powered IDE. π§
codex-unpacked-toolkit/
βββ π launch_codex_webui_unpacked.sh # WebUI mode launcher (browser access)
βββ π§ launch_codex_unpacked.sh # SSH unlock & debug launcher
βββ π webui-bridge.js # Browser-side WebSocket β IPC bridge
βββ π PROJECT_STATE.md # Living project state & patching reference
βββ π images/ # Screenshots & proof it works
β βββ mobile-chat-session.jpeg # Codex chat from mobile phone
β βββ mobile-skills-browser.jpeg # Skills manager from mobile phone
βββ π skills/
βββ launch-codex-unpacked/
βββ SKILL.md # Codex skill definition
The main event. Run Codex in your browser. No Electron window needed. Access from any device on your network.
- π¦ Extracts
app.asarβ Same unpacking as above - π Injects WebUI runtime patch β Embeds a full HTTP server + WebSocket bridge directly into the Electron main process (~800 lines of runtime injection)
- π©Ή Patches renderer bundle β Fixes a
rootsguard compatibility issue in the React renderer that crashes in WebUI mode - π Copies
webui-bridge.jsβ Installs the browser-side bridge into the webview directory - π Launches headless Electron β Starts with
--webuiflag, hides all native windows, serves UI over HTTP - π Optional token auth β Protect your instance with
--tokenfor secure remote access - π Origin allowlist β Restrict which domains can connect via
--origins - π₯οΈ Auto-opens browser β Polls the server and opens your default browser when ready
- π Full HTTP static file server (serves Codex webview assets)
- π RFC 6455-compliant WebSocket server (zero dependencies, hand-rolled frame parser)
- π Timing-safe token authentication (Bearer, header, query param, and cookie)
- π‘οΈ Security headers (X-Content-Type-Options, X-Frame-Options, CORP, Referrer-Policy)
- π‘ IPC-to-WebSocket bridge (intercepts
webContents.sendand mirrors to all connected clients) - π¦ Rate limiting (5000 messages/minute for local, configurable)
- π€ Single-client policy (new tab takes over, old tab gets disconnected)
- π SPA fallback with automatic
webui-bridge.jsinjection into HTML
--app <path> Custom Codex.app path
--port <n> WebUI port (default: 5999)
--token <value> Auth token for secure access π
--origins <csv> Allowed origins (comma-separated)
--bridge <path> Custom webui-bridge.js path
--user-data-dir <path> Chromium user data dir override
--no-open Don't auto-open browser
--keep-temp Keep extracted app dir
# Run from npm package
npx -y codex-web-ui --port 5999
# Basic local access
./launch_codex_webui_unpacked.sh
# Secure remote access with auth
./launch_codex_webui_unpacked.sh --port 8080 --token mysecrettoken
# Access from specific origins only
./launch_codex_webui_unpacked.sh --origins "https://mysite.com,http://localhost:3000"Bonus superpower. This script extracts, patches, and launches Codex with the hidden SSH remote execution feature fully activated.
- π¦ Extracts
app.asarβ Unpacks the Codex Electron bundle into a temp directory using@electron/asar - π Injects SSH host into global state β Writes your SSH host into
.codex-global-state.jsonso the app recognizes it as a configured remote - 𧬠Patches the main bundle β Performs a surgical startup-sequence patch on minified
main-*.jsto auto-select the SSH host on startup (dynamically discovers the target sequence and rewires it to checkelectron-ssh-hostsfirst) - π Enables Node Inspector β Launches with
--inspectfor live debugging (port 9229 by default) - π Enables Chromium Remote Debug β Opens
--remote-debugging-port(9222) for DevTools Protocol access - β
SSH preflight check β Validates connectivity to your host with
BatchMode=yesandConnectTimeout=6before launching - π§Ή Auto-cleanup β Temp directory is removed on exit (unless
--keep-temp)
--app <path> Custom Codex.app path (default: /Applications/Codex.app)
--user-data-dir <path> Chromium user data dir override
--inspect-port <n> Node inspector port (default: 9229)
--remote-debug-port <n> Chromium remote debug port (default: 9222)
--ssh-host <user@host> The SSH host to unlock and auto-connect π
--no-inspect Disable Node inspector
--no-remote-debug Disable Chromium remote debugging
--keep-temp Keep extracted app dir for inspection
# Unlock SSH to your homelab server with custom ports
./launch_codex_unpacked.sh \
--ssh-host ubuntu@192.168.1.100 \
--inspect-port 9230 \
--remote-debug-port 9223Makes the browser think it's Electron. Replaces
window.electronBridgewith a WebSocket-backed implementation.
- π Detects environment β Only activates when the native Electron preload bridge is absent
- π Establishes WebSocket connection β Connects to
/wswith automatic reconnection (exponential backoff, 500ms β 5s) - π¨ Implements full
electronBridgeAPI βsendMessageFromView,sendWorkerMessageFromView,subscribeToWorkerMessages, and more - π¬ Message queue β Buffers outbound messages while disconnected, flushes on reconnect
- π‘ Event forwarding β Translates WebSocket packets into browser
MessageEvents that the React app expects - π Worker subscription system β Manages per-worker callback subscriptions with proper cleanup
- π·οΈ Session management β Emits
client-status-changedon connect, handlesopen-new-instanceredirects - π‘οΈ Single-socket guard β Token-based deduplication prevents ghost connections
See the full reverse-engineering findings in
PROJECT_STATE.mdΒ§ 9
We extracted the app.asar, deobfuscated the minified bundles, and traced the execution paths. Along the way we discovered a fully-built SSH remote execution engine hidden inside the binary. Here's what we found:
| π Discovery | π Detail |
|---|---|
| Remote host detection | Activates when host config kind is ssh or brix |
| Command execution | Builds args from hostConfig.terminal_command, appends --, env vars, and command |
| SSH wrapper | Wraps commands in sh -lc <quoted> with -o BatchMode=yes -o ConnectTimeout=10 |
| Git over SSH | Routes git commands through remote shell with GIT_TERMINAL_PROMPT=0 |
| Remote git apply | Full flow: mktemp -d β cat > patch β test -e β git apply --3way β rm -rf |
| Codex home resolution | Checks $CODEX_HOME, falls back to $HOME/.codex |
All of this was already compiled into the app. We just wired it up. β‘
βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β YOUR BROWSER β
β β
β webui-bridge.js β
β ββββββββββββββββββββββββββββββββββββ β
β β window.electronBridge (fake) β β
β β ββββββββββββββ βββββββββββββββ β β
β β β sendMessage β β subscribe β β β
β β β FromView β β ToWorker β β β
β β ββββββββ¬ββββββ ββββββββ¬βββββββ β β
β βββββββββββΌβββββββββββββββΌβββββββββ β
β β WebSocket β β
βββββββββββββββΌβββββββββββββββΌββββββββββββββββββββββββββ
β /ws β
βββββββββββββββΌβββββββββββββββΌββββββββββββββββββββββββββ
β ELECTRON MAIN PROCESS (headless) β
β β β β
β ββββββββββ΄βββββββββββββββ΄βββββββββ β
β β WebUI Runtime Patch β β
β β ββββββββββββ βββββββββββββββ β β
β β β HTTP β β WebSocket β β β
β β β Server β β Server β β β
β β ββββββββββββ ββββββββ¬βββββββ β β
β β β β β
β β webContents.send ββββ (intercept & mirror) β
β ββββββββββββββββββββββββββββββββββ β
β β β
β βββββββββ΄βββββββββ β
β β SSH Transport β βββ UNLOCKED π β
β βββββββββ¬βββββββββ β
ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββ
β SSH
ββββββββββ΄βββββββββ
β REMOTE HOST β
β ββββββββββββββ β
β β ~/.codex β β
β β git apply β β
β β sh -lc ... β β
β ββββββββββββββ β
βββββββββββββββββββ
- π macOS with Codex Desktop installed (or custom
--apppath) - π¦ Launcher dependencies are auto-installed when missing:
node/npx(both launchers)ripgrep(launch_codex_webui_unpacked.sh)- via Homebrew bootstrap when
brewis missing
- π Internet access and
curlavailable for automatic Homebrew/tool installation - βοΈ Optional: set
AUTO_INSTALL_TOOLS=0to disable auto-install behavior - π A modern browser (Chrome, Firefox, Safari, Arc, etc.) for Web UI access
- π SSH key-based auth configured for your target host β only needed for SSH mode (
BatchMode=yes) - π₯οΈ Target host with
~/.codexdirectory (or$CODEX_HOMEset) β only needed for SSH mode
- SSH uses
BatchMode=yesβ no interactive password prompts, key-based auth only - WebUI token auth uses timing-safe comparison to prevent timing attacks
- Security headers are set on all HTTP responses (DENY framing, no-sniff, no-referrer)
- Single-client policy prevents session hijacking from duplicate tabs
- Rate limiting protects against WebSocket flood attacks
- No
StrictHostKeyCheckingoverrides β your existing SSH config is respected
| Problem | Solution |
|---|---|
EADDRINUSE |
Port already in use β try --port 6002 |
SSH preflight failed |
Check your SSH key: ssh -o BatchMode=yes user@host 'echo ok' |
[webui] Renderer guard patch anchor not found; continuing without renderer patch (bundle shape changed). |
Informational on newer bundles; launcher now continues |
Missing app.asar |
Point --app to your Codex.app location |
| Blank page in WebUI | Check console for roots error β renderer patch may need updating |
# Clone this repo
git clone https://github.com/friuns2/codex-web-ui.git
cd codex-web-ui
# π Launch the Web UI β access Codex from any browser
./launch_codex_webui_unpacked.sh --port 5999
# π Or launch with SSH mode unlocked (connects to your remote host)
./launch_codex_unpacked.sh --ssh-host user@your-server.comFound a new Codex version that breaks the patches? Bundle patterns change between releases β PRs to update the patch anchors are always welcome! Open an issue if you hit a new bundle shape.
If you think Codex should be accessible from any browser, on any device β not just the Electron window it shipped in β smash that star button. β
Built by reverse-engineering Codex Desktop's Electron bundle π¬
Because the best features are the ones they already shipped but forgot to turn on. π

