Files
ersatztv/docs/fork-strategy.md
T
timothyandClaude Opus 4.6 f1e97b94a7
Build / Calculate version information (push) Successful in 13s
Build / build_and_upload (push) Failing after 0s
Build / build_images (push) Failing after 0s
Close stale issues / stale (push) Successful in 15s
Add architecture docs and fork maintenance strategy (#6)
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>
2026-03-17 22:42:07 +01:00

3.2 KiB
Raw Permalink Blame History

Fork Maintenance Strategy

Upstream ErsatzTV was archived February 2026 at v26.3.0. This fork is maintained independently on Gitea.

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. 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

# 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.

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