Self-hosted dashboard for monitoring private tracker stats over time. Track upload, download, ratio, buffer, seedbonus, and rank across all your trackers from one place.
- Per-tracker and fleet-wide stats with 30+ charts
- UNIT3D, Gazelle, GGn, Nebulance, MAM, and AvistaZ network support out of the box
- qBittorrent integration - cross-seed tracking, activity heatmaps, speed history, etc
- Everything stays on your machine. No telemetry, no phoning home.
You can check out a few other, longer, screenshots in the docs folder.
| Tracker | Platform | Status | Note |
|---|---|---|---|
| Aither | UNIT3D | ✅ Verified | |
| Anthelion | Nebulance | ✅ Verified | |
| Blutopia | UNIT3D | ✅ Verified | |
| Concertos | UNIT3D | ✅ Verified | |
| FearNoPeer | UNIT3D | ✅ Verified | |
| GazelleGames (GGn) | GGn | ✅ Verified | |
| LST | UNIT3D | ✅ Verified | |
| Nebulance | Nebulance | ✅ Verified | |
| OldToons | UNIT3D | ✅ Verified | |
| OnlyEncodes | UNIT3D | ✅ Verified | |
| Orpheus (OPS) | Gazelle | ✅ Verified | |
| Phoenix Project (PP) | Gazelle | ✅ Verified | |
| Racing4Everyone | UNIT3D | ✅ Verified | |
| Redacted (RED) | Gazelle | ✅ Verified | |
| ReelFlix | UNIT3D | ✅ Verified | |
| SkipTheCommercials | UNIT3D | ✅ Verified | |
| Seedpool | UNIT3D | ✅ Verified | |
| Upload.cx | UNIT3D | ✅ Verified | |
| Yu-Scene | UNIT3D | ✅ Verified | |
| Zenith | UNIT3D | 🟡 Unverified | |
| IPTorrents | IPTorrents | 🟡 Unverified | Session-cookie scraper, no public API |
| TorrentLeech | TorrentLeech | 🟡 Unverified | Username/password login, no public API |
| Portugas | UNIT3D | 📋 Draft | API endpoint unavailable on this custom build |
| AlphaRatio | Gazelle | 🟡 Unverified ⛔ Stuck | |
| AnimeBytes | Gazelle | 🟡 Unverified ⛔ Stuck | |
| BroadcastheNet (BTN) | BTN | 🟡 Unverified | JSON-RPC adapter; needs an account holder to verify |
| Empornium | Gazelle | 🟡 Unverified ⛔ Stuck | XXX trackers aren't really my jam, so PRs welcome |
| GreatPosterWall (GPW) | Gazelle | 🟡 Unverified | |
| MoreThanTV (MTV) | Gazelle | 🟡 Unverified | |
| PassThePopcorn (PTP) | Gazelle | 🟡 Unverified | |
| 720pier | Custom | 📋 Needs adapter | |
| ABTorrents | Custom | 📋 Needs adapter | |
| AvistaZ | AvistaZ | ✅ Verified | Cookie auth + HTML scraping |
| AnimeZ | AvistaZ | 🟡 Unverified | Same adapter as AvistaZ |
| CinemaZ | AvistaZ | ✅ Verified | Same adapter as AvistaZ |
| ExoticaZ | AvistaZ | 🟡 Unverified | Same adapter as AvistaZ |
| PrivateHD | AvistaZ | 🟡 Unverified | Same adapter as AvistaZ |
| MyAnonamouse (MAM) | MAM | ✅ Verified | Cookie auth via mam_id |
| DarkPeers | UNIT3D | ✅ Verified | |
| Luminarr | UNIT3D | 🟡 Unverified | |
| CathodeRayTube (CRT) | UNIT3D | 📋 Draft | |
| DigitalCore | Custom | ✅ Verified | |
| HDBits | Custom | 📋 Needs adapter | |
| SecretCinema | Custom | 📋 Needs adapter | |
| SportsCult | Custom | 📋 Needs adapter | |
| BeyondHD | Custom | ⛔ Stuck | |
| Cinemageddon | Custom | ⛔ Stuck | |
| FileList | Custom | ⛔ Stuck | |
| HD-Torrents | Custom | ⛔ Stuck | |
| TVVault | Custom | ⛔ Stuck | |
| HawkeUno | Hawke | ✅ Verified |
Legend:
- ✅ Verified — tested against a live tracker
- 🟡 Unverified — platform adapter exists and should work, but not yet tested.
- 📋 Needs adapter — registry entry exists, but the platform requires a custom adapter that I haven't gotten around to yet
- ⛔ Stuck — trackers I'm not a member of and have no way of implementing
- ❌ Broken — known issue prevents polling (i.e API blocks required endpoints, etc)
| Client | Status | Notes |
|---|---|---|
| qBittorrent | ✅ Supported | Torrent stats, cross-seed tracking, activity heatmaps, speed history |
| Deluge | 📋 Planned | |
| Transmission | 📋 Planned | |
| rTorrent | 📋 Planned |
mkdir tracker-tracker && cd tracker-tracker-
Download the compose file and example env:
curl -LO https://raw.githubusercontent.com/jordanlambrecht/tracker-tracker/main/docker-compose.yml curl -L https://raw.githubusercontent.com/jordanlambrecht/tracker-tracker/main/.env.example -o .env
-
Generate secrets and paste them into
.env:# Run these, then copy the output into .env openssl rand -base64 24 # → POSTGRES_PASSWORD openssl rand -base64 48 # → SESSION_SECRET
-
Start the stack:
docker compose up -d
-
Visit
http://localhost:3000to set your master password and start adding trackers.
docker compose pull && docker compose up -dThe database schema is synced automatically on startup.
If you already run Postgres, remove the tracker-tracker-db service and depends_on block from docker-compose.yml. Set DATABASE_URL in your .env and remove POSTGRES_PASSWORD and POSTGRES_USER.
Requires Node.js 24+, pnpm, and PostgreSQL.
pnpm install
cp .env.example .env.local
# Edit .env.local — set DATABASE_URL to your local Postgres and SESSION_SECRET
pnpm db:push
pnpm dev| Variable | Required | Default | Description |
|---|---|---|---|
POSTGRES_PASSWORD |
Yes* | — | Database password |
SESSION_SECRET |
Yes | — | Signs session cookies and wraps your encryption key (min 32 characters). Never rotate it after setup — see Locked Out? |
TZ |
No | UTC |
Timezone for cron schedules and log timestamps |
PORT |
No | 3000 |
Port the app listens on |
LOG_LEVEL |
No | info |
Log verbosity: error, warn, info, debug |
POSTGRES_USER |
No | postgres |
Database user |
POSTGRES_DB |
No | tracker_tracker |
Database name |
DATABASE_URL |
No* | (auto-built) | Override to use an external Postgres instance |
SECURE_COOKIES |
No | (auto) | Set true for HTTPS. Auto-enabled by BASE_URL. |
DISABLE_LOGIN_LOCKOUT |
No | (unset) | Set true to stop failed-attempt lockouts being enforced, for when you have locked yourself out — the in-app toggle sits behind the login you cannot reach. Also suppresses enforcement on the backup-restore password check. Failed attempts are still counted, and a successful login clears them. Unset it once you are back in. |
* Set either POSTGRES_PASSWORD (bundled DB) or DATABASE_URL (external DB).
All other settings — polling interval, privacy mode, proxy, backups — are configured in the app's Settings page after login.
| Host path | Container path | Contents |
|---|---|---|
./data/backups |
/data/backups |
Scheduled backup files |
./data/logs |
/data/logs |
Application log files |
pgdata (named) |
PG data dir | PostgreSQL database (managed by Docker) |
There is no "forgot password" email — this is a single-user app with no mail server. Instead, the app container ships a recovery command:
docker exec -it tracker-tracker-app tt-recover --check # can I recover? writes nothing
docker exec -it tracker-tracker-app tt-recover # dry run, prompts for the new password
docker exec -it tracker-tracker-app tt-recover --apply # commitTake a database dump first. It costs seconds and it is the one step you cannot add later:
docker exec tracker-tracker-db sh -c \
'pg_dump -U "$POSTGRES_USER" tracker_tracker' > tracker-tracker-backup.sqlDo not edit password_hash by hand. Every secret in the database — tracker API tokens, download client credentials, notification configs, your TOTP secret — is encrypted with a key derived from your master password. UPDATE app_settings SET password_hash = ... lets you log in with a key that decrypts nothing, and orphans all of it permanently with no error message. tt-recover recovers the real encryption key, re-encrypts every secret under the new password, clears the lockout counter, and rewrites the hash in a single transaction.
Two things it needs, and one thing it refuses:
SESSION_SECRETmust be byte-identical to what the instance has been running with. It is the only thing that can unwrap the stored encryption key.-itondocker exec, so the password can be typed at a hidden prompt instead of landing in your shell history. (--password '<pw>'exists for scripting, but it is visible inps.)- If
app_settings.encrypted_scheduler_keyis NULL — cleared by an emergency lockdown, a nuke, or a failed restore — recovery is impossible and the tool aborts rather than orphaning your data. Restore a dump from before that point.
Lost your authenticator too? Add --disable-totp to clear 2FA in the same transaction.
Full walkthrough, including running against an external database: Lost Master Password.
- Click + Add Tracker in the sidebar
- Select from the registry or enter details manually
- Paste your API token (found in your tracker's security/API settings)
- The app validates the connection and starts polling automatically
Full documentation is available at jordanlambrecht.github.io/tracker-tracker.
Covers installation, tracker setup (UNIT3D, Gazelle, GGn, MAM, AvistaZ), features (proxies, TOTP, backups, download clients, notifications), and troubleshooting.
PRs welcome. Areas where help matters most:
- New trackers & missing data — copy
src/data/trackers/_template.ts, fill in what you know, and submit a PR. Partial entries are fine — setdraft: trueand CI will accept it. Filling in user classes, rules, release groups, and banned groups on existing trackers is just as valuable. - Download client adapters — only qBittorrent is supported. Deluge, Transmission, and rTorrent all need adapters. See
src/lib/qbt/for the pattern. - Tracker verification — if you belong to a tracker marked 🟡 above, testing and confirming it works helps greatly.
- Security auditing — Check out SECURITY.md for threat surfice info.
- Responsiveness - I only have my 16" MBP to work off of, so feedback of different screen experiences is much appreciated
- Data Visualization - I ain't no math wizard, so any contributions for data viz, charts/graphs, etc.
- Custom platform adapters — trackers marked "Custom" need bespoke adapters since they don't run a supported platform.
Tracker Tracker is free and independently maintained. GitHub Sponsors for recurring support, Buy Me a Coffee for a one-off.
- Next.js 16 (App Router)
- PostgreSQL + Drizzle ORM
- ECharts
- node-cron
- Argon2
- jose