Extend Nothing locks you in
Don't like something?Replace it. Without a fork.
The DMS starts by doing the work for you and never stops you from taking over. Each step down the ladder gives you more control, and each one is plain TypeScript or Vue in your repository.
01 The ladder
From generated to written by you.
Stop at the step that's enough. Most screens never need more than the first two.
- 1
Generated
Pages written for you
The AI or the builder writes the page. What you get is a TypeScript class in your repo, not a record in someone else's database.
src/pages/crm.tsts@RegisterPage() export class CompaniesPage extends PageController("crm-companies", { displayName: "Companies", icon: "i-ph-buildings", category: crm, }) { static table = TableView(companyDataAPI, { caption: "Companies", labelKey: "name", rowActions: { add: true, edit: true, delete: true }, }); } - 2
Modules
Only the modules you want
Translation, SaaS, mailing, media, AI: every module is an optional npm package. Add one from the CLI, remove it the same way.
Terminalbashnpx @antelopejs/core project modules add @antelopejs/dms-lang # in an embedded app (AdonisJS…), list it in createRuntime() instead - 3
Your module
Write your own module
A module is an ordinary AntelopeJS module, packaged the way the official
dms-*modules are. Ship it to one project or publish it.src/index.tstsexport const billing = RegisterModule({ id: "billing", title: "$billing.title", description: "$billing.description", }); export function construct(config: Config) { AddFrontendModule({ name: "@acme/dms-billing", sourcePath: resolve(__dirname, "../frontend-vue"), renderer: { name: "vue", version: "3" }, }); } - 4
Custom component
Your Vue, inside a generated page
Build only the block the catalog is missing, a seat map or a flow canvas, and keep the rest declarative. Roles still apply to it.
src/pages/routes.tstsstatic graph = CustomComponent("ApiRouteGraph") .options({ fetchUrl: "/api/routes/graph", periodScope: "api" }) .meta({ name: "$api.routes.graph.name", icon: "i-ph-graph", }); - 5
Override
Replace any shipped component or layout
Register the same name from a frontend module with a higher priority. Your version wins everywhere the DMS used its own. Layouts, pages and the error page follow the same first-registration rule.
frontend-vue/dms.frontend.tsts// AddFrontendModule({ ..., priority: 1 }) // the DMS sits at 0 const frontendModule: DmsFrontendModule = { setup(sdk) { // same full name, no prefix: replaces the shipped table sdk.registerComponent("DmsTable", MyTable, { prefix: false }); }, }; - 6
Theme
Your brand, not ours
Logos, palette, fonts and design tokens from your frontend layer's app config. No component to fork.
frontend-vue/app/app.config.tstsexport default defineDmsAppConfig({ branding: { logo: { default: { light: "/brand/logo.svg", dark: "/brand/logo-dark.svg" }, collapsed: { light: "/brand/icon.svg", dark: "/brand/icon.svg" }, }, }, });
02 Every extension point
Smaller hooks, when that's all you need.
Between configuring and overriding, the dashboard exposes named extension points. Pick the smallest one that does the job.
- Extend another module's page Inject a block before or after any component of a page you don't own, with
@RegisterPageExtension. - Dashboard chrome Header buttons, banners, sidebar widgets, command-palette groups, footer links.
- Custom data types A new field and column type, from the backend decorator to the Vue input.
- Table displays Show any table as a kanban, cards or a calendar instead of rows.
- Component events Let one block react to another: select a row, refresh a chart.
- Period filtering Link every widget of a page to one shared date range.
03 Why it holds
Built so you can walk away.
Nothing here holds you by a contract. The code, the license, the servers, the history, the data and the skills are all yours to keep.
Plain TypeScript
Pages, tables and controllers are classes. No proprietary format to export from.
Apache 2.0
The DMS and its official modules are open source. Read it, patch it, keep it.
Your servers
Self-hosted by default. AntelopeJS Cloud is an option, never a requirement.
Your Git history
Every change, written by hand, in the builder or by the AI, is a diff in your repository. Review, revert and blame it with the tools you already use.
Your database stays yours
The DMS connects to the PostgreSQL, MongoDB or RethinkDB database you already run. No migration into a vendor's storage, nothing to export if you leave.
/docs/external-databaseA stack your team knows
TypeScript on Node.js, a Vue dashboard, npm packages. Any developer can pick it up; no proprietary platform to learn or hire for.