Optional layer · React 19 · Bring your own components

Rebase CMS.
La misma definición, renderizada para personas.

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 que los equipos usan en Rebase cada día

ScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshot

The tour

No es un visor de tablas. Es un sitio donde trabajar.

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

admin.yourdomain.com

El día a día

Lo que de verdad obtienen quienes no son desarrolladores

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

Almacenamiento de archivos, en el panel — el mismo bucket en el que escribe tu API, no un segundo.

admin.yourdomain.com/posts/new

El editor de texto enriquecido real de Rebase — escribe algo, es totalmente interactivo.

Markdown

Escribe Markdown. Míralo renderizarse.

¿Prefieres texto plano? Los campos Markdown traen una vista previa en vivo a dos paneles — encabezados, negrita, listas y código se renderizan mientras escribes, y lo que llega a tu base de datos es el Markdown en crudo.

  • Editor y vista previa en vivo, lado a lado
  • Selecciona texto para formatearlo con la barra flotante
  • Se guarda como Markdown plano — portable por defecto
Kanban

Arrastra tarjetas, actualiza tu base de datos.

Una collection con una property de texto que tiene un enum obtiene la vista Kanban sin pedirla. La línea enabledViews del ejemplo de arriba acota el selector, no activa el tablero. Arrastrar una tarjeta escribe en Postgres, bajo las mismas policies que cualquier otra escritura.

  • Se genera desde cualquier property de enum o estado
  • Arrastrar y soltar con actualizaciones optimistas en la base de datos
  • Filtrable, ordenable y totalmente responsive
Spreadsheet View

Edita como una hoja de cálculo. Guarda como una base de datos.

Haz clic en cualquier celda y empieza a escribir; el cambio se escribe en Postgres a través de la misma API que usa tu app. Ordena, filtra, selecciona en bloque y exporta, en una cuadrícula que se comporta como una hoja de cálculo.

  • Celdas editables con un clic y campos conscientes del tipo
  • Selección de varias filas y acciones en bloque
  • Redimensionar, reordenar y mostrar u ocultar columnas
  • Exportación a CSV / JSON con un clic

Un editor. Todos los tipos de contenido.

Una entrada de blog, la descripción de un producto y un documento interno son el mismo editor de bloques escribiendo en tres columnas distintas.

Blog entry editor with preview panel showing rich content

Equipos de contenido

Escribe entradas de blog con el editor de texto enriquecido. Arrastra bloques, inserta medios y previsualiza — sin necesidad de un desarrollador.

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

Operaciones

Gestiona datos con vistas de hoja de cálculo y tableros Kanban. Edita en bloque, filtra y exporta a CSV en segundos.

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

Desarrolladores

Construye vistas de entidad, paneles de vista previa y widgets de campo propios — todo en React y TypeScript estándar.

Tuyo para extenderlo

Es una app de React. Trátala como tal.

Apunta una property a tu propio componente y el formulario generado se aparta. Campos propios, vistas previas propias, vistas de entidad completas, acciones extra en la barra — escritas en el React que ya escribes, referenciadas por ruta desde el bloque admin.

una property con tus componentes
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",
  },
},

Tu componente se renderiza en el formulario y en la lista, con la entidad, la colección y el SDK pasados como props.

widgets de campo, configurados

El panel trae una veintena de tipos de campo. Todo lo que va más allá es un componente que escribes, no una petición de función que abres.

Lo que cuesta añadirlo

Una capa, no un cautiverio

Rebase separó el CMS del contrato del backend, y la línea se ve en tu propio proyecto: la mitad de backend de una colección, y la mitad admin que el servidor nunca lee.

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" />

Sin esa referencia, una clave admin en una colección es un error de tipos. La presentación no puede colarse por accidente en un proyecto headless.

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"],
  },
};

Todo lo que el panel necesita vive en un bloque anidado. Tu modelo de datos sigue siendo legible para quien nunca abra la interfaz.

Las mismas APIs que tu aplicación

El panel lee y escribe por los mismos endpoints REST, de auth y de realtime sobre los que construyes, bajo la misma seguridad a nivel de fila. Sin ruta de datos privilegiada.

El mismo esquema, una sola fuente

Sin un segundo modelo de datos que mantener. Renombra una columna en tu colección y tanto la API como el back office la siguen en el mismo commit.

Su propia SPA, o su propio repositorio

Móntalo dentro de una aplicación React existente, o dale su propio repositorio — generate-sdk --from <url> lo tipa contra el backend en marcha, así que se despliega a su propio ritmo. Paquetes de npm, no un framework al que te mudas.

Añade el panel cuando lo necesites.

Genera un proyecto, define una colección, y el back office ya está ahí — o déjalo fuera y nada de la API cambia.

~pnpm dlx @rebasepro/cli init