back to the rack

cour

Pick the anime season together, without anyone racing anyone or seeing the others' picks too early.

ver
1.6.2
lic
Apache 2.0
src
TypeScript
rel : release published
repository releases

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

A single anime title filling the frame with its cover art, genre tags, and a row of Pass, Unsure and Keep buttons
The deck. One title at a time, three verdicts, a running count.
A numbered results list, each row showing cover art, title and a points total, with the room's shared top pick called out above
Final standings, once every ranking is in.

On a phone

Phone join screen with a room name and display name under the cour wordmark
Join
The Unsure button mid-hold, partly filled by a progress sweep reading all 61 unsure
Hold to skip the rest
A drag-to-reorder list of five kept titles, each with a rank number and its point value
Rank your keeps
Phone standings, a numbered list of titles with point totals
Standings

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