For judges
Sixty seconds, no sign-in
Everything on this page works without an account. Sample residents are labelled Sample. Live builds are limited per visitor and per day; the saved sample card is shown on /compare without a build.
- 2Build it live
Watch the agent place the card
Each tool call appears as it happens. Every item shows the year, the favourite it connects to, and a Personal, Shared era or Widely known tag.
- 3See rejections
Open what the rules turned away
Candidates outside the years, without a year, or not linked to a favourite are listed with the reason.
- 4Open session mode
Run the session on a phone
One item per screen, six big taps for what the carer sees.
- 6Group session
Plan a room
Four residents, one pool, the item that works for the person it fits least.
Try a hard case
A resident born in 1925 whose only favourite is a name Qloo cannot resolve. Aftersong should say what it could not find and stop.
Abstention preset
A resident born in 1900, the oldest the intake allows, with one obscure favourite, Mildred Bailey. Their years are 1910 to 1930. Where Qloo has too little in those years, such as television, the card says so and adds nothing.
Fault switch
With AFTERSONG_SABOTAGE=model_injects the model tries to swap a card line for a name that is not on the card and to add an item that does not exist.
Result of the last run: 1 line blocked and replaced with a template line, 1 extra item refused, card checks all pass. Run 2026-10-28 on a synthetic Qloo stand-in, offline, so it spends nothing.
Reproduce: npm run sabotage
Three minutes
Ten minutes, from a clean clone
git clone https://github.com/0xkinno/aftersong cd aftersong npm --prefix backend ci npm test npm run verify:fixtures npm run check
No keys needed. To check a live card, download its export from the sample page and run npm run verify -- card.json.