Disposable domain
The address belongs to a throwaway inbox service. It was never meant to receive a second email, and nobody is reading it now.
@mailinator.com
For founders who never wrote their own auth code
AI builders ship you an app, not a bouncer. Find the fake accounts that got in while you were shipping.
Reads the auth table only. Never write access.
Illustrative sample — not customer data
In this sample, 903 of 2,860 accounts carry at least one flag, and the burst cluster lands at 03:47. Your own numbers will be your own.
The four detectors
Bouncer does not guess at intent and does not hand you a risk score to interpret. It looks for four patterns a real person does not produce, and it names the one that applies to each account.
The address belongs to a throwaway inbox service. It was never meant to receive a second email, and nobody is reading it now.
@mailinator.com
Many accounts built from one real inbox using plus-addressing. One person, dozens of rows, all of them counted as users.
you+7f2@gmail.com
A cluster of accounts created within minutes of each other, far faster than people find an app and decide to join it.
created_at, clustered
The account was created and then did nothing at all. No sign-in, no action, not once since the day it appeared.
last_sign_in_at: null
Three steps, in this order
Bouncer writes it for you. It builds a view over four columns and a role that can read only that view — you paste it into Supabase yourself, so nothing is handed over that you did not read first.
CREATE ROLE bouncer_ro
LOGIN PASSWORD '<you choose>';
CREATE OR REPLACE VIEW public.bouncer_users AS
SELECT id, email, created_at, last_sign_in_at
FROM auth.users;
REVOKE ALL ON public.bouncer_users
FROM PUBLIC, anon, authenticated;
GRANT USAGE ON SCHEMA public TO bouncer_ro;
GRANT SELECT ON public.bouncer_users TO bouncer_ro;Bouncer checks the credential really is read-only, turns down anything over-privileged with a specific reason, and encrypts what it stores.
How many accounts you have, how many are flagged, which reason applies to each one, and the SQL to quarantine them when you are ready.
The boundary
The grant names four columns on one table. Bouncer cannot read your orders, your messages or your profiles, because nothing else was ever granted.
SELECT only. Bouncer cannot create, update or delete a row in your database, and it never runs the quarantine SQL for you.
Disconnecting destroys the stored credential and every cached account row, and confirms the deletion on screen.
Bouncer is new. There are no customer logos on this page because there are no customers to name yet — only the grant you can read before you run it, and the report it gives back.
A security check for an app you did not hand-code.