blog-analyze
Score one blog post (or a folder of posts) on a 5-category 100-point scale covering content quality, SEO, E-E-A-T, technical…
Research what people are actually saying about a topic in the last 30 days across Reddit, X / Twitter, YouTube, Hacker News, dev.to, Medium, and other public discourse platforms. API-free; uses WebSearch with platform-targeted site operators plus recency filters. Produces
Claude Code
$ npx -y skills add AgriciDaniel/claude-blog --skill blog-discourse --agent claude-code
Codex
$ npx skills add AgriciDaniel/claude-blog --skill blog-discourse -a codex -y
Cursor
$ npx skills add AgriciDaniel/claude-blog --skill blog-discourse -a cursor -y
Gemini CLI
$ npx skills add AgriciDaniel/claude-blog --skill blog-discourse -a gemini-cli -y
GitHub Copilot
$ npx skills add AgriciDaniel/claude-blog --skill blog-discourse -a github-copilot -y
OpenCode
$ npx skills add AgriciDaniel/claude-blog --skill blog-discourse -a opencode -y
Windsurf
$ npx skills add AgriciDaniel/claude-blog --skill blog-discourse -a windsurf -y
name: blog-discourse description: > Research what people are actually saying about a topic in the last 30 days across Reddit, X / Twitter, YouTube, Hacker News, dev.to, Medium, and other public discourse platforms. API-free; uses WebSearch with platform-targeted site operators plus recency filters. Produces DISCOURSE.md (a structured brief) and JSON output the writer can consume. Complements blog-researcher (which focuses on authority sources) with a recency-and-engagement lens. Not for verifying statistics (blog-factcheck) or gathering authority sources. Use when user says "blog discourse", "discourse research", "what are people saying about", "research what people are saying", "voice of customer", "social listening", "30-day research", "trend research", "what's the discussion on", "real-time research", "practitioner discourse", "/blog discourse". user-invocable: true argument-hint: "<topic> [--days 30|90] [--input results.json] [--output DISCOURSE.md] [--format markdown|json] [--decomposition questions.txt]" license: MIT
Bundled paths below use host Markdown substitution of `${CLAUDE_SKILL_DIR}`; it is not an exported shell variable. Resolve them before execution, quote paths, and refuse nonabsolute overrides. Pass `blog_reference_root` resolved from `${CLAUDE_SKILL_DIR}/../blog/references`, `blog_template_root` from `${CLAUDE_SKILL_DIR}/../blog/templates`, and needed sibling roots to agents. Read the main reference `orchestration-details.md` before loading project context; pass only its helper-fenced output to downstream agents.
Produces DISCOURSE.md: a structured brief of what practitioners said about <topic> on the public web in the last 30 days. It is the recency + engagement lens that `blog-researcher` (authority-first) lacks, asking what practitioners and customers are actually saying about this topic right now.
Adapted from the methodology of `last30days-skill` (Matt Van Horn, MIT, https://github.com/mvanhorn/last30days-skill). The upstream uses platform APIs; this sub-skill uses WebSearch with platform-targeted site operators. No API keys required.
| Command | Purpose | |---|---| | `/blog discourse <topic>` | Produce a discourse brief at project-root `DISCOURSE.md` | | `/blog discourse <topic> --days 90` | Widen the freshness window from 30 to 90 days | | `/blog discourse <topic> --input results.json` | Skip search; build the brief from a pre-gathered results file. The flag name matches `scripts/discourse_research.py --input` directly. | | `/blog discourse <topic> --output path.md` | Write markdown to a chosen output path and print structured JSON without markdown to stdout. | | `/blog discourse <topic> --format json` | Print the full JSON brief to stdout when no `--output` path is used. | | `/blog discourse <topic> --decomposition questions.txt` | Pass newline-delimited decomposition questions into the helper. |
Before any search, run the four keyword-trap checks from `${CLAUDE_SKILL_DIR}/../blog/references/research-quality.md` (Class 1 demographic shopping, Class 2 numeric trap, Class 3 overly-literal phrase, Class 4 generic single-noun). If the topic matches a class:
1. Emit a single one-line note: `Pre-Flight: matched Class N. Action: <reframe or clarifying question>.` 2. If the action is a clarifying question, STOP and wait for the user. 3. If the action is a reframe, proceed with the reframed query and document the reframe in the brief.
Running discourse research on a trap topic wastes WebSearch calls and produces noise.
For named-entity topics, decompose into discrete searchable queries. Use the checklist from `research-quality.md`:
Emit the decomposition at the top of the eventual brief so reviewers can see the search plan.
For each decomposed query, run WebSearch with platform-targeted site operators. Compose 4 to 8 searches total per topic. Use these operators (the agent picks the relevant subset for the topic class):
| Platform | Operator | When to use | |---|---|---| | Reddit | `site:reddit.com/r/<sub>` or `site:reddit.com` | Always (when a relevant sub is known or discoverable) | | Hacker News | `site:news.ycombinator.com` | Tech, dev tools, startup topics | | X / Twitter | `site:x.com` or `site:twitter.com` | Public discourse, influencer takes | | YouTube | `site:youtube.com` | Walkthroughs, reactions, demos | | dev.to | `site:dev.to` | Developer practitioner content | | Medium | `site:medium.com` | Long-form practitioner commentary | | GitHub | `site:github.com` (for issues / discussions) | Open-source projects | | StackOverflow | `site:stackoverflow.com` | Concrete how-to problems | | Substack | `site:substack.com` | Newsletter-form essays |
Always include a recency filter when the platform supports it (Google's `after:YYYY-MM-DD` and `before:YYYY-MM-DD`). For `--days 30`, set `after:` to today minus 30 days. For `--days 90`, today minus 90 days.
For each WebSearch result, capture (into a temporary results JSON file the script can consume):
{
"platform": "reddit",
"url": "https://reddit.com/r/xxx/comments/yyy",
"title": "Original post title as visible in SERP",
"snippet": "SERP snippet text",
"date": "YYYY-MM-DD or null",
"engagement_proxy": "upvote/comment count visible in snippet, or null"
}Write to a secure temp file (do NOT use a predictable `/tmp/<topic>.json` path; topic names can be sensitive). Create with restrictive permissions:
RESULTS_JSON=$(python3
claude-blog is a Claude Code skill suite that writes, optimizes, audits, localizes, and refreshes blog content at scale. Every article is evaluated for Google-aligned usefulness and internal AI citation readiness heuristics.
Score one blog post (or a folder of posts) on a 5-category 100-point scale covering content quality, SEO, E-E-A-T, technical…
Paid Gemini TTS audio for a finished blog post: summary, full read-aloud, or two-speaker dialogue, with an MP3 and an HTML5…
Full-site blog health assessment scanning all blog files for quality scores, orphan pages, topic cannibalization, stale content,…
Establish durable brand and voice context for cross-skill consumption. Generates BRAND.md (audience, positioning, do/don't…
Create a content brief for ONE planned post: target and secondary keywords, search intent, template choice, competitor gaps from…
Build a dated monthly or quarterly editorial calendar: which posts to publish or review when, content mix, templates,…
Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use…
AI-driven presentation workflow for generating editable PPTX decks and slides, reconstructing page visuals, creating reusable…
Use this skill when the user wants a .pptx with smooth cross-slide animation — PowerPoint Morph transitions, Keynote-style…
Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to…