diff --git a/.env.deploy.example b/.env.deploy.example
index b0f6f91..9424ba2 100644
--- a/.env.deploy.example
+++ b/.env.deploy.example
@@ -5,6 +5,7 @@ ARCHIVE_STATUS_STATE=state/status-message.json
MEDIA_CATALOG_STATE=state/media-catalog.json
MEDIA_LIBRARY_STATE=state/media-library.json
BOT_SETTINGS_STATE=state/bot-settings.json
+JELLYFIN_SYNC_INTERVAL_SECONDS=900
CHECK_INTERVAL_SECONDS=60
HTTP_USER_AGENT=ArchiveStatusBot/1.0
DISCORD_DRY_RUN=false
diff --git a/.env.example b/.env.example
index e3cb2b4..4022e75 100644
--- a/.env.example
+++ b/.env.example
@@ -5,6 +5,7 @@ ARCHIVE_STATUS_STATE=state/status-message.json
MEDIA_CATALOG_STATE=state/media-catalog.json
MEDIA_LIBRARY_STATE=state/media-library.json
BOT_SETTINGS_STATE=state/bot-settings.json
+JELLYFIN_SYNC_INTERVAL_SECONDS=900
CHECK_INTERVAL_SECONDS=60
HTTP_USER_AGENT=ArchiveStatusBot/1.0
DISCORD_DRY_RUN=false
diff --git a/README.md b/README.md
index 2a85ee3..b4e008d 100644
--- a/README.md
+++ b/README.md
@@ -201,6 +201,8 @@ The editor supports adding, editing, and deleting movie/show rows before saving
Discord publishing uses one message with an attached `media-catalog.md` file so the channel does not get flooded by a long embed wall.
+You can also sync directly from Jellyfin instead of using CSVs. In Jellyfin, create an API key from the admin dashboard, then enter the Jellyfin URL and key in the `Media` tab. `Sync now` replaces the editable library with the current Jellyfin movies and shows. `Auto-sync changes` checks Jellyfin periodically and republishes only when the catalog fingerprint changes.
+
Channel selections are stored in:
```env
@@ -223,6 +225,12 @@ MEDIA_LIBRARY_STATE=state/media-library.json
Republishing deletes the previous media catalog message and posts a fresh compact Markdown attachment.
+The auto-sync interval defaults to 15 minutes:
+
+```env
+JELLYFIN_SYNC_INTERVAL_SECONDS=900
+```
+
## Service Config
Each service supports:
diff --git a/dashboard.html b/dashboard.html
index fdb4a8b..ff0df48 100644
--- a/dashboard.html
+++ b/dashboard.html
@@ -307,6 +307,20 @@
padding: 7px;
}
+ .check-field {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ padding-top: 25px;
+ color: var(--muted);
+ font-weight: 650;
+ }
+
+ .check-field input {
+ width: auto;
+ min-height: 0;
+ }
+
.media-status {
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
@@ -538,6 +552,32 @@
+
+