A Manifest V3 Chrome extension for outlier badges, actual observed view history, and closer analysis of specific YouTube channels. Version 0.2.2.
- Outlier badges next to each video's "1y ago" metadata (on the thumbnail when a card has none), plus a chip on watch-page titles.
- The first screen gets priority. A badge marked
≈uses cached observations from the last 48 hours while fresh data loads. - Hover or focus a score badge to inspect its observations or start hourly tracking. A graph appears once observations span at least a minute. Escape closes it.
- Follow up to 20 channels by YouTube
@handle, handle URL, channel-ID URL, or legacy/user/URL. The extension checks their recent uploads hourly. - Analysis: format-aware outliers, views/day, public engagement, median views, upload cadence, sortable video tables, recent-upload view distribution, and per-video history/tracking.
- Hourly video tracking, capped at 500 observations per video. Passive observations are retained for up to 30 days / 1,000 videos; manually tracked videos and watchlist sample videos are preserved.
- Extract a release ZIP to a permanent folder.
manifest.jsonmust be directly inside it. - Open
chrome://extensions, enable Developer mode, then Load unpacked and select that folder. Pin Outlier Tracker. - In Google Cloud, enable YouTube Data API v3 and create an API key restricted to that API. Each user provides their own key in extension Settings. The extension has no built-in key. Never put a real key in source, issues, Actions variables, or a release ZIP.
- Click Save & test, then reload YouTube.
- Open the toolbar popup → Channel watchlist & deep analysis to add channels. No channels are followed automatically.
Use the Chrome Web Store listing once published to receive automatic updates. GitHub releases alone cannot auto-update unpacked installs on regular Windows/Mac Chrome. See release setup.
The outlier score divides current views by the median for that channel and format. It uses the newest 30 qualifying uploads at least 2 days old and requires at least 3. Videos up to 3 minutes long are treated as Shorts. A No baseline badge means there were too few qualifying uploads or their median was zero. No score means the video or channel data was unavailable.
Views/day is the video's lifetime daily average. The channel histogram compares current totals across uploads of different ages. Engagement is (public likes + public comments) / views and requires both public counts. Channel-wide lifetime totals are displayed separately from recent-upload metrics. The extension checks up to 200 recent uploads to find enough qualifying videos for a format.
The YouTube Data API does not supply arbitrary historical daily view totals. OAuth-based YouTube Analytics reports require channel ownership and are not used. Each installation collects its own observations. Timers run while Chrome is running; missed intervals are not filled in.
Requires Node.js 22+ and Python 3. No npm dependencies are needed for the extension or core tests.
npm run check
npm test
python3 scripts/build.pyWith Playwright and Chromium available, run node --test tests/browser/content.test.cjs to check badge behavior in a scrolling feed.
The ZIP in dist/ contains only the allowlisted runtime files. manifest.json is at its root. API keys and publishing credentials are never packaged. Load the repository root unpacked for development. After changing files, reload the extension and YouTube tabs. Existing keys and tracked data are kept when reloading the same installed ID.
See Privacy policy. The runtime contacts only Google’s YouTube Data API. This repository and CI never receive a user's API key, watchlist, snapshots, or browsing activity. storage keeps user settings and observations; alarms schedules collection; activeTab identifies the popup's current video; unlimitedStorage preserves tracked history. Content scripts run only on www.youtube.com and API requests use only www.googleapis.com.
Push a version tag matching manifest.json and package.json, e.g. v0.2.0. CI checks the extension and creates a release ZIP. After the one-time Web Store setup and repository secrets are configured, the same workflow uploads the ZIP and submits it for review. Store-installed copies update after approval/publication on Chrome's schedule. It is not an immediate push, and unpacked copies require a one-time migration.