Skip to content

Free trials of CMS Orbit open in

Developers

Your stack. Your components. Content from CMS Orbit.

CMS Orbit is headless. Read content with an official SDK for JavaScript, PHP, Swift or Kotlin, or over REST or GraphQL, and refresh your website the moment something's published.

Read the docs

Official SDKs

One API, four SDKs

Every SDK is typed, MIT-licensed and reads the same delivery API, so your website and your apps show the same content.

JavaScript and TypeScript

@bifrost-orbit-cms/sdk on npm. For Next.js, React and any Node.js website, with a React renderer and Next.js helpers.

PHP

bifrost-orbit/cms-sdk with Composer. For Laravel, Symfony and plain PHP 8.1 or later, with SEO helpers and webhook checks.

Swift

CMSOrbit with Swift Package Manager. For apps on iOS 15 or later and macOS 12 or later, with async/await, Codable models and no dependencies.

Kotlin

com.bifrostorbit:cms-sdk with Gradle. For Android apps and JVM servers, with coroutines, and futures for Java.

The JavaScript SDK

Pages in a few lines

The JavaScript SDK, @bifrost-orbit-cms/sdk, is MIT-licensed and on npm. It gives you a typed client, a React renderer, Next.js helpers for preview, cache refresh and sitemaps, SEO output, a mock client for tests and a type generator.

Building in Laravel or Symfony, or a native iOS or Android app? The SDKs for PHP, Swift and Kotlin read the same content, and the type generator writes types for each of them.

app/[[...slug]]/page.tsxTypeScript
import { notFound, redirect } from 'next/navigation'import { CmsPage } from '@bifrost-orbit-cms/sdk/react'import { toMetadata } from '@bifrost-orbit-cms/sdk/seo'import { cms } from '@/lib/cms'import { registry } from '@/cms/registry'export async function generateMetadata({ params }) {  const { slug = [] } = await params  const result = await cms.resolve({ path: '/' + slug.join('/') })  return result.kind === 'page' ? toMetadata(result.page) : {}}export default async function Page({ params }) {  const { slug = [] } = await params  const result = await cms.resolve({ path: '/' + slug.join('/') })  if (result.kind === 'redirect') redirect(result.to)  if (result.kind !== 'page') notFound()  return <CmsPage page={result.page} registry={registry} />}

Typed end to end

Schema changes fail the build, not the website

Generate types from your space and register a React component for each component in the CMS. A missing or misspelt one is a type error, so a schema change that would break the website gets caught before it ships.

REST and GraphQL

Read what you need, the way you like

Read pages, lists, menus, settings and campaigns over REST, or several at once in a single GraphQL request. Responses carry cache headers and match what the editor shows in its API response view.

Also for developers

The rest of the toolkit

Live preview

Editors see drafts in your real website inside the editor and click blocks to select them.

Management API

Scripts and integrations change content through the same API the CMS uses itself.

MCP server

Agents connect over the Model Context Protocol, with the same permissions as the person behind them.

Getting started

Connect a website in an afternoon

  1. 01

    Create two keys

    A public key reads published content. A secret preview key reads drafts, stays on the server and only works against Staging.

  2. 02

    Install and generate types

    Add the SDK for your language and run the type generator against your space.

  3. 03

    Register your components

    Map each component in the CMS to a React component. A missing one is a type error.

  4. 04

    Add preview and refresh

    One route turns on the live preview; another refreshes your cache when a webhook arrives.

Webhooks

Refresh only what changed

The handler checks the signature, rejects messages more than five minutes old and refreshes only the pages, menus and sitemaps that changed. Without the SDK, you can verify the HMAC signature in any language.

app/api/revalidate/route.tsTypeScript
// app/api/revalidate/route.tsimport { createRevalidateHandler } from '@bifrost-orbit-cms/sdk/next'export const POST = createRevalidateHandler({  secret: process.env.CMS_WEBHOOK_SECRET!,})

Bring your own stack

Works with the tools you use

Render CMS Orbit content in Next.js and React, Laravel and Symfony, or iOS and Android apps with the official SDKs, or read it from any framework over REST and GraphQL. Connect the AI assistant your team already uses over MCP.

Next.js
React
Laravel
Symfony
iOS
Android
Claude
Cursor
VS Code

From the blog

More for developers

All posts
Guides

2 min read

Live preview for your website in four steps

Show editors their draft on the real website, updating as they type. Here are the four small pieces your website needs, and what each one does.

CMS Orbit

4 min read

CMS Orbit now speaks PHP, Swift and Kotlin

Laravel and Symfony websites and native iOS and Android apps get official SDKs too. All four are typed, open source and read the same content.

Start building today.

Create a space, generate your types and render your first page. The trial is free for 14 days.

Book a demo