A self-hosted anime list manager. Import from MyAnimeList or AniList, or build your list manually.
Prerequisites: Docker and Docker Compose.
- Edit
appsettings.json— at minimum set a strongJwt.Keyand updateDefaultUsercredentials. - Start the container:
docker compose up -dThe image is pulled automatically from ghcr.io/zortexsenpai/zanimelist:latest.
Then open http://localhost:8080.
The default admin credentials are admin / admin — change them via the environment variables below or through the profile settings after first login.
The database is stored in a Docker volume (zanime_data) and persists across restarts.
Edit docker-compose.yml and change "8080:8080" to "<your-port>:8080".
- In
appsettings.jsonset"DatabaseProvider": "postgresql"and updateConnectionStrings.PostgreSQLwith your credentials. - Add a
dbservice todocker-compose.yml:
services:
zanime:
image: ghcr.io/zortexsenpai/zanimelist:latest
ports:
- "8080:8080"
volumes:
- zanime_data:/data
- ./appsettings.json:/app/appsettings.json:ro
depends_on:
- db
db:
image: postgres:17-alpine
environment:
POSTGRES_DB: zanime
POSTGRES_USER: zanime
POSTGRES_PASSWORD: changeme
volumes:
- pg_data:/var/lib/postgresql/data
volumes:
zanime_data:
pg_data:docker compose pull
docker compose up -ddocker compose logs -fdocker compose downTo also delete the database volume:
docker compose down -vZAnimeList supports login via any OpenID Connect provider. The flow uses PKCE so no client secret is required for public clients, but confidential clients with a secret are also supported.
- Go to Applications → Providers → Create and choose OAuth2/OpenID Connect Provider.
- Set Client type to Confidential (recommended) or Public.
- Add a Redirect URI matching your app's callback URL, e.g.
https://anime.example.com/oidc-callback. - Under Advanced protocol settings, ensure the scopes
openid,profile, andemailare selected. - Create an Application that uses this provider and note the Client ID, Client Secret, and the OpenID Configuration Issuer URL (shown on the provider's overview page — looks like
https://authentik.example.com/application/o/<slug>).
Edit the Oidc section in appsettings.json:
"Oidc": {
"Enabled": true,
"Authority": "https://authentik.example.com/application/o/zanime",
"ClientId": "your-client-id",
"ClientSecret": "your-client-secret",
"RedirectUri": "https://anime.example.com/oidc-callback",
"DisplayName": "Authentik"
}| Key | Description |
|---|---|
Enabled |
Set to true to show the SSO button on the login page. |
Authority |
The OpenID Configuration Issuer URL from Authentik's provider overview. |
ClientId |
The Client ID shown in Authentik. |
ClientSecret |
The Client Secret from Authentik. Leave empty for public clients. |
RedirectUri |
Must exactly match the redirect URI registered in Authentik. Use your public URL in production. |
DisplayName |
Label shown on the "Sign in with …" button. |
Once configured, a Sign in with Authentik button appears on the login page. On first login the account is provisioned automatically using the preferred_username from the OIDC token. Local password accounts continue to work alongside SSO.
Prerequisites: .NET 9 SDK, Node.js 22.
# Terminal 1 — backend
cd backend/ZAnimeList.API
dotnet run
# Terminal 2 — frontend
cd frontend
npm install
npm run devFrontend dev server: http://localhost:5173
Backend API: http://localhost:5184
For OIDC during development, set Oidc__RedirectUri to http://localhost:5173/oidc-callback and register that URI in your Authentik provider.