A small, repeatable SEO QA toolkit for proving that a public web surface is crawlable, fast, measurable, and visually credible from search to landing.
This repository was extracted from the NodeRoom SEO loop. It intentionally contains only the workflow, not the product app.
Storyboard first: public proof media and SEO claims should follow
docs/FEATURE_PROOF_STORYBOARD.md. The
storyboard keeps static SEO checks, Search Console data, controlled browser
capture, Gemini visual QA, and receipt boundaries separate.
- Audits static SEO files: titles, descriptions, canonicals, sitemap, robots.txt, JSON-LD, Open Graph, and private-route noindex guards.
- Pulls Google Search Console query and page data without scraping rankings.
- Records a controlled Playwright landing journey.
- Captures one fresh Google-origin journey from a real Chrome session through CDP when manual proof is needed.
- Compresses videos or screenshot frames into review MP4s.
- Sends the final MP4 to Gemini for structured visual QA.
- Writes machine-readable JSON and Markdown receipts.
- Documents a hub-and-spoke keyword cluster workflow inspired by
AgriciDaniel/codex-seo.
If a new product ranks for a long-tail phrase but not for the bare brand name, that usually means the brand entity is not strong enough yet for Google to disambiguate it.
For example, NodeRoom collaborative AI room is a specific phrase. The bare query noderoom competes with older/high-authority meanings such as music channels, blockchain node services, docs pages, and other exact or near-exact names. Search results also vary by account, location, data center, and personalization.
The ethical fix is:
- request indexing for the canonical URL in Search Console;
- keep the homepage title, H1, canonical, schema, and organization/profile links consistent;
- publish public entity anchors such as GitHub, docs, changelog, blog, and social profiles;
- earn real links and mentions;
- monitor Search Console impressions, CTR, and average position.
Do not run fake search clicks, ranking scrapes, or bot traffic.
npm install
npx playwright install chromium
cp .env.example .env.localCopy config/seo-workflow.config.example.json and point it at your static site output:
{
"baseUrl": "https://your-site.example",
"siteRoot": "dist",
"publicDir": ".",
"rootHtml": "index.html",
"publicRoutes": ["/", "/pricing/", "/faq/"],
"privatePatterns": ["/*?room=", "/*?demo="],
"privateNoindexRequired": true
}npm run audit -- --config config/seo-workflow.config.example.json
PLAYWRIGHT_BASE_URL=https://your-site.example npm run journey
npm run perf -- --base-url https://your-site.example
npm run search-console -- --site-url https://your-site.example/
npm run capture:cdp -- --search "Your brand exact product phrase" --target-host your-site.example --base-url https://your-site.example
npm run frames:video -- --input-dir artifacts/chrome-cdp-search
npm run judge-video -- --input artifacts/chrome-cdp-search.review.mp4 --scenario google-originUse docs/KEYWORD_CLUSTER.md before adding pages. The short version:
- exact-brand page for the bare brand query;
- pillar page for the broad solution category;
- focused spokes for one intent each;
- internal links between pillar, spokes, use cases, and comparisons;
- Search Console monitoring before adding more pages.
NodeRoom used this pattern for searches such as NodeRoom, collaborative AI workspace, AI agent collaboration workspace, source-backed AI workflow, AI diligence room, and AI research workspace.
GOOGLE_GENERATIVE_AI_API_KEYfor Gemini video judging.GOOGLE_SEARCH_CONSOLE_ACCESS_TOKENorGOOGLE_APPLICATION_CREDENTIALSfor Search Console.- A local Chrome with remote debugging enabled for
capture:cdp.
On Windows, launch a separate Chrome profile for CDP capture:
Start-Process "$env:ProgramFiles\Google\Chrome\Application\chrome.exe" -ArgumentList "--remote-debugging-port=9222 --user-data-dir=$env:TEMP\nodeseo-chrome"Default outputs go under:
docs/reports/seo-audit.latest.jsondocs/reports/SEO_AUDIT.mddocs/reports/search-console.latest.jsondocs/reports/SEARCH_CONSOLE_REPORT.mddocs/reports/performance-check.latest.jsondocs/reports/PERFORMANCE_QA_REPORT.mdartifacts/
Generated artifacts are gitignored by default.
- Do not commit
.env, service account JSON, access tokens, or API keys. - Do not retain raw Google account, location, sign-out, or personalization URLs in capture receipts.
- Do not scrape Google rankings at scale or simulate clicks.
- Treat Search Console as the source of truth for query performance.
- Label model reviews as visual QA, not as official search ranking proof.