Model content exactly how you think about it.
Compose fields visually or in code. Every change is versioned, typed and reflected in the generated APIs within a second.
Contexa is the developer-first headless CMS: model content in code, publish through fast typed APIs, and keep every team moving without giving up flexibility.
| Title | Model | Status | Locales | Updated |
|---|
Editors get a fast, familiar workspace. Developers keep models, roles and environments in the repository, where they can be reviewed.
Compose fields visually or in code. Every change is versioned, typed and reflected in the generated APIs within a second.
Write, review and publish without stepping on each other. Presence, comments and full revision history are built in.
Start at the fish market before eight, when the boats are still unloading. Then walk the old wharf to the ferry terminal and take the 10:40 boat north.
Upload, tag and reuse images, video and documents. Crops are generated on request and cached at the edge.
Give freelancers draft access to one model, let reviewers publish but never delete, and keep internal notes away from guests.
| Model | Edit | Publish | Delete |
|---|
Models are plain TypeScript in your repository. Save the file and contexa dev updates the editor form, the GraphQL schema and your generated types.
Official SDKs for the frameworks your team ships with. Each snippet below is the whole integration.
Add the typed client to your app.
Link the project to a workspace and pull generated types.
Fetch typed content in a server component, load function or endpoint. Drafts appear with a preview token.
Types are generated from your models, so guide.readingTime autocompletes everywhere.
guide.titleguide.coverpage.blocksStage a redesign, a new locale or a whole season. Review a field-level diff, preview it on its own URL, then merge.
The controls your security review asks about, on by default and documented.
SAML single sign-on and automatic provisioning for Enterprise workspaces.
Every publish, permission change and API key, with who and when. Kept for a year.
Choose EU (Frankfurt) or US (Ohio) when you create a workspace.
Hourly snapshots and point-in-time restore for 30 days.
Contractual on Enterprise, with credits and a public status page.
Report and a GDPR data processing agreement available on request.
Our writers publish a guide in forty minutes now. Developers stopped being the bottleneck for every comma.
“We moved 1,900 help-center articles in a weekend with the import CLI. Our writers never filed a single ticket about it.”
“Branches let merchandising stage a whole season of product stories without touching production.”
Self-host the MIT-licensed core on your own infrastructure.
Postgres and any S3-compatible storage
Read the self-host guideManaged hosting with branches, image CDN and backups.
Billed monthly. 14-day trial, no card.
Start freeFor regulated teams and high-traffic publishing.
Annual contract, invoiced
Contact sales| Feature | Open source | Cloud | Enterprise |
|---|
Anything else is probably in the docs. If it is not, the engineers who build Contexa answer the forum.
Browse the docsCreate a Cloud workspace and we will email the link. Free for 14 days, no card needed.
Use your work email so teammates can find the workspace.
Connect a project to Contexa, define your first model in TypeScript and query it from your frontend. Plan on about ten minutes.
You need Node.js 20 or later and a Contexa Cloud workspace. Prefer your own servers? Jump to Self-hosting; every step below works the same.
Add the client and the schema package. The CLI ships with the client, so there is nothing to install globally.
npm i @contexa/client @contexa/schema npx contexa login npx contexa link halvorne
contexa link writes a .env.local file with the variables below. Keep the token server-side; the browser only ever sees published content.
| Variable | Purpose |
|---|---|
| CONTEXA_PROJECT | Workspace slug, for example halvorne. |
| CONTEXA_TOKEN | Read token for published content. Rotate it from Settings, API keys. |
| CONTEXA_PREVIEW_TOKEN | Reads drafts and branches. Only use it on preview deployments. |
| CONTEXA_REGION | eu or us. Set once, when the workspace is created. |
import { defineConfig } from '@contexa/schema'
export default defineConfig({
project: process.env.CONTEXA_PROJECT!,
models: './contexa/models',
locales: ['en', 'nb', 'de'],
defaultLocale: 'en',
})Models live in your repository. Each field type maps to an editor control in the Studio and to a typed field in the API.
import { defineModel, field } from '@contexa/schema'
export const guide = defineModel({
name: 'Guide',
fields: {
title: field.text({ required: true, localized: true }),
slug: field.slug({ from: 'title' }),
cover: field.media({ accept: ['image/*'] }),
body: field.richText({ localized: true }),
},
})Run npx contexa push to apply the model to a development branch. In production, models change only through your CI pipeline.
The client is generated from your models, so every query is typed end to end.
import { createClient } from '@contexa/client'
export const contexa = createClient({
project: process.env.CONTEXA_PROJECT!,
token: process.env.CONTEXA_TOKEN!,
})
const guide = await contexa.guide.findBySlug('fjord-ferries', { locale: 'en' })Pass the preview token to read unpublished entries. The Studio opens your preview URL with the entry already selected.
A branch is a full copy of your content that you can edit, preview and merge. Create one from the Studio or the CLI.
npx contexa branch create autumn-campaign npx contexa branch diff autumn-campaign npx contexa branch merge autumn-campaign --into main
Merges respect required reviewers. If a reviewer role is set on the target branch, merge waits for an approval in the Studio.
Contexa signs every webhook with your signing secret. Verify the contexa-signature header before you trust the payload.
{
"event": "entry.published",
"model": "guide",
"id": "gd_7Hq2kP",
"slug": "fjord-ferries",
"locales": ["en", "nb"],
"branch": "main",
"at": "2026-09-30T06:12:44Z"
}The open-source core runs as one container next to Postgres and any S3-compatible bucket.
npx create-contexa@latest --self-host docker compose up -d open http://localhost:4100/studio
Every release of the Studio, the APIs and the SDKs. Self-hosted releases follow within a week.
Branch, diff, preview and merge content with required reviewers.
Set a focal point once and every generated crop keeps it in frame.
Publish a set of entries together at a fixed time, per locale.
See formatting and embed changes inline instead of as JSON.
Different review steps for each market, with their own reviewers.
Keep writing on a train; changes sync when you reconnect.
Transform payloads before they reach your build system.
14 days of Cloud, then choose a plan. No card needed to start.
Already have a workspace? Sign in
.env.local by the CLI.“We had the Studio in front of editors on the first afternoon, and our first guide live by Friday.”
We will email you a sign-in link. No password to remember.
New to Contexa? Start free
A 30-minute call with a solutions engineer, not a sales script. We reply within one business day.
A Nordic travel publisher moved 2,300 guides off a page builder and gave 14 editors their own release schedule.
Before Contexa, Halvorne's guides lived in a page builder bolted onto their marketing site. Editors could change text, but anything structural, from a new section to a translated slug, meant a ticket for one of four developers.
"We were publishing two guides a week in the busiest season," says Signe Aaland, who leads the digital platform team. "The writers had more material than we could ship."
The team rebuilt their content as four models in TypeScript: Guide, Destination, Author and Page. Fields that differ by market, like prices and ferry times, are localized; everything else is shared, so a new cover photo updates all eleven languages at once.
"The model review happens in a pull request. That alone saved us a month of meetings."
Halvorne now prepares each season in a content branch. The autumn campaign touched 140 entries; editors reviewed it on a preview URL for two weeks and merged it on 1 October with one click.
"We went from two guides a week to a guide a day," Signe says, "and nobody on my team has touched a CMS ticket since spring."
Uncached crops took up to 1.8 s for 26 minutes after a cache node failed. Resolved by draining the node.
Webhook deliveries were delayed by up to 4 minutes during a queue migration. No events were lost.
Magic-link emails arrived up to 10 minutes late for some workspaces. Our email provider resolved a routing issue.
Last updated 1 September 2026. This policy explains what Contexa Labs collects when you use our website, the Studio and the APIs.
Account details you give us (name, work email, workspace name), billing details handled by our payment processor, and usage data such as API request counts and Studio sessions. We do not sell personal data.
Entries and assets in your workspace belong to you. We process them only to run the service, and they stay in the region you chose: EU (Frankfurt) or US (Ohio).
The marketing site sets no cookies; your theme choice is kept in your browser's local storage. The Studio uses session cookies to keep you signed in. We do not use advertising cookies.
You can export or delete your account at any time from Settings. For access or correction requests, email privacy@contexa.example and we will respond within 30 days.
Last updated 1 September 2026. These terms apply to Contexa Cloud. The open-source core is covered by the MIT license.
You are responsible for the people you invite to a workspace and for keeping API tokens secret. Tell us within 72 hours if you believe a token has leaked.
Cloud plans are billed per project, monthly or yearly in advance. Usage above the included API requests is billed at the end of each month at $2 per million requests.
We aim for 99.9% monthly uptime on all plans. Enterprise contracts include a 99.95% SLA with service credits, described in your order form.
You can cancel at any time. Your content stays exportable for 30 days after cancellation, after which it is deleted from our systems and backups.
The link may be out of date, or the page moved when we reorganised the docs.
Can we link the ferry timetable here? Readers ask for it every season.
Linked it, and updated the cover crop for mobile.