skills/fetch-substack-stats/SKILL.md
--- name: fetch-substack-stats description: Pulls substacker's weekly Substack stats directly from the dashboard via Claude-in-Chrome browser automation. Navigates to substack.com/stats, parses the posts table and subscribers table, and produces the same typed WeekExport object that ingest-substack-csv produces — but without requiring a manual CSV export. The writer keeps Chrome signed in to Substack; this skill opens the dashboard in a new tab, reads the rendered stats, closes the tab. Primary
npx skillsauth add lyndonkl/claude skills/fetch-substack-statsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.testing
--- name: advisory-edit description: A strict advisory-only editing discipline for a writer who dictates ("speaks out") essays and wants help WITHOUT having their voice changed. The editor directs structure, flags grammar, and suggests strategic language — but never modifies the writer's text unless the writer explicitly says "apply" / "make that change" / "rewrite this." Produces a line-referenced, suggestion-only critique where every item is marked the writer's call. Four passes: structural, l
testing
Provides the house style for analyst-grade strategist writing — third-person register with sparing first-person, no em dashes, no "not X, not Y, not Z" negation cascades, numbered footnote citations rather than inline source parentheticals, specific opinion-signaling phrases, and topic-forward paragraph structure modeled on voice patterns observed in Damodaran's Musings on Markets and Thompson's Stratechery. Use when consolidating working notes into a finished long-form strategist or analyst report that must read as written by a senior human analyst rather than an AI assistant.
testing
Renders a markdown report to a PDF using pandoc with xelatex (11pt serif body, 1-inch margins, numbered footnotes, formal heading hierarchy). Requires a one-time install of pandoc and a LaTeX engine on the user's machine — basictex on macOS or texlive-xetex on Linux. Does not attempt automatic install. Fails loudly with the exact install commands if pandoc or xelatex is missing on the user's PATH. Use when producing a finished strategist or analyst report PDF from a polished markdown source.
testing
Produces step-by-step computational walkthroughs of vector and matrix operations as a sequence of numbered "frames", showing the explicit state at each step. The text-equivalent of a 3Blue1Brown animation — each frame shows what changed and why, so the learner can re-trace the operation by hand. Use when the learner needs to *see* a computation unfold (eigenvalue computation, attention with 3 tokens, gradient descent step, SVD on a 2×2, layer norm on a 3-vector, softmax of a small input), when an explanation has been given but the learner needs to ground it in a worked example, or when introducing an operation that's intimidating in symbol form but trivial in pencil-and-paper form.