Skip to content

Repository files navigation

📬 InboxSwipe

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.

demo

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
light dark

How it works

  • 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.

Syncing

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.

Self-hosting

This is a personal, self-hosted tool — you run it, pointed at your own Gmail, with your own free Google Cloud credentials. How?

Requirements

  • Docker (or Node.js 20+ to run without it)
  • A Google account and 15 minutes for Google Cloud setup

Run (Docker)

git clone https://github.com/PakshP/InboxSwipe.git
cd InboxSwipe
cp .env.example .env    # fill in your Google credentials
docker compose up -d

Run (without Docker)

Requires Node.js 20+:

npm install
cp .env.example .env
npm start

First-time setup

Then from the machine running it (or through an SSH tunnel — ssh -L 3000:localhost:3000 user@server):

  1. Open http://localhost:3000/oauth/login and connect your Gmail
  2. 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)
  3. 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.

Access from anywhere

Want to use your instance away from home (and reconnect Gmail from your phone)? See docs/public-hosting.md.

Keyboard shortcuts

keep · delete · unsubscribe · U undo · Enter confirm sweep

Privacy

  • 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

Data

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.

License

MIT

About

Tinder-style Gmail triage: swipe to keep, delete, or unsubscribe. Self-hosted, privacy-first.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages