AnimeWatcher is a self-hosted anime tracker. It monitors your favorite anime via the AniList API and sends you push notifications through Pushover when new episodes air, a new season starts, a sequel is announced, or a season finishes.
- 🔍 Search AniList — find any anime and add it to your watchlist with one click
- 👁️ Background monitoring — polls AniList on a configurable interval (rate-limit aware)
- 🔔 Pushover notifications — new episode, season started, new season announced, season finished
- ⚙️ Global + per-anime preferences — override notification types for individual anime
- 📖 Change history — see every episode and season change the monitor detected
- 🌐 Synopsis translation — translate synopses in place (RTL languages supported)
- 💾 Automatic backups — scheduled ZIP backups of the databases with retention pruning, plus export/import of your watchlist as JSON
- 🔐 Flexible authentication — require login always, bypass it for your local network, or disable it entirely
- 🚀 Fast UI — Blazor Interactive Auto (server-rendered first paint, WebAssembly after), response compression, and layered caching
| Search | Anime details |
|---|---|
![]() |
![]() |
| Home | Settings |
|---|---|
![]() |
![]() |
The image is published on Docker Hub: albahadly/animewatcher.
docker run -d \
--name animewatcher \
-p 8111:8111 \
-v animewatcher-data:/app/data \
-v animewatcher-animedb:/app/animedb \
-v animewatcher-keys:/home/appuser/.aspnet/DataProtection-Keys \
-v animewatcher-logs:/app/logs \
albahadly/animewatcher:latestThen open http://localhost:8111.
Or with Docker Compose:
services:
animewatcher:
image: albahadly/animewatcher:latest
container_name: animewatcher
ports:
- "8111:8111"
volumes:
- animewatcher-data:/app/data
- animewatcher-animedb:/app/animedb
- animewatcher-keys:/home/appuser/.aspnet/DataProtection-Keys
- animewatcher-logs:/app/logs
restart: unless-stopped
volumes:
animewatcher-data:
animewatcher-animedb:
animewatcher-keys:
animewatcher-logs:See DOCKER.md for the full deployment guide: building the image yourself, SQL Server instead of SQLite, reverse proxy / HTTPS setup, backups, and troubleshooting.
- Open the app and register an account (authentication is required by default; you can relax this later under Settings → Security).
- Go to Settings and enter your Pushover User Key and App Token (create an application at pushover.net to get a token), then send a test notification.
- Use Search Anime to find shows and click Monitor This Anime.
- Done — the background service checks AniList on your configured interval and notifies you of changes.
Requires the .NET 10 SDK.
git clone https://github.com/albahadly/AnimeWatcher.git
cd AnimeWatcher
dotnet run --project AnimeWatcher/AnimeWatcher.csprojThe server hosts both the API and the client UI (default: http://localhost:5272).
Run the tests with:
dotnet test| Setting | Where | Notes |
|---|---|---|
| Check interval, Pushover keys, notification types | Settings page (stored in DB) | Not environment variables — configured in the UI |
| Authentication mode | Settings → Security | Always required (default), local-network bypass, or disabled |
| Backups | Settings → Database | Interval, retention, manual backup/restore |
ConnectionStrings__DefaultConnection |
Environment variable | Identity (login) database. Defaults to SQLite; a Server=... connection string switches to SQL Server |
ASPNETCORE_URLS |
Environment variable | Listening URL, http://+:8111 in the Docker image |
Data locations (Docker): anime data in /app/animedb/anime.db, identity in /app/data/identity.db, logs in /app/logs, backups alongside the anime DB. In development everything lives in the project folder.
- .NET 10 / C# 14 — ASP.NET Core Minimal APIs
- Blazor Web App (Interactive Auto) — server-side rendering + WebAssembly client
- EF Core 10 — SQLite (anime data); SQLite or SQL Server (identity)
- Serilog — console + rolling file logs
- Bootstrap 5 — UI
- AniList GraphQL API — anime metadata; Pushover — notifications; MyMemory — translation
AnimeWatcher/ # Server host: API endpoints, background services, server components
Endpoints/ # Minimal API endpoints (anime, settings, backup, translate, version)
Services/ # AniList client, cache, monitoring loop, Pushover, backups
Data/ # DbContexts + EF Core entities
Components/ # Server-side Razor components (layout, Identity pages)
Shared/ # DTOs shared by the server
AnimeWatcher.Client/ # Blazor WebAssembly client
Pages/ # Interactive pages (Search, Monitored, AnimeDetails, Settings)
Models/ # Client-side mirror of the shared DTOs
AnimeWatcher.Tests/ # xUnit tests (monitoring service behavior)
The server exposes a REST API under /api (used by the Blazor client):
GET /api/anime/search?query=...— search AniListGET /api/anime/details/{aniListId}/seasons/{aniListId}/recommendations/{aniListId}GET /api/anime/monitored/unmonitored— your watchlistPOST /api/anime/monitor/DELETE /api/anime/monitor/{aniListId}— add/removePUT /api/anime/preferences/{aniListId}— per-anime notification preferencesGET /api/anime/changes/season-changes— change historyGET /api/anime/export/POST /api/anime/import— watchlist JSON export/importGET|PUT /api/settings/monitoring— global settings;POST /api/settings/test-notification/api/settings/db/*— backup create/list/download/restorePOST /api/translate— synopsis translation proxyGET /health— health check;GET /api/version— app version
Issues and pull requests are welcome. Before submitting changes, see .github/copilot-instructions.md for the project's architecture rules and conventions (DTO synchronization, caching invalidation, logging, etc.), and run dotnet test.
This project is licensed under the MIT License.




