Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
937 commits
Select commit Hold shift + click to select a range
4259918
fix(historyimport): import Emby watch dates, episode favorites, and c…
Quick104 Sep 23, 2026
0bd7742
feat(admin): run full library metadata refreshes from the web (#1337)
Quick104 Sep 23, 2026
0539abc
fix(historyimport): import Jellyfin favorites and support Jellyfin 12…
Quick104 Sep 23, 2026
e705f7d
docs(contributing): drop the issue-first requirement for pull requests
Quick104 Sep 23, 2026
eb0ffea
refactor(tasks): trim the Scheduled Tasks page to tasks admins manage…
Quick104 Sep 23, 2026
61fe4e0
feat(scanner): support flexible movie and episode filenames (#1313)
Quick104 Sep 23, 2026
b14646d
feat(storage): add managed storage transitions (#1295)
Rhainland Sep 23, 2026
c060e75
feat(jellycompat): update to the Jellyfin 12.1 API (#1343)
Quick104 Sep 23, 2026
0b22a31
feat(playback): configure profile-wide seek intervals (#994)
Rhainland Sep 23, 2026
996b41f
fix(intromarkers): stop re-refining unchanged silence backfill files …
Quick104 Sep 24, 2026
0e5c5fb
fix(playback): fall back to CPU decode and software under auto hw acc…
Quick104 Sep 24, 2026
6622b36
fix(watch-party): stop warning on routine room socket reconnects (#1347)
neurekadev Sep 24, 2026
d4e35ba
fix(subtitles): keep SRT {\anN} placement in the WebVTT conversion (#…
Quick104 Sep 24, 2026
36fb66f
fix(jellycompat): serve Jellyfin Web preference discovery routes (#1405)
tomislav Sep 24, 2026
2aa9316
feat(playback): serve original SRT sidecars to clients that parse Sub…
Quick104 Sep 24, 2026
cc4102f
fix(watchsync): classify Trakt and Simkl rate limits and pace writes …
Quick104 Sep 24, 2026
1b82554
fix(watchsync): keep the MDBList API key out of error text (#1351)
Quick104 Sep 24, 2026
1a23d4c
fix(logging): keep Redis off the request path for log writes (#1363)
Quick104 Sep 24, 2026
6b320cb
test(playback): wait for the control lane takeover before sending (#1…
Quick104 Sep 24, 2026
df0e9d9
perf(playback): sync sessions on progress only when pause state flips…
Quick104 Sep 24, 2026
e29eccc
perf(playback): refresh the taste profile only when a play changes it…
Quick104 Sep 24, 2026
012634e
perf(progress): index the resume-point predicate behind Continue Watc…
Quick104 Sep 24, 2026
c484aff
fix(downloads): stop series monitors re-registering deleted episodes …
Quick104 Sep 24, 2026
2d6a100
perf(plugins): stop re-hashing a verified plugin binary on manifest r…
Quick104 Sep 24, 2026
bd33214
perf(plugins): index event subscribers instead of reading the store p…
Quick104 Sep 24, 2026
d219d63
perf(catalog): read series and season user_data from the SQL rollup (…
Quick104 Sep 24, 2026
0f4c28a
ci: run the DB-backed query-budget pins against Postgres (#1374)
Quick104 Sep 24, 2026
26c5a54
perf(artwork): keep revisioned artwork URLs stable for a UTC day (#1376)
Quick104 Sep 24, 2026
c6a0ba9
perf(access): stop re-reading legacy settings on every profile reques…
Quick104 Sep 24, 2026
1fc9900
feat(jellycompat): add request metrics and a server span per request …
Quick104 Sep 24, 2026
13a3675
fix(jellycompat): bound the image cache and stop serving expired imag…
Quick104 Sep 24, 2026
9748570
perf(playback): relay to transcode nodes through the tuned node clien…
Quick104 Sep 24, 2026
911bdbb
perf(scanner): skip marker reads while the markers prefix is empty (#…
Quick104 Sep 24, 2026
5fc1fc0
perf(web): collapse the signed-in boot chain (#1368)
Quick104 Sep 24, 2026
4fc537d
perf(web): paint the cached theme first and self-host the UI fonts (#…
Quick104 Sep 24, 2026
6a58f8d
perf(web): keep loaded artwork visible when only its signature change…
Quick104 Sep 24, 2026
42f406d
perf(web): build the series play button from the server's play target…
Quick104 Sep 24, 2026
973af63
feat(playback): measure time from pressing play to the first frame (#…
Quick104 Sep 24, 2026
476f38d
fix(web): keep refresh bumps from failing in-flight section loads (#1…
Quick104 Sep 24, 2026
49cfd0c
perf(playback): keep player time updates out of the playback context …
Quick104 Sep 24, 2026
7021cd9
perf(web): serve WASM assets precompressed (#1385)
Quick104 Sep 24, 2026
515e8d0
perf(web): ask for one favorite card to gate taste seeding (#1383)
Quick104 Sep 24, 2026
2812ac3
perf(web): shrink the launch bundle, split out React, and add a size …
Quick104 Sep 24, 2026
8b60084
fix(api): accept same-host origins on v2 sockets when a public URL is…
neurekadev Sep 24, 2026
101c125
fix(access): enforce content-rating ceilings by minimum age (#1359)
Quick104 Sep 24, 2026
2f95ed7
fix(web): right-align API key dialog actions (#1414)
Quick104 Sep 24, 2026
8ce65d6
fix(jellycompat): return cast receiver discovery in system info (#1412)
tomislav Sep 24, 2026
5d7889b
fix(watchsync): page every Trakt list read (#1352)
Quick104 Sep 24, 2026
091478c
feat(web): offer the Silo app on Watch Party invitation links (#1415)
Quick104 Sep 24, 2026
de0f070
fix(watchsync): match Trakt not_found echoes by any shared id (#1353)
Quick104 Sep 24, 2026
8e702f1
fix(catalog): filter reconcile's orphan image dirs after the delete (…
zerodayz1 Sep 24, 2026
234f017
feat(watchsync): sync Simkl movie and show ratings (#1355)
Quick104 Sep 24, 2026
064184d
feat(watchsync): sync MDBList movie and show ratings (#1356)
Quick104 Sep 24, 2026
3515dc2
fix(historyimport): complete Plex imports on current Plex Media Serve…
Quick104 Sep 24, 2026
8d3147b
feat(watchsync): sync ratings with watch-sync plugins (#1357)
Quick104 Sep 24, 2026
fab6cb4
feat(catalog): show an advisory age on item detail, behind a profile …
Quick104 Sep 24, 2026
e46376c
fix(historyimport): give up on a Plex id sweep that keeps failing (#1…
Quick104 Sep 24, 2026
4f26330
feat(watchsync): sync movie and series ratings with watch providers (…
Quick104 Sep 24, 2026
e6a7b0e
fix(historyimport): explain Plex imports dropped by a history removal…
Quick104 Sep 24, 2026
acfc097
fix(jellycompat): persist webOS direct-play resume progress (#1416)
tomislav Sep 24, 2026
4e9b7c7
fix(web): hide the login Sign up link when public signups are closed …
rangoDJ Sep 24, 2026
08ec126
feat(catalog): add opt-in local theme music (#1344)
crowquillx Sep 24, 2026
e3a220b
fix(web): send a session the server stops accepting to sign-in (#1422)
rangoDJ Sep 25, 2026
956984b
perf(catalog): check unreferenced image dirs in one pass, not per can…
zerodayz1 Sep 25, 2026
412e916
fix(web): give each access group its own URL (#1421)
rangoDJ Sep 25, 2026
900f32e
fix(jellycompat): canonicalize lowercase localtrailers path segment (…
rangoDJ Sep 25, 2026
c972b54
fix(clientip): accept Traefik's ws/wss forwarded proto on WebSocket u…
rangoDJ Sep 25, 2026
0cb1ac0
fix(web): tell subtitle variants apart in the AI translation source p…
rangoDJ Sep 25, 2026
42fcc01
fix(web): type-safe, collision-free source labels; keep negated flags
rangoDJ Sep 25, 2026
7038ccb
fix(metadata): call enrichment-only plugin providers by declared look…
Quick104 Sep 25, 2026
7cc2c1f
feat(access): limit a profile by advisory age (#1429)
Quick104 Sep 25, 2026
6d55cdf
fix(web): keep TV detail controls and navigation visible (#1012)
Rhainland Sep 25, 2026
1aa1eb2
feat(access): let a profile hide titles with no advisory age (#1441)
Quick104 Sep 25, 2026
88b9146
fix(metadata): corroborate lopsided sweep pages against the GC's disp…
zerodayz1 Sep 25, 2026
9e839e0
fix(taskmanager): move the artwork sweep on after an anomaly stop
zerodayz1 Sep 25, 2026
3584273
fix(web): label admin and no-group policy defaults by their source (#…
Quick104 Sep 25, 2026
6afd43e
fix(web): show stream bitrate limits in Mbps with presets (#1444)
Quick104 Sep 25, 2026
6ea86c6
fix(metadata): leave GC-scheduled sweep pages to the GC instead of de…
zerodayz1 Sep 25, 2026
484bb51
fix(taskmanager): report objects the artwork sweep left to the GC
zerodayz1 Sep 25, 2026
89535f1
ci: run the artwork sweep's GC-schedule lookup test against a migrate…
zerodayz1 Sep 25, 2026
af7db2f
fix(web): show a real page when an item, person or collection is unav…
Quick104 Sep 25, 2026
e48f9b9
fix(web): stop retrying 404 problem responses (#1452)
Quick104 Sep 25, 2026
6fce165
docs(contributing): add rules for writing a readable PR description (…
Quick104 Sep 25, 2026
0478306
fix(web): show a not-available page for a missing collection (#1450)
Quick104 Sep 25, 2026
358be57
docs(contributing): drop the word target from PR description rules (#…
Quick104 Sep 25, 2026
44b6e3c
fix(web): give missing admin users, collections and tasks a real page…
Quick104 Sep 25, 2026
6b5e053
fix(web): reset the item page's library check when the URL changes (#…
Quick104 Sep 25, 2026
623cf5e
fix(jellycompat): apply subtitle preferences on item details (#1457)
tomislav Sep 25, 2026
2094810
fix(intromarkers): tighten Chromaprint intro boundaries (#1446)
Quick104 Sep 25, 2026
8362861
feat(auth): let admins send password reset links and set temporary pa…
Quick104 Sep 25, 2026
b0ef72d
fix(idgen): start when the host has no private IPv4 address (#1463)
Quick104 Sep 25, 2026
23cf484
perf(intromarkers): analyze intro seasons in parallel (#1447)
Quick104 Sep 25, 2026
9bf75d6
fix(intromarkers): rate Chromaprint intros by season agreement (#1449)
Quick104 Sep 25, 2026
25bd65b
feat(auth): add self-service "Forgot password?" to the sign-in page (…
Quick104 Sep 25, 2026
b8614c3
fix(intromarkers): detect 12-second to 3-minute intros (#1453)
Quick104 Sep 25, 2026
7ad9479
chore(clientip): satisfy lint on the ws/wss forwarded-proto change (#…
rangoDJ Sep 25, 2026
a89e6b5
fix(jellycompat): always send BackdropImageTags as an array (#1424)
rangoDJ Sep 25, 2026
d3c5065
fix(api-keys): restrict v2 personal API key creation to admins (#1423)
rangoDJ Sep 25, 2026
b38a738
fix(jellycompat): accept a media-source id in the PlaybackInfo route …
rangoDJ Sep 25, 2026
89ea125
fix(jellycompat): keep saved language preferences selected (#1456)
tomislav Sep 25, 2026
78f7f23
fix(watch-party): play a rebuilt stream's pre-roll up to a room seek …
Quick104 Sep 25, 2026
807ad80
fix(migrations): restore ON UPDATE CASCADE on content_id-family FKs (…
rangoDJ Sep 25, 2026
518fa83
fix(downloads): stop rebuilding missing artifacts no download uses (#…
Quick104 Sep 25, 2026
a0343cd
fix(playback): keep the subtitle variant across formats on edition sw…
rangoDJ Sep 25, 2026
642d7f9
feat(sections): name the source title in Because You Watched rows (#1…
im85288 Sep 25, 2026
e94611b
fix(web): hide playback selectors without choices (#1408)
tomislav Sep 25, 2026
f6a8efc
fix(auth): stop a username from matching another account's email (#1472)
Quick104 Sep 25, 2026
135e059
fix(jellycompat): add MessageId to outbound socket messages (#1476)
Quick104 Sep 25, 2026
c3d3466
fix(jellycompat): send UserDataChanged when watched state changes (#1…
rangoDJ Sep 25, 2026
2fce15e
fix(jellycompat): follow Jellyfin sort keys and default order (#1477)
Quick104 Sep 25, 2026
825d5d3
fix(jellycompat): apply Jellyfin browse filters on Items, Persons and…
Quick104 Sep 25, 2026
5ec3c4f
fix(jellycompat): send fields Jellyfin SDK clients require (#1479)
Quick104 Sep 25, 2026
23125d6
fix(jellycompat): grant static streams to the client that negotiated …
Quick104 Sep 25, 2026
f50bed6
docs(readme): credit Macroscope's open source program (#1482)
Quick104 Sep 26, 2026
1c8d191
fix(deploy): pin the bundled Meilisearch image (#1487)
neurekadev Sep 26, 2026
e1a7b26
fix(watchtogether): log corrections and syncs sent to members (#1486)
neurekadev Sep 26, 2026
02a7d2e
fix(watchtogether): return the room to the lobby when the item ends (…
neurekadev Sep 26, 2026
67e0c31
feat(metadata): run enrichment-only providers at batch size (#1491)
Quick104 Sep 26, 2026
d5df9f7
fix(historyimport): keep user-supplied server addresses off the serve…
Quick104 Sep 26, 2026
83ac7a9
fix(markers): stop wasting the marker submission quota (#1445)
Quick104 Sep 26, 2026
8d4d1f6
feat(metadata): store per-source ratings from metadata plugins (#1490)
Quick104 Sep 26, 2026
61ffca6
fix(collections): page MDBList lists past the feed's 2000-entry defau…
Quick104 Sep 26, 2026
3f799f9
fix(collections): bound MDBList sync and record failed runs (#1496)
Quick104 Sep 26, 2026
3ced415
fix(policy): raise the default eval timeout to 100ms (#1497)
Quick104 Sep 26, 2026
633d94e
fix(playback): stop transcode startup waits when the request ends (#1…
Quick104 Sep 26, 2026
96a0b7e
fix(sections): always refresh the calendar's trending feed (#1501)
Quick104 Sep 26, 2026
d77371d
fix(web): label home sections by the preset their config matches (#1503)
Quick104 Sep 26, 2026
703d483
fix(recommendations): prevent taste cluster replacement races (#1502)
blurbery Sep 26, 2026
e5ed3a4
fix(web): add the Group selector to the Users list's user dialogs (#1…
rangoDJ Sep 26, 2026
653d75b
feat(web): show access group members and a Users group column (#1474)
rangoDJ Sep 26, 2026
d6bd3d7
fix(web): call the API key tier a rate limit (#1473)
rangoDJ Sep 26, 2026
dce1af5
fix(web): return to the access group list after saving a group
rangoDJ Sep 25, 2026
3d29bf5
chore(web): raise the launch bundle budget for compression drift
rangoDJ Sep 25, 2026
0929c8f
feat(auth): protect the server Owner's account from other admins (#1504)
Quick104 Sep 26, 2026
8e97a50
fix(web): keep fullscreen when the next episode starts (#1509)
Quick104 Sep 26, 2026
203be5d
fix(notifications): recover the push relay credential after the relay…
Quick104 Sep 26, 2026
54dcc2f
ci(macroscope): flag PRs that affect validated 1.0 cases (#1511)
Quick104 Sep 26, 2026
75e2ed6
fix(idgen): lease each process's Sonyflake machine ID from Postgres (…
Quick104 Sep 26, 2026
83f1af8
feat(web): rebuild the plugins admin page around per-plugin pages (#1…
Quick104 Sep 26, 2026
c6f4836
docs(wiki): note Valkey as a drop-in for the bundled Redis (#1512)
Tobechukwu-Njoku Sep 26, 2026
66f6a52
docs(contributing): close resolved issues when their PR merges (#1522)
Quick104 Sep 26, 2026
5a61781
docs(contributing): allow a maintainer's gated evidence link in PRs (…
Quick104 Sep 26, 2026
bb6d640
fix(access): move a deleted group's members into the default group
rangoDJ Sep 26, 2026
29e5f92
test(access): run the delete's revocation callback in the handler test
rangoDJ Sep 26, 2026
df7fb89
ci: re-run checks for a flaky Watch Party web test
rangoDJ Sep 26, 2026
95bef0f
fix(idgen): reject IDs minted after lease expiry (#1520)
Quick104 Sep 26, 2026
dfa62e5
fix(sections): size the Next Up row like Continue Watching (#1530)
Quick104 Sep 26, 2026
cd70b0b
fix(auth): keep email validation the same when built with Go 1.27 (#1…
Quick104 Sep 26, 2026
be15e8b
feat(auth): let only the server Owner manage admin accounts (#1523)
Quick104 Sep 27, 2026
1149439
fix(playback): fall back to the HDR10 strip after native Dolby Vision…
tomislav Sep 27, 2026
47cc1d8
fix(jellycompat): strip Dolby Vision to HDR10 for clients that reject…
Quick104 Sep 27, 2026
39a5547
feat(theme): make Cinema Dark the only theme, customized by the admin…
Quick104 Sep 27, 2026
00380a1
fix(api-keys): require an admin to create keys through /api/v1 (#1550)
Quick104 Sep 27, 2026
b859460
fix(web): show the server Owner's role as "owner" instead of "admin" …
Quick104 Sep 27, 2026
5e49cc8
feat(watchsync): sync dropped shows with Trakt and Simkl (#1547)
Quick104 Sep 27, 2026
3838c3a
fix(requests): resolve missing series TVDB IDs through TVDB before fa…
Quick104 Sep 27, 2026
283a46c
fix(scanner): count a file as one part of a split only when other par…
tomislav Sep 27, 2026
a64eece
fix(playback): hide quality rungs from viewers who cannot transcode
tomislav Sep 27, 2026
dee7c98
fix(playback): class cropped sources like the catalog does
tomislav Sep 27, 2026
186ef8b
docs(playback): note the ladder tops out at 2160p above 1080p
tomislav Sep 27, 2026
aecdeff
fix(adminjob): resume image cache cleanup instead of restarting it
zenjabba Sep 27, 2026
67e5408
docs(adminjob): say why Yield keeps requested_at
zenjabba Sep 27, 2026
5d225c4
fix(sections): let Recently Added and Recently Released rows pick lib…
bulderi Sep 27, 2026
a02f8d4
fix(adminjob): retry a cleanup prefix interrupted by the slice deadline
zenjabba Sep 27, 2026
bfa70cd
fix(adminjob): count a partly deleted prefix as cleanup progress
zenjabba Sep 27, 2026
acfff78
fix(sections): hide the library picker on profile library pages
bulderi Sep 27, 2026
1e706d8
fix(sections): end a generated row's ownership when its library is de…
bulderi Sep 27, 2026
82b5b39
build(docker): bundle jellyfin-ffmpeg 8.1.3 (#1587)
Quick104 Sep 27, 2026
1b26f6b
fix(intromarkers): pair silencedetect starts and ends, including nega…
Quick104 Sep 27, 2026
678483e
refactor(intromarkers): run intro ffmpeg through a shared media sampl…
Quick104 Sep 27, 2026
550f0ab
perf(intromarkers): run background marker analysis at idle CPU and I/…
Quick104 Sep 27, 2026
de77c43
refactor(intromarkers): store analysis artifacts by kind (#1539)
Quick104 Sep 27, 2026
87bd9d2
refactor(markers): generalize the local analyzer for marker kinds and…
Quick104 Sep 27, 2026
10284e8
feat(markers): detect episode credits from chapters and ending audio …
Quick104 Sep 27, 2026
00b15bc
feat(markers): use end-credit visuals for episode credits (#1542)
Quick104 Sep 27, 2026
f3de8f4
fix(markers): run scheduled marker detection on one server at a time …
Quick104 Sep 27, 2026
50729f0
feat(markers): detect movie credits locally (best effort) (#1544)
Quick104 Sep 27, 2026
4da4a56
refactor(chapterthumbs): extract frames through mediasample (#1545)
Quick104 Sep 27, 2026
13763f5
perf(markers): decode credits keyframes on the GPU (#1546)
Quick104 Sep 27, 2026
819fbbd
test(markers): cover the on-demand online intro for movies during pla…
Quick104 Sep 27, 2026
4442cdb
fix(jellycompat): serve item artwork anonymously and advertise logos …
Quick104 Sep 27, 2026
11f0c00
feat(markers): re-detect intro, credits, or all markers for an item (…
Quick104 Sep 27, 2026
265a3bd
feat(markers): turn intro and credits detection on or off separately …
Quick104 Sep 27, 2026
a259387
fix(markers): queue re-detect kinds the running analysis does not cov…
Quick104 Sep 27, 2026
fe21614
feat(search): show people in the quick search dialog (#1601)
Quick104 Sep 27, 2026
cd50491
docs(contributing): open a siloserver.org issue when a change outdate…
Quick104 Sep 27, 2026
961b6ec
feat(markers): disable re-detect choices for kinds turned off in sett…
Quick104 Sep 27, 2026
99bcc7d
fix(markers): keep credits scenes out of chapter credits (#1599)
Quick104 Sep 27, 2026
d1f49b9
fix(markers): withdraw chapter credits the chapters no longer produce…
Quick104 Sep 27, 2026
ca29a8e
fix(markers): keep chapter-credit movies listed despite a stored tail…
Quick104 Sep 27, 2026
9840ca2
fix(markers): treat adjacent credits chapters as one credits segment …
Quick104 Sep 27, 2026
862bf5c
feat(collections): sync collections from public TMDB lists (#1585)
Rhainland Sep 28, 2026
b308065
fix(markers): limit chapters titled only Ending or Outro to three min…
Quick104 Sep 28, 2026
737ab2c
fix(jellycompat): make collection children playable and support Play …
Rhainland Sep 28, 2026
69995e8
fix(web): ask for the public URL before invitation and reset links (#…
rangoDJ Sep 28, 2026
720068a
fix(web): keep player menus closable in Safari (#1572)
tomislav Sep 28, 2026
91e16b4
fix(migrations): release marker claims before granting them by target…
bmanhuge Sep 28, 2026
753d6b6
fix(web): name the recommendations page "For You" (#1583)
rangoDJ Sep 28, 2026
0c43ebc
fix(web): keep the delete warning when the cached member count is zero
rangoDJ Sep 28, 2026
b7f6629
Merge pull request #1575 from zenjabba/fix/image-cache-cleanup-resume
Quick104 Sep 28, 2026
6775813
Merge pull request #1569 from tomislav/fix/playback-ladder-user-trans…
Quick104 Sep 28, 2026
d8ad240
Merge pull request #1567 from tomislav/fix/scanner-lone-part-number
Quick104 Sep 28, 2026
8363ddc
fix(web): say that turning off video transcoding still allows remux (…
tomislav Sep 28, 2026
183f6b2
fix(playback): preserve clamped encoder heights
Quick104 Sep 28, 2026
8f7b01f
fix(sections): preserve generated ownership until save
Quick104 Sep 28, 2026
b4f4a1d
Merge main into fix/playback-ladder-cropped-sources
Quick104 Sep 28, 2026
1860788
fix(playback): class 8K sources as 4320p so 4K rungs scale down
tomislav Sep 28, 2026
34f577c
fix(web): hide admin-only section types from profiles that cannot sav…
rangoDJ Sep 28, 2026
f9d6e8e
fix(jellycompat): record Jellyfin-client requests in the activity log…
tomislav Sep 28, 2026
661d2a7
fix(history-import): limit imports to the acting profile unless it's …
rangoDJ Sep 28, 2026
0f6fe8b
fix(playback): negotiate HEVC and preserve DV8 remux (#1557)
Pukabyte Sep 28, 2026
b8b39b1
Merge pull request #1570 from tomislav/fix/playback-ladder-cropped-so…
Quick104 Sep 28, 2026
e02bad7
Merge pull request #1434 from rangoDJ/fix/ai-translation-source-label…
Quick104 Sep 28, 2026
8e44d0b
Merge pull request #1458 from zerodayz1/fix/artwork-sweep-dense-orphans
Quick104 Sep 28, 2026
d01d07f
Merge main into fix/recently-added-library-filter
Quick104 Sep 28, 2026
87f7d35
fix(recommendations): distinguish Gemini daily quotas from throttling…
blurbery Sep 28, 2026
4925157
fix(jellycompat): resolve profile preferences on item details (#1506)
tomislav Sep 28, 2026
a794900
fix(jellycompat): start on the remembered series subtitle track (#1507)
tomislav Sep 28, 2026
a43e9b3
fix(playback): download hardware frames in the surface's own pixel fo…
Tobechukwu-Njoku Sep 28, 2026
3742b41
fix(web): link an empty calendar view to the other two views (#1515)
rangoDJ Sep 28, 2026
b630320
fix(jellycompat): hide ID-less stopped sessions from admin
rangoDJ Sep 28, 2026
8053fe1
feat(web): filter admin logs by level and component (#1568)
madmatt Sep 28, 2026
6e673bb
fix(admin): prefer resolved inherited policy (#1339)
neurekadev Sep 28, 2026
4cef509
fix(sections): let Recently Added and Recently Released rows pick lib…
Quick104 Sep 28, 2026
2f61d72
feat(home): hide watched items from Home, per profile (#1526)
rangoDJ Sep 28, 2026
ce286f5
fix(collections): report visible members in personal collection item_…
Quick104 Sep 28, 2026
0cdd97d
fix(notifications): skip releases for content added long before it ma…
Quick104 Sep 28, 2026
ad899be
feat(libraries): scan library folders automatically when files change…
Quick104 Sep 28, 2026
37b3829
fix(access): revoke moved members' sign-ins in one pass
rangoDJ Sep 28, 2026
91b4c78
test(access): read the set-based revoke argument as []int
rangoDJ Sep 28, 2026
2057f38
Merge pull request #1626 from Silo-Server/fix/notifications-new-conte…
Quick104 Sep 28, 2026
cd3b2cc
docs: send operator guides to the siloserver.org manual
Quick104 Sep 28, 2026
f212cbc
Merge pull request #1524 from rangoDJ/feat/delete-group-moves-members…
Quick104 Sep 28, 2026
37b197a
feat(database): log migration progress while migrations run (#1516)
rangoDJ Sep 28, 2026
2086624
Merge pull request #1633 from Silo-Server/docs/operator-guides-to-manual
Quick104 Sep 28, 2026
7c906a8
fix(notifications): skip second library copies in server channel post…
Quick104 Sep 28, 2026
0c9927a
chore(scripts): remove unused scripts and the Continuum migration pat…
Quick104 Sep 28, 2026
ec48b34
fix(catalog): match name_prefix on the sort title only (#1631)
Rhainland Sep 28, 2026
64be2bf
fix(downloads): pick the version the profile watches when none is nam…
Rhainland Sep 28, 2026
42b3976
docs: move operator guides out of the server repository (#1635)
Quick104 Sep 28, 2026
f84d2de
fix(notifications): stop notifying for series removed from Home (#1625)
Quick104 Sep 28, 2026
cbd9cc1
fix(collections): give replaced collection artwork a new URL (#1326)
dannyshafer Sep 28, 2026
d23952d
fix(apiv2): keep sendfile for file responses and log body bytes (#1647)
Quick104 Sep 28, 2026
8cc97dc
fix(downloads): answer 503 when the offline artwork store fails (#1648)
Quick104 Sep 28, 2026
c0fea4e
fix(watch-party): return web members to the room when an episode ends…
neurekadev Sep 29, 2026
6e5408a
fix(watch-party): stop replaying the room command after a socket rene…
neurekadev Sep 29, 2026
0eddbf9
fix(web): describe chapter thumbnail workers as a per-server limit (#…
Tobechukwu-Njoku Sep 29, 2026
19e8184
feat(overlays): add an advisory age poster badge (#1672)
Quick104 Sep 29, 2026
08794f7
Merge upstream silo-server main (~925 commits, API v2) into Prairie
JonahMMay Sep 28, 2026
0bad5e1
Merge upstream silo-server main (7 commits) into Prairie
JonahMMay Sep 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
30 changes: 30 additions & 0 deletions .agents/skills/unslop/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
name: unslop
description: Rewrite prose to remove AI-sounding patterns while preserving meaning, evidence, citations, terminology, uncertainty, and the intended tone. Use when the user says "unslop", asks to make writing sound human or less AI-generated, or when another workflow explicitly requests a final prose pass for a human-facing issue, pull request, Discord reply, document, or status update. Do not apply to code, logs, quoted text, exact commands, or machine-readable contracts.
---

# Unslop

Make the writing sound like a thoughtful person wrote it. Protect accuracy before style.

## Preserve the contract

- Keep the meaning, factual claims, citations, uncertainty, and scope unchanged.
- Keep exact quotations, code, commands, identifiers, API names, log text, and contractual language exact.
- Do not invent personality, opinions, anecdotes, confidence, or informality that the author did not supply.
- Do not remove a hedge that communicates a real evidence limit.
- Match the audience. A Discord reply, architecture note, and incident report should not share one voice.

## Rewrite

1. Identify the audience, purpose, and expected tone from context.
2. Read [references/patterns.md](references/patterns.md).
3. Cut filler, generic framing, repetition, and promotional puffery. Preserve substantive claims; style editing is not fact-checking or permission to delete them. Removing a restatement of material the reader already has, such as a diff or a code comment, is not deleting a claim.
4. Replace vague language with the concrete fact, mechanism, number, or action when the source supports it.
5. Prefer plain words and active voice. Keep necessary domain terminology consistent rather than cycling synonyms.
6. Vary sentence length naturally. Use formatting only when it makes the content easier to scan.
7. Read the result once as the intended recipient. Fix anything that still sounds templated, promotional, overeager, or sterile.

## Respond

When asked to rewrite, return the revised text only unless the user asks for commentary or alternatives. When asked to review rather than rewrite, identify the highest-impact problems and provide a proposed revision.
40 changes: 40 additions & 0 deletions .agents/skills/unslop/references/patterns.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
# Writing patterns

Use this as a diagnostic list, not as a mechanical ban list. Preserve a construction when it is the clearest accurate choice.

## Cut or replace

- Empty praise, promotional adjectives, and grand claims.
- Stock openings and closers such as "Certainly", "Great question", "I hope this helps", and "Let me know if".
- Vague attribution such as "experts say" when no source is named.
- Generic framing that previews the answer instead of giving it.
- Forced groups of three, false ranges, and symmetrical "not only X but Y" constructions.
- Repeated bold labels that merely restate the sentence that follows.
- Abstract metaphors where a concrete engineering term exists.
- Dense sentences that make the reader backtrack.
- Adverbs that stand in for a measurement or stronger verb.
- Synonym cycling. Give one concept one name.
- Private vocabulary: names the writer coined while working that the reader has never seen. Use the established name or plain words.
- Restating what the reader already has, such as the diff, a linked issue, or code comments.
- Process narrative: how the writer got to the answer, when the reader needs only the answer and its evidence.

## Prefer

- The answer or outcome first.
- Specific actors and mechanisms.
- Measured change over adjectives such as "significant".
- Plain words such as "use", "help", and "if".
- Sentence-case headings and restrained formatting.
- A concise plain-English explanation before policy or implementation detail when both matter.
- Honest uncertainty where the evidence is incomplete.

## Final audit

Ask:

1. Could this paragraph appear unchanged in an unrelated project? If so, make it specific or cut it.
2. Would a reader who was not part of the work understand the first paragraph? If not, rewrite it in plain words.
3. Did style editing alter a fact, quote, citation, or confidence level? Restore it.
4. Does the text sound polished but anonymous? Add the author's actual judgment only when context supplies it.
5. Did punctuation or formatting become a visible mannerism? Simplify it.

29 changes: 0 additions & 29 deletions .air.toml

This file was deleted.

1 change: 1 addition & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ web/docs
# Authoring-only plates (~231MB). Vite already omits them from dist; excluding
# them from the build context avoids shipping them into every Docker build.
web/public/images/collection-templates/raw
web/assets-source
silo
streamapp
*.md
Expand Down
18 changes: 16 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ POSTGRES_SHM_SIZE=8gb
# Optional Meilisearch service. Generate a key, uncomment it, then start the
# search profile with: docker compose --profile search up -d
# MEILI_MASTER_KEY=replace-with-output-of-openssl-rand-hex-32
# MEILISEARCH_IMAGE=getmeili/meilisearch:latest
# MEILISEARCH_IMAGE=getmeili/meilisearch:v1.54.0
# Set for one start after changing MEILISEARCH_IMAGE, then remove it.
# MEILI_UPGRADE_DB=true
# MEILISEARCH_HOST=127.0.0.1
# MEILISEARCH_PORT=7700

Expand Down Expand Up @@ -80,7 +82,6 @@ POSTGRES_SHM_SIZE=8gb
# SECRET_KEY=replace-with-output-of-openssl-rand-base64-48

# Optional public URL for Prairie. If not set, the server will use the IP address of the container.
# PRAIRIE_PUBLIC_URL=https://prairie.example.com

# Optional trusted reverse-proxy CIDRs for client IP resolution. When set, this
# overrides the "Trusted Proxies" admin setting on every startup (the value is
Expand All @@ -105,3 +106,16 @@ POSTGRES_SHM_SIZE=8gb
# Optional server mode override for source runs or standalone worker nodes.
# MODE=integrated
#PRAIRIE_MIGRATE_TIMEOUT=60m

# Optional local profiling in every serving process; disabled when empty.
# Use literal loopback addresses only. Container loopback is accessible from
# the container's network namespace; do not publish or proxy this port.
# PRAIRIE_DEBUG_LISTEN=127.0.0.1:6060
# Optional Prometheus metrics listener; disabled when empty. Keep it on a
# private monitoring network because the endpoint has no application auth.
# PRAIRIE_METRICS_LISTEN=127.0.0.1:9091
# Contention sampling requires the listener and a restart; both default to 0.
# Block rate is the average blocked nanoseconds per sample: 1000000..1000000000.
# PRAIRIE_DEBUG_BLOCK_RATE=10000000
# Mutex fraction samples one in N contention events: 100..1000000.
# PRAIRIE_DEBUG_MUTEX_FRACTION=100
14 changes: 14 additions & 0 deletions .github/ISSUE_TEMPLATE/bug-report.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,13 @@ body:
attributes:
label: Technical notes
description: Optional suspected root cause, relevant files, SQL output, or stack traces. Keep this separate from the observed reproduction above.
- type: input
id: ai-harness
attributes:
label: AI harness
description: Enter the exact agent harness or application, or "none".
validations:
required: true
- type: input
id: ai-tools
attributes:
Expand All @@ -95,6 +102,13 @@ body:
- Fully AI-generated, human verified
validations:
required: true
- type: textarea
id: ai-review
attributes:
label: Independent or adversarial review
description: Summarize the scope, method, findings, and resolutions, or enter "n/a" when this issue does not require independent or adversarial review.
validations:
required: true
- type: checkboxes
id: confirmations
attributes:
Expand Down
28 changes: 22 additions & 6 deletions .github/ISSUE_TEMPLATE/v1-capability-proposal.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ body:
One proposal per **user-facing capability** (e.g. "Manga library type", "Transcoded playback"),
not per PR or per endpoint. Locked capabilities are what the client teams plan against —
the **API surface** section is mandatory for a capability to be lockable.
Scope state and lock rules: `docs/architecture/v1-scope.md`.
Capability scope state and lock rules: `docs/architecture/v1-scope.md`.
New API surface targets `/api/v2`, Silo 1.0's stable native contract; `/api/v1` is frozen
and takes no new capability work. Contract rules: `docs/architecture/api-contract.md`.
- type: textarea
id: summary
attributes:
Expand All @@ -29,12 +31,12 @@ body:
attributes:
label: API surface
description: >
Endpoints/payloads clients will call (method + path + notable request/response fields).
Plain list now; OpenAPI pointers once the #135 tooling lands. A capability cannot be
Locked without this section filled in.
Operations clients will call (method + path + operation ID + notable request/response
fields), under `/api/v2`. Point at `contracts/api/v2/openapi.json` where the operation
already exists. A capability cannot be Locked without this section filled in.
placeholder: |
GET /api/v1/manga/{seriesId}/chapters — list chapters (id, index, volume, read_state)
POST /api/v1/watch-progress — records reading progress (existing endpoint, new item type)
GET /api/v2/manga/{series_id}/chapters (listMangaChapters) — chapters (id, index, volume, read_state)
POST /api/v2/sync/progress (syncProgress) — records reading progress (existing operation, new item type)
validations:
required: true
- type: textarea
Expand All @@ -54,6 +56,13 @@ body:
- L
validations:
required: true
- type: input
id: ai-harness
attributes:
label: AI harness
description: Enter the exact agent harness or application, or "none".
validations:
required: true
- type: input
id: ai-tools
attributes:
Expand All @@ -79,3 +88,10 @@ body:
- Fully AI-generated, human verified
validations:
required: true
- type: textarea
id: ai-review
attributes:
label: Independent or adversarial review
description: Summarize the scope, method, findings, and resolutions, or enter "n/a" when this issue does not require independent or adversarial review.
validations:
required: true
45 changes: 34 additions & 11 deletions .github/PULL_REQUEST_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -1,31 +1,54 @@
<!-- Follow "Write the description" in CONTRIBUTING.md: plain summary first, no restated
diff, no working history. Agents: then apply .agents/skills/unslop/SKILL.md to the
title and body before posting. -->

## Problem

Closes #NNN
<!-- One "Closes #NNN" line per issue this change fully resolves, so GitHub closes it
when the PR merges into main. Use "Closes Silo-Server/<repo>#NNN" for an issue in
another repository. Delete the line when the PR only partly addresses an issue. -->
Related issue: #NNN
<!-- Use "Related issue: N/A — narrow fix" only when no prior coordination was needed. -->
<!-- An epic, sub-issue, or partly addressed issue this work serves and that should
stay open, or "N/A". An open issue is not required — the Problem section below must
stand on its own. -->
Validation tasks: #NNN C1
<!-- Until 1.0 ships: v1.0 board tasks and cases this change unblocks or changes
(see "1.0 validation" in AGENTS.md), e.g. "unblocks #1144 C3; changes #1200 C1".
Write "none" when no validation task is affected. -->

What user or maintainer problem does this solve?
A short plain-language summary: what goes wrong, who it affects, and what this
change does about it. Details come after.

## Approach

Why this approach? Note alternatives or tradeoffs worth knowing about.
What changed and why this way. Mention an alternative only if a reviewer would ask
about it. Do not walk through the diff.

## Validation

Paste the actual commands and results. Name anything not run or not passing.
Include screenshots or recordings for visible UI changes.
One line per kind of check and its result; do not list tests by name. Name required
checks that were not run or did not pass. Include a short output excerpt only when it
explains a failure.
<!-- Do not include private domains, hostnames, IPs, Tailscale or Report Shelf URLs,
local paths, credentials, personal data, or private media details. Attach screenshots
or recordings only when the user explicitly requests them. A maintainer may end this
section with `Evidence: https://evidence.siloserver.org/r/<repo>/<topic>/`; that page
requires Silo-Server organization sign-in. -->

## Risks

Migration, compatibility, security, or operational impact, or "None identified".

## Checklist

- [ ] I read and can explain the complete diff.
- [ ] This pull request addresses one concern.

## AI Disclosure

- Harness: exact agent harness or application, or "none"
- Tool(s): exact tool name(s), or "none"
- Model(s): exact model identifier(s) reported by each tool, or "n/a"
- Involvement: Fully AI-generated, human verified | AI-assisted | Human-written, AI-reviewed | No AI used
- Adversarial review: scope, method, findings, and resolutions, or "n/a" only when no AI or implementation change was involved

## Checklist

- [ ] I read and can explain the complete diff.
- [ ] This pull request addresses one concern.
- Adversarial review: scope, method, findings, and resolutions, or "n/a" when this change does not require independent or adversarial review
64 changes: 64 additions & 0 deletions .github/actions/setup-go/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Set up Go for this repository
description: >-
Installs libvips, the Go toolchain from go.mod, a per-commit build and module
cache, and the stub frontend bundle that cmd/prairie embeds.

inputs:
cache-name:
description: >-
Distinguishes the build cache of one job from another's. Jobs compile
different things (a lint job type-checks, a test job builds test
binaries), so each keeps a cache that matches its own work.
required: true

runs:
using: composite
steps:
# github.com/h2non/bimg binds libvips through cgo and pkg-config, so
# nothing under ./... compiles without the headers. The Dockerfile
# installs the same package in its build stage.
- name: Install libvips
shell: bash
run: |
# libvips and its dependencies use the runner's official Ubuntu sources.
test -f /etc/apt/sources.list.d/ubuntu.sources
apt_options=(
-o Dir::Etc::sourcelist=/etc/apt/sources.list.d/ubuntu.sources
-o Dir::Etc::sourceparts=-
)
sudo apt-get "${apt_options[@]}" update
sudo apt-get "${apt_options[@]}" install -y --no-install-recommends libvips-dev

# setup-go's own cache is keyed on go.sum alone and written only on a
# miss, so between dependency bumps every run restored a build cache
# from weeks ago and recompiled the tree. The cache below is keyed on the
# commit and restored by prefix, so each run starts from the newest
# cache any earlier run saved.
- name: Set up Go
uses: actions/setup-go@v6
with:
go-version-file: go.mod
cache: false

- name: Read the Go version
id: go
shell: bash
run: echo "version=$(go env GOVERSION)" >> "$GITHUB_OUTPUT"

- name: Restore the Go build and module cache
uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: go-${{ inputs.cache-name }}-${{ runner.os }}-${{ steps.go.outputs.version }}-${{ hashFiles('go.sum') }}-${{ github.sha }}
restore-keys: |
go-${{ inputs.cache-name }}-${{ runner.os }}-${{ steps.go.outputs.version }}-${{ hashFiles('go.sum') }}-
go-${{ inputs.cache-name }}-${{ runner.os }}-${{ steps.go.outputs.version }}-

# cmd/prairie embeds the built frontend, so nothing under ./... compiles
# without web/dist. The Go jobs never serve it, so a placeholder is
# enough; the Docker workflow builds the real bundle.
- name: Stub the embedded frontend bundle
shell: bash
run: make embed-stub
Loading
Loading