Qack.dev

Disposable email inboxes for CI.

Create a temporary `@qack.dev` address, point your app-under-test at it, and let your pipeline wait for verification emails, OTPs, and magic links. The CLI uses api.qack.dev by default; self-host when you need a private instance.

Three commands.

# Create an inbox (use --realistic when signup filters reject random addresses)
ADDR=$(npx qack-mail create --realistic)

# Trigger your signup, reset, or invite flow with $ADDR
curl -X POST https://your-app.test/signup -d "email=$ADDR"

# Wait for the email body, then extract what your test needs
BODY=$(npx qack-mail wait "$ADDR" --timeout 300)
OTP=$(echo "$BODY" | grep -oE '[0-9]{6}' | head -1)

What you can run

qack-mail create
Create a throwaway inbox. Prints the email address to stdout. Use --realistic for human-looking addresses.
qack-mail wait
Block until the next message arrives. Use this for OTPs and links.
qack-mail list
List message IDs, senders, subjects, and timestamps.
qack-mail get
Fetch a message body as text, HTML, raw RFC 822, or JSON.
qack-mail delete
Delete an inbox and every message it received.

Add --json for structured stdout. The default API is https://api.qack.dev. Set QACK_API_URL or pass --api-url to point at a self-hosted server.

Plain HTTP underneath

POST   /v1/inboxes              { "realistic": true }
GET    /v1/inboxes/:address/messages
GET    /v1/inboxes/:address/messages/:id
GET    /v1/inboxes/:address/messages/wait
DELETE /v1/inboxes/:address

Messages include text, html, headers, raw source, and stable IDs. Inboxes expire by default after 60 minutes. Pass --realistic or { "realistic": true } when an app blocks obviously random disposable addresses.

Use it in GitHub Actions.

Qack is designed for tests that need to receive mail without wiring a real inbox into automation.

- name: Create test inbox
  run: echo "TEST_EMAIL=$(npx qack-mail create --realistic)" >> $GITHUB_ENV

- name: Wait for verification email
  run: |
    BODY=$(npx qack-mail wait "$TEST_EMAIL" --timeout 300)
    OTP=$(echo "$BODY" | grep -oE '[0-9]{6}' | head -1)
    echo "OTP=$OTP" >> $GITHUB_ENV