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.
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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1f8b53f067e21fc69e4a30acebf86f6621db69582e1bcd9ad24b31ccce8e5942
|
|
| MD5 |
f92caeb477f4a75910ad49b27bcacc95
|
|
| BLAKE2b-256 |
0aa04c4632224f0643906713adccac2811648e028410e148431d29a503aea47d
|
Provenance
The following attestation bundles were made for seofleet_cli-0.2.1.tar.gz:
Publisher:
publish-pypi.yml on RudrenduPaul/SeoFleet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
seofleet_cli-0.2.1.tar.gz -
Subject digest:
1f8b53f067e21fc69e4a30acebf86f6621db69582e1bcd9ad24b31ccce8e5942 - Sigstore transparency entry: 2203469022
- Sigstore integration time:
-
Permalink:
RudrenduPaul/SeoFleet@65d57c7524a4cf6f5ba2238a4f7c4c78ae59c882 -
Branch / Tag:
refs/tags/python-v0.2.1-retry - Owner: https://github.com/RudrenduPaul
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@65d57c7524a4cf6f5ba2238a4f7c4c78ae59c882 -
Trigger Event:
release
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5d470fa73eedc4b62adbbb791bcb7be13b1e5da69dee4d02b4f7f282d273810c
|
|
| MD5 |
132ea0ea11ef34cace09d5b6e98b88ba
|
|
| BLAKE2b-256 |
c7a76fb5f377f506f8b001216d8e090683d71e22fd2831b37ccb0a49d942ca9e
|
Provenance
The following attestation bundles were made for seofleet_cli-0.2.1-py3-none-any.whl:
Publisher:
publish-pypi.yml on RudrenduPaul/SeoFleet
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
seofleet_cli-0.2.1-py3-none-any.whl -
Subject digest:
5d470fa73eedc4b62adbbb791bcb7be13b1e5da69dee4d02b4f7f282d273810c - Sigstore transparency entry: 2203469057
- Sigstore integration time:
-
Permalink:
RudrenduPaul/SeoFleet@65d57c7524a4cf6f5ba2238a4f7c4c78ae59c882 -
Branch / Tag:
refs/tags/python-v0.2.1-retry - Owner: https://github.com/RudrenduPaul
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@65d57c7524a4cf6f5ba2238a4f7c4c78ae59c882 -
Trigger Event:
release
-
Statement type: