Passively sync raddarr and sonarr tags to your Plex library.
- TypeScript 96.3%
- Dockerfile 3.7%
- Initial release of taggarr — syncs tags from Radarr and Sonarr to Plex as library labels - Plex items are matched by TMDB ID (movies) and TVDB ID (shows); unmatched items are not touched - SQLite cache prevents unnecessary Plex writes when nothing has changed ## Changes - `src/index.ts` — sync loop: fetches arr tags, resolves desired Plex labels, applies adds/removes with cache deduplication - `src/plex.ts` — Plex library fetch and label write API - `src/arr.ts` — Radarr/Sonarr tag fetch, keyed by TMDB/TVDB ID - `src/cache.ts` — SQLite-backed label cache - `src/health.ts` — container `/health` management - `src/log.ts` — structured logger - Docker/Compose setup and `.env` example Reviewed-on: #1 |
||
|---|---|---|
| compose | ||
| src | ||
| .dockerignore | ||
| .gitignore | ||
| bun.lock | ||
| Dockerfile | ||
| LICENSE.md | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
Taggarr
Syncs tags from Radarr and Sonarr to your Plex library as labels.
How it works
On each sync, Taggarr fetches tags from Radarr and Sonarr concurrently, then matches those items to your Plex library by TMDB/TVDB ID and applies the corresponding labels. A local SQLite cache prevents unnecessary writes — if nothing has changed, Plex is not touched.
Setup
services:
taggarr:
image: forgejo.dawes.cc/ryan/taggarr:nightly
container_name: taggarr
env_file: .env.taggarr
user: "1000:1000"
environment:
- TZ=America/New_York
volumes:
- ./data:/data
Create a .env.taggarr file next to your compose.yaml:
RADARR_URL=http://radarr:7878
RADARR_TOKEN=TOK123
SONARR_URL=http://sonarr:8989
SONARR_TOKEN=TOK456
PLEX_URL=http://plex:32400
PLEX_TOKEN=TOK789
Create the data directory before starting:
mkdir data
docker compose up -d
Configuration
| Variable | Default | Description |
|---|---|---|
PLEX_URL |
— | Required. Plex server URL |
PLEX_TOKEN |
— | Required. Plex auth token |
RADARR_URL |
— | Radarr server URL |
RADARR_TOKEN |
— | Radarr API key |
SONARR_URL |
— | Sonarr server URL |
SONARR_TOKEN |
— | Sonarr API key |
SYNC_INTERVAL |
60 |
How often to sync, in minutes |
FETCH_TIMEOUT |
30 |
Per-request timeout, in seconds |
DB_PATH |
/data/taggarr.db |
Path to the SQLite cache |
SKIP_TAGS |
— | Comma-separated tags to exclude from syncing (case-insensitive) |
OVERWRITE_TAGS |
false |
When true, Plex labels are replaced to match arr exactly. When false, arr labels are appended without removing existing ones. |
LOG_LEVEL |
WARN |
DEBUG, INFO, WARN, or ERROR |
Notes
- At least one of Radarr or Sonarr must be configured. If both fail, the container stops.
- Plex items are matched by TMDB ID (movies) and TVDB ID (shows). Unmatched items are not touched.
- The
data/directory must be writable by theuserspecified in your compose file.