Eugeny/tabby · critical · Error
Did not find any bootstrap components. Are there any plugins
Error message
Did not find any bootstrap components. Are there any plugins installed?
What it means
Thrown at application bootstrap time when no plugin contributes a component marked with a `bootstrap` field. The app module collects every plugin's `bootstrap` array and fails hard if the resulting list is empty, because Angular's manual bootstrap (appRef.bootstrap) requires at least one root component. This guards against shipping a build with no UI entry point.
Source
Thrown at app/src/app.module.ts:23
export function getRootModule (plugins: any[]) {
const imports = [
BrowserModule,
...plugins,
ToastrModule.forRoot({
positionClass: 'toast-bottom-center',
toastClass: 'toast',
preventDuplicates: true,
extendedTimeOut: 1000,
}),
]
const bootstrap = [
...plugins.filter(x => x.bootstrap).map(x => x.bootstrap),
]
if (bootstrap.length === 0) {
throw new Error('Did not find any bootstrap components. Are there any plugins installed?')
}
@NgModule({
imports,
}) class RootModule {
ngDoBootstrap (appRef: ApplicationRef) {
(window as any)['requestAnimationFrame'] = window[window['Zone'].__symbol__('requestAnimationFrame')]
const componentDef = bootstrap[0]
appRef.bootstrap(componentDef)
}
}
return RootModule
}
View on GitHub (pinned to 14e2d60b9b)
Solutions
- Verify at least one plugin exports a `bootstrap` component (e.g. the default UI plugin like tabby-terminal or the main window plugin) and that it is included in the `imports` array fed to RootModule.
- Rebuild plugins: run the project's build step (e.g. `npm run build` / plugin build script) so plugin manifests and their `bootstrap` exports are generated.
- If writing a custom host, add your own root component to a plugin's `bootstrap` array so the bootstrap list is non-empty.
- Inspect the loaded `plugins` array at runtime (log `plugins.map(p => p.bootstrap)`) to confirm which plugin is missing the export, then fix that plugin's entry file.
Example fix
// before
const bootstrap = [...plugins.filter(x => x.bootstrap).map(x => x.bootstrap)]
if (bootstrap.length === 0) throw new Error('Did not find any bootstrap components...')
// after - ensure a UI plugin with a bootstrap component is registered
import { TerminalTabComponent } from 'tabby-terminal'
const plugins = [...loadedPlugins]
if (!plugins.some(p => p.bootstrap)) {
plugins.push({ bootstrap: [TerminalTabComponent] } as any)
} Defensive patterns
Strategy: validation
Validate before calling
import { Type } from '@angular/core'
function assertHasBootstrap (plugins: any[]): void {
const bootstrap = plugins.filter(p => p?.bootstrap).flatMap(p => p.bootstrap)
if (bootstrap.length === 0) {
throw new Error(
`No bootstrap component. Loaded ${plugins.length} plugin(s): ` +
plugins.map(p => p?.name ?? '<anonymous>').join(', '),
)
}
}
// run before constructing RootModule
assertHasBootstrap(plugins) Type guard
function pluginHasBootstrap (p: any): p is { bootstrap: any[] } {
return Array.isArray(p?.bootstrap) ? p.bootstrap.length > 0 : Boolean(p?.bootstrap)
} Prevention
- Run the plugin build step before launching the app so plugin manifests and bootstrap exports exist.
- Include at least one UI plugin that exports a bootstrap component in every build configuration.
- Add a unit test asserting the default plugin set yields a non-empty bootstrap list.
- Log the loaded plugin names early in bootstrap so a missing plugin is obvious in CI logs.
When it happens
Trigger: The `plugins` array (the app module's `imports`) contains zero plugins whose `bootstrap` property is truthy. This happens when plugins are loaded but none exports a root component, or when the plugin loader returns an empty list (e.g. broken plugin discovery, empty plugin folder, wrong plugin entry path).
Common situations: A fresh checkout where built-in UI plugins were not compiled/linked yet; a custom build that excluded the default `tabby-terminal`/`tabby-core` UI plugin; a packaging bug where `plugins` is filtered to nothing; running the app before `npm run build` for plugins; a plugin manifest that omits the `bootstrap` export.
Related errors
AI-assisted analysis of Eugeny/tabby@14e2d60b9b (2026-08-12).
Data as JSON: /api/errors/0ac3bf0042206c6c.
Report an issue: GitHub.