Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Check blog posts and articles before publishing, and audit live pages after publishing. Finds broken links, weak sources, missing SEO elements, and citation problems. Post-publish check runs 251 SEO rules via SEOmator CLI and adds custom checks for llms.txt, hreflang, and Core Web Vitals. Use when: reviewing a draft, auditing content quality, checking if links still work, verifying sources are credible, running pre-publish QA, or doing post-publish page checks. Also triggers on: 'check this arti
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 93% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 47% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 111% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 41% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 59% | 0% |
Use this skill to audit content reliability before or after publishing.
curl available in PATH (for HTTP HEAD checks)r.jina.ai — used as a fallback for SERP search and competitor page fetching via browser rendering (handles JavaScript-heavy pages). Pass --no-jina to disable if needed.bash npm install -g @seomator/seo-audit seomator self doctor # verify installation If SEOmator is not installed, post_publish_check.py automatically falls back to basic checks (title / H1 / meta / canonical) and prints an install prompt.
--psi-key or set in config.Run the unified runner for normal draft review:
bashpython3 skills/seo-geo-qa/scripts/seo_qa_runner.py path/to/article.md --keyword "best email apps"
If you know the site's main domain, pass it so internal vs external links are counted correctly:
bashpython3 skills/seo-geo-qa/scripts/seo_qa_runner.py path/to/article.md --keyword "best email apps" --site-domain example.com
If you want project defaults, pass a lightweight JSON config:
bashpython3 skills/seo-geo-qa/scripts/seo_qa_runner.py path/to/article.md --keyword "best email apps" --config path/to/seo-geo-qa.json
seo_qa_runner.py on the draft.post_publish_check.py on the live URL.Use these only when debugging a specific failure mode.
bashpython3 skills/seo-geo-qa/scripts/verify_links.py path/to/article.md python3 skills/seo-geo-qa/scripts/verify_links.py path/to/article.md --json
bash# Auto-search (uses DuckDuckGo + Jina Reader fallback for browser-rendered content access) python3 skills/seo-geo-qa/scripts/serp_gap_analyzer.py "best email apps" path/to/article.md # Supply competitor URLs directly (skips search, still uses Jina to fetch pages) python3 skills/seo-geo-qa/scripts/serp_gap_analyzer.py "best email apps" path/to/article.md --urls https://competitor1.com https://competitor2.com # Disable Jina (direct HTTP only, faster but may fail on JavaScript-rendered pages) python3 skills/seo-geo-qa/scripts/serp_gap_analyzer.py "best email apps" path/to/article.md --no-jina
How the SERP search works:
r.jina.ai) which renders the page with a real browser and decodes DDG's redirect linksFull audit (SEOmator 251 rules + custom checks for llms.txt / hreflang / CWV):
bash# Standard — SEOmator + custom checks python3 skills/seo-geo-qa/scripts/post_publish_check.py https://example.com/blog/post # With Core Web Vitals (requires PageSpeed Insights API key) python3 skills/seo-geo-qa/scripts/post_publish_check.py https://example.com/blog/post --psi-key YOUR_KEY # Scope SEOmator to specific categories (faster) python3 skills/seo-geo-qa/scripts/post_publish_check.py https://example.com/blog/post --categories core,technical,schema # Lightweight fallback — skip SEOmator, run custom checks only python3 skills/seo-geo-qa/scripts/post_publish_check.py https://example.com/blog/post --no-seomator # JSON output for automation python3 skills/seo-geo-qa/scripts/post_publish_check.py https://example.com/blog/post --json
What the post-publish check covers:
| Layer | Source | Checks | |---|---|---| | SEOmator | 251 rules / 20 categories | Core SEO, Performance, Links, Images, Security, Technical SEO, Schema, JS Rendering, Accessibility, Mobile, i18n, E-E-A-T, AI/GEO Readiness, … | | Custom | llms.txt | Existence + HTTP 200 at /llms.txt | | Custom | hreflang | Self-reference validation, return-link symmetry | | Custom (optional) | PageSpeed Insights API | LCP, CLS, INP, FCP, TTFB field data |
The runner writes timestamped markdown + JSON reports by default.
Default behavior:
qa-reports/<article-slug>/ next to the articleOverride with --report-dir or config.
Read references/configuration.md when you need project-level defaults.
Read references/source-tiers.md when you need to decide whether a citation is acceptable.
Read references/verdict-rules.md when you need to tune PASS / FAIL / REVISE behavior.
Read references/example-report.md for a real QA report with annotations on how to interpret each section.
The seo_qa_runner.py JSON output includes a llm_review_required flag and a llm_review_items list. These identify checks that scripts cannot resolve deterministically — keyword intent alignment, borderline source quality, word count near thresholds, and SERP overlap edge cases.
When llm_review_required is true, read llm_review_items and apply editorial judgment before issuing a final verdict. Do not pass or fail on these items automatically.
This skill is not a writing assistant. It is a reliability layer.
Scripts handle deterministic checks (link liveness, source tiers, structural metrics). LLM handles semantic judgment only — and only for items explicitly listed in llm_review_items. Do not let LLM re-evaluate what scripts have already decided.
Other measured skills in the registry, with their headline benchmark lift.