Schema and field types
You build the schema in the fields editor. Each field has a key, a label, a type, an order, a required flag, and a config (help text, placeholder, min/max). One field is marked as the title: it becomes the H1 on the detail page, the name on list cards, and the base for SEO.
- Reference: a field that points to an entry of another collection
- Lookup: shows a field of the referenced entry, stores no value of its own
- Rollup: count, sum, average, min or max over the linked entries
- Multi-select, currency, percent, image gallery, color, phone
Entries and status
Each entry (record) has a status: draft, published, archived. Only published entries reach the public site. You edit in a grid or a form, reorder, duplicate, bulk delete. Every entry keeps a version history: you can reread a past version and restore it.
Per-locale translation
An entry carries default data plus per-locale overrides (data_i18n). Translatable fields (text, long text, rich text, url, email) can hold a different value per language. Public rendering picks the right locale and falls back to the default value when a translation is missing.
Public submissions and end-user accounts
A collection can accept entries created from a site form, with a forced status (draft or published). In owner-scoped mode, each end-user only sees their own entries, and you can require a verified email. The end-user directory is managed from the admin: list, per-user count, CSV export, resend of the verification email, removal of an account.
Plans and subscriptions
The workspace can sell access to its app. You create plans with a monthly or yearly price, in the currency you pick. The Stripe price is immutable: changing the amount mints a new price and points the plan at it, existing subscriptions keep their original rate. End-users go through checkout via Stripe Connect, cancel, and the billing dashboard shows MRR normalized per currency. This part stays inert until the workspace connects Stripe.