Self-hosted dashboard for monitoring private tracker stats over time
4.3K
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.
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:
| 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:3000 to set your master password and start adding trackers.
docker compose pull && docker compose up -d
The 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
# In .env.local, set DATABASE_URL to your local Postgres and SESSION_SECRET
pnpm db:push
pnpm dev
Unit tests run with pnpm test:run. The browser smoke suite runs with pnpm test:e2e against a production build (pnpm build first) and a throwaway tracker_tracker_e2e database on the same Postgres server, which it wipes on every run; create that database once with createdb tracker_tracker_e2e and sync it with POSTGRES_DB=tracker_tracker_e2e pnpm db:push.
| 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, because 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).
You configure everything else (polling interval, privacy mode, proxy, backups) 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 # commit
Take 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.sql
Do 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_SECRET must be byte-identical to what the instance has been running with. It is the only thing that can unwrap the stored encryption key.-it on docker 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 in ps.)app_settings.encrypted_scheduler_key is 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.
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:
src/data/trackers/_template.ts, fill in what you know, and submit a PR. Partial entries are fine. Set draft: true and CI will accept it. Filling in user classes, rules, release groups, and banned groups on existing trackers is just as valuable.src/lib/download-clients/adapters/qbt.ts for the pattern.Tracker Tracker is free and independently maintained. GitHub Sponsors for recurring support, Buy Me a Coffee for a one-off.
Content type
Image
Digest
sha256:dad7df07c…
Size
199.4 MB
Last updated
6 days ago
docker pull jordyjordy/tracker-tracker