Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
485 commits
Select commit Hold shift + click to select a range
b529f30
style(web): apply oxfmt to cast and crew components
cursoragent Jul 27, 2026
bdb830f
Merge pull request #86 from Prairie-Server/cursor/cast-crew-parity-54a0
JonahMMay Jul 27, 2026
6937ac8
fix(livetv): make HLS bridge playable on native media clients
cursoragent Jul 27, 2026
d8b666c
fix(web): stop Home On now from refetching guide every render
cursoragent Jul 27, 2026
04de81d
Remove redundant Live TV header actions; hide Record on past guide cells
cursoragent Jul 27, 2026
63d2035
Give Live TV guide more room: wider hours, taller rows, taller viewport
cursoragent Jul 27, 2026
1c58d39
Start Live TV guide at now and omit ended programmes
cursoragent Jul 27, 2026
a9397f5
Update internal/api/handlers/livetv.go
JonahMMay Jul 27, 2026
3a21957
fix(livetv): repair HLS playlist rewrite after CodeRabbit edit
cursoragent Jul 27, 2026
67303e1
Merge pull request #87 from Prairie-Server/cursor/livetv-hls-media-au…
JonahMMay Jul 27, 2026
8e165ae
Merge pull request #88 from Prairie-Server/cursor/fix-onnow-guide-spa…
JonahMMay Jul 27, 2026
cfc82e9
Default Live TV guide API window to start at now
cursoragent Jul 27, 2026
bdf28c8
Merge pull request #89 from Prairie-Server/cursor/livetv-ux-cleanup-6b7d
JonahMMay Jul 27, 2026
910415d
perf(artwork): speed AVIF backfill with NumCPU workers and simd128
cursoragent Jul 27, 2026
0fe96ae
Merge Silo-Server/silo-server main (2 commits)
cursoragent Jul 27, 2026
dc3475f
fix: expect PRAIRIE- diagnostics short_id in chunked upload test
cursoragent Jul 27, 2026
ffc7d17
Merge pull request #90 from Prairie-Server/cursor/sync-silo-server-4f35
JonahMMay Jul 27, 2026
d8aa30e
Snap Live TV guide to the current half-hour; widen columns
cursoragent Jul 27, 2026
7219e70
Show programme posters on Home On now
cursoragent Jul 27, 2026
a697701
Merge pull request #91 from Prairie-Server/cursor/livetv-guide-halfho…
JonahMMay Jul 27, 2026
cab5d57
Merge pull request #92 from Prairie-Server/cursor/livetv-onnow-poster…
JonahMMay Jul 27, 2026
766c877
Merge pull request #93 from Prairie-Server/cursor/avif-backfill-durab…
JonahMMay Jul 27, 2026
a2e041b
perf(artwork): native SVT-AV1 AVIF encoder with optional NVENC
cursoragent Jul 27, 2026
021b01b
fix(artwork): drop unused NVENC encoder mutex
cursoragent Jul 27, 2026
32063b2
Merge pull request #94 from Prairie-Server/cursor/avif-native-encoder…
JonahMMay Jul 27, 2026
e8e25de
fix(artwork): stop SVT AVIF pad from shrinking landscape frames
cursoragent Jul 27, 2026
98b77cf
fix(artwork): gofmt AVIF SVT regression tests
cursoragent Jul 27, 2026
76bd87a
Merge pull request #95 from Prairie-Server/cursor/avif-native-encoder…
JonahMMay Jul 27, 2026
a9602ff
fix(livetv): start stream from On now and guide Play
cursoragent Jul 27, 2026
28ef594
style(livetv): oxfmt LiveTV page
cursoragent Jul 27, 2026
0e95167
Merge pull request #96 from Prairie-Server/cursor/livetv-onnow-watch-…
JonahMMay Jul 27, 2026
0b88359
feat(artwork): native WebP encode and Live TV image cache
cursoragent Jul 27, 2026
560fad2
chore: merge upstream Silo-Server/silo-server main
cursoragent Jul 27, 2026
6b2c052
test(livetv): cover artwork cache for 95% gate
cursoragent Jul 27, 2026
d5804d1
fix(livetv): launch On now in fullscreen watch player
cursoragent Jul 27, 2026
2c4ccc2
Merge pull request #97 from Prairie-Server/cursor/native-webp-livetv-…
JonahMMay Jul 27, 2026
294d0f6
Merge pull request #98 from Prairie-Server/cursor/livetv-player-parit…
JonahMMay Jul 27, 2026
1e68547
fix(playback): keep slow transcodes alive through startup
cursoragent Jul 27, 2026
a95a143
Merge pull request #99 from Prairie-Server/cursor/transcode-startup-k…
JonahMMay Jul 27, 2026
b303814
style(audiobooks): hide scrollbar on RelatedRail
cursoragent Jul 27, 2026
8aac036
Merge pull request #100 from Prairie-Server/cursor/hide-related-rail-…
JonahMMay Jul 27, 2026
8aff3c4
perf(artwork): cap total encode concurrency below core count
cursoragent Jul 27, 2026
cca85f1
perf(artwork): nice artwork encode ffmpeg subprocesses
cursoragent Jul 27, 2026
7fbefa1
feat(artwork): yield artwork encoding to active playback
cursoragent Jul 27, 2026
6bd22e4
feat(admin): expose artwork encode budget and playback pause
cursoragent Jul 27, 2026
6d1d50f
test(artwork): cover AVIF backfill playback pause
cursoragent Jul 27, 2026
8b3f399
Merge remote-tracking branch 'origin/main' into cursor/artwork-encode…
cursoragent Jul 27, 2026
522daca
Merge pull request #101 from Prairie-Server/cursor/artwork-encode-bud…
JonahMMay Jul 27, 2026
3810459
fix(subtitles): register AI status probe without object storage
cursoragent Jul 27, 2026
80b4848
Merge pull request #102 from Prairie-Server/cursor/subtitle-ai-status…
JonahMMay Jul 27, 2026
2de2824
fix(livetv): reclaim leaked tuners and log live views in history
cursoragent Jul 27, 2026
496bf33
style(playback): reuse a direct play-method constant for Live TV history
cursoragent Jul 27, 2026
8b06c0d
test(livetv): cover session reclaim and history edge paths for the co…
cursoragent Jul 27, 2026
89ba0d2
feat(api): return hydrated cards from the similar-items endpoint
cursoragent Jul 27, 2026
29f3e34
Merge pull request #103 from Prairie-Server/cursor/livetv-tuner-recla…
JonahMMay Jul 27, 2026
baee56c
Merge pull request #104 from Prairie-Server/cursor/similar-items-hydr…
JonahMMay Jul 27, 2026
d72d652
test(playback): lock AV1 remux sessions to fMP4 HLS segments
cursoragent Jul 27, 2026
56877f9
Merge pull request #105 from Prairie-Server/cursor/av1-remux-fmp4-7c8e
JonahMMay Jul 27, 2026
6298765
fix(api): prefix advertised playback URLs with /api/v1
cursoragent Jul 27, 2026
427d957
style(web): format stream-url tests for oxfmt CI gate
cursoragent Jul 27, 2026
634980b
Merge pull request #106 from Prairie-Server/cursor/playback-api-v1-ur…
JonahMMay Jul 27, 2026
f787692
fix(playback): emit EXT-X-START and preserve resume on startup probes
cursoragent Jul 27, 2026
c51eaf3
Merge pull request #107 from Prairie-Server/cursor/hls-start-seek-res…
JonahMMay Jul 28, 2026
291ec67
fix(playback): window encoded HLS resume at the start segment
cursoragent Jul 28, 2026
21e3f31
Merge pull request #108 from Prairie-Server/cursor/avplay-windowed-ma…
JonahMMay Jul 28, 2026
7c685fb
fix(livetv): transcode broadcast codecs browsers cannot decode
cursoragent Jul 28, 2026
52f031c
fix(livetv): accept a live playlist ffmpeg finished as it exited
cursoragent Jul 28, 2026
25c6661
Merge pull request #109 from Prairie-Server/cursor/livetv-codec-aware…
JonahMMay Jul 28, 2026
ad9cc4f
fix(playback): pick transcode video codec from client ∩ encodable
cursoragent Jul 28, 2026
d587a5a
Merge pull request #110 from Prairie-Server/cursor/transcode-codec-ca…
JonahMMay Jul 28, 2026
0078a76
fix(livetv): stop advertising AC-3 the browser cannot receive
cursoragent Jul 28, 2026
2e6b94a
Merge pull request #111 from Prairie-Server/cursor/livetv-browser-aud…
JonahMMay Jul 28, 2026
12363e1
perf(livetv): keep live transcodes on the GPU end to end
cursoragent Jul 28, 2026
1736d60
feat(livetv): admin controls for live transcoding
cursoragent Jul 28, 2026
e7790af
Merge pull request #112 from Prairie-Server/cursor/livetv-gpu-pipelin…
JonahMMay Jul 28, 2026
ba0cea6
Merge pull request #113 from Prairie-Server/cursor/livetv-transcode-a…
JonahMMay Jul 28, 2026
1da3b95
Fix Live TV ffmpeg killed when start request completes
cursoragent Jul 28, 2026
07b66f8
Merge pull request #114 from Prairie-Server/cursor/livetv-ffmpeg-life…
JonahMMay Jul 28, 2026
f245e35
fix(livetv-web): stop browser Live TV stalling after ~3 segments
JonahMMay Jul 28, 2026
89ca456
Merge pull request #115 from Prairie-Server/fix/livetv-web-hls-lowlat…
JonahMMay Jul 28, 2026
a59db3e
feat(artwork): add w200 poster/still/profile rung for smart-TV clients
JonahMMay Jul 28, 2026
fc1b30e
Merge pull request #116 from Prairie-Server/feat/artwork-w200-tv-rung
JonahMMay Jul 28, 2026
92a8b28
refactor(artwork): address w200 review — share ladder, tighten backfi…
JonahMMay Jul 28, 2026
11e85cf
Merge pull request #117 from Prairie-Server/fix/w200-review-followups
JonahMMay Jul 28, 2026
a0a7369
perf(catalog): take ffprobe repair off the browse request path
Jul 28, 2026
20f89c9
Merge pull request #118 from Prairie-Server/perf/probe-repair-off-req…
JonahMMay Jul 28, 2026
819a5ab
feat(artwork): serve a wider rung instead of 404 when a variant is mi…
Jul 28, 2026
cee3b8e
style: use US spelling in artwork rung-fallback comments
Jul 28, 2026
56eace0
Merge pull request #119 from Prairie-Server/perf/artwork-rung-fallback
JonahMMay Jul 28, 2026
afa305a
perf(artwork): pick the artwork rung from the requesting device class
Jul 28, 2026
e3f1d11
style: use US spelling in deviceclass docs
Jul 28, 2026
61c6428
Merge pull request #120 from Prairie-Server/perf/device-aware-artwork…
JonahMMay Jul 28, 2026
bd633db
perf(artwork): sign the artwork revision so clients can pick their ow…
Jul 28, 2026
13e716b
Merge remote-tracking branch 'upstream/main' into chore/sync-silo-ups…
JonahMMay Jul 28, 2026
55bbb75
feat(requests): enforce per-profile rating limits in discovery (#505)
Quick104 Jul 28, 2026
f41c186
style: US spelling in artwork signature scope tests
Jul 28, 2026
c552987
Merge pull request #121 from Prairie-Server/perf/scoped-artwork-signa…
JonahMMay Jul 28, 2026
f36059c
Merge pull request #122 from Prairie-Server/chore/sync-silo-upstream
JonahMMay Jul 28, 2026
6d8e07d
feat: emailed invitations, claim + household setup, and onboarding tour
Jul 28, 2026
9a03501
Merge pull request #123 from Prairie-Server/feat/invitations-onboardi…
JonahMMay Jul 28, 2026
02e7ead
fix(tasks): self-arming interval triggers and observable scheduling
JonahMMay Jul 28, 2026
37db7dc
Merge pull request #124 from Prairie-Server/fix/task-scheduler-observ…
JonahMMay Jul 28, 2026
01786e7
perf(artwork): gate rungs by image type and let browsers pick portrai…
JonahMMay Jul 28, 2026
4d982ac
Merge pull request #125 from Prairie-Server/perf/gate-artwork-rungs-b…
JonahMMay Jul 28, 2026
6a23168
fix(imageutil): stop the ffmpeg capability cache answering questions …
JonahMMay Jul 28, 2026
4780213
Merge pull request #126 from Prairie-Server/fix/ffmpeg-capability-pro…
JonahMMay Jul 28, 2026
32b7eeb
Merge remote-tracking branch 'upstream/main' into chore/sync-silo-ups…
JonahMMay Jul 28, 2026
09251e0
chore(sync): keep Prairie branding over the upstream invite deep link
JonahMMay Jul 28, 2026
e9e62f3
Merge pull request #127 from Prairie-Server/chore/sync-silo-upstream-2
JonahMMay Jul 28, 2026
fabab8f
fix(artwork): cast 403s, unreachable backfill windows, and lost job s…
JonahMMay Jul 28, 2026
95d96e7
fix(metadata): return no work on cancellation without discarding the …
JonahMMay Jul 28, 2026
6bc928e
fix: unstick portrait fallbacks, share the paging helper, satisfy nilerr
JonahMMay Jul 28, 2026
0584a23
Merge pull request #128 from Prairie-Server/fix/cast-403-and-backfill…
JonahMMay Jul 28, 2026
ff3b796
fix(artwork): let one discovery pass cross the corpus
JonahMMay Jul 28, 2026
b6ae949
Merge pull request #129 from Prairie-Server/fix/discovery-accumulates…
JonahMMay Jul 28, 2026
3a97664
feat(artwork): count artwork requests by rung, format and outcome
JonahMMay Jul 28, 2026
bee71e1
style(artwork): group the test import with the other internal packages
JonahMMay Jul 28, 2026
34d6cae
fix(artwork): bound metric labels, count failed copies, assert the by…
JonahMMay Jul 28, 2026
7a5a5ba
Merge pull request #130 from Prairie-Server/feat/artwork-request-metrics
JonahMMay Jul 28, 2026
77d0649
fix(artwork): only canonical rung spellings keep their metric label
JonahMMay Jul 28, 2026
f09a344
Merge pull request #131 from Prairie-Server/fix/canonical-rung-labels
JonahMMay Jul 28, 2026
f70e410
fix(artwork): stop discovering originals that were never cached
JonahMMay Jul 28, 2026
9a00614
Merge pull request #132 from Prairie-Server/fix/skip-uncached-originals
JonahMMay Jul 28, 2026
fceb3ec
fix(playback): require working av1_nvenc before advertising AV1 encode
cursoragent Jul 29, 2026
3b099b0
Merge pull request #133 from Prairie-Server/cursor/av1-nvenc-encode-p…
JonahMMay Jul 29, 2026
19a350e
fix(playback): let a signed stream token authorize HLS delivery
JonahMMay Jul 29, 2026
066f81c
fix(lint): use US spellings in stream token middleware
JonahMMay Jul 29, 2026
3f88144
refactor(playback): one shared name for the stream token query param
JonahMMay Jul 29, 2026
9ce8d96
Merge pull request #134 from Prairie-Server/fix/stream-token-authoriz…
JonahMMay Jul 29, 2026
b0f58d8
Merge remote-tracking branch 'upstream/main' into chore/sync-upstream-14
JonahMMay Jul 29, 2026
3327866
Merge remote-tracking branch 'origin/main' into chore/sync-upstream-14
JonahMMay Jul 29, 2026
0d17d87
fix(lint): satisfy Prairie's linters on the synced upstream code
JonahMMay Jul 29, 2026
6f39064
Merge pull request #135 from Prairie-Server/chore/sync-upstream-14
JonahMMay Jul 29, 2026
37e2ae5
fix(playback): serve HEAD on transcode segments
JonahMMay Jul 29, 2026
7773f8d
Merge pull request #136 from Prairie-Server/fix/head-on-transcode-seg…
JonahMMay Jul 29, 2026
4d4053f
fix(playback): serve a real master playlist for HLS
JonahMMay Jul 29, 2026
046e54e
fix(lint,playback): US spellings; drop guessed CODECS from the master…
JonahMMay Jul 29, 2026
c3c7962
Merge pull request #137 from Prairie-Server/fix/hls-master-playlist
JonahMMay Jul 29, 2026
75b51d9
fix(playback): authorize media.m3u8 with the stream token
JonahMMay Jul 29, 2026
a5861ea
Merge pull request #138 from Prairie-Server/fix/stream-token-media-pl…
JonahMMay Jul 29, 2026
ba9188f
fix(playback): drop HLS tags Tizen does not support
JonahMMay Jul 29, 2026
a9910fd
Merge pull request #139 from Prairie-Server/fix/drop-unsupported-hls-…
JonahMMay Jul 29, 2026
a082789
chore: sync upstream silo-server (descriptor-driven autoscan setup)
JonahMMay Jul 29, 2026
bb55494
fix(lint): US spellings, oxfmt, and no-base-to-string in synced autoscan
JonahMMay Jul 29, 2026
db26965
fix(playback): tag copied HEVC as hvc1 in fMP4 HLS
JonahMMay Jul 29, 2026
48d7df6
Merge pull request #141 from Prairie-Server/fix/hevc-hvc1-tag
JonahMMay Jul 29, 2026
28b57d7
fix: apply CodeRabbit auto-fixes
coderabbitai[bot] Jul 29, 2026
2f9f308
Merge pull request #140 from Prairie-Server/chore/sync-upstream-autoscan
JonahMMay Jul 29, 2026
3c7e2f3
feat(playback): server-side quality ladder and adaptive advice
JonahMMay Jul 29, 2026
cb4e4d6
Merge pull request #142 from Prairie-Server/feat/quality-ladder-advice
JonahMMay Jul 29, 2026
2bb6913
feat(playback): derive the web quality ladder from the server
JonahMMay Jul 29, 2026
f28f17b
Merge pull request #143 from Prairie-Server/fix/quality-ladder-derive…
JonahMMay Jul 29, 2026
8932415
fix(playback): authorize progressive stream delivery with the stream …
JonahMMay Jul 30, 2026
40df2a6
Merge pull request #144 from Prairie-Server/fix/stream-token-progressive
JonahMMay Jul 30, 2026
8e5d08b
fix(playback): accept the trimmed path when matching progressive deli…
JonahMMay Jul 30, 2026
3505b2c
fix(playback): take identity from the verified card on progressive de…
JonahMMay Jul 30, 2026
dbd579b
fix(playback): address review findings on the derived quality ladder …
JonahMMay Jul 30, 2026
3e33b08
fix(playback): require container-safe audio before copying it into a …
JonahMMay Jul 30, 2026
d397c6e
fix(playback): normalize codec aliases on both sides of the remux aud…
JonahMMay Jul 30, 2026
20cd636
feat(playback): honor a client max_audio_channels ceiling (#150)
JonahMMay Jul 30, 2026
efa6dff
fix(livetv): stop bufferAppendError from video-only early HLS segment…
JonahMMay Jul 30, 2026
3b44741
fix(playback): select a playable audio track instead of re-encoding (…
JonahMMay Jul 30, 2026
7303326
fix(playback): choose the remux container instead of always writing M…
JonahMMay Jul 30, 2026
46e4713
test(livetv): pin bufferAppendError regressions in player and first s…
JonahMMay Jul 30, 2026
f8d04b0
fix(playback): declare the remux output duration so seeking works (#154)
JonahMMay Jul 30, 2026
3adeb86
fix(livetv): authorize live HLS delivery with a stream token (#156)
JonahMMay Jul 30, 2026
b030bf5
fix(web): restore missing icons on two overflow menu items (#158)
JonahMMay Jul 30, 2026
c2c1ce5
fix(livetv): explain tuner refusals and deepen the live HLS window (#…
JonahMMay Jul 30, 2026
a76e099
fix(web): stop the utility rail from clipping player menus open upwar…
JonahMMay Jul 30, 2026
e178fd2
fix(web): offer episode stills their own width ladder in Continue Wat…
JonahMMay Jul 30, 2026
f8d27db
fix(livetv): give copy sessions a startup buffer before advertising t…
JonahMMay Jul 30, 2026
b6a7a4d
feat(chapterthumbs): store chapter thumbnails locally when S3 is unco…
JonahMMay Jul 30, 2026
5d01a15
feat(trickplay): live seek-bar sprite sheet previews for web player (…
JonahMMay Jul 30, 2026
77c539b
fix(playback): reject a copy-video request that also asks to downscale
JonahMMay Jul 30, 2026
6c967b5
feat(player): rename stats overlay and recognize roku/android-tv (#164)
JonahMMay Aug 5, 2026
d92b2ff
chore(deps): update go modules (non-major) (#168)
renovate[bot] Aug 5, 2026
095ecd2
chore(deps): update cargo (non-major) (#167)
renovate[bot] Aug 5, 2026
6c601a2
chore(deps): update rust crate clap to v4.6.6 (#171)
renovate[bot] Aug 28, 2026
83ac33d
fix(ci): restore green main CI checks (#173)
JonahMMay Aug 28, 2026
d1fb2cd
chore(deps): update go modules (non-major) (#169)
renovate[bot] Aug 28, 2026
69ab5c1
chore(deps): update google.golang.org/genproto/googleapis/rpc digest …
renovate[bot] Aug 28, 2026
b5ca13b
feat: sync silo-server main upstream (~413 commits) (#174)
JonahMMay Aug 28, 2026
f4d5191
chore(deps): update dependency golangci/golangci-lint to v2.13.2 (#172)
renovate[bot] Aug 28, 2026
3b0dcea
chore(deps): update npm (non-major) (#170)
renovate[bot] Aug 28, 2026
9492bb0
merge: link silo upstream history and sync admin UX (#175)
JonahMMay Aug 28, 2026
a27e1bd
merge: link silo upstream history (repair accidental squash)
cursoragent Aug 28, 2026
d502b92
Merge pull request #176 from Prairie-Server/cursor/fix-silo-ancestry-…
JonahMMay Aug 28, 2026
15a8fff
chore(deps): update rust crate clap to v4.6.7
renovate[bot] Sep 21, 2026
53603f0
livetv: move Gracenote program artwork off dead emby.tmsimg.com
JonahMMay Sep 26, 2026
9020d8a
Merge pull request #182 from Prairie-Server/fix/livetv-artwork-host
JonahMMay Sep 28, 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
12d9337
Merge pull request #183 from Prairie-Server/sync/upstream-2026-09-28
JonahMMay Sep 29, 2026
2b2a4dd
chore(deps): update github.com/prairie-server/prairie-plugin-sdk dige…
renovate[bot] Sep 29, 2026
0da785d
chore(deps): update google.golang.org/genproto/googleapis/rpc digest …
renovate[bot] Sep 29, 2026
6dac94f
chore(deps): update npm (non-major)
renovate[bot] Sep 29, 2026
bf48d38
fix(playback): window resumed encoded HLS at the start segment
JonahMMay Sep 29, 2026
bf211cd
fix(images): align artwork tests and ladder step-down with Prairie wi…
JonahMMay Sep 29, 2026
6d039f3
fix(playback): keep the pinned HLS window on FFmpeg's numbering
JonahMMay Sep 29, 2026
00cbf70
fix(telemetry): fold Prairie client names into metric client families
JonahMMay Sep 29, 2026
249cf39
fix(logredact): scrub raw URLs that a wrapper carries outside the url…
JonahMMay Sep 29, 2026
f006c3f
Merge pull request #185 from Prairie-Server/fix/prairie-image-width-t…
JonahMMay Sep 29, 2026
c373561
Merge pull request #177 from Prairie-Server/renovate/github.com-prair…
JonahMMay Sep 29, 2026
cdbb896
Merge pull request #180 from Prairie-Server/renovate/google.golang.or…
JonahMMay Sep 29, 2026
9f29eb2
Merge pull request #181 from Prairie-Server/renovate/cargo-(non-major)
JonahMMay Sep 29, 2026
8c8b93a
fix(playback): classify below-window probes before a stopped session
JonahMMay Sep 29, 2026
a115231
Merge pull request #186 from Prairie-Server/fix/prairie-client-metric…
JonahMMay Sep 29, 2026
8dcbdb9
Merge pull request #187 from Prairie-Server/fix/logredact-wrapper-url…
JonahMMay Sep 29, 2026
6b67833
chore(deps): update go modules (non-major)
renovate[bot] Sep 29, 2026
2794409
feat(config): read every SILO_* setting as PRAIRIE_* through one lookup
JonahMMay Sep 29, 2026
82bba8e
test: read test-harness env through the brand alias
JonahMMay Sep 29, 2026
ad31c1c
docs: document PRAIRIE_* env names
JonahMMay Sep 29, 2026
456c5cc
Merge pull request #184 from Prairie-Server/fix/encoded-hls-resume-wi…
JonahMMay Sep 29, 2026
25bff62
Merge upstream/main (silo-server 9d63465b) into prairie-server
JonahMMay Sep 29, 2026
57b1f39
Rebrand upstream request-routing additions; bump prairie-plugin-sdk
JonahMMay Sep 29, 2026
9ae3fb6
Merge remote-tracking branch 'origin/main' into sync/upstream-2026-09-29
JonahMMay Sep 29, 2026
bde932c
fix(deps): hold chi at v5.2.5 (and huma at v2.38.0); fake pgx.Rows ga…
JonahMMay Sep 29, 2026
5595ee3
fix(web): satisfy eslint-plugin-react-hooks 7.1 dependency-list rules
JonahMMay Sep 29, 2026
11c7cb9
chore(renovate): hold chi below v5.3 and huma below v2.39
JonahMMay Sep 29, 2026
15ca778
fix(deps): hold prettier at 3.8.1; reorder classes for tailwindcss 4.3
JonahMMay Sep 29, 2026
8e12552
chore(renovate): hold prettier below 3.9
JonahMMay Sep 29, 2026
e4e795e
fix(sync): drop duplicate tmdb import, goimports grouping, Link tag i…
JonahMMay Sep 29, 2026
9e00350
fix(deps): hold grpc at v1.83.2 (GO-2026-6443); remaining pgx.Rows fa…
JonahMMay Sep 29, 2026
1eb8c92
chore(renovate): skip grpc v1.84.0 (GO-2026-6443)
JonahMMay Sep 29, 2026
e8ae6ff
Merge pull request #190 from Prairie-Server/chore/renovate-hold-chi
JonahMMay Sep 29, 2026
ac3e694
Merge pull request #179 from Prairie-Server/renovate/npm-(non-major)
JonahMMay Sep 29, 2026
a09fe2f
Merge remote-tracking branch 'origin/main' into sync/upstream-2026-09-29
JonahMMay Sep 29, 2026
0ae3a82
style(web): tailwindcss 4.3 class order in upstream request pages
JonahMMay Sep 29, 2026
a17912a
Merge pull request #178 from Prairie-Server/renovate/go-modules-(non-…
JonahMMay Sep 29, 2026
22c9e98
Merge remote-tracking branch 'origin/main' into sync/upstream-2026-09-29
JonahMMay Sep 29, 2026
b0d0d19
Merge remote-tracking branch 'upstream/main' into sync/upstream-2026-…
JonahMMay Sep 29, 2026
5af90d6
Merge pull request #189 from Prairie-Server/sync/upstream-2026-09-29
JonahMMay Sep 29, 2026
42696ed
Merge remote-tracking branch 'origin/main' into feat/prairie-env-names
JonahMMay Sep 29, 2026
11195f2
test: route new DB-gated env reads through the brand alias; fix missp…
JonahMMay Sep 29, 2026
e882e2f
ci: run every Go package, and fix what that surfaces
JonahMMay Sep 29, 2026
c4a0d91
Merge pull request #188 from Prairie-Server/feat/prairie-env-names
JonahMMay Sep 29, 2026
cc81530
test: fix fake trigger mutex deadlock
JonahMMay Sep 29, 2026
06a17c9
ci: exclude coverage packages from full test shards
JonahMMay Sep 29, 2026
cf4e5f2
ci: fix full test package filter
JonahMMay Sep 29, 2026
f2f0c72
ci: correct package exclusion filter
JonahMMay Sep 29, 2026
19a2220
Merge pull request #191 from Prairie-Server/ci/full-go-test-coverage
JonahMMay Sep 29, 2026
193269a
fix(jellycompat): use Live TV HLS bridge for capable clients
JonahMMay Sep 29, 2026
55ab5fe
fix(jellycompat): pass device profiles to Live TV handler
JonahMMay Sep 29, 2026
5d10995
fix(jellycompat): pass device profile into Live TV playback
JonahMMay Sep 29, 2026
7be39da
fix(jellycompat): track HLS Live TV sessions for close
JonahMMay Sep 29, 2026
7e11c05
fix(jellycompat): preserve HLS source across Live TV reopen
JonahMMay Sep 29, 2026
3f50184
fix(jellycompat): use valid audio stream type
JonahMMay Sep 29, 2026
854c157
fix(jellycompat): use valid audio stream type everywhere
JonahMMay Sep 29, 2026
9c8dcb0
test(jellycompat): cover Live TV client capability mapping
JonahMMay Sep 29, 2026
2f89cf8
Merge pull request #192 from Prairie-Server/fix/jellycompat-livetv-pl…
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.
111 changes: 111 additions & 0 deletions .claude/skills/dev-environment-debugging/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
name: dev-environment-debugging
description: Use when diagnosing a running Prairie server — playback, streaming, or transcode failures, unhealthy nodes, stuck sessions, wrong database state, errors after a deploy, or anything needing the deployment's logs, health endpoints, or SQL. Covers both a local docker compose install and a remote host over SSH. Not for building or testing code in this repo, and not for client-side bugs that reproduce without a server.
---

# Debugging a running Prairie deployment

Everything here goes through `scripts/prairie-dev`, which reads `.prairie-dev.env` and runs
commands against the deployment whether it is on this machine or behind SSH. Start with:

```bash
scripts/prairie-dev doctor
```

`doctor` reports which of API, host shell, compose stack, database, and login actually
work. Fix what it flags before diagnosing anything else — most confusing symptoms here
are really a misconfigured target. If `.prairie-dev.env` is missing, copy
`.prairie-dev.env.example` and fill it in; ask the user for hosts and credentials rather
than guessing, and never move those values into a committed file.

## Orienting

```bash
scripts/prairie-dev compose ps # what is running
scripts/prairie-dev api /api/v1/health # API up
scripts/prairie-dev api /api/v1/ready # PostgreSQL and optional S3 reachable
scripts/prairie-dev logs --tail 200 # recent server logs
scripts/prairie-dev logs -f # follow
```

`/ready` failing usually means the database, not the API — read the service logs before
concluding Postgres is down.

Prairie also records structured logs in the database itself, which survive container
restarts and are easier to filter than stdout. `operational_logs` holds server events,
`activity_log` holds HTTP requests; both are keyed by `"timestamp"` (quoted — it is a
reserved word). See [references/queries.md](references/queries.md) for the diagnostic
queries worth having on hand, along with the schema traps that bite most often.

Log level lives in `server_settings` under `server.log_level` and is read at startup, so
raising it to `debug` means updating the row and recreating the service. Put it back
afterwards unless the task needs it to persist.

## Search

Meilisearch is optional — Prairie runs without it — but it is recommended, and it is what
makes search results good. It ships as a compose service behind the `search` profile and
needs `MEILI_MASTER_KEY` set, so a stack brought up without that profile simply has no
`meilisearch` service.

The provider is chosen from the `catalog.search.provider` setting rather than from
whether the container is running, and the failure mode is quiet: if Meilisearch is
selected but the URL is empty, unreachable, or the provider fails to initialize, Prairie
logs a warning at startup and serves Postgres results instead. Nothing surfaces to the
client. So "search got worse" or "search stopped matching the way it used to" is usually
the fallback being active, not a ranking regression — check which provider is live before
touching query code:

```bash
scripts/prairie-dev psql "SELECT key, value FROM server_settings WHERE key LIKE 'catalog.search%' ORDER BY key;"
scripts/prairie-dev logs --tail 500 | grep -i 'catalog search'
```

Provider settings, index name, timeouts, batch sizes, and the semantic-search options all
live under `catalog.search.meilisearch.*` in `server_settings`. Changing the provider
needs a restart to take effect.

## Playback

Work outward from the failure the user actually saw.

**Direct play** — confirm the file exists at the path stored in `media_files`
(`scripts/prairie-dev sh 'ls -la …'`, under `PRAIRIE_MEDIA_ROOT`), then compare the file's
codecs against what the client advertised. A mismatch should have fallen back to remux
or transcode; if it did not, that is the bug.

**Remux and transcode** — both run ffmpeg inside the server container, so check ffmpeg
is present and, for hardware paths, that `/dev/dri` is passed through:

```bash
scripts/prairie-dev compose "exec -T prairie sh -lc 'ffmpeg -hwaccels; ls -la /dev/dri'"
```

Transcode output lands in a bind-mounted temp directory; a full disk there looks like a
transcode bug. If `PRAIRIE_TRANSCODE_SSH` is set, the node is a separate host with its own
`/api/v1/health` and logs — check it before blaming the main server.

**Stuck sessions** — query `playback_sessions_sync` for rows whose `updated_at` has gone
stale. The reconciler and shutdown path clean these up; when Redis is unavailable,
cross-node coordination degrades and stale rows are a symptom rather than the cause.

## Deploying a fix

`make dev-deploy` and friends come from `Makefile.local`, which is gitignored and
per-developer — do not assume they exist. Confirm with `make -n dev-deploy` first, and
otherwise deploy however the user's setup does. Afterwards, verify rather than assume:

```bash
scripts/prairie-dev compose ps
scripts/prairie-dev api /api/v1/ready
scripts/prairie-dev logs --tail 100
```

Deploys restart the container, which invalidates any token you were holding.

## Rename drift

Prairie was formerly Silo, and Silo was formerly Continuum. Names like `continuum-postgres`, `/opt/continuum`,
`CONTINUUM_IMAGE`, or a stray `docker-compose.dev.yml` are usually legacy artifacts, but
on a long-lived host they are occasionally still the live stack. Check what compose
actually reports before deciding which one you are looking at.
110 changes: 110 additions & 0 deletions .claude/skills/dev-environment-debugging/references/queries.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
# Diagnostic queries

Run with `scripts/prairie-dev psql "<sql>"`.

## Schema traps

- `activity_log` and `operational_logs` order by `"timestamp"` — quoted, not `created_at`.
- `admin_jobs` uses `job_type`, `requested_at`, and `completed_at` (not `type`,
`created_at`, `finished_at`).
- Login accounts (`users`) are separate from household profiles (`user_profiles`); a
playback session carries both a `user_id` and a `profile_id`.

## Errors and requests

```sql
SELECT "timestamp", level, component, message, request_id, playback_session_id, attrs
FROM operational_logs
WHERE level IN ('error', 'warn')
ORDER BY "timestamp" DESC
LIMIT 50;
```

```sql
SELECT "timestamp", client_ip, method, path, status_code, duration_ms, request_id
FROM activity_log
WHERE status_code >= 500
ORDER BY "timestamp" DESC
LIMIT 20;
```

Drop the `WHERE` clause on `activity_log` for a plain recent-traffic view — useful for
confirming a client is reaching the server at all, and with which paths.

## Playback

```sql
SELECT s.session_id, u.username, COALESCE(s.profile_id, '') AS profile_id,
s.play_method, s.reporting_node, s.transcode_node_url,
s.position_seconds, s.is_paused, s.target_resolution,
s.started_at, s.updated_at
FROM playback_sessions_sync s
LEFT JOIN users u ON u.id = s.user_id
ORDER BY s.updated_at DESC NULLS LAST;
```

Stale rows only:

```sql
SELECT session_id, user_id, play_method, updated_at
FROM playback_sessions_sync
WHERE updated_at < now() - interval '5 minutes'
ORDER BY updated_at;
```

## Nodes

```sql
SELECT id, name, type, url, enabled, healthy, active_jobs, last_health_check
FROM stream_nodes
ORDER BY type, name;
```

Read-only node state is better taken from here than from the admin endpoints, which need
a bearer token. To force a re-check, `POST /api/v1/admin/nodes/{id}/check` — reachable as
`scripts/prairie-dev api /api/v1/admin/nodes/{id}/check -X POST`.

## Jobs

```sql
SELECT id, job_type, status, message, error_message,
progress_current, progress_total, requested_at, started_at,
completed_at, heartbeat_at
FROM admin_jobs
ORDER BY requested_at DESC
LIMIT 20;
```

Filter by `job_type = 'library_refresh'` (and select `request_payload`, `result_payload`)
when chasing a scan or refresh that did not finish.

## Users and settings

```sql
SELECT id, username, email, role, enabled, permissions, max_streams, max_transcodes, created_at
FROM users
ORDER BY id;
```

```sql
SELECT key, value
FROM server_settings
WHERE key NOT ILIKE '%secret%'
AND key NOT ILIKE '%password%'
AND key NOT ILIKE '%api_key%'
AND key NOT ILIKE '%token%'
ORDER BY key;
```

Keep that filter. Encrypted `server_settings` values are GCM-bound to their key name, so
they are unreadable here anyway — and dumping them into a transcript is a leak.

## Raising the log level

```sql
INSERT INTO server_settings (key, value) VALUES ('server.log_level', 'debug')
ON CONFLICT (key) DO UPDATE SET value = EXCLUDED.value;
```

Then `scripts/prairie-dev compose "up -d --force-recreate silo"`, and set it back to `info`
when done.
Loading
Loading