Eugeny/tabby · warning · Error

Not implemented

Error message

Not implemented

What it means

Thrown by WebHostApp.newWindow(), the web implementation of the abstract HostAppService.newWindow(). A browser tab cannot spawn a new native application window the way Electron's BrowserWindow can, so the web build throws 'Not implemented'. relaunch() and quit() are implemented (reload / window.close), but newWindow is not.

Source

Thrown at tabby-web/src/services/hostApp.service.ts:25

    get platform (): Platform {
        return Platform.Web
    }

    get configPlatform (): Platform {
        const os = Bowser.parse(window.navigator.userAgent).os
        return Platform[os.name ?? 'Windows'] ?? Platform.Windows
    }

    // Needed for injector metadata
    // eslint-disable-next-line @typescript-eslint/no-useless-constructor
    constructor (
        injector: Injector,
    ) {
        super(injector)
    }

    newWindow (): void {
        throw new Error('Not implemented')
    }

    relaunch (): void {
        location.reload()
    }

    quit (): void {
        window.close()
    }
}

View on GitHub (pinned to 14e2d60b9b)

Solutions

  1. Gate 'new window' actions on the platform being non-Web, or open a new browser tab via window.open as a web equivalent.
  2. Catch 'Not implemented' and fall back to window.open(location.href) for the web build.
  3. Hide/disable the 'New window' menu entry when hostApp.platform === Platform.Web.
  4. Use the desktop build if native multi-window is required.

Example fix

// before
this.hostApp.newWindow()
// after
if (this.hostApp.platform === Platform.Web) {
    window.open(location.href)
} else {
    this.hostApp.newWindow()
}
Defensive patterns

Strategy: fallback

Validate before calling

import { Platform } from 'tabby-core'
if (hostApp.platform === Platform.Web) {
    // no native new window; use a browser tab
    window.open(location.href)
} else {
    hostApp.newWindow()
}

Try / catch

try { hostApp.newWindow() } catch (e) {
    if (e.message === 'Not implemented') { window.open(location.href) } else throw e
}

Prevention

When it happens

Trigger: hostApp.newWindow() is invoked while running the web build. Callers include the dock menu (dockMenu.service.ts in electron only), CLI new-window path (cli.ts:87), and app lifecycle code (app/lib/app.ts, index.ts) that assume a desktop environment.

Common situations: A keyboard shortcut or menu item bound to 'New window' is triggered in the web build; shared app code that opens a new window on startup runs in the browser context; a plugin calls hostApp.newWindow() unconditionally.

Related errors


AI-assisted analysis of Eugeny/tabby@14e2d60b9b (2026-08-12). Data as JSON: /api/errors/8ae5eae93d470f60. Report an issue: GitHub.