
Geo Fundamentals
Run a Generative Engine Optimization audit on public HTML/JSX pages so AI search engines can cite your content with proper structure, authorship, and FAQ signals.
Overview
geo-fundamentals is an agent skill most often used in Launch (also Grow content refreshes) that audits public web pages for Generative Engine Optimization signals so AI engines can cite them reliably.
Install
npx skills add https://github.com/sickn33/antigravity-awesome-skills --skill geo-fundamentalsWhat is this skill?
- Python `geo_checker.py` scans a project path for AI citation readiness on indexable web content
- Targets HTML and JSX/TSX page components; explicitly skips markdown dev docs and config-only trees
- Skips non-public dirs (node_modules, .next, dist, tests, docs) so scores reflect customer-facing pages
- Checks aligned with GEO: structured data, author info, publication dates, and FAQ-style sections
- Checker intentionally excludes markdown developer docs in favor of HTML and JSX/TSX page files
Adoption & trust: 833 installs on skills.sh; 40.1k GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
Your marketing pages render in the browser but lack the structure, authorship, and FAQ cues that generative search systems use when picking sources to cite.
Who is it for?
Indie SaaS or content sites with React/Next-style page components who want a repeatable script audit before launch or after a site refresh.
Skip if: Private markdown READMEs, developer-only docs folders, XML sitemap-only tasks, or teams with no indexable marketing HTML yet.
When should I use this skill?
User wants GEO, generative engine optimization, AI citation readiness, or to audit public web content for Perplexity/ChatGPT-style discovery.
What do I get? / Deliverables
You get a GEO-oriented audit of public HTML/JSX pages with concrete gaps to fix in templates and content before you rely on AI-driven discovery.
- GEO audit output from project scan
- Prioritized list of missing citation signals per page pattern
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
GEO audits are first needed at launch when public pages go live, but the same checks apply whenever you ship new landing or marketing surfaces. AI citation readiness—structured data, author metadata, dates, FAQ blocks—is categorized under launch → geo, distinct from classic XML sitemap technical SEO.
Where it fits
Run geo_checker.py on the marketing app before launch week to fix missing author and date markup on pricing and docs landing routes.
Re-audit JSX page templates after publishing a batch of comparison articles meant to be quoted by AI assistants.
Sanity-check a prototype landing page for FAQ and structured data before you point paid traffic at it.
Gate a release checklist item confirming public routes pass GEO basics alongside functional QA.
How it compares
GEO citation checker for live page files—not the xml-sitemap skill and not a keyword-rank tracker.
Common Questions / FAQ
Who is geo-fundamentals for?
Solo builders shipping customer-facing web pages who want an agent-guided GEO audit focused on AI citation signals rather than generic copy editing.
When should I use geo-fundamentals?
At launch before promoting a site, when adding new landing routes, during grow-phase content updates, or when you ask how to optimize pages for ChatGPT and Perplexity citations.
Is geo-fundamentals safe to install?
The checker reads local project files only; review the Security Audits panel on this Prism page and run it in your repo without pointing it at secrets-heavy paths you do not intend to scan.
SKILL.md
READMESKILL.md - Geo Fundamentals
#!/usr/bin/env python3 """ GEO Checker - Generative Engine Optimization Audit Checks PUBLIC WEB CONTENT for AI citation readiness. PURPOSE: - Analyze pages that will be INDEXED by AI engines (ChatGPT, Perplexity, etc.) - Check for structured data, author info, dates, FAQ sections - Help content rank in AI-generated answers WHAT IT CHECKS: - HTML files (actual web pages) - JSX/TSX files (React page components) - NOT markdown files (those are developer docs, not public content) Usage: python geo_checker.py <project_path> """ import sys import re import json from pathlib import Path # Fix Windows console encoding try: sys.stdout.reconfigure(encoding='utf-8', errors='replace') sys.stderr.reconfigure(encoding='utf-8', errors='replace') except AttributeError: pass # Directories to skip (not public content) SKIP_DIRS = { 'node_modules', '.next', 'dist', 'build', '.git', '.github', '__pycache__', '.vscode', '.idea', 'coverage', 'test', 'tests', '__tests__', 'spec', 'docs', 'documentation' } # Files to skip (not public pages) SKIP_FILES = { 'jest.config', 'webpack.config', 'vite.config', 'tsconfig', 'package.json', 'package-lock', 'yarn.lock', '.eslintrc', 'tailwind.config', 'postcss.config', 'next.config' } def is_page_file(file_path: Path) -> bool: """Check if this file is likely a public-facing page.""" name = file_path.stem.lower() # Skip config/utility files if any(skip in name for skip in SKIP_FILES): return False # Skip test files if name.endswith('.test') or name.endswith('.spec'): return False if name.startswith('test_') or name.startswith('spec_'): return False # Likely page indicators page_indicators = ['page', 'index', 'home', 'about', 'contact', 'blog', 'post', 'article', 'product', 'service', 'landing'] # Check if it's in a pages/app directory (Next.js, etc.) parts = [p.lower() for p in file_path.parts] if 'pages' in parts or 'app' in parts or 'routes' in parts: return True # Check filename indicators if any(ind in name for ind in page_indicators): return True # HTML files are usually pages if file_path.suffix.lower() == '.html': return True return False def find_web_pages(project_path: Path) -> list: """Find public-facing web pages only.""" patterns = ['**/*.html', '**/*.htm', '**/*.jsx', '**/*.tsx'] files = [] for pattern in patterns: for f in project_path.glob(pattern): # Skip excluded directories if any(skip in f.parts for skip in SKIP_DIRS): continue # Check if it's likely a page if is_page_file(f): files.append(f) return files[:30] # Limit to 30 pages def check_page(file_path: Path) -> dict: """Check a single web page for GEO elements.""" try: content = file_path.read_text(encoding='utf-8', errors='ignore') except Exception as e: return {'file': str(file_path.name), 'passed': [], 'issues': [f"Error: {e}"], 'score': 0} issues = [] passed = [] # 1. JSON-LD Structured Data (Critical for AI) if 'application/ld+json' in content: passed.append("JSON-LD structured data found") if '"@type"' in content: if 'Article' in content: passed.append("Article schema present") if 'FAQPage' in content: passed.append("FAQ schema present") if 'Organization' in content or 'Person' in content: passed.append("Entity schema present") else: issues.append("No JSON-LD structured data (AI engines prefer structured content)") # 2. Heading Structure h1_count = len(re.findall(r'<h1[^>]*>', content, re.I)) h2_count = len(re.findall(r'<h2[^>]*>', content, re.I)) if h1_count == 1: