Skip to content

Plugin System

Plugins are the primary extension mechanism in Rebase. They can:

  • Wrap the entire app with a provider (context, state management)
  • Add home page actions and widgets
  • Inject collection view components (toolbar, column builders)
  • Add form components (field builders, additional panels)
  • Inject or modify collections dynamically
interface RebasePlugin {
key: string; // Unique identifier
loading?: boolean; // Show loading state while initializing
// Wrap the app with a provider
provider?: {
Component: React.ComponentType;
};
// Home page customization
homePage?: {
additionalActions?: React.ReactNode;
additionalChildrenStart?: React.ReactNode;
additionalChildrenEnd?: React.ReactNode;
};
// Collection view customization
collectionView?: {
showTextSearchBar?: boolean;
CollectionActions?: React.ComponentType[];
AddColumnComponent?: React.ComponentType;
onCellValueChange?: (params) => void;
};
// Entity form customization
form?: {
Actions?: React.ComponentType;
provider?: { Component: React.ComponentType };
fieldBuilder?: (params) => React.ReactNode | null;
};
// Collection injection/modification
collection?: {
injectCollections?: (params) => EntityCollection[];
modifyCollection?: (params) => EntityCollection;
};
}

Pass plugin instances to the navigation controller:

const dataEnhancementPlugin = useDataEnhancementPlugin();
const collectionEditorPlugin = useCollectionEditorPlugin({
collectionConfigController
});
const plugins = [dataEnhancementPlugin, collectionEditorPlugin];
const navigationStateController = useBuildNavigationStateController({
plugins,
collections: () => collections,
// ...
});

Here’s a minimal plugin that adds a toolbar action to every collection:

import { RebasePlugin } from "@rebasepro/types";
function useMyPlugin(): RebasePlugin {
return {
key: "my_plugin",
collectionView: {
CollectionActions: [MyToolbarAction]
},
form: {
fieldBuilder: ({ property, ...rest }) => {
// Return a custom field for specific property configs
if (property.propertyConfig === "my_custom_field") {
return <MyCustomField {...rest} />;
}
return null; // Use default field
}
}
};
}

Visual schema editing — add/remove fields, change types, rearrange properties:

import { useCollectionEditorPlugin, useLocalCollectionsConfigController } from "@rebasepro/studio";
const configController = useLocalCollectionsConfigController(client, collections, {
getAuthToken: authController.getAuthToken
});
const editorPlugin = useCollectionEditorPlugin({ collectionConfigController: configController });

AI-powered field autocompletion:

import { useDataEnhancementPlugin } from "@rebasepro/data_enhancement";
const enhancementPlugin = useDataEnhancementPlugin();

Data enhancement

Plugins can dynamically add new collections:

collection: {
injectCollections: ({ collections, user }) => {
// Add an audit log collection for admins
if (user?.roles?.includes("admin")) {
return [auditLogCollection];
}
return [];
}
}

Plugins can modify existing collections:

collection: {
modifyCollection: ({ collection }) => {
// Add a "last_modified_by" field to every collection
return {
...collection,
properties: {
...collection.properties,
last_modified_by: {
type: "string",
name: "Modified By",
readOnly: true
}
}
};
}
}