From thinking-frameworks-skills
Fetches weekly Substack stats from the dashboard using Claude-in-Chrome browser automation, parsing posts and subscribers tables into a typed WeekExport object without manual CSV export.
npx claudepluginhub lyndonkl/claude --plugin thinking-frameworks-skillsThis skill uses the workspace's default tool permissions.
- [Prerequisites](#prerequisites)
Generates design tokens/docs from CSS/Tailwind/styled-components codebases, audits visual consistency across 10 dimensions, detects AI slop in UI.
Records polished WebM UI demo videos of web apps using Playwright with cursor overlay, natural pacing, and three-phase scripting. Activates for demo, walkthrough, screen recording, or tutorial requests.
Delivers idiomatic Kotlin patterns for null safety, immutability, sealed classes, coroutines, Flows, extensions, DSL builders, and Gradle DSL. Use when writing, reviewing, refactoring, or designing Kotlin code.
Related skills: Primary alternative to ingest-substack-csv. Produces the same WeekExport contract so downstream skills (compute-baseline, attribute-performance, per-section-tracking) don't care which path produced the data.
tabs_context_mcp, tabs_create_mcp, navigate, get_page_text, read_page, optionally javascript_tool.https://thethinkersnotebook.substack.com/publish/stats (the dashboard URL shape — verify on first run).Per weekly run (Mondays) or on-demand:
- [ ] Step 1: tabs_context_mcp — inspect existing tabs; if a Substack stats tab is already open, reuse; else tabs_create_mcp
- [ ] Step 2: navigate to https://substack.com/publish/stats (or publication-specific dashboard URL)
- [ ] Step 3: get_page_text on the rendered dashboard; parse:
- Total subscribers (headline number)
- Weekly delta
- Posts table with columns: title, date, opens, open rate, clicks, CTR, views, sent
- Activity-tier distribution (free / paid, active / at-risk / churned)
- [ ] Step 4: For each post in the last 7 days, also navigate to the individual post stats page for:
- Referral sources breakdown
- Post-specific engagement
- [ ] Step 5: Normalize into WeekExport object (schema matches ingest-substack-csv's output)
- [ ] Step 6: Archive the scraped stats as CSV in corpus/stats/YYYY-WW.csv (so historical baseline works identically)
- [ ] Step 7: Close the Substack tab (do NOT leave stats pages open in the user's browser)
Substack exposes referral source breakdowns only on individual post stats pages. The scraper navigates to each outlier post (|z| ≥ 1.0 candidate, determined after baseline compute — so this step may be deferred to attribute-performance) to pull referral data. For non-outliers, per-post referral is skipped.
Same schema as ingest-substack-csv:
{
"subscribers_end": int,
"delta_subscribers": int,
"posts": [
{"slug", "title", "post_date", "views", "opens", "open_rate", "clicks", "sent", ...}
],
"sends_this_week": int,
"free_subs": int,
"paid_subs": int,
"activity_tier_distribution": {...},
"source": "chrome-scrape", # vs. "csv-export" from the other skill
"scraped_at": ISO8601
}
Written to corpus/stats/YYYY-WW.csv (same archive path as CSV imports). The source field marks provenance so the writer can tell at a glance whether a week came from live scrape or manual export.
Trigger: Monday morning, Growth Analyst invokes fetch-substack-stats.
tabs_context_mcp — no existing Substack tab.tabs_create_mcp + navigate → Substack dashboard stats page.get_page_text — reads:
navigate → post-specific stats → referral breakdown shows 60% direct, 20% Notes, 20% search.WeekExport{subscribers_end: 148, delta_subscribers: 6, posts: [...], ...}.corpus/stats/2026-W17.csv.Downstream pipeline (compute-baseline, attribute-performance, etc.) runs identically whether data came from CSV or scrape — the WeekExport contract is stable.
corpus/stats/{YYYY-WW}.csv already exists for today's ISO week, compare — don't overwrite unless the scrape is strictly more recent and differs meaningfully.fetch-substack-stats FAILED: {reason}; falling back to ingest-substack-csv and halt — let the writer decide whether to retry or drop a manual CSV.login-required message; writer handles auth manually.corpus/stats/YYYY-WW.csv on success.ingest-substack-csv if browser path fails.