Skip to main content

Zero-config, cross-platform SEO and GEO (generative engine optimization) checker: 12 checks against a live site, plus multi-site fleet mode, in pure Python with no extra runtime toolchain.

Project description

seofleet-cli (Python)

Zero-config SEO and GEO (generative engine optimization) checker: 21 checks against a live site, plus a multi-site fleet mode for agencies checking several client sites at once, in pure Python with no extra runtime toolchain -- no headless browser, no separate interpreter to provision.

PyPI version License: MIT Python versions CI npm version

Why this exists

SeoFleet checks a website for 21 technical-SEO and GEO issues -- title/meta description length, canonical tags, robots.txt/sitemap.xml reachability (with a robots.txt Sitemap: fallback), heading structure, image alt coverage and weight, Open Graph and Twitter Card tags, meta robots directives, redirect-chain health, JSON-LD structured data, llms.txt, AI-crawler directives (training and search crawlers tracked separately -- GPTBot/OAI-SearchBot, ClaudeBot/Claude-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended), FAQ schema, Speakable schema, Organization schema, Markdown content negotiation, an RFC 8288 Link header, and content-extraction friendliness -- and reports PASS/WARN/FAIL with a fix suggestion for anything short of a clean pass. This package is the Python distribution of the tool: a genuine, independent port of the npm CLI's logic, not a wrapper around the Node binary. It ships with zero runtime dependencies -- HTML parsing and HTTP fetching both use only the Python standard library.

Install

pip install seofleet-cli

or with uv:

uv add seofleet-cli

The complementary JS/TS distribution installs from npm: npm install -g seofleet-cli -- see the project README for that package. Both packages read the same 21-check spec and are intended to report the same PASS/WARN/FAIL verdicts for the same site; neither is deprecated in favor of the other.

Quickstart

seofleet init ./my-site --site-url https://example.com
seofleet check ./my-site

init scaffolds a seofleet.json config (and a Claude Code skill file) in the target directory; check runs all 21 checks against the configured siteUrl and prints a PASS/WARN/FAIL line per check plus a summary. Pass --json before the subcommand for structured output an agent can parse:

seofleet --json check ./my-site

Or call the library directly (the agent-native path, no subprocess):

from seofleet import load_site, run_checks, ALL_CHECKS

ctx = load_site("https://example.com")
results = run_checks(ALL_CHECKS, ctx)
for r in results:
    print(f"[{r.status}] ({r.category}) {r.name}: {r.message}")

How it works

seofleet.json -> site URL -> fetch homepage + robots.txt + sitemap.xml + llms.txt (parallel)
   -> 21 checks (12 technical + 9 GEO) run against the shared fetched context
   -> PASS / WARN / FAIL per check -> exit code (0 clean / 1 any FAIL / 2 usage error)

Full data model, the 21 checks explained, and fleet-mode semantics are in docs/concepts.md and docs/getting-started.md. The checks are reimplemented as genuine Python logic against the same check contract the npm package uses (Check.run(ctx) -> CheckResult) -- see those docs for what each check actually verifies.

Fleet mode

seofleet fleet ./fleet.json

Runs the full 21-check suite against every site declared in a local JSON manifest ({"sites": [{"name": ..., "path": ...}]}) in one invocation -- local filesystem only, no SSH, no remote execution. Aimed at agencies or teams checking several client repos side by side. Add --out-dir ./reports to also write one auto-named report file per site, named from the manifest's name field.

CI integration

- uses: actions/checkout@v4
- uses: actions/setup-python@v5
  with:
    python-version: '3.12'
- run: pip install seofleet-cli
- run: seofleet check ./my-site --json > results.json

Full walkthrough in docs/integrations/ci.md.

Security

seofleet's fetch layer only ever dials http(s), follows redirects manually one hop at a time, refuses to follow a redirect whose Location targets a non-http(s) scheme, and bounds the redirect chain at 5 hops so a redirect loop can't hang the process -- see SECURITY.md for the full policy and how to report a vulnerability. Honest note: this project does not currently publish SLSA provenance, Sigstore signatures, or an SBOM, and has no OpenSSF Scorecard badge set up -- none of that infrastructure exists yet for either distribution, so it isn't claimed here.

Contributing

See CONTRIBUTING.md.

cd python
python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
pytest

License

MIT, see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

seofleet_cli-0.2.0.tar.gz (50.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

seofleet_cli-0.2.0-py3-none-any.whl (54.9 kB view details)

Uploaded Python 3

File details

Details for the file seofleet_cli-0.2.0.tar.gz.

File metadata

  • Download URL: seofleet_cli-0.2.0.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for seofleet_cli-0.2.0.tar.gz
Algorithm Hash digest
SHA256 04c0c24a90c78be21b2e5b6d30d219182ad8561cfd14e6c19f75e24938bab920
MD5 40cd23bbd18e65e9f7b47f5fba788304
BLAKE2b-256 769ddcc6485f12477c67c3ee2723606100bfb26002022461e0d018fba8224e1d

See more details on using hashes here.

File details

Details for the file seofleet_cli-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: seofleet_cli-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 54.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.6

File hashes

Hashes for seofleet_cli-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 60094cb9364d294fcd13fa8950e6d43e839ccc8aad7df6862a2b9b4e0afbfadf
MD5 db293562a7f05431fc222298cd3ad1ce
BLAKE2b-256 c58d4d7a0757361b333e12120fe86f6d5ac2c7ae4eeb9756baa2d5d05455f410

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page