Document channel architecture, M3U/XMLTV integration with Jellyfin, and fork maintenance strategy for the archived upstream. Also includes CLAUDE.md updates for implementer workflow and project boundaries. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
69 lines
3.2 KiB
Markdown
69 lines
3.2 KiB
Markdown
# Fork Maintenance Strategy
|
||
|
||
Upstream ErsatzTV was archived February 2026 at v26.3.0. This fork is maintained independently on [Gitea](http://192.168.1.95:3000/timothy/ersatztv).
|
||
|
||
## Divergence Policy
|
||
|
||
We diverge freely from upstream's final state. There is no upstream to merge from, so maintaining merge compatibility serves no purpose. All changes are our own.
|
||
|
||
## Security & Dependency Updates
|
||
|
||
### .NET Runtime
|
||
|
||
- **Current**: .NET 10.0 (LTS candidate, supported through Nov 2028)
|
||
- **Upgrade path**: When .NET 11 ships (Nov 2026), upgrade by updating `TargetFramework` across all projects and `global.json`. The `rollForward: latestMinor` setting in `global.json` handles patch versions automatically.
|
||
- **Key constraint**: EF Core is pinned to `[9.0.12,10)` — a .NET 11 upgrade will likely require bumping to EF Core 10.x simultaneously.
|
||
|
||
### NuGet Packages
|
||
|
||
- No central package management (`Directory.Packages.props`) — versions are declared per-project. This means bulk updates require editing multiple .csproj files.
|
||
- Upstream had a GitHub Dependabot config (`.github/dependabot.yml`) that is not active on Gitea.
|
||
- **Current approach**: Manual periodic audits. Run `dotnet list package --outdated` to check for updates.
|
||
- **Future consideration**: Add a Gitea Actions workflow for dependency scanning, or adopt `Directory.Packages.props` to centralize version management.
|
||
|
||
### Docker Base Images
|
||
|
||
- .NET SDK/runtime images (`mcr.microsoft.com/dotnet/sdk:10.0-noble-amd64`) — update when .NET patches ship.
|
||
- FFmpeg image: forked separately at [timothy/ersatztv-ffmpeg](http://192.168.1.95:3000/timothy/ersatztv-ffmpeg). Currently `192.168.1.95:3000/timothy/ersatztv-ffmpeg:7.1.1`. The main Dockerfile still references the upstream `ghcr.io` image and needs updating.
|
||
|
||
### CVE Response
|
||
|
||
1. Check if the CVE affects a dependency we use (most NuGet advisories are noise)
|
||
2. Update the package version in the relevant .csproj file(s)
|
||
3. Build, run tests, deploy to test environment (port 8410)
|
||
4. Promote to prod after verification
|
||
|
||
## EF Core Migrations
|
||
|
||
- **SQLite**: 196 migrations (primary, Feb 2021 – Feb 2026)
|
||
- **MySQL**: 153 migrations (secondary, Aug 2023 – Feb 2026, parity maintained)
|
||
|
||
### Adding New Migrations
|
||
|
||
```bash
|
||
# SQLite (primary)
|
||
dotnet ef migrations add MigrationName \
|
||
--project ErsatzTV.Infrastructure.Sqlite \
|
||
--startup-project ErsatzTV
|
||
|
||
# MySQL (if maintaining parity)
|
||
dotnet ef migrations add MigrationName \
|
||
--project ErsatzTV.Infrastructure.MySql \
|
||
--startup-project ErsatzTV
|
||
```
|
||
|
||
We only use SQLite in the homelab. MySQL migrations can be maintained for completeness but are not tested in deployment.
|
||
|
||
## Feature Development
|
||
|
||
New features follow the existing CQRS/MediatR pattern. No compatibility constraints — we own the entire codebase now. Track work via [Gitea Issues](http://192.168.1.95:3000/timothy/ersatztv/issues).
|
||
|
||
## Key Risks
|
||
|
||
| Risk | Mitigation |
|
||
|------|------------|
|
||
| EF Core major version gap | Pin to `[9.x,10)` range; bump when .NET upgrade forces it |
|
||
| Lucene.Net stuck on beta (`4.8.0-beta00017`) | Monitor for stable release; functional as-is |
|
||
| SkiaSharp native deps | Pinned with `NativeAssets.Linux.NoDependencies`; test on Linux after updates |
|
||
| OpenAPI generator JAR (`7.15.0`) | Hardcoded in Dockerfile; update manually when needed |
|