easeo
A deterministic SEO metadata generator: one Rust core with Python, Node.js, and Rust APIs.
Takes an entity, route, and site config, and returns canonical URL, title, description, robots, Open Graph, Twitter Cards, and JSON-LD.
Tests
310
Entity types
11
Integrations
10
Docs pages
64
Problem
SEO libraries tend to mix metadata generation with scoring, keyword analysis, and content rewriting. The output varies run to run, which makes it hard to snapshot-test, hash, cache, or diff. Platforms that render in more than one language end up with subtly different payloads per stack.
Key decisions
One core, three bindings
All logic lives in easeo-core. Python and Node.js wrap the same engine, and the cross-language conformance suite asserts byte-for-byte identical output.
Pure determinism
No timestamps, randomness, environment reads, or hidden I/O. The same inputs always produce the same payload, so output can be hashed and committed.
SEO contracts for CI
build_seo_contract emits machine-readable SEO intent that can be committed and validated as code, catching metadata regressions in review.
Scoped extension registries
HookRegistry and SchemaRegistry add post-processing and custom JSON-LD without touching the core, scoped to a config rather than global.
Tradeoffs
- Not a framework: adapters marshal inputs, they do not own application lifecycle
- Not a scoring, keyword-analysis, crawling, or content-rewriting tool
- Renders a head snippet, not a full document; alpha release status