CLI

Email, from your terminal

Send, read and set up everything in AI Inbx from a shell, a script or the coding agent beside you.

~/northwind
$ curl -fsSL https://aiinbx.com/install.sh | sh✓ Installed aiinbx 0.4.0 to ~/.aiinbx/bin$ aiinbx loginOpened your browser to sign in.✓ Signed in to Northwind as profile default$ aiinbx send --from ada@northwind.io --to grace@harbourly.com \  --subject "Q4 report" --text-file report.md --attach q4.pdfIdempotency key 4e306697-7390-43c4-8e61-cb5a455ff376✓ Sent eml_018f2c… to grace@harbourly.com (queued)$ aiinbx wait --from grace@harbourly.com --json \  | jq -r .stripped_textLooks great. One question on page 3: is the EMEA number net?

One binary for macOS, Linux and Windows. Install it with curl, PowerShell, npm or Homebrew.

Install

One binary. Nothing else to install.

No Node, no Bun, no runtime to keep in step. Your login lives in the system keychain, and it tells you when there’s a new version.

curl -fsSL https://aiinbx.com/install.sh | sh

You and your agent

Tables for you. JSON for your agent.

The same command reads the room. At a terminal it prints tables and asks before anything it can’t undo. Piped, in CI or run by an agent, it prints JSON and never waits on a prompt.

Terminal
$ aiinbx threads --limit 3id         subject          mailboxthr_8f2c…  Re: Q4 report    ada@northwind.iothr_1b2c…  Invoice 2291     billing@northwind.iothr_2c3d…  Kickoff Monday?  hello@northwind.io
Claude Code
$ aiinbx threads --limit 3 | jq '.data[0]'{  "id": "thr_8f2c…",  "space_id": null,  "subject": "Re: Q4 report",  "mailbox": "ada@northwind.io",  "participants": [    "ada@northwind.io",    "grace@harbourly.com"  ],  "message_count": 2,  "last_message_at": "2026-09-26T14:02:11Z",  "forward_of": null}

Works in any agent with a shell. Teach it the rest in one line: npx skills add aiinbx/cli

  • Claude Code
  • Codex
  • Cursor
  • Gemini CLI
  • GitHub Copilot
  • Windsurf

On your machine

Your dev loop, on localhost

webhooks
$ aiinbx listen --forward-to localhost:3000/hooksReady. Forwarding every event to http://localhost:3000/hooksSigning secret whsec_jeMe… (aiinbx listen --print-secret)14:02:11  email.sent            evt_a1b2…  → 200  38 ms14:02:13  email.delivered       evt_b2c3…  → 200  21 ms14:03:40  email.received        evt_c3d4…  → 500  112 ms14:03:52  email.received        evt_d4e5…  → 200  44 ms
e2e
$ aiinbx wait --to qa@northwind.io --subject "your code" \  --timeout 1m --json | jq -r .stripped_textYour verification code is 482 913.

listen posts real events to your dev server, signed exactly like a production webhook. Nothing to register, nothing to tunnel.

wait blocks until the email lands — sign-up codes, magic links — and exits 124 if it never does, failing the run.

Doctor

When something’s off, it says what to type

aiinbx doctor checks your login, the API and every domain. Name one and it reads each record against the live zone, and ends on the fix.

~/northwind
$ aiinbx doctor rheinbau.de✗ rheinbau.de               not verified  → Publish the records below, then: aiinbx domains verify dom_4kq2…✗ DKIM TXT                  aibx._domainkey.rheinbau.de pending  → Publish TXT aibx._domainkey.rheinbau.de with the value p=MIGfMA0…✓ INBOUND MX                rheinbau.de✓ RETURN_PATH MX            bounces.rheinbau.de✓ SPF TXT                   bounces.rheinbau.de✓ DMARC TXT                 _dmarc.rheinbau.de✗ The DKIM record ended up at the wrong name  The value is published — but at aibx._domainkey.rheinbau.de.rheinbau.de instead of aibx._domainkey.rheinbau.de, so nothing finds it.  → Edit that record and set its name to just "aibx._domainkey", without "rheinbau.de" on the end. Your DNS provider adds that part for you.

Around it

The small things a shell needs

React Email, straight from disk--react emails/welcome.tsx --props '{…}' renders the template with your project’s own React and sends the HTML and a plain-text body.
Safe to retryEvery send carries an idempotency key and prints it. Pass your own --idempotency-key and a retried job sends once.
Every API operation is a commandaiinbx commands prints the whole tree as JSON — every flag, its type, whether it repeats — for an agent to read before it types.
Profiles for every account-p staging for one command, auth switch for all of them. A CI login never changes what your own commands act as.
Keys where keys goSecrets live in the macOS Keychain, the Secret Service or DPAPI. Tokens renew on their own, one terminal at a time.
Lists without paging--all walks every page for you. --data @file.json or stdin takes a whole body, with flags laid over it.

Give your product an inbox. The hard parts are already handled.

Get started