SmartCodex turns a Wear OS watch into a tiny, always-available interface for Codex. It lets you browse local Codex projects and threads, read conversations, dictate a reply, watch agent activity stream live, and get a haptic notification when the work is done.
I work remotely, and when I step away from my desk I deliberately leave my phone behind. I still want long-running agentic work to keep moving without turning every break into more screen time. SmartCodex gives me the smallest possible interaction loop: raise my wrist, answer with my voice, put my arm down, and feel a vibration when Codex finishes.
The design goal is maximum agentic power per pixel — and, finally, a reason for the smartwatch to be useful.
- Groups all local Codex threads by project, with a separate Chats view.
- Shows recent conversations and live working/idle state.
- Sends replies using Wear OS voice dictation or the watch keyboard.
- Streams Codex text, command, file-edit, reasoning, and web-search activity over WebSockets.
- Notifies and vibrates on turn completion, with a deep link back to the thread.
- Adds watch-face complications for five-hour quota, weekly quota, and active thread count.
- Adds tiles for recent threads and quota at a glance.
Galaxy Watch (Wear OS + Jetpack Compose)
│ REST + WebSocket over local Wi-Fi, port 8788
▼
Local Node.js / TypeScript bridge
│ JSON-RPC over stdio
▼
codex app-server ──► existing local ~/.codex threads and login
The watch is intentionally thin. The Kotlin app handles the round-screen experience, dictation, tiles, complications, and notifications. A small TypeScript bridge on the Mac translates its REST calls into codex app-server JSON-RPC requests and relays app-server events back to the watch over WebSockets.
This proof of concept stays local: there is no cloud relay and no separate SmartCodex account.
The entire project was built by Codex. I supplied the problem, product direction, and real-device feedback; Codex designed and wrote the TypeScript bridge, the Kotlin Wear OS app, the round-screen Compose UI, the JSON-RPC integration with codex app-server, the REST and WebSocket layers, voice-reply flow, live activity streaming, notifications, tiles, complications, setup instructions, and validation workflow.
GPT-5.6 in Codex was used for the final architecture and implementation audit, to validate the Node and Android builds, trace the end-to-end event flow, identify the security boundaries of the local proof of concept, and prepare a reproducible judge-ready package. The primary core-build Codex session ID is 019f2523-8e4f-7231-9e01-31b58858a3f9; the GPT-5.6 validation and packaging session ID is 019f81ec-f35d-7471-9146-8f46bc9e3384.
- macOS with Node.js 20+
- Codex CLI installed and signed in (
codex login) - JDK 21 and Android SDK for building the watch app
- A Wear OS watch and the Mac on the same Wi-Fi network
cd bridge
npm ci
npm run typecheck
HOST=0.0.0.0 CODEX_AUTO_APPROVE=1 npm startThe safe default binds to 127.0.0.1:8788 and denies command/file approval requests. The command above explicitly enables trusted-LAN demo mode so a physical watch can connect and wrist-started turns can proceed without an approval UI. Quick checks:
curl localhost:8788/health
curl localhost:8788/projects| Method | Route | Purpose |
|---|---|---|
GET |
/projects |
Projects grouped by working directory |
GET |
/threads?cwd=... |
Threads for a project |
GET |
/threads/{id} |
Normalized thread messages |
POST |
/threads/{id}/reply |
Start a turn with { "text": "..." } |
POST |
/threads/{id}/interrupt |
Interrupt a turn |
GET |
/quota |
Five-hour and weekly remaining quota |
GET |
/running |
Active local threads |
WS |
/ws?threadId=... |
Live events for one thread |
WS |
/ws |
Global activity events for notifications |
cd watch
export JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home
./gradlew assembleDebugEnable developer mode, ADB debugging, and wireless debugging on the watch, then:
adb pair <WATCH_IP>:<PAIRING_PORT>
adb connect <WATCH_IP>:<DEBUG_PORT>
adb install -r app/build/outputs/apk/debug/app-debug.apkOpen Codex on the watch. In Settings, set the bridge address to http://<MAC_LAN_IP>:8788 if the default address does not match your network.
The submission build was validated with:
cd bridge && npm ci && npm run typecheck
cd watch && JAVA_HOME=/opt/homebrew/opt/openjdk@21/libexec/openjdk.jdk/Contents/Home ./gradlew assembleDebugBoth checks pass on macOS. The resulting debug APK is at watch/app/build/outputs/apk/debug/app-debug.apk.
SmartCodex is a local-network proof of concept, not a production service.
- The bridge has no authentication or TLS and must not be exposed to the public internet.
- Safe defaults bind only to loopback and deny command/file approvals.
HOST=0.0.0.0 CODEX_AUTO_APPROVE=1is intentionally explicit. It exposes the bridge to the LAN and auto-approves Codex command/file requests so wrist-started turns cannot stall. Use it only on a trusted machine and trusted LAN, and stop it when not in use.- The quota endpoint reads the existing local Codex login and only returns aggregate usage percentages; credentials are never sent to the watch.
- For remote use, add authentication and TLS or place the bridge behind a private network such as Tailscale.
Codex, GPT-5.6, Wear OS, Kotlin, Jetpack Compose for Wear OS, AndroidX Wear Tiles, Watch Face Complications, Node.js, TypeScript, JSON-RPC, WebSockets, OkHttp, and Kotlin Serialization.
MIT — see LICENSE.
0 comments
log in to comment.