cour is a self-hosted seasonal anime picker for a couple or a small room of friends. Each broadcast quarter, everyone works through the new season's lineup at their own pace, marking each title Keep, Pass or Unsure, then locks in. After locking you rank the ones you kept, and the room's rankings combine into a shared shortlist.
It is asynchronous on purpose. There is no live matching and no race, and you do not see anyone else's picks until every ranking is in. Season data comes from AniList, refreshed at boot and cached on disk, with sequels hidden by default since the point is finding new shows.
What it does
- no keys needed
- Titles, cover art and trailers come from AniList out of the box. An optional TMDB key adds screenshots to the details view.
- no accounts
- Join with a name and a room name, both remembered on the device. State persists in SQLite across restarts and rooms never expire.
- lock-in is final
- Locking is guarded by a confirmation you have to tick, because the whole scoring model depends on nobody revising after seeing the room.
- top five score
- Ranked keeps score 12, 9, 6, 3 and 1 points. Passed and unsure titles are discarded, and the totals produce the standings.
- phone and desktop
- An installable PWA on mobile and a two-pane layout on wider screens, with drag-to-reorder ranking.
Running
On a phone
Install
# nothing is required to run; the volume keeps the season and the verdicts
docker run -d \
-p 8000:8000 \
-v cour_data:/app/data \
cajunflavoredbob/cour:latest
A docker-compose.yml is included in the repository. The
one option in regular use is TMDB_API_KEY, which adds
screenshots to the details view.
As with reely, logging in is claiming a name, so anyone who can reach the server can claim any name. Behind a reverse proxy, forward the WebSocket upgrade or the app will load and then sit permanently disconnected.
Specification
| Version | 1.6.2 |
|---|---|
| License | Apache 2.0 |
| Language | TypeScript, Node 26 |
| Artifact | Container image, amd64 and arm64 |
| Requires | Nothing. A TMDB key is optional |
| Listens on | Port 8000, HTTP and WebSocket on the same origin |
| Storage | SQLite on a mounted volume |
| External calls | AniList at boot for the season snapshot, a YouTube embed when a trailer is played, and TMDB when a key is configured |
| Source | github.com/cajunflavoredbob/cour |