██╗ ███████╗ ████████╗ ██╗ ██╗ ███████╗
██║ ██╔════╝ ╚══██╔══╝ ██║ ██║ ██╔════╝
██║ █████╗ ██║ ███████║ █████╗
██║ ██╔══╝ ██║ ██╔══██║ ██╔══╝
███████╗ ███████╗ ██║ ██║ ██║ ███████╗
╚══════╝ ╚══════╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝
[ mailbox recon // GDPR art. 17 strike kit // response tracking ]
Every service that ever mailed you knows who you are. LETHE finds them all — and makes them forget.
What it does
Your mailbox is a map of your digital footprint: every "Welcome!", every "Confirm your account", every newsletter is a company holding your data. LETHE reads that map and burns it, in five moves:
| phase | command | what happens |
|---|---|---|
| 🔍 recon | fpd scan |
reads every mailbox in your Betterbird / Thunderbird profile, catalogs every sender domain + address, detects registration signals, cross-references JustDeleteMe |
| ⚖️ triage | fpd review |
interactive: per domain you decide — DELETE (send erasure request), KEEP, or MANUAL. Excel round-trip available (--csv-export / --csv) |
| 📝 arm | fpd generate |
writes a GDPR Art. 17 erasure request (.eml, German or English, auto-detected) for every DELETE domain — and if no contact address is known, the built-in mail sniffer crawls the service's website for privacy@ / support@ / Impressum addresses |
| 🚀 strike | fpd send |
sends everything via your SMTP account(s). One confirmation per mail — or --yes for full autosend. Every mail gets a tracked Message-ID, and Art. 12(3) starts the one-month clock |
| 📡 track | fpd check |
re-scans your mailbox: bounces mark a contact address dead (and the domain gets re-drafted with the next-best address), replies mark it alive and the request responded. Overdue deadlines surface in fpd status with an escalation hint |
Everything lands in a local SQLite database — your decisions, every sent request, every bounce, every reply. Nothing ever leaves your machine except the erasure mails you decide to send.
The contact knowledge base
Bounce tracking has a nice side effect: over time you build a database of
verified-working (and verified-dead) privacy contact addresses per
service. fpd export-contacts dumps it as CSV/JSON — with zero personal
data — so you can share it, e.g. with the JustDeleteMe project.
Install
git clone https://github.com/Himerys/LETHE
cd LETHE
python -m venv .venv
. .venv/bin/activate # Windows: .venv\Scripts\activate
pip install .
Then:
fpd # first run: setup wizard + dashboard, tells you the next step
fpd scan # inventory your mailbox
fpd review # d / k / m — decide
fpd generate # drafts + auto-sniff missing contacts
fpd send # or: fpd send --yes
fpd check # days later: bounces & replies
fpd status # progress, deadlines, escalations
fpd with no arguments always tells you what to do next.
Windows .exe
No Python needed — grab fpd.exe from the releases page, or build it yourself:
pip install . pyinstaller
pyinstaller fpd.spec # -> dist/fpd.exe
(The GitHub Action in .github/workflows/build-exe.yml builds it on every
tagged release.)
Configuration
fpd configure walks you through everything and writes config.json into
your working directory. config.json is gitignored — your name,
addresses and SMTP credentials stay local, always. config.example.json
documents every field.
| field | meaning |
|---|---|
sender_name, aliases |
how you sign the letters / other names your accounts use |
language |
auto (per-service German/English detection), de, en |
supervisory_authority |
optional: your DPA, named in the escalation paragraph |
accounts[] |
one SMTP account per mail identity you send from |
send_delay_seconds, send_daily_limit |
be nice to your mail provider (Gmail caps at ~500/day) |
sniffer.* |
crawler knobs: workers, max pages, locales, robots.txt |
Passwords can stay out of the file entirely: leave password empty and
you'll be prompted at send time (or set FPD_SMTP_PASSWORD).
Commands
fpd dashboard + next step
fpd configure setup wizard
fpd scan inventory mailboxes [--profile PATH] [-v]
fpd review interactive triage [--all] [--csv-export F] [--csv F]
fpd generate write .eml drafts [--no-sniff] [--prefer-self-service]
fpd sniff hunt contact addresses [targets...] [-i FILE] [-o CSV]
fpd send SMTP send [--yes] [--limit N] [--dry-run]
fpd check detect bounces & replies [--profile PATH]
fpd status progress, deadlines, overdue escalations
fpd sent DOMAIN... mark as manually sent (starts the deadline)
fpd mark DOMAIN ST deleted|responded|refused|escalated|noaccount
fpd contact D EMAIL manually set a contact address
fpd export-contacts shareable contact knowledge base (no personal data)
Notes
- Legal basis: the letters invoke Art. 17 (erasure), Art. 7(3) (consent withdrawal), Art. 21 (objection), Art. 12(3) (one-month deadline) and Art. 19 (recipients) GDPR. This tool is not legal advice.
- Sniffer etiquette: the crawler respects
robots.txt, uses a polite per-host delay and identifies itself honestly. You're looking up contact addresses to exercise your legal rights — behave accordingly. - Betterbird & Thunderbird share the same profile format; both are auto-discovered (Windows/Linux/macOS/flatpak/snap). POP and IMAP folders are read directly from the local mbox files.
fpd checkreads your local mail — let Betterbird fetch new mail before running it.- JustDeleteMe data (
LETHE/data/sites.json) courtesy of the JustDeleteMe project (MIT).
decimate responsibly.
Release files for lethe-fpd 0.4.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| lethe_fpd-0.4.3.tar.gz | 341.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| lethe_fpd-0.4.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 686.2 kB
Release files / lethe_fpd-0.4.3.tar.gz
| Download URL | lethe_fpd-0.4.3.tar.gz |
|---|---|
| Size | 341.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
787bb0bdf4fda56411a90dddfb53dd4546f4721d1b6653d7384e7d80c31df565
|
|
BLAKE2b-256 checksum How to use checksums |
567cfcd6749bf7bdce24b6c99ec60e06638be20adb10e3075a7d3a52718af806
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / lethe_fpd-0.4.3-py3-none-any.whl
| Download URL | lethe_fpd-0.4.3-py3-none-any.whl |
|---|---|
| Size | 345.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
b04e33b9a8bca6fed5c2e1a6f86f28f0692eabea4467db217e28895209b50d0f
|
|
BLAKE2b-256 checksum How to use checksums |
8ccf53e98988313f42a886241ba4040ac3ade19c086e35e2f16107225a40b11e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|