908855644a743c421cb0bd43a2a4f29da5849dca
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 9s
Build ErsatzTV Image / Delimiter ban (release path) (pull_request) Successful in 19s
PR Gates / Docs update reminder (pull_request) Successful in 25s
PR Gates / decisions lifecycle (pull_request) Successful in 28s
PR Gates / Fix proofs (Proves trailers) (pull_request) Successful in 20s
review-verdict/h10 Awaiting review verdict for 9088556
Review verdict / Set review-verdict status (pull_request_target) Successful in 19s
PR Gates / Script lint and tests (ruff + pytest) (pull_request) Successful in 5m42s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 8m14s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 5m58s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Skipped
Build ErsatzTV Image / Functional E2E (curl + UI contracts) (pull_request) Successful in 6m0s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 8s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 5s
`docs/guard-inventory.md` shipped "one per module. The The registered derivations are listed…". The rewrite replaced the line that began "The registered derivations…" without removing the trailing `The` the previous line carried as that sentence's wrapped start. Markdown soft-breaks the two lines, so the published page showed both. Worth a line rather than a silent fix: the evidence was on screen. The `sed` output I used to verify that rewrite printed line 140's trailing `The` directly above line 141's `The registered` and I read past it — a verification that ran, produced the right output, and was not actually read. Cold review caught it. Swept for the same shape across the three prose artifacts this change touches, over JOINED lines so a duplication split across a wrap is visible: no others. One clarification to the previous message, which enumerated what the count sweep returns and reads as exhaustive: that enumeration covers the prose this branch authors. `guard-derives-population-from-source.md` also carries "the 95 closed issues carrying a `## Closing record`" and "27 of the 69 process-failure records" — counts over growing sets, but pre-existing (#774/#775) and attributed citations of #773's analysis rather than live tallies, so they are left alone. refs #806 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fix(754,757): declare graphicsElementIds + padToNearestMinute, and pin every MCP tool to its OpenAPI contract (#760)
fix(754,757): declare graphicsElementIds + padToNearestMinute, and pin every MCP tool to its OpenAPI contract (#760)
feat(779): test the deny path at the production config value, and derive full-replace field lists (#808)
ErsatzTV
ErsatzTV lets you transform your media library into a personalized, live TV experience - complete with EPG, channel scheduling, and seamless streaming to all your devices. Rediscover your content, your way.
How It Works
- Install ErsatzTV: Download and set up the server on your system.
- Add Your Media: Connect your media libraries and collections.
- Create Channels: Design and schedule your own live channels.
- Stream Anywhere: Watch on any device with IPTV and EPG support.
Key Features
- Custom channels: Create and schedule your own live TV channels.
- IPTV & EPG: Stream with IPTV and Electronic Program Guide support.
- Hardware Transcoding: High-performance streaming with hardware acceleration (NVENC, QSV, VAAPI, AMF, VideoToolbox)
- Media Server Integration: Connect Plex, Jellyfin, Emby and more.
- Music & Subtitles: Mix music videos and enjoy subtitle support.
- Open Source: Free, open, and community-driven project.
Documentation
Documentation is available at ersatztv.org.
License
This project is inspired by pseudotv-plex and the dizquetv fork and is released under the zlib license.
