Passively sync raddarr and sonarr tags to your Plex library.
  • TypeScript 96.3%
  • Dockerfile 3.7%
Find a file
Ryan Dawes 8a6982efc6 Release 0.0.2 (#1)
- 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
2026-05-17 18:29:34 +00:00
compose Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
src Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
.dockerignore Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
.gitignore Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
bun.lock Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
Dockerfile Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
LICENSE.md Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
package.json Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
README.md Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00
tsconfig.json Release 0.0.2 (#1) 2026-05-17 18:29:34 +00:00

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 the user specified in your compose file.