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.1.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.1-py3-none-any.whl (54.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: seofleet_cli-0.2.1.tar.gz
  • Upload date:
  • Size: 50.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for seofleet_cli-0.2.1.tar.gz
Algorithm Hash digest
SHA256 1f8b53f067e21fc69e4a30acebf86f6621db69582e1bcd9ad24b31ccce8e5942
MD5 f92caeb477f4a75910ad49b27bcacc95
BLAKE2b-256 0aa04c4632224f0643906713adccac2811648e028410e148431d29a503aea47d

See more details on using hashes here.

Provenance

The following attestation bundles were made for seofleet_cli-0.2.1.tar.gz:

Publisher: publish-pypi.yml on RudrenduPaul/SeoFleet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

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

File metadata

  • Download URL: seofleet_cli-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 54.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for seofleet_cli-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5d470fa73eedc4b62adbbb791bcb7be13b1e5da69dee4d02b4f7f282d273810c
MD5 132ea0ea11ef34cace09d5b6e98b88ba
BLAKE2b-256 c7a76fb5f377f506f8b001216d8e090683d71e22fd2831b37ccb0a49d942ca9e

See more details on using hashes here.

Provenance

The following attestation bundles were made for seofleet_cli-0.2.1-py3-none-any.whl:

Publisher: publish-pypi.yml on RudrenduPaul/SeoFleet

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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