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.