What it is
AniBridge is a small daemon that listens for Plex playback events and syncs them to AniList. When I finish an anime episode in any Plex client (phone, TV app, browser), AniBridge tells AniList "episode N watched" and my list updates.
Why I run it
Seanime handles AniList sync when I'm watching through Seanime. But a lot of my anime watching happens through the Plex apps on the TV, where Seanime isn't running. Without AniBridge, those episodes don't get tracked.
The two services are complementary: Seanime tracks anime watched through Seanime, AniBridge tracks anime watched through Plex. They use different auth flows (Seanime is per-user OAuth, AniBridge is a server-side JWT) and don't conflict.
How I use it
Set-and-forget. It runs in the same stack as Plex, listens for webhook events from Plex, matches the show against AniList by metadata, and updates progress. The web UI exposes settings and a live activity view — useful for confirming sync is actually working and not silently broken — but day to day I don't open it.
Setup notes
- Host: the media LXC.
- Reverse proxy: yes, with websockets enabled in the proxy config. Without websockets, the dashboard shows an "Offline" indicator perpetually even when the underlying sync is working perfectly. The status indicator relies on a websocket; the actual sync doesn't.
- AniList JWT: stored in AniBridge's config file. Has an expiry — I track the date so I can rotate before it dies. A silent sync death is the typical failure mode when the token expires.
- Plex token: shared with the rest of the stack. When the Plex token rotates, AniBridge's config needs updating too.
- Update cadence: manual.
Runbook
- Healthy looks like: dashboard shows Online, recent logs show
syncedlines for episodes I've actually watched, AniList shows current episode counts that match my Plex history. - The on-disk config file is not the source of truth. AniBridge owns its config; the running service may diverge from what's on disk if the file was edited directly without restarting. The web UI is authoritative — if you need to verify what's actually in effect, look at the UI, not the file. Save through the UI overwrites the file.
- Sync silently stopped working: check the logs for
401orunauthorized. Usually means the AniList JWT has expired. Rotate the token, update the config (via the UI), restart. - Profiles must declare providers explicitly. In current schema versions, each profile in the config needs an explicit
providers:block listing AniList (or MAL, etc.). Older config formats that inherited providers globally don't sync — they just sit happily idle. The clue is "service shows Online, but nosyncedlines ever appear in the logs." - Where logs live:
docker logs anibridgeon the host; the UI also has a logs view.