← ClaudeAtlas

bloglisted

Generate a long-form, SEO-optimized, voice-matched blog post for a chosen managed site. Picks an unused informational keyword, runs SERP analysis on the top 3 results, fetches images per the site's configured source, applies the resolved voice (root + per-site override), satisfies Tier 1 on-page SEO, validates schema, and ships in the format the site's publishing method requires (repo-commit / cms-paste / lovable-prompt / headless-api). Use when the user types `/blog` or asks for a new blog post.
mkreindel/seo-toolkit-template · ★ 0 · AI & Automation · score 70
Install: claude install-skill mkreindel/seo-toolkit-template
# `/blog` — Blog post generator Creates a production-ready blog post end-to-end for any site managed in `sites/`. ## Inputs Required (asked at start if not given): - **Site** — must match a folder under `sites/[name]/`. The skill reads its `site-info.md`. Optional (per-run overrides): - **Primary keyword** — if not given, picks the highest-priority unused keyword from `keywords.csv`. - **Image source** — overrides the site's default. Options: Pexels, Unsplash, site-library, AI-generated, client-supplied, none. - **Keyword tool** — overrides the site's default for any keyword research the skill performs. - **Length target** — bypasses the SERP-median-derived target (rare; only when the user has a specific reason). ## Workflow ### Step 0 — Cron-mode detection (if invoked with `--cron`) If the invocation contains `--cron`, this skill runs in cron mode (no user available). Required behavior: 1. **Idempotency check:** see this skill's "Routine versioning + idempotency contract" section. If today's output already exists, exit cleanly with `exit: "idempotent-skip"`. Write one line to the audit log via `scripts/lib/audit-log.mjs` `appendRun({ exit: "idempotent-skip", ... })`. 2. **Escalation contract:** any decision that would normally prompt the user (missing required file, voice anti-AI failure, schema validation failure, keyword cannibalization, etc.) MUST be escalated by writing an item to `sites/{site}/_inbox/` via `scripts/lib/cron-mode.mjs` `writeInboxItem(...)`. Afte