Optional layer · React 19 · Bring your own components

Rebase CMS.
The same definition, rendered for people.

A complete back office, generated from the collections your backend already uses. It is a layer on top — a client of the same API your own code calls, under the same policies. Add it when a human needs to touch the data, skip it when nobody does, and remove it without your API noticing.

Back offices teams run on Rebase every day

ScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshot

The tour

Not a table viewer. A place to work.

Everything below is generated from the same collection definitions your API is served from. Nobody drew these screens.

admin.yourdomain.com

Day to day

What the people who are not developers actually get

Every view, no code. The same rows as a data grid, cards, a list or a Kanban board. Switch layout, filter live, edit in place.

Relations as navigation. Foreign keys and many-to-many joins become tabs. Attach existing rows or create related records without leaving the entity.

Media that belongs to a row. Uploads land in your storage bucket and resolve inline — thumbnails in the list, previews in the form.

History and revert. Who changed what, when. Compare two versions side by side and roll one back.

Users, roles and what they can reach. The same roles your RLS policies read, managed by people who will never open psql.

Import, export, bulk edit. CSV, JSON or Excel in with field mapping; one click out. Thousands of rows without a migration script.

Folders

File storage, in the panel — the same bucket your API writes to, not a second one.

admin.yourdomain.com/posts/new

The real Rebase rich text editor — try typing, it's fully interactive.

Every block you need.

The editor supports a comprehensive set of content blocks — from simple text to complex embeds. All stored as structured data in your database.

Rich Text & Headings

Bold, italic, strikethrough, inline code, and 3 heading levels. Markdown shortcuts auto-convert as you type.

Code Blocks

Fenced code blocks with syntax highlighting for 100+ languages. Perfect for technical documentation and developer content.

Image Uploads

Drag-and-drop or paste images directly into the editor. Files are stored via your configured storage provider.

Task Lists

Interactive checkboxes for TODO lists and checklists. Track progress right inside your content.

Tables

Inline editable tables with row and column controls. Add structured data directly inside rich text content.

Drag & Drop

Reorder any block by dragging. Move paragraphs, images, and code blocks to restructure your content visually.

Slash Commands

Type / to do anything.

A contextual command palette appears when you type / — just like Notion. Insert images, code blocks, tables, dividers, and more without lifting your fingers from the keyboard.

  • Fuzzy search across all available block types
  • Register custom slash commands from your code
  • Keyboard navigable — never leave your flow
Markdown

Write Markdown. Watch it render.

Prefer plain text? Markdown fields come with a split-pane live preview — headings, bold, lists and code render as you type, and the raw Markdown is what lands in your database.

  • Side-by-side editor and live preview
  • Select text to format with the floating toolbar
  • Stored as plain Markdown — portable by default
Kanban Board

Drag cards, update your database.

Every collection with an enum or status field automatically gets a Kanban view. Drag cards between columns to update records — no code, no config. Backed by real Postgres writes.

  • Auto-generated from any enum or status property
  • Drag-and-drop with optimistic database updates
  • Filterable, sortable, and fully responsive
Spreadsheet View

Edit like a spreadsheet. Save like a database.

Click any cell and start typing. Changes are persisted directly to Postgres. Sort, filter, bulk-select, and export — all from a familiar grid interface that non-technical users love.

  • Click-to-edit cells with type-aware inputs
  • Multi-row selection and bulk actions
  • Column resizing, reordering, and visibility toggles
  • CSV / JSON export with one click
Extensible

20+ fields. Or build your own.

Text, numbers, dates, enums, arrays, maps, references, file uploads, rich text, JSON, and more — all pre-built. Need a color picker, a rating widget, or a map selector? Build it in React and plug it in.

  • 20+ built-in field types with custom rendering
  • Custom field widgets via standard React components
  • Conditional field logic and validation rules
  • Preview panels for real-time content previews

One editor. Every content type.

From blog posts to product descriptions to internal docs — Rebase adapts to how your team works.

Blog entry editor with preview panel showing rich content

Content Teams

Write blog posts with the rich text editor. Drag blocks, insert media, and preview — no developer needed.

Users table view with inline editing, relations, and entity actions

Operations

Manage data with spreadsheet views and Kanban boards. Bulk edit, filter, and export to CSV in seconds.

Product detail view with Custom Preview tab showing product images and rich description — dark mode

Developers

Build custom entity views, preview panels, and field widgets — all in standard React and TypeScript.

Yours to extend

It is a React app. Treat it like one.

Point a property at your own component and the generated form gets out of the way. Custom fields, custom previews, whole custom entity views, extra actions in the toolbar — written in the React you already write, referenced from the admin block by path.

a property with your components
status: {
  name: "Status",
  type: "string",
  enum: { paid: "Paid", refunded: "Refunded" },
  admin: {
    // your own React component, resolved at build time
    Field: "./components/StatusPicker",
    Preview: "./components/StatusChip",
  },
},

Your component renders in the form and in the list, with the entity, the collection and the SDK handed to it as props.

field widgets, configured

Twenty-odd field types ship with the panel. Everything beyond them is a component you write, not a feature request you file.

The cost of adding it

A layer, not a lock-in

Rebase split the CMS out of the backend contract, and the line is visible in your own project: the backend half of a collection, and the admin half the server never reads.

opting in
# one dependency more than a headless project
~ pnpm add @rebasepro/cms-types

// config/cms.d.ts — one line, once per project
/// <reference types="@rebasepro/cms-types" />

Without that reference, an admin key on a collection is a type error. Presentation cannot drift into a headless project by accident.

config/collections/orders.ts
export const orders: PostgresCollectionConfig = {
  // … the backend half: table, properties, securityRules

  admin: {
    icon: "ShoppingCart",
    group: "E-Commerce",
    defaultViewMode: "table",
    enabledViews: ["table", "kanban"],
    listProperties: ["reference", "status", "total"],
    sort: ["created_at", "desc"],
  },
};

Everything the panel needs lives in one nested block. Your data model stays readable to anyone who never opens the UI.

Same APIs as your app

The panel reads and writes through the same REST, auth and realtime endpoints you build on, under the same row-level security. No privileged data path.

Same schema, one source

No second data model to maintain. Rename a column in your collection and both the API and the back office follow in the same commit.

Its own SPA, or its own repository

Mount it inside an existing React app, or give it a repo of its own — generate-sdk --from <url> types it against the running backend, so it ships on its own cadence. npm packages, not a framework you move into.

Add a back office in one dependency

On a fresh clone, rebase dev brings up the backend, the back office and a database together — nothing to install first. Or open the live demo: it is a real Rebase project, with a real database behind it.

Add the panel when you need it.

Scaffold a project, define one collection, and the back office is already there — or leave it out and nothing about the API changes.

~pnpm dlx @rebasepro/cli init