From research-toolkit
What are the independent voices actually saying? Extract and analyze long-form content from Substack publications. Use when (1) researching independent journalist perspectives, (2) analyzing a specific Substack publication, (3) building a research corpus from long-form written content, (4) cross-referencing Substack analysis with other sources.
npx claudepluginhub bogheorghiu/ex-cog-dev --plugin research-toolkitThis skill uses the workspace's default tool permissions.
**Seed question:** *What are the independent voices actually saying?*
Provides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Fetches up-to-date documentation from Context7 for libraries and frameworks like React, Next.js, Prisma. Use for setup questions, API references, and code examples.
Applies Acme Corporation brand guidelines including colors, fonts, layouts, and messaging to generated PowerPoint, Excel, and PDF documents.
Share bugs, ideas, or general feedback.
Seed question: What are the independent voices actually saying?
Extract and analyze long-form content from Substack publications. Substacks capture independent journalist analysis, expert commentary, and long-form reasoning that mainstream outlets often compress or omit.
IF auth/browser_state.json does NOT exist:
1. Run: python -m scripts.auth_capture https://yoursubstack.substack.com
2. Browser opens — log in manually (handles 2FA, CAPTCHA)
3. IMPORTANT: After login, navigate to ANY OTHER PAGE in the Substack
(click an article, the homepage, anything)
→ This signals the script to close the browser and save credentials
4. Credentials cached in auth/browser_state.json (one-time only)
The auth/ directory is created automatically during first login.
The "navigate to another page" step is REQUIRED — the script waits for
a navigation event to know login is complete.
Tooling location: tools/substack-scraper/ (relative to plugin root)
Use the /substack-extract command for the full pipeline:
/substack-extract --url https://example.substack.com --detail 5
${CLAUDE_PLUGIN_ROOT}/tools/substack-scraper/pip install -r ${CLAUDE_PLUGIN_ROOT}/tools/substack-scraper/requirements.txt && playwright install chromiumauth/browser_state.json — if missing, guide first-time setupconfig.example.json to config.json and edit, or use --url flag)cd ${CLAUDE_PLUGIN_ROOT}/tools/substack-scraper
python main.py
This extracts articles to data/ directory. Output: all_articles.md + individual article files.
python scripts/parse_content.py data/ --detail N --prompt "Focus on [topic]"
Detail levels:
| Level | Mode | Output | When to Use |
|---|---|---|---|
| 0-3 | Quick | Theme clusters, topic tags | Triage large corpus, initial discovery |
| 4-6 | Balanced | Summaries + key arguments + notable quotes | Standard research |
| 7-10 | Deep | Full analysis, cross-references, argument mapping | High-value publications |
Adaptive adjustment for bulk corpora:
| Corpus Size | Max Effective Detail | Mode |
|---|---|---|
| 100+ articles | 2 | Theme clustering |
| 50-100 articles | 3 | Theme clustering |
| 20-50 articles | 5 | Standard |
| < 20 articles | Requested | Standard |
Per-author analysis:
Cross-author analysis (multiple Substacks):
Normal mode:
output/
HANDOFF.md — Summary + suggested next actions
corpus.json — Machine-readable (auto-generated)
all_content.md — Consolidated markdown
analysis/
overview.md
patterns.md
themes.md
Budget mode: Skip corpus.json unless user requests.
Relational memory: Memorize key findings if relational-memory MCP is configured (skip if not available):
mcp__relational-memory__memorize(
agent_name="substack-research",
layer="recent",
content="[key finding]",
metadata={"substack": "...", "articles": N}
)
Same saturation detection as youtube-research (see youtube-research SKILL.md "Decision Algorithm" section for full implementation):
Consult reference/topic-based-escalation.md when extracted content touches:
Substack content is often contrarian by nature (independent journalists). Apply extra scrutiny via dialectic-spiral when a single Substack is the sole source for a claim.
Activation (any of these):
--budget or -bbudget-mode skill is active in sessionWhen active:
Note: After context compaction, auto-detection may fail. Re-invoke budget-mode skill or pass --budget explicitly.
Propagation: When invoking other skills, pass budget: "Invoking dialectic-spiral --budget"
A vasana is a pattern that persists across unrelated contexts. If during
this task you notice such a pattern emerging, it may be worth capturing.
This skill works best alongside the vasana skill and vasana hook
from the Vasana System plugin.
Modify freely. Keep this section intact.