A real voice link to your desktop Codex.
Use an Android phone as the remote microphone and speaker for the existing ChatGPT desktop Codex Voice session running on your Mac. Your phone carries live audio; Codex, GPT-Live, project context, permissions, and spoken replies remain on the Mac where they belong.
Codex Voice Link is an independent, unofficial project. It is not affiliated with, endorsed by, or sponsored by OpenAI.
The official ChatGPT Android Remote now appears to provide native Voice on current supported builds. That removes this project's commercial premise.
Codex Voice Link is retained as a private technical test build for comparing a locally controlled Android-to-desktop native Codex Voice audio path. It is not a new agent, remote shell, prompt relay, text-to-speech layer, replacement Codex UI, or a product offered for sale.
| The phone does | The bridge never does |
|---|---|
| Sends your live microphone audio to the paired Mac | Store audio, transcripts, prompts, output, or credentials |
| Plays the verified Codex Voice reply | Call an OpenAI API or implement STT/TTS |
| Starts/stops Voice and mutes/unmutes through fixed controls | Execute tasks, approve actions, access files, or control a shell |
| Opens official ChatGPT Remote for the visual surface | Send generic keyboard, pointer, or arbitrary commands |
flowchart LR
A["Android microphone"] -->|"Encrypted CVL1 audio"| B["Paired Mac host"]
B --> C["Virtual microphone input"]
C --> D["Desktop Codex Voice"]
D --> E["Verified Codex-only audio capture"]
E -->|"Encrypted CVL1 audio"| F["Android speaker / headset"]
The visual Codex experience stays in the official ChatGPT Android app. This repository adds only the secure audio link and a deliberately small set of session controls.
- Explicit pairing: an Android device identity is created in Android Keystore and bound locally by a single-use, five-minute pairing descriptor.
- Authenticated encryption: fresh P-256 ECDH, transcript-bound HKDF-SHA256, directional AES-GCM media keys, and authenticated control messages protect a session.
- Replay and expiry protection: a replay-protected media sequence space, correlated control receipts and short cryptographic liveness window fail microphone injection closed after a break. A bounded reconnect grace never replays a native Voice toggle.
- Least privilege: the Mac host captures only the verified Codex helper's output and automates only fixed Voice start/stop actions.
- No retained content: the bridge logs pairing/session/control/failure metadata, never raw media, transcripts, Codex content, credentials, or project data.
- Immediate revocation: revoke an enrolled Android device locally; it cannot create or resume a session without a fresh enrollment.
Read the implementation detail in the architecture decision record and the CVL1 transport contract.
Private test build — built and tested, not a production or commercial release.
The repository contains the Kotlin/Compose Android client, Swift macOS host, versioned protocol, crypto vectors, unit tests, host checks, and a physical Android smoke test. Real-world audio quality, echo behavior, roaming, and long-duration reliability still need broader testing.
| Component | Status |
|---|---|
| Android 12+ companion | Implemented |
| macOS Apple Silicon host | Implemented |
| CVL1 pairing and encrypted datagram media | Implemented |
| Codex-only capture and route restoration | Implemented |
| Network deployment and signed distribution | Deliberately paused |
- Apple Silicon Mac running the ChatGPT desktop app with Codex Voice access
- Android 12 or newer
- A private network path between the devices (the prototype uses Tailscale)
- A separately installed two-channel virtual audio device for the Mac input route
Warning
Deploying the prototype requires installing a virtual audio device, granting macOS/Android permissions, and starting a private listener. Review SETUP.md before changing either device.
Run the complete non-invasive suite from the repository root:
./scripts/check.shThis validates protocol vectors, builds and checks the Swift host, then runs Android lint, unit tests, and a debug APK build. See SETUP.md for the separate pairing and on-device deployment steps.
| Path | Purpose |
|---|---|
android/ |
Kotlin/Compose phone companion and Android tests |
macos/ |
Swift host, routing, capture, pairing, and control boundary |
protocol/ |
Versioned control schema, CVL1 transport, fixtures, and vectors |
docs/ |
Architecture decision record |
scripts/check.sh |
One command for local verification |
This project treats the Android phone as an enrolled media client, never a trusted executor. If a change widens that boundary, it is out of scope.
- Read CONTRIBUTING.md before opening a PR.
- Report vulnerabilities privately as described in SECURITY.md.
- Keep DECISIONS.md append-only.
The accurate short description is:
A real voice link to your desktop Codex. Speak from Android and hear replies from the same Codex Voice session on your Mac.
Avoid claims of OpenAI affiliation, any Android Voice availability guarantee, or being the only possible implementation.

