Agent skill

Publish SEO Batch

by PramodDutta in PramodDutta/qaskills

A skill your agent uses when publishing SEO blog articles to qaskills.sh, e.g.

MITAuto-check passedWriting & Content

Install Publish SEO Batch

skills CLI
$ npx skills add PramodDutta/qaskills --skill publish-seo-batch -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install PramodDutta/qaskills publish-seo-batch --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/PramodDutta/qaskills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/publish-seo-batch .claude/skills/publish-seo-batch && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
publish-seo-batch
GitHub stars
235
Token cost
~2.2k tokens
SKILL.md length
793 words
Files
1
Skills in repo
11
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when publishing SEO blog articles to qaskills.sh, e.g.

  • Works in 10 steps: State check → Source topics → Dedup every slug (MANDATORY before… → …
  • Publishing SEO blog articles to qaskills.sh
  • SKILL.md covers Step 0: State check, Step 1: Source topics, Step 2: Dedup every slug… and Step 3: Write each post, plus 8 more sections
  • Calls git, curl and pnpm; reaches qaskills.sh and bing.com

What it does

Publish SEO Batch is an agent skill from PramodDutta/qaskills. Use when publishing SEO blog articles to qaskills.sh, e.g. "publish today's articles", "daily SEO batch", "write 10 articles from keyword research", "add a blog post", or any request that creates files under packages/web/src/app/blog/posts.

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Writing & Content, covering Blog and article writing and Keyword research. The repository describes itself as: QA Skills Directory QA Skills is a curated directory of testing-specific skills for AI coding agents (Claude Code, Cursor, Copilot, etc.). The licence is MIT.

When your agent uses it

  • Publishing SEO blog articles to qaskills.sh
  • Tasks that involve Blog and article writing
  • Tasks that involve Keyword research

Example prompts

  • “publish today”
  • “daily SEO batch”
  • “write 10 articles from keyword research”
  • “/publish-seo-batch”

Requirements

  • Python 3

Workflow steps

10 steps, taken from the step headings in SKILL.md.

  1. State check
  2. Source topics
  3. Dedup every slug (MANDATORY before writing any file)
  4. Write each post
  5. Register in BOTH registries
  6. Verify locally (do not skip)
  7. Commit
  8. Deploy
  9. Prove it live
  10. Ping IndexNow (Bing + Yandex + Naver + Seznam)

What it can do on your machine

Read from SKILL.md and the folder at commit 1d2a092. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • git
    • curl
    • pnpm
    • python3

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Hosts in commands or code, which the agent is likely to contact:

    • qaskills.sh
    • bing.com
    • api.indexnow.org

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Publish SEO Batch loads about 2.2k tokens when it runs. Until then it costs about 65 tokens; SKILL.md has 793 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~65
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from PramodDutta/qaskills at commit 1d2a092, republished under its MIT licence (© PramodDutta). 793 words, ~2,157 tokens.

Download SKILL.mdSave it as .claude/skills/publish-seo-batch/SKILL.md (or your agent's skills folder).
name
publish-seo-batch
description
Use when publishing SEO blog articles to qaskills.sh, e.g. "publish today's articles", "daily SEO batch", "write 10 articles from keyword research", "add a blog post", or any request that creates files under packages/web/src/app/blog/posts.

Publish SEO Batch

The daily content pipeline: source topics -> dedup slugs -> write posts -> register -> build -> commit -> deploy -> prove live -> ping IndexNow. Default batch size is 10 unless the user says otherwise. Every step has a check; a batch is not "published" until step 8 passes, then step 9 nudges the search engines.

Step 0: State check

bash
git -C /Users/promode/qaskills status --short   # note pre-existing WIP; you will NOT stage it
date +%F                                        # today's date, used in every post and the commit message

Pre-existing modified/untracked files are the user's WIP. Leave them alone.

Step 1: Source topics

Saved GSC reports in docs/seo/KEYWORD-OPPORTUNITIES-*.md are historical and fully published; do not source topics from them. Instead:

  1. If the user supplied topics or keywords, use those.
  2. Otherwise WebSearch for net-new opportunities in the site's clusters: Playwright (releases, features, integrations), LLM evaluation (DeepEval, Ragas, promptfoo, Langfuse), API testing, load testing, AI test generation, agentic testing, CI/CD. Favor high-intent long-tail: "X vs Y 2026", "how to X", tool + new-version guides, fresh industry reports.
  3. Cross-check each candidate against existing coverage (step 2). Prefer gaps over rewrites.
  4. If the research produced a reusable keyword dataset, save it as docs/seo/KEYWORD-OPPORTUNITIES-YYYY-MM.md and include it in the commit.

Step 2: Dedup every slug (MANDATORY before writing any file)

Batch arrays are spread into the registries LAST, so a colliding slug silently replaces a real article. This has shipped a stub over a full article before.

bash
cd /Users/promode/qaskills
for s in slug-one slug-two; do
  hits=$(grep -rn "$s" packages/web/src/app/blog/posts/ | grep -v "$s-something-longer" | wc -l)
  echo "$s: $hits hits"
done

Any hit (filename, posts map key, postList entry, batch array entry): choose a different slug or drop the topic. Also scan titles in posts/index.ts for near-duplicate topics; a second article on the same query cannibalizes the first.

Step 3: Write each post

File: packages/web/src/app/blog/posts/<slug>.ts

ts
import type { BlogPost } from './index';

export const post: BlogPost = {
  title: 'Primary Keyword In Natural Title',
  description: 'Meta description, 140-170 chars, contains the keyword, states the payoff.',
  date: 'YYYY-MM-DD',            // today
  category: 'Guide',             // Guide | Reference | Tutorial | Comparison | AI Testing | API Testing | Migration | BDD | Performance
  content: `
# Same Title As Above

Opening paragraphs that answer the query directly...
`,
};

Per-article bar (all required):

  • Content >= 1200 words; H1 equals title
  • At least one markdown table (comparison, metrics, or reference)
  • Code blocks for technical topics; ESCAPE backticks inside the template literal (\`\`\`)
  • At least 2 internal links to existing posts (/blog/<existing-slug>); verify each target exists in posts/index.ts before linking
  • No em dashes anywhere; no invented statistics (attribute figures or mark them approximate)
  • No ${ in prose unless intentionally interpolating; escape as \${ if literal
  • End with a ## Frequently Asked Questions section (3-4 ### Question? H3s with short answers) as the LAST H2. It counts toward the word bar and src/lib/extract-faqs.ts turns it into FAQPage JSON-LD for AI-search citation. Without it, articles tend to land short of 1200 words.

Step 4: Register in BOTH registries

packages/web/src/app/blog/posts/index.ts needs three edits per post:

  1. Import: import { post as camelCaseName } from './<slug>'; (with the other imports)
  2. posts map entry: '<slug>': camelCaseName, placed BEFORE the batch ...Object.fromEntries spreads
  3. postList entry: { slug: '<slug>', ...camelCaseName }, placed before the batch spreads at the end

Missing 1 or 2 = the page 404s. Missing 3 = invisible on /blog and absent from the sitemap. Do not touch sitemap.ts; it derives from postList.

Step 5: Verify locally (do not skip)

bash
cd /Users/promode/qaskills
# exactly 2 quoted occurrences per slug in index.ts (map key + postList)
for s in slug-one slug-two; do
  c=$(grep -c "'$s'" packages/web/src/app/blog/posts/index.ts)
  [ "$c" -eq 2 ] || echo "REGISTRATION WRONG: $s count=$c"
done
# no em dashes in the new files
grep -l '—' packages/web/src/app/blog/posts/<each-new-slug>.ts && echo "EM DASH FOUND"
# build must pass
pnpm --filter @qaskills/shared build && pnpm --filter @qaskills/web build

Fix and re-run until all three are clean. Build failure in a post file is almost always an unescaped backtick or ${ in the template literal.

Show full SKILL.md (317 more words)Show less

Step 6: Commit

bash
git -C /Users/promode/qaskills add \
  packages/web/src/app/blog/posts/<slug-one>.ts \
  packages/web/src/app/blog/posts/<slug-two>.ts \
  packages/web/src/app/blog/posts/index.ts
git -C /Users/promode/qaskills diff --cached --stat   # only your files
git -C /Users/promode/qaskills commit -m "feat: publish 10 SEO articles (YYYY-MM-DD) from keyword research"
git -C /Users/promode/qaskills push origin main

Explicit paths only. No trailers, no footers, no em dash in the message.

Step 7: Deploy

REQUIRED SUB-SKILL: ship-prod. Follow it exactly (worktree if the tree is dirty, explicit project IDs, its verification checklist).

Step 8: Prove it live

bash
for s in slug-one slug-two; do
  code=$(curl -s -o /dev/null -w '%{http_code}' "https://qaskills.sh/blog/$s")
  echo "$s: $code"
done
curl -s https://qaskills.sh/sitemap.xml | grep -c '<one-new-slug>'   # >= 1

Every slug must return 200 and appear in the sitemap. Report the checked URLs in the final summary.

Step 9: Ping IndexNow (Bing + Yandex + Naver + Seznam)

After the new slugs are confirmed live (step 8), notify IndexNow so Bing and the other participating engines crawl them fast. Submit only the NEW slugs, not the whole sitemap. The verification key file is already hosted at https://qaskills.sh/f1e4781767e4472e9061ad0f853449d3.txt (committed in packages/web/public/); do not regenerate it.

bash
# Build the payload from just this batch's new slugs
python3 - "$@" <<'PY'
import json, sys
slugs = ["slug-one", "slug-two"]  # replace with this batch's new slugs
urls = [f"https://qaskills.sh/blog/{s}" for s in slugs]
json.dump({
  "host": "qaskills.sh",
  "key": "f1e4781767e4472e9061ad0f853449d3",
  "keyLocation": "https://qaskills.sh/f1e4781767e4472e9061ad0f853449d3.txt",
  "urlList": urls,
}, open("/tmp/indexnow-batch.json", "w"))
print("urls:", len(urls))
PY
curl -s -o /dev/null -w 'Bing IndexNow: %{http_code}\n' -X POST 'https://www.bing.com/indexnow' \
  -H 'Content-Type: application/json; charset=utf-8' --data @/tmp/indexnow-batch.json
curl -s -o /dev/null -w 'IndexNow.org: %{http_code}\n' -X POST 'https://api.indexnow.org/indexnow' \
  -H 'Content-Type: application/json; charset=utf-8' --data @/tmp/indexnow-batch.json

200 or 202 means accepted. A 403 SiteVerificationNotCompleted means the key file was not reachable; confirm the txt URL returns the bare key as text/plain and retry. This is a fire-and-forget hint, not a gate: a non-200 here does not un-publish the batch, but report it. Google is not an IndexNow participant; it discovers the posts through the sitemap and robots.txt as before.

Failure modes

SymptomCauseFix
Build: Unexpected token / template error in a postUnescaped backtick or ${ in contentEscape as \` and \${
Article 404 liveMissing posts map entry, or deploy did not actually runStep 5 count check, then re-run ship-prod verification
Article absent from /blog and sitemapMissing postList entryAdd it, rebuild, redeploy
An OLD article changed contentNew slug collided with a batch-array slugRename the new slug, restore, redeploy
Sitemap grep = 0 but page is 200Deployed stale HEAD or sitemap cachedConfirm commit is in HEAD, redeploy, re-check

Red flags: stop and restart the step

  • Writing a post file before running the step 2 grep
  • "The slug is probably unique"
  • git add -A or staging files you did not create
  • Skipping the build because "it's just content"
  • Reporting done without step 8 output in hand

© PramodDutta, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/publish-seo-batch of PramodDutta/qaskills.

Open the folder on GitHubat commit 1d2a092

Compare with similar skills

Publish SEO Batch next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Publish SEO Batch compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Publish SEO Batch this skillPramodDutta/qaskills235—~2.2kAutomated safety check: PassMIT
Blog CannibalizationAgriciDaniel/claude-blog2.3k1 repos~2.2kAutomated safety check: PassMIT
Article Writingericrisco/rsc-harness180—~2.9kAutomated safety check: PassMIT
Ink Briefjeremylongshore/tons-of-skills-marketplace2.8k—~1.2kAutomated safety check: NotesMIT
Blog Post CounterInfrasity-Labs/dev-gtm-claude-skills136—~3.9kAutomated safety check: PassMIT
SEO Keyword ResearchVarnan-Tech/opendirectory674—~1.8kAutomated safety check: PassMIT

Similar skills

  • Blog Cannibalization

    AgriciDaniel/claude-blog

    Detect keyword cannibalization across blog posts by extracting primary keywords from titles and headings, clustering semantically similar targets, and flagging posts competing for the same search…

    2.3k GitHub starsUsed in 1 repo~2.2k tokens
    Writing & ContentAuto-check passed
  • Article Writing

    ericrisco/rsc-harness

    A skill your agent uses when writing one long-form article end to end — answer-first lede, question-shaped headings, plus its on-page surface (title, meta, slug, FAQ, Article/FAQPage JSON-LD) — or…

    180 GitHub stars~2.9k tokensUpdated today
    Writing & ContentAuto-check passed
  • Ink Brief

    jeremylongshore/tons-of-skills-marketplace

    Content brief generator — takes a topic or keyword and produces a complete content brief with target keyword, search intent, recommended structure, internal link targets, word count, CTA, and…

    2.8k GitHub stars~1.2k tokensUpdated today
    Writing & ContentAuto-check: notes
  • Blog Post Counter

    Infrasity-Labs/dev-gtm-claude-skills

    Counts and compares blog posts across a target and competitors, audits content freshness via sitemap lastmod dates, and maps competitor organic keywords (US, non-branded, informational) against the…

    136 GitHub stars~3.9k tokensUpdated 3 mo ago
    Writing & ContentAuto-check passed
  • SEO Keyword Research

    Varnan-Tech/opendirectory

    SEO keyword research workflow for blog generation using Google Trends data.

    674 GitHub stars~1.8k tokensUpdated 1 mo ago
    Marketing & SEOAuto-check passed
  • SEO Aeo Blog Writer

    sickn33/agentic-awesome-skills

    Writes search-intent-led long-form articles with answer-first structure, FAQ coverage, internal links, and conversion paths for SEO and AEO.

    47k GitHub starsUsed in 1 repo~1.5k tokens
    Marketing & SEOAuto-check passed

More from PramodDutta/qaskills

All 11 skills in this repo
  • Add Seed Skills

    PramodDutta/qaskills

    A skill your agent uses when adding or editing QA skills in seed-skills/ or getting them onto the live qaskills.sh catalog, e.g.

    235 GitHub stars~1.4k tokensUpdated 6 days ago
    Auto-check: notes
  • Ship Prod

    PramodDutta/qaskills

    A skill your agent uses when deploying qaskills.sh to production, verifying whether a deploy landed, or when a push to main did not show up on the live site, e.g.

    235 GitHub stars~1k tokensUpdated 6 days ago
    Auto-check passed
  • API Testing REST

    PramodDutta/qaskills

    Comprehensive RESTful API testing patterns covering HTTP methods, status codes, request/response validation, authentication, error handling, and contract testing.

    235 GitHub stars~4.9k tokensUpdated 6 days ago
    Auto-check passed
  • Claude Code QA

    PramodDutta/qaskills

    The complete QA skill for Claude Code — turn Claude into an expert QA engineer that picks the right test type, writes reliable Playwright, Cypress, and pytest tests, eliminates flaky tests, enforces…

    235 GitHub stars~2.3k tokensUpdated 6 days ago
    Auto-check passed
  • Cypress E2E

    PramodDutta/qaskills

    End-to-end testing skill using Cypress for web applications, covering custom commands, network intercepts, fixtures, cy.session, and component testing patterns.

    235 GitHub stars~3.4k tokensUpdated 6 days ago
    Auto-check passed
  • E2E Testing Claude Code

    PramodDutta/qaskills

    Make Claude Code write and maintain end-to-end tests like a senior SDET — Playwright and Cypress flows with stable locators, the Page Object Model, fixtures, reused auth state, network mocking, and…

    235 GitHub stars~1.4k tokensUpdated 6 days ago
    Auto-check passed

Questions about Publish SEO Batch

What does Publish SEO Batch do?

A skill your agent uses when publishing SEO blog articles to qaskills.sh, e.g. Publish SEO Batch is an agent skill from PramodDutta/qaskills.g.

When should I use Publish SEO Batch?

Publish SEO Batch fits situations like: publishing SEO blog articles to qaskills.sh; tasks that involve Blog and article writing; tasks that involve Keyword research.

How do I install Publish SEO Batch in Claude Code?

Run `npx skills add PramodDutta/qaskills --skill publish-seo-batch -a claude-code`. Or copy the skill folder (.claude/skills/publish-seo-batch in PramodDutta/qaskills) into .claude/skills/publish-seo-batch in your project. Claude Code loads it when a task matches its description.

How do I install Publish SEO Batch in Codex?

Run `npx skills add PramodDutta/qaskills --skill publish-seo-batch -a codex`. Or copy the skill folder (.claude/skills/publish-seo-batch in PramodDutta/qaskills) into .agents/skills/publish-seo-batch in your project. Codex loads it when a task matches its description.

Can I use Publish SEO Batch in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add PramodDutta/qaskills --skill publish-seo-batch -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/publish-seo-batch, .gemini/skills/publish-seo-batch, .github/skills/publish-seo-batch and .opencode/skills/publish-seo-batch in your project.

What does Publish SEO Batch need to run?

Going by SKILL.md and its folder, Publish SEO Batch needs the command-line tools its instructions call (git, curl, pnpm and python3). Our summary lists: Python 3.

Does Publish SEO Batch access the network?

SKILL.md names 3 domains. In commands or code: qaskills.sh, bing.com and api.indexnow.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.

Is Publish SEO Batch safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Publish SEO Batch use?

Publish SEO Batch is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Publish SEO Batch use?

About 2.2k tokens (SKILL.md is roughly 8.6k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Publish SEO Batch?

Skills that share tags, products or a category with Publish SEO Batch: Blog Cannibalization (AgriciDaniel/claude-blog, 2.3k stars), Article Writing (ericrisco/rsc-harness, 180 stars), Ink Brief (jeremylongshore/tons-of-skills-marketplace, 2.8k stars) and Blog Post Counter (Infrasity-Labs/dev-gtm-claude-skills, 136 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Publish SEO Batch?

PramodDutta (a GitHub user) maintains it in PramodDutta/qaskills, which has 235 GitHub stars. The repository holds 11 skills in this directory. The repository was last updated on October 4, 2026.

Source: PramodDutta/qaskills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.