Watched, resume, and favorites synced across Emby and Jellyfin.
docker run -d --name statesync -p 4601:4601 -v statesync-config:/config ghcr.io/studio2201/statesync:latestNo environment variables required. Open http://localhost:4601.
- Run the install command above.
- Dashboard: Add server, paste Emby or Jellyfin URL and API key, Save. Type is auto-detected. Browser paths such as
/web/index.htmlare reduced to host and port. - Add the other server the same way.
- If usernames differ, use Link users.
- Play something on one server and watch state appear on the other. Optional: Preview force, then Force sync for history. Per user: Force, Clear watched, or Ignore.
| Target | How |
|---|---|
| Docker | One-liner above (ghcr.io/studio2201/statesync) |
| Unraid | Import unraid/unraid-template.xml; appdata /mnt/user/appdata/statesync; port 4601; shell sh (BusyBox ash). If Emby or Jellyfin use br0, put StateSync on br0 as well. |
| Compose | container/docker-compose.yml (port and volume only) |
| Binary | GitHub Release statesync-linux-x86_64-*.tar.gz (static musl) |
Image tags: latest, 0.28.x, v0.28.x.
| Live | Force | |
|---|---|---|
| Played | yes | yes (skip if already equal) |
| Position | yes | yes |
| Favorites | yes | yes |
Clear watched is a dedicated per-user action on every server, not force. Not synced: ratings, playlists, libraries, media files.
| Default | |
|---|---|
| Bind | 0.0.0.0:4601 |
| Config | /config/config.json |
| Auth | off |
| Base image | Alpine Linux with BusyBox ash |
| User | PUID 99, PGID 100 when unset |
Optional environment variables and architecture notes: docs/ARCHITECTURE.md. Brand assets: graphics/BRAND.md.
statesync --validate
statesync --sync-force --dry-run
statesync --sync-force
statesync --tui- Issues: https://github.com/studio2201/statesync/issues
- Packages: https://github.com/studio2201/statesync/pkgs/container/statesync
- Releases: https://github.com/studio2201/statesync/releases
Apache License 2.0. See LICENSE.