Tinder-style triage for your Gmail. Swipe through your entire mailbox — left to keep, right to delete, down to unsubscribe — then bulk-delete in Gmail when you're ready.
Nothing is deleted by the app. Swiping applies Gmail labels
(Swipe/Delete, Swipe/Unsubscribe); you review and delete in Gmail
yourself with one search. Fully reversible until that moment.
| Light | Dark |
|---|---|
![]() |
![]() |
- Syncs metadata for all your mail (newest first) into a local SQLite database — sender, subject, snippet, date. Message bodies never leave Gmail.
- You swipe. Decisions are stored locally and flushed to Gmail as labels in batches — instant swipes, no waiting on the API.
- Unsubscribe a sender once, sweep the rest: after marking an email unsubscribe, one tap deletes every remaining email from that sender (keeping the unsubscribed one as your audit copy). Cards from senders you've already unsubscribed show a sweep button too.
- Undo anything — single swipes and full sweeps revert as one action, including labels already pushed to Gmail.
- Sender-aware cards: every card shows how many emails that sender has in your mailbox and warns if you've already unsubscribed from them.
- When you reach the end, pending labels flush automatically and you get a
recap. In Gmail: search
label:Swipe/Delete→ select all → delete. Done. - Light and dark themes — follows your system, or toggle manually.
The first sync walks your entire mailbox and takes a while on large ones (~1 hour per 25k messages, due to Gmail API quotas) — it's resumable and runs in the background. Every sync after that is incremental and takes seconds. The in-app Sync button is limited to once per 24 hours; new mail is picked up from the top of your mailbox and appears at the front of the deck. If any messages fail to fetch during a sync, the app tells you rather than pretending the sync was clean.
This is a personal, self-hosted tool — you run it, pointed at your own Gmail, with your own free Google Cloud credentials. How?
- Docker (or Node.js 20+ to run without it)
- A Google account and 15 minutes for Google Cloud setup
git clone https://github.com/PakshP/InboxSwipe.git
cd InboxSwipe
cp .env.example .env # fill in your Google credentials
docker compose up -dRequires Node.js 20+:
npm install
cp .env.example .env
npm startThen from the machine running it (or through an SSH tunnel —
ssh -L 3000:localhost:3000 user@server):
- Open
http://localhost:3000/oauth/loginand connect your Gmail - Click Sync (a full first sync of a large mailbox takes ~1 hour due to Gmail API quotas; it's resumable and runs in the background)
- Swipe
After the first login, daily use works from any device that can reach the server — the OAuth redirect only matters for the login step.
Want to use your instance away from home (and reconnect Gmail from your phone)? See docs/public-hosting.md.
← keep · → delete · ↓ unsubscribe · U undo · Enter confirm sweep
- Metadata only, stored in SQLite on your machine
- Talks exclusively to Google's Gmail API — no third-party services, no telemetry
- Your OAuth credentials and token live in
.env/ local DB, gitignored
Everything lives in one SQLite file (data/app.db): message metadata,
your decisions, and your OAuth refresh token. Decided messages are kept
(they power undo, sender statistics, and instant re-syncs) — the file for
a 27,000-message mailbox is ~30MB. Delete data/ and the app starts
fresh; revoke access anytime at myaccount.google.com/permissions.
MIT


