Personal project · 2026
AnimeKaiser
A self-hosted anime library that keeps AniList and MyAnimeList in sync without hiding partial failures.

- Scope
- Full-stack
- Experience
- Discovery · library · playback
- Reliability
- Visible · retryable sync
The problem
AniList and MyAnimeList both hold the same kind of library data, but neither is a dependable source of truth for the other. Either service can be slow, rate-limited or unavailable, so a simple request that writes to both can leave the library split.
The interface
I designed and built the frontend as a cohesive product rather than a thin shell over the sync system. Discovery, search, library filters, series details, playback, watch history and sync activity share consistent navigation and feedback across desktop and mobile. Failure states appear where users can understand and act on them instead of being hidden in logs.
The approach
AnimeKaiser persists sync work as database events before attempting an external write. Workers recover interrupted work after restarts, retry failures and retain the error for an explicit user-triggered retry instead of silently dropping a change. PostgreSQL notifications wake the workers without adding a separate queue service.
Keeping upstreams usable
Discovery and detail requests are cached in Redis with lifetimes matched to how quickly each result changes. AniList requests fall back to Jikan, and a cache outage falls through to the upstream rather than taking the product down. This sits behind a complete tracker with discovery, library management, playback and watch history.

