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…
Paid Gemini TTS audio for a finished blog post: summary, full read-aloud, or two-speaker dialogue, with an MP3 and an HTML5 embed. Asks for explicit consent before the first paid call. Runs only on an explicit request: /blog audio, "generate audio for this blog post", "narrate
Claude Code
$ npx -y skills add AgriciDaniel/claude-blog --skill blog-audio --agent claude-code
Codex
$ npx skills add AgriciDaniel/claude-blog --skill blog-audio -a codex -y
Cursor
$ npx skills add AgriciDaniel/claude-blog --skill blog-audio -a cursor -y
Gemini CLI
$ npx skills add AgriciDaniel/claude-blog --skill blog-audio -a gemini-cli -y
GitHub Copilot
$ npx skills add AgriciDaniel/claude-blog --skill blog-audio -a github-copilot -y
OpenCode
$ npx skills add AgriciDaniel/claude-blog --skill blog-audio -a opencode -y
Windsurf
$ npx skills add AgriciDaniel/claude-blog --skill blog-audio -a windsurf -y
name: blog-audio description: > Paid Gemini TTS audio for a finished blog post: summary, full read-aloud, or two-speaker dialogue, with an MP3 and an HTML5 embed. Asks for explicit consent before the first paid call. Runs only on an explicit request: /blog audio, "generate audio for this blog post", "narrate this blog post", "audio version of this post", or "podcast version of this post". Not for general speech or dictation questions. user-invocable: true argument-hint: "[generate|voices|setup] [file-or-text] [--mode summary|full|dialogue] [--voice name]" license: MIT metadata: author: AgriciDaniel version: "2.3.2"
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.
Generate professional audio narration of blog content using Google's Gemini TTS. Three modes: summary (200-300 word spoken overview), full article read-aloud, or two-speaker podcast dialogue. 30 prebuilt voices, over 130 languages on Gemini 3.8 Flash TTS (over 100 on Flash-Lite), HTML5 embed output. Dated model, pricing and language facts live in `${CLAUDE_SKILL_DIR}/references/models.md`.
This skill spends the user's Google AI credit and writes audio files.
split into chunks, so a full read-aloud costs several calls. The script's `--max-chunks` flag caps the chunks per run (default 12); never raise it without telling the user the new worst-case cost.
per model (rates and their checked date are in `references/models.md`; re-read https://ai.google.dev/gemini-api/docs/pricing before quoting a number). Run `--dry-run --json` first for the script's estimate.
setup only, the managed `.venv`.
chunk count, and estimated cost, then wait for an explicit yes. The yes covers only that run. Writing a blog post does not consent to audio.
one retry on a transient error, then report.
skip and return ONE line for the orchestrator's "Fallbacks and skips" summary, such as "Audio: no API key set, skipped".
| Command | What it does | |---------|-------------| | `/blog audio generate <file>` | Generate audio narration of a blog post | | `/blog audio voices` | Show available voices with characteristics | | `/blog audio setup` | Check/configure API key for Gemini TTS |
`CLAUDE_BLOG_RUNTIME_DIR` optionally selects one trusted absolute persistent root. This integration uses `<root>/blog-audio/.venv`; NotebookLM also uses `<root>/blog-notebooklm/data` for its library, authentication and browser state. Without this override, the existing skill-local defaults stay in use. Google's shared credential config/token paths stay unchanged. No state is copied or migrated automatically, and ordinary runs never perform setup.
Preserve an existing validated operator override. For a plugin without one, explicitly pass the host-substituted `${CLAUDE_PLUGIN_DATA}/claude-blog-runtime` path on both setup and every later runner call. This is Markdown substitution, not an exported shell variable. Execute only once it is an absolute resolved path. Single quotes keep an unresolved placeholder literal so validation rejects it instead of expanding it to a different shell path:
CLAUDE_BLOG_RUNTIME_DIR='${CLAUDE_PLUGIN_DATA}/claude-blog-runtime' python3 "${CLAUDE_SKILL_DIR}/scripts/setup_environment.py" --check --json
CLAUDE_BLOG_RUNTIME_DIR='${CLAUDE_PLUGIN_DATA}/claude-blog-runtime' python3 "${CLAUDE_SKILL_DIR}/scripts/run.py" generate_audio.py --helpOnly explicit setup without `--check` installs dependencies. Standalone users keep the default unless they explicitly choose an absolute runtime root. Relative, unresolved, or linked managed subdirectories fail closed. Changing the root selects separate state; it never authorizes a migration or cleanup of the old root. Plugin persistent data follows the host's uninstall retention rules; preserve it explicitly when uninstalling if it is still needed.
BLOG_SKILLS_DIR="${CLAUDE_BLOG_SKILLS_DIR:-${CLAUDE_SKILL_DIR}/..}"
case "$BLOG_SKILLS_DIR" in /*) ;; *) echo "ERROR: skills dir must be absolute" >&2; exit 1 ;; esac
AUDIO_RUN="$BLOG_SKILLS_DIR/blog-audio/scripts/run.py"
python3 "$AUDIO_RUN" generate_audio.py --text-file blog_audio_prepared.txt --voice Charon --model flash38 --jsonPut prepared narration in a file and pass `--text-file`. If you must use `--text`, follow the shell argument rule in `${CLAUDE_SKILL_DIR}/../blog/SKILL.md` (single quotes, embedded `'` written as `'\''`).
Ordinary generate and voices commands perform a nonmutating capability check. If the managed environment is absent,
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…
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,…
Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically…
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…