[data-reveal]{opacity:1!important;transform:none!important}
AntelopeJS DMS
Back to the overview

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. 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.ts
    ts
    @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. 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.

    Terminal
    bash
    npx @antelopejs/core project modules add @antelopejs/dms-lang
    # in an embedded app (AdonisJS…), list it in createRuntime() instead
    
  3. 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.ts
    ts
    export 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. 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.ts
    ts
    static graph = CustomComponent("ApiRouteGraph")
      .options({ fetchUrl: "/api/routes/graph", periodScope: "api" })
      .meta({
        name: "$api.routes.graph.name",
        icon: "i-ph-graph",
      });
    
  5. 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.ts
    ts
    // 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. 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.ts
    ts
    export default defineDmsAppConfig({
      branding: {
        logo: {
          default: { light: "/brand/logo.svg", dark: "/brand/logo-dark.svg" },
          collapsed: { light: "/brand/icon.svg", dark: "/brand/icon.svg" },
        },
      },
    });
    

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.