Create a Web application OAuth client in your own Google Cloud project, enable YouTube Data API v3, and register this exact redirect:
https://afterhours.becker.im/oauth/callback
Store the client ID and secret in the server’s central keys.json → afterhours, then rerun scripts/deploy.py. After that, Connect YouTube opens Google’s authorization screen.
03
A playlist that finds you
Send ten fresh recommendations to a private playlist called Afterhours. Open it on your phone, desktop or TV.
Select YouTube → history → JSON. Upload watch-history.json or watch-history.html here. No ZIP needed. A watch is a weak signal; a like counts much more.
05
How your taste takes shape
Likes and saves are the strongest positive signals. “Less like this” pushes related work down. Skips are gentle nudges. Actual time played here is a weak signal; opening a YouTube link never counts as completing a video.
The feed compares titles, artists, tags and curator context. It balances relevance with variety across sources and artists, and puts an exploratory choice in every fifth slot. It learns across your devices when you use the same access code. Watching outside this site is reflected when you import history; YouTube likes update on the daily sync after connection.
THE PEOPLE BEHIND THE PICKS
Good taste has a source.
Only verified YouTube links from selected editorial articles enter the collection. A live metadata check confirms the video exists; regional restrictions and disabled embedding can still affect playback.