The headless CMS,
on your terms.
bincms gives your team a TypeScript-first schema, per-field localization, and full multi-tenancy — running entirely on infrastructure you own. No vendor lock-in. No per-seat pricing. No trade-offs.
Your schema lives in your repo.
Content types are defined in TypeScript — no proprietary schema language, no YAML, no GUI-only configuration. Refactor it like any other code, review it in PRs, ship it with your build.
// content types are TypeScript — reviewed in PRs, refactored like code import { defineType, defineField } from 'bincms' export default defineType({ name: 'product', type: 'document', title: 'Product', fields: [ defineField({ name: 'title', type: 'string', localize: true }), defineField({ name: 'sku', type: 'string', localize: false }), defineField({ name: 'body', type: 'richtext', localize: true }), defineField({ name: 'gallery', type: 'image', array: true }), defineField({ name: 'category', type: 'content', options: { type: 'category' }, }), ], })
Translate what you mean to translate.
One localize flag per field. Title varies per language; SKU stays global. The delivery API composes them automatically.
Drafts are drafts. Published is published.
The delivery API only ever returns published data. No accidental leaks, no "preview mode" footguns.
Custom field types are React components.
Register a manifest in your workspace; it's bundled at build. No fork required.
Built for teams that take content seriously.
Multi-tenancy, localization, custom fields, and clean API namespaces — not bolted on as paid add-ons, but designed in from the first commit.
You own your data
Runs wherever you want. No third party. No SaaS dependency. No per-seat pricing tied to a platform you can't leave.
TypeScript schema, end-to-end
defineType / defineField — in your repo, in PRs, in your build. No proprietary DSL, no YAML, no GUI-only state.
Per-field localization
One flag per field. Translate titles, share SKUs and media. The delivery API composes shared and localized fields for you.
Multi-tenancy, built in
Every piece of data — content, media, globals, users, languages — scoped to a tenant. Hostname routing, role-based membership.
Clean content lifecycle
Drafts are drafts. Published is published. Edit drafts freely; publish each language variant independently. No accidental leaks.
Three clean API namespaces
/management, /delivery, /workspace. No collisions, no backdoors. OpenAPI generated automatically.
Pluggable by design
Custom field types and sidebar apps register as React components. Live in your workspace, bundled at build, no forking.
Database-agnostic contracts
Storage is defined as TypeScript interfaces validated by a shared contract test suite. Swap drivers without rewriting.
No bloat
Biome for lint & format. Hono for the server. React + Vite + Tailwind v4 for the studio. One sharp tool per job.
A monorepo of sharp, small packages.
Your application sits on top of a thin orchestration layer that picks the right storage driver at runtime. Storage contracts are interfaces — drivers implement them and pass a shared contract test suite.
How bincms stacks up.
The honest version. We're not trying to be every CMS — we're trying to be the right CMS for teams who care about owning their stack.
| Feature | bincms | Sanity | Contentful | Strapi | Payload | Umbraco |
|---|---|---|---|---|---|---|
| Self-hosted | Yes | Cloud only | Cloud only | Yes | Yes | Yes |
| TypeScript schema | First-class | Yes | No | — Partial | Yes | No |
| Per-field localization | Built in | — Partial | — Partial | — Plugin | — Plugin | Yes |
| Multi-tenancy | Built in | — Enterprise | — Enterprise | — Plugin | — Manual | — Partial |
| Database choice | SQLite + drivers | Proprietary | Proprietary | Several | PostgreSQL | SQL family |
| No usage-based pricing | Yes | No | No | Yes | Yes | Yes |
| Plugin system | React-native | Yes | Yes | Yes | Yes | Yes |
| Delivery API | REST + OpenAPI | GROQ | REST | REST | REST | REST |
One contract. Multiple drivers.
Storage is defined as a set of TypeScript interfaces validated by a shared contract test suite. Pick your database with one environment variable.
BINCMS_STORAGE_DRIVER=sqlite
|
BINCMS_SQLITE_FILE=app/cms/data/cms.sqlite
From zero to studio in three commands.
The scaffold sets up the workspace, installs the studio, and seeds an example schema so you can hit the ground running.
Scaffold a new project
Creates the workspace, installs dependencies, and seeds an example schema.
Run the studio
Starts the Vite dev server and the Hono API. Hot reload across schema, plugins, and UI.
Build for production
Builds all workspace packages in dependency order. Output is a single Node app.
Ship the CMS
your stack deserves.
One command. Your schema, your database, your infrastructure — ready to ship in minutes.