A local web app that displays your YouTube subscription videos sorted by a nowcast ranking algorithm tuned for ad hoc runs.
Videos are ranked by a core score designed for ad hoc runs and then filtered by the selected facet window (2 days, 1 week, 2 weeks, 1 month). This means each facet shows the strongest videos within that window, not a globally recency-biased list.
Core score components:
-
Nowcast vs Expected (55% weight)
- Compares current views to age-adjusted expected views from each channel's
baseline_48h.
- Compares current views to age-adjusted expected views from each channel's
-
Velocity Shock (20% weight)
- Compares current views/hour to expected slope at the video's current age.
-
Subscriber Reach (15% weight)
- Views relative to subscriber count with diminishing returns.
-
Duration Prior (5% weight)
- Lightweight bias for durations that tend to produce stable performance.
Score modifiers:
- Confidence multiplier (0.75-1.05) lowers rank impact for weak parse confidence/stale baselines.
- Early breakout boost (up to +0.12) helps very new videos that are simultaneously strong in nowcast and velocity.
Notes:
- Facet sorting uses facet score keys (
day,week,twoweeks,month) backed by the core score. - Freshness diagnostics are still recorded in details for transparency, but recency is not applied as a hard rank penalty across wider windows.
A tool to track YouTube subscriptions and surface high-performing videos. It consists of:
- A channel stats scraper that collects subscriber counts and a channel
baseline_48hproxy - A video scraper that collects new videos from subscribed channels
- Observation tracking per scrape run for better point-in-time ranking
- A static page generator that creates a feed of videos sorted by performance
You can run the tool directly with uvx — no cloning and no manual installs:
uvx ytsubs@latest scrape-channels
uvx ytsubs@latest scrape-videos
uvx ytsubs@latest open-
Requirements:
- Python 3.12+
- Google Chrome browser
-
(Optional) Install tool versions with mise:
mise install- Install dependencies with uv:
uv syncIf local schema/data gets out of sync, reset your local DB:
rm -f ~/.local/state/ytsubs/youtube.dbRun these commands in order:
uv run ytsubs scrape-channels # When Chrome opens, log in to YouTube
uv run ytsubs scrape-videos # Collect recent videos and generate the feed
uv run ytsubs open # Open the feed in your browserYour YouTube login is saved in ~/.local/state/ytsubs/chrome_profile (or $XDG_STATE_HOME/ytsubs/chrome_profile), so you'll only need to log in once. Subsequent runs will reuse this profile.
- Collect video data:
uv run ytsubs scrape-videos # Run daily to get new videos- Update channel statistics (subscriber counts and baseline views):
uv run ytsubs scrape-channels # Run occasionally (e.g., monthly)- Open the feed:
uv run ytsubs open # Opens the latest feedThe feed is written to ~/.local/state/ytsubs/ytsubs_feed.html (or $XDG_STATE_HOME/ytsubs/ytsubs_feed.html).
- Chrome profile:
~/.local/state/ytsubs/chrome_profile(or$XDG_STATE_HOME/ytsubs/chrome_profile) - SQLite DB:
~/.local/state/ytsubs/youtube.db(or$XDG_STATE_HOME/ytsubs/youtube.db) - Feed output:
~/.local/state/ytsubs/ytsubs_feed.html(or$XDG_STATE_HOME/ytsubs/ytsubs_feed.html)
uv run ytsubs debug-scrape --scrolls 4 --filter "gymkhana"The project uses:
- SQLite for data storage
- Playwright for web scraping
- Preact for the frontend (served statically)
The project includes several helpful make commands:
make clean: Remove Python cache filesmake reset-db: Reset database to empty tablesmake reset-videos: Clear only the videos tablemake reset-channels: Clear only the channels table
- Python 3.12+
- Google Chrome