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.
Start here
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)CLI
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.
API
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/:addressMessages 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.
CI example
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