In the loop

Answer when your agents ask.

Before a risky step, your agent asks and waits. You answer from the Lock Screen, with Face ID to approve, or in the app: approve, pick an option, type a reply or fill in a form, and the agent carries on with your answer.

acme-api · claude-code
$ kabu ask "Which region?" -c us -c eu -c ap
# waiting for your answer…
{"choices": ["eu"], "decision": "respond", "id": "msg_01K8ZF3Q8N1W5T9X2M6R4V7JPB", "option": "eu", "outcome": "answered", "status": "answered", "text": null, "values": null, "via": "lock_screen"}
# exit 0 · deploying to eu…

Signed receipt · ES256 · verify with JWKS

An agent asks which region to deploy to; you pick eu. The terminal runs kabu ask "Which region?" with the choices us, eu and ap. The question lands on the Lock Screen with three buttons; eu is tapped, the pigeon carries the answer back, and the terminal prints option eu, exit 0, with a signed receipt.

Approve or reject from the Lock Screen.

kabu ask waits for your answer and exits 0 when you approve, 10 when you reject, so the agent's next step depends on you.

Learn how
acme-api — zsh
$ kabu ask "Deploy v1.4.2 to prod?" "Canary green for 30 min"
{"choices": ["approve"], "decision": "approve", "id": "msg_01K8ZD6N2Q9V4T8X1M5R7W3PHC", "option": "approve", "outcome": "answered", "status": "answered", "text": null, "values": null, "via": "lock_screen"}
# exit 0: approved, so the deploy goes ahead (a reject exits 10)

Pick one of the agent's options.

With -c, an ask offers 2 to 12 options. Up to three fit on the notification as buttons; the answer names the option you picked.

Learn how
acme-api — zsh
$ kabu ask "Which environment?" -c staging -c production
{"choices": ["production"], "decision": "respond", "id": "msg_01K8ZE3P7W1X6Q2T9N4M8R5KJD", "option": "production", "outcome": "answered", "status": "answered", "text": null, "values": null, "via": "lock_screen"}
# exit 0: the agent reads option and deploys to production

Type the answer.

--type text asks for words: a branch name, a release note, a reason. Reply from the notification, and the agent reads your text.

Learn how
acme-api · claude-code
$ kabu ask "Release name?" --type text
# waiting for your answer…
{"choices": null, "decision": "respond", "id": "msg_01K8ZG7T2M9Q4X1N6W8R3V5HKC", "option": null, "outcome": "answered", "status": "answered", "text": "Nimbus", "values": null, "via": "lock_screen"}
# exit 0 · tagging Nimbus…

Signed receipt · ES256 · verify with JWKS

An agent asks for a release name; you type Nimbus. The terminal runs kabu ask "Release name?" --type text. The question lands on the Lock Screen with a reply field; Nimbus is typed and sent, the pigeon carries it back, and the terminal prints text Nimbus, exit 0, with a signed receipt.

Fill in a short form.

Through MCP or the API, an ask can be a form with typed fields, answered in one go in the app or on an answer page.

Learn how
acme-api · claude-code · MCP
# the agent calls ask_human (MCP)
{"title": "Release details?", "ask": {"type": "form", "schema": {…}}}
# waiting for your answer…
{"decision": "respond", "values": {"version": "1.4.2", "notify": true}, …}

Signed receipt · ES256 · verify with JWKS

An agent asks for release details in a form; you fill it in in Kabu. An agent calls the MCP tool ask_human with a form of two fields. On the Lock Screen the notification offers Review in Kabu, since a form is answered in the app; Kabu opens with the form, version 1.4.2 and notify the team are submitted, the pigeon carries the values back, and the agent reads them, with a signed receipt.

Answer wherever it reaches you.

From the notification, the Kabu app, or a single-use answer page in any browser. The first answer settles the ask.

Learn how

An unanswered ask never approves itself.

Every ask has a deadline, 5 minutes by default from the CLI and up to 30 days. If nobody answers, it expires, and a fallback the agent sets in advance can never be an approval.

Learn how
acme-api — zsh
$ kabu ask "Run the migration?" --expires-in 600
{"decision": null, "id": "msg_01K8ZG5R1X8P3W6T2Q9M4N7KHF", "outcome": "expired", "status": "expired"}
# exit 20: nobody answered in 10 minutes, so the agent stops

Put your agents on your phone.

One line installs the kabu CLI and connects this computer. Approve its code in the Kabu app, and your agents can tell you what they are doing, and ask.

mkdir -p ~/.local/bin && curl -fsSL https://usekabu.com/kabu -o ~/.local/bin/kabu && chmod +x ~/.local/bin/kabu && export PATH="$HOME/.local/bin:$PATH" && kabu login --device