A GitHub Pages site tracking vibe coding trends: weekly growth signals (GitHub, Hacker News, Google Trends, VS Code Marketplace installs) plus a daily feed of news and YouTube videos, from sources configured from a simple Google Sheet that admins can edit directly, and relevant products tracked from Product Hunt. No backend — everything renders client-side against static CSV/JSON files committed by two scheduled GitHub Actions workflows.
Google Sheet (non-technical source/topic config - feeds the daily
workflow only; the weekly workflow's tool lists are hardcoded in
scripts/fetch_trends.py, not Sheet-driven)
|
v
GitHub Actions (daily, 05:00 UTC) GitHub Actions (weekly, Mon 06:00 UTC)
-> scripts/fetch_news.py -> scripts/fetch_trends.py
-> scripts/fetch_youtube.py -> scripts/compute_signals.py
-> scripts/generate_digest.py (optional) -> scripts/fetch_producthunt.py (optional)
-> writes data/news.json, data/youtube.json -> writes data/*.csv, data/signals.json,
-> writes/updates data/status.json, data/status.json, data/producthunt*.json
data/digest.json (optional)
-> commits + pushes -> commits + pushes
| |
+-------------------+-------------------+
v
index.html / leaderboard.html / compare.html
(fetches the JSON/CSV directly, no build step)
|
v
GitHub Pages
index.html,leaderboard.html,compare.html— the siteassets/— shared CSS/JS (style.css,app.js,trend-chart.js,radar-chart.js,tool-profiles.js)data/— the CSVs/JSON both workflows write to, and what the site readsscripts/— the six Python scripts (trends, news, YouTube, signals, digest, Product Hunt).github/workflows/— the two scheduled workflowsdocs/GOOGLE_SHEET_SCHEMA.md— the exact columns the Sheet needs
News and video sources live in a
Google Sheet, not in code. See docs/GOOGLE_SHEET_SCHEMA.md for setup and
the exact column format. Adding a source is just a spreadsheet row; no code
change or redeploy needed.
Set these under Settings → Secrets and variables → Actions:
| Secret | Used by | Notes |
|---|---|---|
GITHUB_TOKEN |
weekly workflow | auto-provided, no setup needed |
TRENDS_MCP_API_KEY |
weekly workflow | see the Google Trends caveat below |
SHEET_CSV_URL |
daily workflow | the published-CSV URL of the sources Sheet |
YOUTUBE_API_KEY |
daily workflow | YouTube Data API v3 key, free tier |
GEMINI_API_KEY |
daily workflow | optional. Gemini free-tier key - adds an LLM second opinion on top of the keyword-based relevance/category checks in fetch_news.py and fetch_youtube.py (both run keyword-only if unset, capped at 30 calls/run each - see MAX_GEMINI_CALLS_PER_RUN), and powers the auto-written digest in generate_digest.py. That script runs daily but self-limits to writing a new digest roughly once a week (MIN_DAYS_BETWEEN_DIGESTS); skipped entirely, leaving any prior digest in place, if unset |
PRODUCTHUNT_API_KEY |
weekly workflow | A non-expiring developer_token from your Product Hunt account's API dashboard (producthunt.com/v2/oauth/applications) - see the Product Hunt section below. Skipped (not a failure) if unset |
The VS Code Marketplace signal (fetch_vscode_marketplace_installs() in
scripts/fetch_trends.py) needs no secret at all - it's an unauthenticated
public endpoint, so there's nothing to add here for it.
GitHub — repo count per configured topic tag. Official API, no auth required (a token raises the rate limit).
Hacker News — story and comment mentions per search term, last 7 days, via the official Algolia HN Search API. No auth needed.
Google Trends — relative search interest (0–100), via Trends MCP
(trendsmcp.ai), an unofficial third-party proxy, not a Google
product. Free tier caps at 100 requests/month, 20/day — this is why the
term list stays short. Treat this as the least stable link in the
pipeline; a manual CSV export or a paid alternative (SerpApi, Apify) are
the fallbacks if it breaks. See scripts/fetch_trends.py for the parsing
details, since the response schema is inferred, not officially documented.
VS Code Marketplace — total install count per extension, via the
Marketplace's own public Extension Gallery API
(marketplace.visualstudio.com/_apis/public/gallery/extensionquery). No
auth or API key required, and it's undocumented for third-party use but is
Microsoft's own endpoint (the same one the VS Code client itself queries),
queried by exact extension ID (VSCODE_EXTENSIONS in
scripts/fetch_trends.py). This is the one signal here that's a direct
usage count rather than a proxy for one — but it only exists for tools that
ship an actual VS Code extension (Cursor and Windsurf are standalone forked
editors, not extensions; Replit Agent, Devin, and Lovable are browser-only,
so they have no extension to count installs for either).
News (RSS) — headline, link, date per configured feed. Feeds only, not scraping — scraping is fragile and often against a site's terms of service.
YouTube — long-form videos (last 60 days) per configured search topic,
ranked by views-per-day-since-published as a proxy for "gaining
popularity," since there's no official trending-by-niche endpoint. Search
results are ordered by view count (not date) within that window so genuinely
popular videos aren't crowded out by newer, less-watched ones before stats
are even fetched. Shorts (<=3 minutes, YouTube's current eligibility
threshold) are excluded - see SHORTS_MAX_SECONDS in fetch_youtube.py.
Product Hunt — recent launches from Product Hunt's own
"vibe-coding" topic, via their v2 GraphQL API
(api.producthunt.com/v2/api/graphql), authenticated with a
developer_token (see PRODUCTHUNT_API_KEY above) - no OAuth flow needed
for a script like this one. Unlike every other source here, this one isn't
tied to a pre-configured list of tools at all: it's this project's answer
to "how would we notice new and growing tools before someone manually adds it to
TOOLS/GITHUB_TOPICS/etc." - see scripts/fetch_producthunt.py's
docstring. The site cross-references each launch's name against
assets/tool-profiles.js client-side and flags anything not already
tracked. The same script also writes data/producthunt_top.json and
data/producthunt_reviewed.json - always-fresh (not accumulating)
snapshots of the all-time top-voted and top-reviewed posts within that
same "vibe-coding" topic, for the site's "Top voted"/"Most reviewed"
lists. Both are derived from one shared, broad fetch (not two separate
order-specific queries), so a post with few votes but a genuinely high
review count still gets found - see the module docstring for why that
distinction matters. producthunt_reviewed.json only includes posts with
at least one real written review (a separate, less common action than a
vote), not every post sorted with 0-review ones at the bottom.
All three files are scoped to the vibe-coding topic alone - Product
Hunt's own "Best vibe coding tools" page draws from a separate, editorial
Category grouping that isn't reachable through the public API, so established tools
that don't carry the vibe-coding topic tag themselves (Cursor, Lovable,
Windsurf, and similar) won't appear in these three lists. Two terms from
Product Hunt's own API docs worth knowing if this data is ever used
beyond this proof of concept: it must not be used for commercial purposes
without contacting them, and they ask for attribution linking back to
Product Hunt (see each page's footer disclosure).
scripts/compute_signals.py writes each tool's four signals as separate
fields in data/signals.json - honestly null where a signal genuinely
isn't tracked for that tool - and does not rank tools against each other
or blend them into a composite score. Combining narrow, noisy proxies
(GitHub topic-tag counts, comment volume on one forum, search interest via
an unofficial third-party proxy) into a single number doesn't make the
result more accurate, and it makes it harder to audit: a reader can't
tell whether a blended score change reflects real momentum or one of those
proxies' known failure modes, and any weighting between them would be
arbitrary rather than validated. leaderboard.html shows the four signals
as a sortable table (click a column to sort by it); compare.html's radar
chart plots them as four independent axes.
Not every tool gets all four signals. Cursor has no Trends coverage ("Cursor" is too generic a search term to track cleanly). Replit Agent, Devin, and Lovable have no GitHub signal at all - none of them are tools people build a public GitHub ecosystem of extensions/example repos around the way an IDE or CLI tool is, so a repo count would be thin (Replit Agent/Lovable - usage mostly stays on the vendor's own hosted platform) or actively misleading (Devin - "devin" is also just a common first name). Only Claude Code, Codex, and GitHub Copilot have a VS Code install count - Cursor and Windsurf are standalone forked editors rather than VS Code extensions, and Replit Agent, Devin, and Lovable are browser-only. A missing signal shows as a dash on the site, never a fabricated zero.
Edit the TOOLS dict at the top of scripts/compute_signals.py — map a
display name to the matching metric names already being tracked in the two
CSVs. Set "github", "trends", or "vscode" to None if that signal
genuinely isn't trackable for this tool (see "Signals, not a score" above)
"hn"is the one every tool is expected to have, since Hacker News needs no topic tag, Trends term, or Marketplace listing to configure first. If the tool isn't tracked yet, add it to theGITHUB_TOPICS/HN_TERMS/TRENDS_TERMSlists inscripts/fetch_trends.pyfirst (skipGITHUB_TOPICSif you're setting"github": None), and toVSCODE_EXTENSIONS(same file) with its exact Marketplace extension ID if it ships a VS Code extension. Also add it toassets/tool-profiles.js(compare.html's hand-curated facts) and toTOOL_MATCHERSincompare.htmlif you want it picked up by the "recent mentions" count there.
The repo can stay private. Recommended: connect Cloudflare Pages (or Netlify/Vercel) directly to this repo — works on the free tier without requiring the repo to be public, and without depending on the org's GitHub plan. If deploying via GitHub Pages instead, note that private-repo Pages requires GitHub Team or higher; on Team+ you can keep the repo private while setting the published site to public visibility.