Skip to main content

Extensions vs. Core Modules

Beaker distinguishes between:

  • Core modules: Essential infrastructure (e.g. auth, layout, plugin runtime)
  • Extensions (plugins): Optional features you can add, remove, or customize

Core modules live in packages/core and are tightly coupled to app lifecycle. Plugins live in their own package/folder and are loaded into "slots" at runtime.

This separation allows you to treat Beaker like a shell - you can plug in what your team needs, and ignore what you don't.

🎯 Slots, Tabs & Mounting Strategy

Beaker uses a lightweight slot-based system to mount plugin UIs dynamically.

Each plugin declares:

{
id: 'tasks',
name: 'Tasks',
icon: TaskIcon,
...
component: async () => (await import('@beaker/tasks')).TasksApp
}

And Beaker renders them using <ExtensionRenderer /> and <ExtensionSlot />:

  • Tabs in the sidebar = dynamically registered
  • Page views = lazy loaded with Suspense
  • Slots = where your extension renders (tab, modal, card, etc.)

This lets plugins feel native while staying decoupled from core app logic.