# 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:8.1.2`.

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