Your admin panel shouldn't
make you write CRUD.
Pure React and TypeScript. Schema-as-code. Full control — from custom fields to entire pages.
Trusted by developers at forward-thinking companies
Self-Hosted by Design
Deploy Rebase on your own infrastructure for maximum control, deep customization, and full data privacy.
- Full source code access (MIT license)
- Deploy anywhere on your own infrastructure
- Extend with custom React components & logic
A Toolkit That Just Works
Everything you need. Nothing you don't.
Stop reinventing the wheel. Rebase provides a production-ready toolkit of components and logic, so you can focus on the features that make your app unique.
import { buildProperty } from "@rebasepro/core";
const price = buildProperty({
name: "Price",
description: "Price with range validation",
dataType: "number",
validation: {
required: true,
requiredMessage: "Price must be between 0 and 1000",
min: 0,
max: 1000
}
});
Schema as Code, Backed by Git
Define your data models in pure TypeScript, or construct them visually using the Rebase Studio GUI. Even when non-technical users add fields via the UI, Rebase uses AST mutation to surgically write clean TypeScript back to your repo. Your code remains the single source of truth, fully versioned in Git.
From a single collection definition, Rebase instantly generates:
- Admin Views & Forms for data management
- DB Schema synchronization
- Instant APIs (REST & GraphQL)
- Typed SDK for end-to-end type safety
Radical React Extensibility
If you can build it in React, you can build it in Rebase. Create your own custom form fields or build entirely new top-level views (like a custom dashboard) and add them to the main navigation. No black boxes, no weird proprietary templating languages. Just standard React components.
import { buildCollection } from "@rebasepro/core";
export const productsCollection = buildCollection({
name: "Products",
path: "products",
callbacks: {
onSave: async ({ values }) => {
// e.g., send a notification
await sendSlackMessage("Product updated: ${values.name}");
// e.g., modify data before saving
values.updatedAt = new Date();
return values;
}
}
// ...properties
});Built-in Business Logic
Run your custom code during the data lifecycle. Use onSave,
onDelete, and other
callbacks to trigger cloud functions, send notifications, clean data, or integrate with
third-party APIs right from your CMS configuration.
A Truly Typed Client SDK
Query your database from any frontend securely with the Universal Client SDK. Powered by Drizzle ORM, it provides perfect TypeScript autocomplete and eliminates N+1 query issues instantly by effortlessly resolving deep relational data with the with clause.
import { createRebaseClient } from "@rebasepro/client";
// Perfect type inference automatically applied!
const posts = await rebaseClient.data.posts.findMany({
// Type-safe deep relation fetching. No N+1 queries.
with: {
author: true,
comments: {
with: { author: true }
}
},
where: "status = 'published'",
orderBy: "createdAt DESC",
limit: 10
});
console.log(posts[0].author.name); // 100% type-safeOne SDK. Every environment.
The same @rebasepro/client runs in your CMS plugins, your user-facing apps, and your Node.js backend. No wrappers, no adapters — one API everywhere.
Same types. Same queries. Same auth. Zero platform-specific code.
Explore the SDK arrow_forwardEverything for your
UI
needs
If you need to create custom views or components, you can use our battle-tested Rebase UI components.
Build Custom Views
Use all the built-in data hooks to create your own React components and add them directly to the main navigation, or to documents
export function ProductDetailPreview({ modifiedValues }: {
modifiedValues?: EntityValues<Product>;
}) {
const snackbarController = useSnackbarController();
const [quantity, setQuantity] = React.useState(1);
if (!modifiedValues) {
return <CenteredView>Please add some data to see the preview</CenteredView>;
}
const { name, price, description, images } = modifiedValues;
const mainImage = images?.[0];
return (
<div className="p-8">
<div className="grid md:grid-cols-2 gap-8 max-w-4xl mx-auto">
{/* Product Image */}
{mainImage && (
<img
alt="Product"
className="aspect-square object-cover w-full rounded-lg"
src={mainImage}
/>
)}
{/* Product Details */}
<div className="grid gap-4 content-center">
<div className="flex items-start">
<h1 className="flex-grow text-3xl font-bold">
{name ?? "Product name"}
</h1>
<div className="text-3xl font-semibold ml-auto">
${price}
</div>
</div>
<Markdown source={description ?? ""} />
<QuantitySelect onSelected={(quantity) => snackbarController.open({
type: "success",
message: `Added \${ quantity } items to cart`
})}/>
</div>
</div>
</div>
);
}
Over 20+ Powerful Data Fields
We've built all the complex fields you don't want to. Get a Notion-style rich text editor, file uploads and storage, relational data (references), enums, arrays, maps, and more, all as pre-built components.
Start Your Self-Hosted Project
npx create-rebase-app Ready to Build?
Dive into the open-source framework. Perfect for custom builds, agencies, and full control.