SEO METADATA · MULTI-LANGUAGE SDK

easeo

A deterministic SEO metadata generator: one Rust core with Python, Node.js, and Rust APIs.

Takes a content entity, its route, and a site config, and returns canonical URL, title, description, robots directives, Open Graph, Twitter Cards, and JSON-LD.

Rust core Python Node.js JSON-LD MIT
Entity + route + config │ ▼ URL normalization (HTTPS, slashes, query allowlist) │ ▼ Fallback chain resolution │ ┌─────────┼─────────┬─────────┐ ▼ ▼ ▼ ▼ Meta Open Twitter JSON-LD + robots Graph Cards schemas │ │ │ │ └─────────┼─────────┴─────────┘ ▼ Payload + SHA-256 hash / ETag │ ▼ render_html() head snippet

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, and are scoped to a config rather than global.

Results

Tests
310
Entity types
11
Integrations
10
Docs pages
64

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