Optional layer · React 19 · Bring your own components

Rebase CMS.
La même définition, rendue pour des humains.

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.

Des back-offices que les équipes utilisent sur Rebase chaque jour

ScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshotScreenshot

The tour

Pas une visionneuse de tables. Un lieu de travail.

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

admin.yourdomain.com

Au quotidien

Ce qu'obtiennent réellement celles et ceux qui ne sont pas développeurs

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

Le stockage de fichiers, dans le panneau — le même bucket que celui où écrit votre API, pas un second.

admin.yourdomain.com/posts/new

Le véritable éditeur de texte enrichi de Rebase — tapez quelque chose, il est entièrement interactif.

Markdown

Écrivez du Markdown. Regardez-le s'afficher.

Vous préférez le texte brut ? Les champs Markdown offrent un aperçu en direct en deux volets — titres, gras, listes et code s'affichent à la frappe, et c'est le Markdown brut qui atterrit dans votre base.

  • Éditeur et aperçu en direct côte à côte
  • Sélectionnez du texte pour le formater avec la barre flottante
  • Stocké en Markdown brut — portable par défaut
Kanban

Glissez des cartes, mettez à jour votre base.

Une collection dont une property de type texte possède un enum obtient la vue Kanban sans la demander. La ligne enabledViews de l'exemple ci-dessus restreint le sélecteur, elle n'active pas le tableau. Glisser une carte écrit dans Postgres, sous les mêmes policies que toute autre écriture.

  • Générée depuis n'importe quelle property enum ou statut
  • Glisser-déposer avec mises à jour optimistes en base
  • Filtrable, triable et entièrement responsive
Spreadsheet View

Éditez comme un tableur. Enregistrez comme une base de données.

Cliquez sur n'importe quelle cellule et tapez ; la modification est écrite dans Postgres via la même API que votre app. Triez, filtrez, sélectionnez en masse et exportez, dans une grille qui se comporte comme un tableur.

  • Cellules éditables au clic avec des champs typés
  • Sélection multi-lignes et actions groupées
  • Redimensionnement, réordonnancement et visibilité des colonnes
  • Export CSV / JSON en un clic

Un éditeur. Tous les types de contenu.

Un article de blog, une description de produit et un document interne, c'est le même éditeur de blocs qui écrit dans trois colonnes différentes.

Blog entry editor with preview panel showing rich content

Équipes contenu

Rédigez des articles avec l'éditeur de texte enrichi. Glissez des blocs, insérez des médias, prévisualisez — sans développeur.

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

Opérations

Gérez les données avec des vues tableur et des tableaux Kanban. Édition en masse, filtres et export CSV en quelques secondes.

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

Développeurs

Créez vos propres vues d'entité, panneaux d'aperçu et widgets de champ — le tout en React et TypeScript standard.

À vous de l'étendre

C'est une app React. Traitez-la comme telle.

Pointez une property vers votre propre composant et le formulaire généré s'efface. Champs personnalisés, aperçus personnalisés, vues d'entité entières, actions supplémentaires dans la barre d'outils — écrits dans le React que vous écrivez déjà, référencés par chemin depuis le bloc admin.

une property avec vos composants
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",
  },
},

Votre composant s'affiche dans le formulaire et dans la liste, avec l'entité, la collection et le SDK passés en props.

widgets de champ, configurés

Une vingtaine de types de champs sont livrés avec le panneau. Tout ce qui va au-delà est un composant que vous écrivez, pas une demande de fonctionnalité que vous déposez.

Ce que coûte son ajout

Une couche, pas un enfermement

Rebase a séparé le CMS du contrat backend, et la ligne est visible dans votre propre projet : la moitié backend d'une collection, et la moitié admin que le serveur ne lit jamais.

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

Sans cette référence, une clé admin sur une collection est une erreur de type. La présentation ne peut pas dériver par accident dans un projet 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"],
  },
};

Tout ce dont le panneau a besoin vit dans un bloc imbriqué. Votre modèle de données reste lisible pour qui n'ouvre jamais l'interface.

Les mêmes API que votre application

Le panneau lit et écrit via les mêmes endpoints REST, auth et temps réel sur lesquels vous bâtissez, sous la même sécurité au niveau des lignes. Aucun chemin de données privilégié.

Le même schéma, une seule source

Pas de second modèle de données à maintenir. Renommez une colonne dans votre collection et l'API comme le back-office suivent dans le même commit.

Sa propre SPA, ou son propre dépôt

Montez-le dans une application React existante, ou donnez-lui son propre dépôt — generate-sdk --from <url> le type contre le backend en cours d'exécution, il se livre donc à son propre rythme. Des paquets npm, pas un framework dans lequel on emménage.

Ajoutez le panneau quand vous en avez besoin.

Échafaudez un projet, définissez une collection, et le back-office est déjà là — ou laissez-le de côté et rien ne change dans l'API.

~pnpm dlx @rebasepro/cli init