Deck
APX Deck is a companion app (Android, separate repo: apx-deck) that lets
you drive the local APX daemon from your phone. Same agents, same tools, same
memory, same projects — just a different surface. Your phone connects to the
daemon over your LAN (or USB reverse port).
The deck channel is distinct from Voice mode: voice is a spoken interaction mode, while deck is a surface — a companion command console with a widget grid, action buttons, and an optional voice mic.
Pairing
Section titled “Pairing”Pair the web panel (browser)
Section titled “Pair the web panel (browser)”To open the admin panel on any browser (phone, tablet, another computer):
apx pair webPrints a QR code and a direct URL with an embedded token:
http://192.168.1.42:7430/#token=eyJ...Scan the QR with your phone camera (no app needed) or open the URL in any browser. See Web panel → LAN pairing.
Pair the Deck app
Section titled “Pair the Deck app”To pair an Android device running the APX Deck app:
apx pair # no argument → Deck pairingapx pair deck # same as aboveapx pair --label "my-phone" # attach a friendly label to the pairingThe command prints a QR code that carries a JSON payload. Open APX Deck on your phone and scan the QR. The app completes the pairing, receives a per-device bearer token, and stores it locally for future requests.
$ apx pair APX pairing (deck) · expires in 90s █▀▀▀▀▀█ ▀▀▄█▀▄ █▀▀▀▀▀█ █ ███ █ █▀▄ ▄ █ ███ █ █ ▀▀▀ █ ▀▀█▄█▀ █ ▀▀▀ █ ▀▀▀▀▀▀▀ █ ▀ ▀ █ ▀▀▀▀▀▀▀ ▀█▄▀█▀▀▄ ▄▀█▄▀▀▄██▀▄ ▄ █ ▄▀▀ ▀▄▀▄ ▀█▄ ▀▄▀█▀▀▄ ▀ ▀▀ ▀▀▀ ██▀▄▀█▄█▀▀▀█▄ █▀▀▀▀▀█ ▄▄██ ▀▄▀ █▄█ ▀ █ ███ █ █▀▄▀▄██▀▄▀▀ ▄█ █ ▀▀▀ █ ▀█▀ ▄▀▄▀█▄▀▄▀ ▀▀▀▀▀▀▀ ▀▀▀ ▀ ▀▀ ▀▀▀▀ scan with APX Deck on your phone to pair the companion app payload: { host: "192.168.1.42:7430", token: "dk_4M…b21" } • waiting for the device to complete pairing…
List and revoke pairings
Section titled “List and revoke pairings”apx pair list # show all paired clients (id, label, created)apx pair revoke <id> # revoke a token — that device loses access$ apx pair list d_abc123 my-phone paired 2026-05-28 d_def456 tablet paired 2026-05-29Revoked tokens are invalid immediately. The device will need to re-pair to reconnect.
The deck bridge
Section titled “The deck bridge”The bridge is a small API module in the daemon: src/host/daemon/api/deck.js.
It exposes a single read-only endpoint that the Deck app calls on startup to
bootstrap its state:
GET /deck/manifestThe manifest returns:
- Daemon health metadata
- APX projects and an active-project guess
- Plugin status
- Desktop groups and widget descriptors
- Safe action descriptors
- Endpoint map for voice, transcription, projects, plugins, and super-agent chat
- Explicit safety flags
This endpoint is read-only and intentionally limited. It does not execute shell commands or trigger external plugin actions.
After bootstrapping from the manifest, the Deck app uses the same REST API that
the web panel uses (/projects/…, /voice/turn, /messages, etc.) with its
device bearer token.
Widgets and desktops
Section titled “Widgets and desktops”The manifest groups widgets into desktops (named groups, e.g. “main”, “dev”). Each widget has:
id— stable identifiersource—"internal"(APX-owned) or"external"(user/plugin-defined)status—"available"|"configured"|"disabled"user_enabled— whether the widget is shown on the Deck
Toggle a widget from the Web panel → Deck module or via the API:
# PATCH /deck/widgets/:id { enabled: true|false }curl -X PATCH http://127.0.0.1:7430/deck/widgets/my-widget \ -H "Authorization: Bearer $(cat ~/.apx/daemon.token)" \ -H "Content-Type: application/json" \ -d '{"enabled": true}'Network requirements
Section titled “Network requirements”The daemon binds to 127.0.0.1 by default (loopback only). For the Deck app
on your phone to reach it, you need to opt in to LAN binding:
apx config set remote.bind 0.0.0.0# Then restart the daemonapx daemon stopapx daemon startWhen behind a firewall or VPN, users sometimes forward the port manually (e.g.
via ssh -L) rather than changing the bind address. Cloud relays and tunnels
(Tailscale, ngrok) are explicitly out of scope — APX doesn’t set them up, but
they work if you wire them yourself.
Voice mode on the Deck
Section titled “Voice mode on the Deck”The Deck app’s voice mic sends audio to POST /voice/turn with
"channel": "voice". The daemon:
- Transcribes the audio with Whisper (STT)
- Runs the super-agent with a voice-optimized prompt
- Synthesizes the reply with the configured TTS provider
- Returns the text reply, audio file path, duration, and optional suggestion chips
The reply text is short and conversational (voice-optimized). Suggestion chips at the end of the response let the user tap common follow-up actions without typing.
See Voice for TTS provider setup.
Security model
Section titled “Security model”- Each paired device gets a unique bearer token stored in
~/.apx/remote/devices.json. - Tokens are listable with
apx pair listand revocable withapx pair revoke <id>. - The web-token endpoint (
/admin/web-token) refuses non-loopback and tunneled requests. For remote browsers, the token must arrive via the#token=…URL fragment. - The manifest endpoint is read-only; it does not expose sensitive credentials or execute actions.
What’s not supported yet (v1)
Section titled “What’s not supported yet (v1)”- Cloud relays / tunnels — wire externally if needed.
- Multi-user sharing — one user, multiple devices.
- Push notifications — the app polls or holds a WebSocket open.
- Real-time WebSocket streaming to Deck — open work (
/remote/ws).