GEO-first SEO skill for Claude Code. Comprehensive AI search optimization for any website — citability scoring, AI crawler analysis, brand authority, schema markup, platform-specific optimization, and PDF reports. If you want learn how to sell this to real businesses, check out the skool community
This report summarizes scanner evidence for zubair-trabzada/geo-seo-claude, a Python project with 10,996 GitHub stars. SynthScan examined 14,597 lines of code across 67 source files, recording 178 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 20.7 (Elevated pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Can maintainers explain intent, assumptions, and trade-offs? 125 finding(s).
Are imports declared and package/API names verified? 18 finding(s).
Are wrappers, guards, and repeated structures necessary? 52 finding(s).
Which changes need focused human review? 178 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 178 distinct pattern matches across 11 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | agents/geo-technical.md | 17 | ### Step 1: Fetch Page HTML and Response Headers | COMMENT |
| LOW | agents/geo-technical.md | 29 | ### Step 2: Robots.txt and XML Sitemap | COMMENT |
| LOW | agents/geo-technical.md | 49 | ### Step 3: Meta Tags Analysis | COMMENT |
| LOW | agents/geo-technical.md | 65 | ### Step 4: Security Headers | COMMENT |
| LOW | agents/geo-technical.md | 88 | ### Step 5: URL Structure | COMMENT |
| LOW | agents/geo-technical.md | 108 | ### Step 6: Mobile Optimization | COMMENT |
| LOW | agents/geo-technical.md | 123 | ### Step 7: Core Web Vitals Assessment | COMMENT |
| LOW | agents/geo-technical.md | 154 | ### Step 8: Server-Side Rendering and JavaScript Dependency (CRITICAL) | COMMENT |
| LOW | agents/geo-technical.md | 182 | ### Step 9: Additional Technical Checks | COMMENT |
| LOW | agents/geo-technical.md | 190 | ### Step 10: Agent-Readiness Signals (non-scoring) | COMMENT |
| LOW | agents/geo-technical.md | 209 | ### Step 11: Calculate Technical Score | COMMENT |
| LOW | agents/geo-platform-analysis.md | 16 | ### Step 1: Google AI Overviews (AIO) Readiness | COMMENT |
| LOW | agents/geo-platform-analysis.md | 43 | ### Step 2: ChatGPT Web Search Optimization | COMMENT |
| LOW | agents/geo-platform-analysis.md | 70 | ### Step 3: Perplexity AI Optimization | COMMENT |
| LOW | agents/geo-platform-analysis.md | 100 | ### Step 4: Google Gemini Optimization | COMMENT |
| LOW | agents/geo-platform-analysis.md | 128 | ### Step 5: Bing Copilot Optimization | COMMENT |
| LOW | agents/geo-platform-analysis.md | 161 | ### Step 6: Cross-Platform Comparison | COMMENT |
| LOW | agents/geo-platform-analysis.md | 171 | ### Step 7: Platform-Specific Action Items | COMMENT |
| LOW | agents/geo-schema.md | 23 | ### Step 1: Detect Existing Structured Data | COMMENT |
| LOW | agents/geo-schema.md | 48 | ### Step 2: Parse and Validate Detected Schemas | COMMENT |
| LOW | agents/geo-schema.md | 74 | ### Step 3: Check Google Rich Result Eligibility | COMMENT |
| LOW | agents/geo-schema.md | 101 | ### Step 4: Evaluate Critical GEO Schemas | COMMENT |
| LOW | agents/geo-schema.md | 191 | ### Step 5: Flag Deprecated and Restricted Schemas | COMMENT |
| LOW | agents/geo-schema.md | 207 | ### Step 6: Note JavaScript-Injected Schema Warning | COMMENT |
| LOW | agents/geo-schema.md | 219 | ### Step 7: Generate Recommended JSON-LD Templates | COMMENT |
| LOW | agents/geo-schema.md | 240 | ### Step 8: Score Schema Completeness | COMMENT |
| LOW | agents/geo-ai-visibility.md | 17 | ### Step 1: Fetch and Extract Target Content | COMMENT |
| LOW | agents/geo-ai-visibility.md | 24 | ### Step 2: Citability Analysis | COMMENT |
| LOW | agents/geo-ai-visibility.md | 44 | ### Step 3: AI Crawler Access Check | COMMENT |
| LOW | agents/geo-ai-visibility.md | 83 | ### Step 4: llms.txt Analysis | COMMENT |
| LOW | agents/geo-ai-visibility.md | 109 | ### Step 5: Brand Mention Scanning | COMMENT |
| LOW | agents/geo-ai-visibility.md | 145 | ### Step 6: Compile AI Visibility Report Section | COMMENT |
| LOW | agents/geo-ai-visibility.md | 149 | ### Step 7: Calculate AI Visibility Score | COMMENT |
| LOW | agents/geo-content.md | 17 | ### Step 1: Extract and Analyze Page Content | COMMENT |
| LOW | agents/geo-content.md | 32 | ### Step 2: Experience Evaluation | COMMENT |
| LOW | agents/geo-content.md | 56 | ### Step 3: Expertise Evaluation | COMMENT |
| LOW | agents/geo-content.md | 81 | ### Step 4: Authoritativeness Evaluation | COMMENT |
| LOW | agents/geo-content.md | 105 | ### Step 5: Trustworthiness Evaluation | COMMENT |
| LOW | agents/geo-content.md | 132 | ### Step 6: Content Metrics | COMMENT |
| LOW | agents/geo-content.md | 172 | ### Step 7: AI Content Indicators | COMMENT |
| LOW⚡ | agents/geo-content.md | 195 | ### Step 8: Topical Authority Assessment | COMMENT |
| LOW⚡ | agents/geo-content.md | 205 | ### Step 9: Content Freshness | COMMENT |
| LOW⚡ | agents/geo-content.md | 214 | ### Step 10: Calculate Content Score | COMMENT |
| LOW | skills/geo-crawlers/SKILL.md | 220 | ### Step 1: Fetch and Parse robots.txt | COMMENT |
| LOW⚡ | skills/geo-crawlers/SKILL.md | 231 | ### Step 2: Check Meta Robots Tags | COMMENT |
| LOW⚡ | skills/geo-crawlers/SKILL.md | 241 | ### Step 3: Check HTTP Headers | COMMENT |
| LOW⚡ | skills/geo-crawlers/SKILL.md | 250 | ### Step 4: Check for AI-Specific Files | COMMENT |
| LOW⚡ | skills/geo-crawlers/SKILL.md | 257 | ### Step 5: Assess JavaScript Rendering Requirements | COMMENT |
| LOW | skills/geo-crawlers/SKILL.md | 268 | ### Step 6: Parse Content Signals | COMMENT |
| LOW | skills/geo-crawlers/SKILL.md | 283 | ### Step 7: Detect Cloudflare Managed robots.txt | COMMENT |
| LOW | skills/geo-update/SKILL.md | 20 | ### Step 1: Determine Installed Location | COMMENT |
| LOW | skills/geo-update/SKILL.md | 35 | ### Step 2: Clone Latest from Upstream | COMMENT |
| LOW | skills/geo-update/SKILL.md | 44 | ### Step 3: Compare Installed vs Latest | COMMENT |
| LOW | skills/geo-update/SKILL.md | 55 | ### Step 4: Apply Updates | COMMENT |
| LOW⚡ | skills/geo-update/SKILL.md | 97 | ### Step 5: Update Python Dependencies | COMMENT |
| LOW⚡ | skills/geo-update/SKILL.md | 107 | ### Step 6: Clean Up | COMMENT |
| LOW⚡ | skills/geo-update/SKILL.md | 113 | ### Step 7: Report Results | COMMENT |
| LOW | skills/geo-llmstxt/SKILL.md | 161 | ### Step 1: Fetch the File | COMMENT |
| LOW | skills/geo-llmstxt/SKILL.md | 171 | ### Step 2: Validate Format | COMMENT |
| LOW | skills/geo-llmstxt/SKILL.md | 189 | ### Step 3: Assess Content Quality | COMMENT |
| 35 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | install-win.sh | 4 | # ============================================================ | COMMENT |
| MEDIUM | install-win.sh | 7 | # ============================================================ | COMMENT |
| MEDIUM | uninstall.sh | 4 | # ============================================================ | COMMENT |
| MEDIUM | uninstall.sh | 6 | # ============================================================ | COMMENT |
| MEDIUM | install.sh | 4 | # ============================================================ | COMMENT |
| MEDIUM | install.sh | 8 | # ============================================================ | COMMENT |
| MEDIUM | tests/test_fetch_page_ssr.py | 36 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | tests/test_fetch_page_ssr.py | 38 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_fetch_page_ssr.py | 149 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test_fetch_page_ssr.py | 151 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | scripts/crm_dashboard.py | 37 | # ── Paths ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/crm_dashboard.py | 44 | # ── Color helpers ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/crm_dashboard.py | 82 | # ── Load CRM ─────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/crm_dashboard.py | 91 | # ── Views ────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/crm_dashboard.py | 296 | # ── Main ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/webapp/app.py | 29 | # ── Helpers ──────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/webapp/app.py | 82 | # ── Template filters ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/webapp/app.py | 102 | # ── Routes ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | scripts/webapp/app.py | 211 | # ── Run ───────────────────────────────────────────────────────────────── | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | tests/test_fetch_page_ssr.py | 156 | def test_plain_html_has_ssr_content_true(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 160 | def test_plain_html_has_no_csr_error(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 173 | def test_wordpress_bricks_not_flagged(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 179 | def test_wordpress_bricks_no_csr_error(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 186 | def test_litespeed_cache_not_flagged(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 192 | def test_litespeed_cache_no_csr_error(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 197 | def test_prerender_service_not_flagged(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 203 | def test_prerender_service_no_csr_error(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 215 | def test_empty_app_div_flagged(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 221 | def test_empty_app_div_has_error(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 226 | def test_loading_root_div_flagged(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 232 | def test_loading_root_div_has_error(self): | CODE |
| LOW⚡ | tests/test_fetch_page_ssr.py | 241 | def test_csr_error_includes_word_count(self): | CODE |
| LOW | tests/test_fetch_page_ssr.py | 256 | def test_root_with_nested_scripts_and_rich_text_not_flagged(self): | CODE |
| LOW⚡ | tests/test_fetch_robots_cloudflare.py | 53 | def test_detects_cloudflare_managed_block(self): | STRING |
| LOW⚡ | tests/test_fetch_robots_cloudflare.py | 59 | def test_plain_robots_is_not_flagged(self): | STRING |
| LOW⚡ | tests/test_fetch_robots_cloudflare.py | 63 | def test_missing_robots_is_not_flagged(self): | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | scripts/llmstxt_generator.py | 124 | except Exception: | CODE |
| HIGH | scripts/brand_scanner.py | 131 | except Exception: | CODE |
| HIGH | scripts/brand_scanner.py | 145 | except Exception: | CODE |
| HIGH | scripts/fetch_page.py | 452 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/llmstxt_generator.py | 116 | except Exception as e: | CODE |
| LOW | scripts/llmstxt_generator.py | 124 | except Exception: | CODE |
| LOW | scripts/llmstxt_generator.py | 146 | except Exception as e: | CODE |
| LOW | scripts/llmstxt_generator.py | 260 | except Exception: | CODE |
| LOW | scripts/brand_scanner.py | 131 | except Exception: | CODE |
| LOW | scripts/brand_scanner.py | 145 | except Exception: | CODE |
| LOW | scripts/citability_scorer.py | 258 | except Exception as e: | CODE |
| LOW | scripts/fetch_page.py | 204 | except Exception as e: | CODE |
| LOW | scripts/fetch_page.py | 319 | except Exception as e: | CODE |
| LOW | scripts/fetch_page.py | 345 | except Exception as e: | CODE |
| LOW | scripts/fetch_page.py | 452 | except Exception: | CODE |
| LOW | scripts/fetch_page.py | 468 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/brand_scanner.py | 18 | CODE | |
| LOW | scripts/brand_scanner.py | 23 | CODE | |
| LOW | scripts/crm_dashboard.py | 14 | CODE | |
| LOW | scripts/crm_dashboard.py | 26 | CODE | |
| LOW | scripts/crm_dashboard.py | 29 | CODE | |
| LOW | scripts/crm_dashboard.py | 29 | CODE | |
| LOW | scripts/crm_dashboard.py | 29 | CODE | |
| LOW | scripts/crm_dashboard.py | 30 | CODE | |
| LOW | scripts/crm_dashboard.py | 31 | CODE | |
| LOW | scripts/webapp/app.py | 15 | CODE | |
| LOW | scripts/webapp/app.py | 15 | CODE | |
| LOW | scripts/webapp/app.py | 15 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/llmstxt_generator.py | 30 | CODE | |
| LOW | scripts/llmstxt_generator.py | 130 | CODE | |
| LOW | scripts/brand_scanner.py | 104 | CODE | |
| LOW | scripts/citability_scorer.py | 26 | CODE | |
| LOW | scripts/citability_scorer.py | 247 | CODE | |
| LOW | scripts/fetch_page.py | 36 | CODE | |
| LOW | scripts/fetch_page.py | 210 | CODE | |
| LOW | scripts/fetch_page.py | 414 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_fetch_page_ssr.py | 52 | <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do | CODE |
| LOW | tests/test_fetch_page_ssr.py | 52 | <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do | CODE |
| LOW | agents/geo-schema.md | 366 | - Generated templates should use realistic placeholder patterns like `[REPLACE: Your company name]` rather than lorem ip | CODE |
| LOW | docs/commands-reference.md | 516 | /geo proposal example.com --tier standard --client-name "Acme Corp" | CODE |
| LOW | scripts/brand_scanner.py | 269 | print("Example: python brand_scanner.py 'Acme Corp' acmecorp.com") | CODE |
| LOW | skills/geo-schema/SKILL.md | 284 | "streetAddress": "123 Main St", | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | README.md | 120 | │ ├── geo-audit/ # Full audit orchestration & scoring | CODE |
| MEDIUM | docs/architecture.md | 10 | │ ├── geo-audit/ # Full audit orchestration & scoring | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/brand_scanner.py | 126 | # Check if top result is about the brand | COMMENT |
| LOW | scripts/citability_scorer.py | 55 | # Check if answer appears early (first 60 words) | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | scripts/brand_scanner.py | 234 | """Generate a comprehensive brand mention report.""" | STRING |