
If a signup test stops after "email sent," it has not tested the full signup flow.
I ran into this problem often. I was switching between Gmail accounts to open verification links and copy OTPs. Mocking the email sender was easier, but it did not test the email itself.
So I built InboxTap. It catches your app's emails on localhost and lets your tests read the real link or code.
It is available on npm, free, open source, and MIT licensed.
The usual options did not work well for me:
I wanted a small tool that stayed local and tested what the user would actually receive.
Start InboxTap:
npx inboxtap
Point your app at it:
SMTP_HOST=localhost
SMTP_PORT=1025
SMTP_SECURE=false
Then use a unique inbox in your test:
import { InboxTapClient } from "inboxtap/client";
const inboxTap = new InboxTapClient();
const inbox = await inboxTap.createInbox({ alias: "signup" });
await page.getByLabel("Email").fill(inbox.address);
await page.getByRole("button", { name: "Create account" }).click();
const verificationUrl = await inbox.waitForLink({
subject: /verify your email/i,
});
await page.goto(verificationUrl);
Each test gets its own address, so parallel tests do not read each other's emails. InboxTap can also return OTPs, custom matches, complete messages, and data through a local REST API.
I do not think every developer tool needs to become another subscription.
I understand why hosted tools charge money. Servers, support, and maintenance cost money. But InboxTap runs locally and solves a basic development problem, so I wanted anyone to be able to use it.
Email is part of signup, password resets, security, invitations, and onboarding. Testing those flows should not depend on whether a developer or small team can pay for another account.
Making InboxTap free and open source is one way I can support the developer community. People can use it, read the code, change it, and contribute back.
InboxTap does one job: catch an email and return what the test needs.
If you need a visual inbox or saved messages, another tool may suit you better. InboxTap is for automated tests that need a link, code, or message and then move on.
The missing part was not another large testing platform. It was a simple way to connect the email my app sent with the next step in the test.
The distinction between testing that an email was sent and testing the actual user journey is what stood out to me.
Treating email as part of the product flow rather than a side effect makes the problem feel much more concrete.