Setup
Total cost: nothing. No database, no auth, no paid API, no Vercel add-on. Roughly ten minutes end to end.
A Google Cloud project costs nothing, the YouTube Data API v3 needs no billing card, and the free quota is 10,000 units per day. This app uses about 5 to 10 units per day — roughly a tenth of one percent of the free allowance.
1. Get a free API key
- Go to console.cloud.google.com and create a project. No card required.
- APIs & Services → Library → search YouTube Data API v3 → Enable.
- APIs & Services → Credentials → Create credentials → API key.
- Restrict the key: under API restrictions choose YouTube Data API v3 only. It is a public-data read key, but restricting it means a leak cannot be used against anything else.
2. Find your channel ID
YouTube Studio → Settings → Channel → Advanced settings. It starts with UC. Your @handle also works.
3. Push this repo to GitHub
A private repo is fine. Then in the repo: Settings → Secrets and variables → Actions.
- Secrets tab → New repository secret → name
YOUTUBE_API_KEY, paste the key. - Variables tab → New repository variable → name
CHANNEL_ID, paste your ID.
The key goes in Secrets, not Variables — Variables are visible in logs.
4. Run the snapshot once by hand
Actions tab → Daily snapshot → Run workflow. It fetches your public stats, writes data/snapshots/<today>.json, and commits it. After that it runs itself daily at 04:10 UTC.
The daily commit counts as activity, so this keeps itself alive. If snapshots ever stop, open the Actions tab and re-enable.
5. Deploy to Vercel
- vercel.com/new → import the repo → Deploy. Framework detection handles the rest; there are no environment variables to set, because the app reads committed JSON rather than calling any API at runtime.
- Hobby plan, free. Each snapshot commit triggers a rebuild automatically, so the dashboard is current within a minute of the daily job.
6. Add the growth data
Watch time, average view duration, impressions and CTR are not available from a public API key — they need either OAuth or a Studio export. Since this build has no auth, use the export:
- YouTube Studio → Analytics → Advanced mode.
- Pick a date range, choose the Content tab, add the columns you care about.
- Export current view → Comma-separated values.
- Drop the CSV on the Growth page. It is parsed in your browser and never uploaded anywhere.
Running it locally
npm install
cp .env.example .env.local # fill in the two values
npm run snapshot # writes today's snapshot
npm run dev # http://localhost:3000What this app does not do
It does not generate views. It has no proxy support, no headless browser, no automated playback, and the multi-view wall blocks duplicate videos on purpose. See docs/05-compliance-guardrails.md for the full list and the reasoning.