The official CLI for the SEO.md open standard — AEO (AI Engine Optimization) infrastructure for technical founders.
Use it to scaffold, validate, analyze, and sync SEO.md files directly from your repo.
- Why SEO.md
- Install
- Quick Start
- Configuration
- Commands
- Local Development
- Testing
- Release Notes (Contributor Tagging)
- Security
- Specification Reference
- License
SEO.md is a structured, version-controlled specification for describing your site, intent queries, and pages so AI engines can cite you more often.
- Declare what matters (site, identity, keywords, intent, pages)
- Run audits via your connected platform
- Write back
_analysisblocks and per-page playbooks into your repo
npm install -g seomd-cliOr run without installing (zero-install):
npx seomd-cli initVerify:
seomd --helpRun in the root of your project:
seomd initOr non-interactively with flags:
seomd init -y --type local
# or
seomd init --brand "Acme" --domain acme.com --primary-keyword "local seo"seomd validateseomd analyze
seomd syncseomd status
seomd status --jsonCopy .env.example from your platform provider docs, or create one with the vars you need:
Required for live audits:
SEOMD_API_URL=
SEOMD_API_KEY=your_key_hereOptional:
SEOMD_PAYMENT_TOKEN= # x402 pay-per-scan token
SEOMD_DOMAIN= # override domain headerIf you don't have a platform key yet,
seomd initstill works without.env.
Scaffolds SEO.md, SEO.REVERSE.md, and the .seo/ intelligence directory.
Usage:
seomd init # interactive 5-question flow
seomd init -y --type local # skip prompts, use defaults
seomd init --brand "Acme" --domain acme.com # non-interactive with partial flags
seomd init --type saas --brand "MyApp" --domain myapp.com --primary-keyword "billing automation" --output ./new-projectOptions:
| Flag | Description |
|---|---|
-y, --yes |
skip prompts, use defaults |
--type <type> |
site type: saas, ecommerce, local, blog, marketplace |
--brand <name> |
brand name |
--domain <domain> |
primary domain |
--primary-keyword <keyword> |
primary keyword |
--competitors <list> |
comma-separated competitor list |
--output <dir> |
scaffold into a new (empty) directory instead of cwd |
Behavior:
- Interactive flow by default (5 questions)
- Non-interactive when
-yis set OR any config flag (--brand,--domain,--primary-keyword,--competitors) is provided --typealone pre-selects site type in the interactive flow--outputwrites all files to the target directory (must be empty or non-existent)
Validates your SEO.md against the spec requirements.
Shows current citation rates and gap scores from _analysis.
--jsonoutputs machine-readable JSON for scripts/CI
Runs an AI search audit via your connected platform and writes results back into:
SEO.md(_analysisblocks)SEO.REVERSE.md(generated reverse view).seo/pages/*.md(per-page playbooks when available)
Pulls cached/latest platform intelligence and writes it back to the same files as analyze.
--dry-runprints a preview and does not modify files
seomd-cli ships with type-specific templates under src/templates/. seomd init --type <type> uses the matching template automatically.
| Type | Template dir | Best for |
|---|---|---|
saas |
src/templates/saas/ |
Software products, B2B tools, web apps |
blog |
src/templates/blog/ |
Content sites, newsletters, personal brands |
ecommerce |
src/templates/ecommerce/ |
Online stores, DTC brands, product catalogs |
local |
src/templates/local/ |
Service-area businesses, locations pages |
marketplace |
src/templates/marketplace/ |
Two-sided platforms, directories |
Each template contains:
SEO.md— pre-filled with type-specific intent queries, page structures, and negative keywordsSEO.REVERSE.md— reverse-engineer output scaffold with placeholders for competitor analysis
Want to customize a template? Copy the relevant folder, edit the placeholders ({{brand}}, {{domain}}, etc.), and use --type with your custom scaffold.
Prefer the local entrypoint while developing:
node ./bin/seomd.js --help
node ./bin/seomd.js init
node ./bin/seomd.js validate
node ./bin/seomd.js status --jsonnpm testTo generate a contributor section for a release (commit-based attribution), maintain mappings in .github/contributors.yml and generate markdown from a tag range:
npm run release:contributors -- --from v1.0.2 --to v1.0.3To write output to a file:
npm run release:contributors -- --from v1.0.2 --to v1.0.3 --out notes/v1.0.3-contributors.mdTo generate a full release note (changes + contributors) for a tag:
npm run release:notes -- --tag v1.0.3Automation: the repository includes a GitHub Actions workflow that runs on tag push (v*) and creates/updates the GitHub Release using scripts/release-notes.js.
To enable live intelligence writebacks (using automated platforms like Foxcite):
-
Obtain a developer API key from your platform provider.
-
Export the key as an environment variable:
export SEOMD_API_KEY="your_api_key_here"
-
Run
seomd syncorseomd analyze.
Note: Never commit your API keys or .env files containing keys to version control.
- Never commit
.envfiles or API keys - Use
.env.exampleas the template for required variables
Read the complete specification and guidelines at seomd.dev/spec.
MIT License. Developed and maintained by the community.