Oratos
Website visibility intelligence for SEO, accessibility, structured metadata, and AI readiness.
Oratos audits and improves websites without owning your workflow. It works on local HTML directories, static exports, and live URLs — useful in CI/CD like Credo, Sobelow, Ruff, or Lighthouse CI.
v0.3.1 ships as a single Rust crate (CLI + library modules) with multi-ecosystem install paths that do not require Rust. API docs on docs.rs include this README.
Install
No Rust required. Pick your environment — full details in docs/install.md.
Linux / macOS
curl -fsSL https://raw.githubusercontent.com/latentmeta/oratos/main/scripts/install.sh | sh
# or: brew install latentmeta/tap/oratos
Windows
scoop bucket add latentmeta https://github.com/latentmeta/scoop-bucket
scoop install oratos
Or download oratos-v*-windows-x86_64.zip from Releases, extract oratos.exe, and add it to your PATH.
Version managers
# mise
mise use -g github:latentmeta/oratos
# asdf
asdf plugin add oratos https://github.com/latentmeta/asdf-oratos.git
asdf install oratos latest
CI / language ecosystems
# GitHub Actions
- uses: latentmeta/oratos/.github/actions/setup-oratos@main
pip install oratos # PyPI
npm install -D @latentmeta/oratos # npm
# mix.exs — only: [:dev, :test], runtime: false
{:oratos, "~> 0.3", only: [:dev, :test], runtime: false}
# then: mix oratos.audit ./priv/static
Rust contributors
cargo install oratos
# or from a checkout:
cargo install --path crates/oratos
Prebuilt binaries for Linux (x86_64/aarch64), macOS (Intel/Apple Silicon), and Windows are published on every v* tag with SHA256SUMS.
Quick start
# Audit a static site directory
oratos audit examples/static_site
# JSON report for tooling
oratos audit examples/static_site --format json --output report.json
# CI gate: fail if overall score is below 85
oratos audit ./priv/static --fail-under 85
# Generate llms.txt draft
oratos generate llms examples/static_site
# LLM remediation prompt for a page
oratos prompt html examples/static_site/index.html
CLI
oratos audit <target> [--format console|json|markdown|html|sarif] [--output PATH] [--fail-under SCORE] [--strict] [--crawl] [--changed-only] [--config PATH]
oratos generate llms <target> [--output PATH]
oratos generate metadata <target> [--output PATH]
oratos prompt html <file-or-url> [--output PATH]
oratos prompt phoenix <file-or-url> [--output PATH]
<target> may be a directory (./priv/static, ./dist), a single HTML file, or a URL (https://example.com).
URL audits: by default a URL fetches one page. Enable multi-page crawl with --crawl or [crawl] enabled = true in oratos.toml (see Configuration).
What Oratos checks
- SEO — title, meta description, canonical, headings, Open Graph, Twitter cards, internal links
- Accessibility — alt text,
lang, landmarks, form labels, link text - Structured data — JSON-LD presence and syntax, WebPage/BreadcrumbList/ImageObject hints
- LLM readiness —
llms.txt, extractable text, summaries, image descriptions
Scores are 0–100 per category. Overall score uses weights: SEO 30%, Accessibility 25%, Structured Data 25%, LLM Readiness 20%. Penalties: error −10, warning −5, info −1 (per category).
Phoenix / Mix
Oratos does not replace Phoenix SEO libraries — it audits rendered HTML after prerendering or static export:
# mix.exs
aliases: [
"seo.audit": ["cmd oratos audit ./priv/static --fail-under 85"],
"seo.report": ["cmd oratos audit ./priv/static --format html --output reports/oratos.html"]
]
See docs/phoenix.md and docs/ci.md.
Library
Use Oratos from Rust without shelling out to the CLI:
[dependencies]
oratos = "0.3"
use oratos::{audit_pages, load_pages, LoadOptions};
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let pages = load_pages("examples/static_site", &LoadOptions::default()).await?;
let report = audit_pages("examples/static_site", &pages);
println!("overall score: {:.1}", report.scores.overall);
Ok(())
}
See docs/architecture.md for module layout. Upgrading from v0.2 split crates? See v0.3.0 release notes. Latest patch notes: v0.3.1.
Documentation
- Install
- Architecture
- Configuration
- Reports — includes JSON schema
- Rule catalog
- Scoring
- CI/CD
- Phoenix workflows
- llms.txt
- Remediation prompts
- Tutorials
- Publishing to crates.io
- Roadmap
- Release notes (v0.3.1)
- pre-commit · Node/Python
Development
cargo test
cargo clippy -- -D warnings
cargo fmt --check
License
MIT — see the LICENSE file.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
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 oratos-0.3.1.tar.gz.
File metadata
- Download URL: oratos-0.3.1.tar.gz
- Upload date:
- Size: 58.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82018cf7867cf51174ff616bd5c553f3aed5bcee782bdead45c374978d822315
|
|
| MD5 |
d33a10ee2ae7fe60453410670cfd07d9
|
|
| BLAKE2b-256 |
bb1bc8adc366c5992389c5e3f55675aaad45bf439559703416a516991408af0d
|
Provenance
The following attestation bundles were made for oratos-0.3.1.tar.gz:
Publisher:
publish-pypi.yml on latentmeta/oratos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oratos-0.3.1.tar.gz -
Subject digest:
82018cf7867cf51174ff616bd5c553f3aed5bcee782bdead45c374978d822315 - Sigstore transparency entry: 2291330303
- Sigstore integration time:
-
Permalink:
latentmeta/oratos@d2f02e150ce573a3938b38123cda4847f70686cc -
Branch / Tag:
refs/heads/main - Owner: https://github.com/latentmeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@d2f02e150ce573a3938b38123cda4847f70686cc -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oratos-0.3.1-py3-none-win_amd64.whl.
File metadata
- Download URL: oratos-0.3.1-py3-none-win_amd64.whl
- Upload date:
- Size: 2.8 MB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3dbff7170960666b598a82d0ecbb8f75293dadc98945310b117266eb8040f008
|
|
| MD5 |
163d3c79278816fbf99580c2af1091fd
|
|
| BLAKE2b-256 |
db18bfb987073a5e52c78dd619d4dcfb08739c48cf2b40802fb67f9421961671
|
Provenance
The following attestation bundles were made for oratos-0.3.1-py3-none-win_amd64.whl:
Publisher:
publish-pypi.yml on latentmeta/oratos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oratos-0.3.1-py3-none-win_amd64.whl -
Subject digest:
3dbff7170960666b598a82d0ecbb8f75293dadc98945310b117266eb8040f008 - Sigstore transparency entry: 2291296692
- Sigstore integration time:
-
Permalink:
latentmeta/oratos@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/latentmeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oratos-0.3.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: oratos-0.3.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 2.9 MB
- Tags: Python 3, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
39eb600f40efd4e3041b09d46b9e40eb52c6777c038db2e7015901f38fe87265
|
|
| MD5 |
d985565a3f481d06c240b33fb1757dbd
|
|
| BLAKE2b-256 |
a01a9ffa9895a9ed842375ad768aee074019584ecd1f1ac790b52923d125be25
|
Provenance
The following attestation bundles were made for oratos-0.3.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
publish-pypi.yml on latentmeta/oratos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oratos-0.3.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
39eb600f40efd4e3041b09d46b9e40eb52c6777c038db2e7015901f38fe87265 - Sigstore transparency entry: 2291296672
- Sigstore integration time:
-
Permalink:
latentmeta/oratos@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/latentmeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oratos-0.3.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: oratos-0.3.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 2.8 MB
- Tags: Python 3, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6f02f88a55deaf797b3d59e0c31897813c20e70bede40a3abdc5299b1eb6f446
|
|
| MD5 |
35429925ddda505f65ec9349685545cd
|
|
| BLAKE2b-256 |
c50cd4c8569f10719bf145aec182a69ee3a1524f4f661a552b424743389c88c4
|
Provenance
The following attestation bundles were made for oratos-0.3.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
publish-pypi.yml on latentmeta/oratos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oratos-0.3.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
6f02f88a55deaf797b3d59e0c31897813c20e70bede40a3abdc5299b1eb6f446 - Sigstore transparency entry: 2291296626
- Sigstore integration time:
-
Permalink:
latentmeta/oratos@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/latentmeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oratos-0.3.1-py3-none-macosx_11_0_arm64.whl.
File metadata
- Download URL: oratos-0.3.1-py3-none-macosx_11_0_arm64.whl
- Upload date:
- Size: 2.7 MB
- Tags: Python 3, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84d83ad8874af4d26109c431bb5ecaf3269b32197b4480c190a08afa3fca09ec
|
|
| MD5 |
de5a4f60b79b12a657fb0142c74a0a51
|
|
| BLAKE2b-256 |
f5bf0b40e3ad8c79318370127b3c55ea4ac9f319cfa4be2d4421c93f356f1911
|
Provenance
The following attestation bundles were made for oratos-0.3.1-py3-none-macosx_11_0_arm64.whl:
Publisher:
publish-pypi.yml on latentmeta/oratos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oratos-0.3.1-py3-none-macosx_11_0_arm64.whl -
Subject digest:
84d83ad8874af4d26109c431bb5ecaf3269b32197b4480c190a08afa3fca09ec - Sigstore transparency entry: 2291296646
- Sigstore integration time:
-
Permalink:
latentmeta/oratos@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/latentmeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Trigger Event:
workflow_dispatch
-
Statement type:
File details
Details for the file oratos-0.3.1-py3-none-macosx_10_12_x86_64.whl.
File metadata
- Download URL: oratos-0.3.1-py3-none-macosx_10_12_x86_64.whl
- Upload date:
- Size: 2.8 MB
- Tags: Python 3, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec31f3240f42af81daa2ef297f502a3d210d13cbbc3e3558692821273e82d395
|
|
| MD5 |
d69844900fd795461cc141f0882b6e2f
|
|
| BLAKE2b-256 |
0d76e0977e861a55e7e7716357cd68016ee449fc1c1cc87369f7c4b82a3a7835
|
Provenance
The following attestation bundles were made for oratos-0.3.1-py3-none-macosx_10_12_x86_64.whl:
Publisher:
publish-pypi.yml on latentmeta/oratos
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
oratos-0.3.1-py3-none-macosx_10_12_x86_64.whl -
Subject digest:
ec31f3240f42af81daa2ef297f502a3d210d13cbbc3e3558692821273e82d395 - Sigstore transparency entry: 2291296712
- Sigstore integration time:
-
Permalink:
latentmeta/oratos@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Branch / Tag:
refs/heads/main - Owner: https://github.com/latentmeta
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@fa8eb91904a0cdbb63683a24a9f20c0537c9a09b -
Trigger Event:
workflow_dispatch
-
Statement type: