← All projects

AI Engineering · Developer Tools

AgentDeck, One Place to Answer Your Coding Agents

Coding agents stop and wait for a yes. With several running, the question sits in whichever terminal tab asked it, and you find out ten minutes later. The other failure is clicking yes without reading.

My role
Solo project, built with Claude Code as the coding agent. I set the rules it had to follow, chose the designs, and tested every build on my own PC and phone.
When
Oct 2026 · public beta
a sketch you can clickthe real one is a Windows appshipped · public beta

Request 1 of 3

You decide

An agent needs a yes

Claude Code wants to run a command. Without AgentDeck, that question waits in whichever terminal tab asked it. Here it drops from the island at the top of the screen. Answer it there, or on the phone.

Your PC

1 needs you

webshop wants to run a command

Medium riskRuns npm test

npm test

Claude Code · waiting 0s

Your phone

My PC

webshop

Claude Code

Can I run a command?

npm test

History

Nothing yet. Answer the request above.

2

agents covered: Claude Code and Codex

122

automated tests in the 0.18 release

115 MB

memory when idle, 1.2% CPU while agents work

0

network calls of its own until you switch one on

Approach

A small Windows app that brings every agent's permission requests, questions and finished turns to one island at the top of the screen. It rates each request's risk before you see it, and you answer there or from an Android app, over Wi-Fi or an encrypted relay.

Results

Version 0.18 is a public beta: a 5 MB installer for Windows and an Android app. It covers the two agents I use, idles at 115 MB of memory, and ships with 122 automated tests that run on every push. What it has not had is other people. I have no usage numbers, because it collects none. The result I can vouch for is my own: I stopped finding questions that had been waiting in a terminal tab, and the hardest bug taught me to put the reason on the screen instead of guessing.

Three rules I did not let myself break

It may never block an agent

If AgentDeck is closed, crashed or slow, Claude Code and Codex behave as if it was never installed. A request nobody answers goes back to the terminal after 9 minutes.

Agents cannot approve themselves

Two keys. The one on disk, which an agent's hooks use, can only ask. The one that answers lives in the app's memory, so nothing an agent can read is able to say yes.

Nothing leaves the PC unless you switch it on

No telemetry and no account. The phone's relay is off by default, and when it is on it carries frames sealed between the phone and the PC that it cannot read.

One bug, start to finish

Notifications worked on the test phone and not on mine. This is how that went, working with Claude Code, including the part where the first guess was wrong.

  1. 01The symptom. A request showed up in the phone app the moment I opened it. On a locked phone, no notification ever came.
  2. 02Stop guessing. The path has four parts: PC, relay, Google's push service, phone. I made the relay log one plain line per outcome. The first one read: this phone hasn't registered for notifications. So the PC and the relay were fine.
  3. 03Reproduce it somewhere I can see. On an Android emulator the same build registered and showed the notification. The code worked. Something about my phone did not.
  4. 04Put the reason on the screen. The app swallowed the error, so I added a Notifications line to its settings that says On, or the exact reason it is not. On my phone it said MISSING_INSTANCEID_SERVICE. It is a Huawei: no Google Play services, so Google's push can never reach it.
  5. 05The fix is a second way in. On phones without Google, the app now keeps one quiet connection to the relay and shows the notification itself. Phones with Google keep using Google's push. I tested it on the emulator with Google services switched off, then on the Huawei.
  6. 06And the bug behind the bug. The new settings line said Connecting forever while notifications arrived. Commands sent from the page to the Android side are looked up in camelCase, and mine were snake_case, so four of them had never run. That included the one that asks Android for permission to notify.

The first guess was timing: that the notification had been sent while the app was still open. The relay's log line ruled that out in one test.

Not proven yet

  • It is a public beta. I use it myself, but I have no usage numbers, because it collects none.
  • The installer is not code-signed yet, so Windows shows a warning before it runs.
  • Windows only on the PC side, Android only on the phone. The iPhone app is not built.
  • The relay is one Cloudflare Worker on my own account. It has had one user's traffic, not load.

Next on the list: Allow and Deny inside the notification itself, and telling an already-paired phone about the relay so that turning it on later needs no second scan.

Technical highlights

  • 01One Rust core for sessions, approvals, risk rating and history; the island is a Tauri window talking to it over a local WebSocket
  • 02Two agents with different hook mechanics behind one interface, including Codex hooks that run inside its sandbox
  • 03Risk is rated before you see a request: the card says why, high risk needs a 0.8 s hold and critical 1.5 s
  • 04Every frame to the phone is sealed with a key only the phone and the PC hold; the relay is a Cloudflare Durable Object that passes what it cannot read
  • 05Two notification paths: Firebase where Google Play services exist, a foreground service with its own connection where they do not
  • 06Each reader of an agent's files checks the format first: if an update changes it, that one feature turns off with a plain message

Under the hood

AgentDeck architecture: Claude Code and Codex send permission requests through their hooks to a local Rust core, which also reads their session files. The core serves the island and window on the PC, a listener for the phone on Wi-Fi, and an opt-in relay client. Outside the PC, a Cloudflare Worker passes sealed frames to the Android app and cannot read them.
One Rust core holds every session and every pending request. The island, the phone on Wi-Fi and the relay are three doors to the same core, and the phone speaks one sealed protocol through both of its doors. The Android app reuses the React screens of the PC app.

Stack

RustTauri 2React + TypeScriptSQLiteCloudflare WorkersKotlin (Android)NaCl secretboxFirebase Cloud Messaging
Visit the project site →

Building something similar?

hichamalaoui975@gmail.com