Stable field IDs
Fields are addressed by ID, not by label. Rename a field in the UI and every template binding and API integration keeps working.
Define content types the way an engineer would design a schema — not the way a page builder forces you to. Every field carries a stable ID, so templates and integrations survive a field rename instead of silently breaking.
Short text, rich text, relations, media, enumerations, dates, decimals, JSON, and typed components give you a real content model — the same primitives you’d reach for designing a database schema, exposed to editors as structured fields.
Fields are addressed by ID, not by label. Rename a field in the UI and every template binding and API integration keeps working.
Relate records to each other and constrain fields at the schema level, so bad data is rejected at entry, not discovered downstream.
Schema changes run with dry-run impact checks and apply forward-only — evolving a content type never resets the records already in it.
Build reusable, nested components once, then let editors assemble flexible page bodies from an allow-listed set of blocks — no copy-pasted field groups, no developer ticket to rearrange a page.
Define a component — an address, a pricing tier, a FAQ entry — once, and reuse it across every content type that needs it.
Give editors a curated set of blocks to assemble into a page body, without opening the layout up to arbitrary HTML.
Every field can carry per-locale values with a clear default-locale source record, so translation stays structured, not duplicated.
Define fields, add a component, and see a generated page bound to real data.