Repository navigation
Development
| Part | Address | Needs |
|---|---|---|
| Backend | http://localhost:5000 | The .NET 10 SDK and an installed 7-Zip. |
| Frontend | http://localhost:4200 | Node 26. Forwards /api and /health to the backend. |
Both ports are fixed: the backend gets 5000 from backend/AniLink.Api/Properties/launchSettings.json, the frontend
uses 4200, and frontend/proxy.conf.json points at 5000. On macOS, the AirPlay Receiver can occupy port 5000; switch
it off in the system settings, or change the port in those two files.
# Backend, on http://localhost:5000
cd backend/AniLink.Api
dotnet runPut the API key into backend/AniLink.Api/appsettings.Local.json (git-ignored; user secrets and environment variables
such as Debrid_ApiKey work too):
{
"DebridLink": { "ApiKey": "your-api-key" },
"Archive": { "Passwords": [ "www.example.org" ] }
}In development, downloads go to downloads/ in the repository, and 7-Zip is expected at
C:\Program Files\7-Zip\7z.exe. On Linux and macOS, set Archive:SevenZipPath to 7zz or 7z.
# Frontend, on http://localhost:4200 (forwards /api to the backend)
cd frontend
npm ci
npm startnpm run build is the check that the frontend compiles. It also writes a .br and a .gz file next to every text
file of the build (frontend/scripts/precompress.mjs), compressed once at the highest level, and the backend serves
them to a browser that accepts them. With ng build alone, the backend sends the plain files and compresses them on the
fly at a low level. dotnet build backend/AniLink.slnx is the check for the backend, and docker compose build the one
for the image.
| Folder or file | Contents |
|---|---|
backend/AniLink.Api/ |
The .NET API: controllers call services, services call repositories. |
frontend/ |
The Angular web page (Angular Material, signals). |
frontend/scripts/ |
Compresses the build once for the server; npm run build runs it. |
Dockerfile |
Builds both and bundles 7-Zip into one image. |
docker-compose.yaml |
How the container is started. |
.env.example |
The template for .env. |
The version lives in three files that have to agree: <Version> in backend/AniLink.Api/AniLink.Api.csproj, and
version in frontend/package.json and frontend/package-lock.json. npm version X.Y.Z --no-git-tag-version in
frontend/ sets the last two. The workflow reads all three and stops if they differ.
To release, raise the version in all three and start the title of the commit, or of the pull request, with Release
and the version: Release X.Y.Z - what changed. When it reaches master, GitHub Actions publishes X.Y.Z, X.Y, X
and latest, and sets the git tag X.Y.Z. The number in the title has to be the version in the files, and a version
can be released only once. Every other push to master publishes edge and nothing else. A pre-release such as
X.Y.Z-rc.1 gets only its own tag.
Merge the pull request with Create a merge commit or Squash and merge. With Rebase and merge, only the title of the last commit counts.
If the title was forgotten, the release can be started by hand: Actions → Docker Build & Push →
Run workflow, on master, with release ticked. It publishes the version in the files as a release, exactly as
if the title had said so, as long as that version has not been released before.