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

  1. 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.
  2. 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.
  3. If writing a custom host, add your own root component to a plugin's `bootstrap` array so the bootstrap list is non-empty.
  4. 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

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.