Skip to content

[FEATURE]: Desktop app: user-installable GUI plugins, incl. a startup/boot animation slot #56037

Open

Description

@zhoug3415-prog

Describe the enhancement you want to request

Let a user-installed plugin play a startup (boot) animation in the desktop app: on launch, play a short animation over the shell, then hand over to the UI — the same experience as the DeepSeek Harness (dsh) boot-animation plugins.

Two things are missing today:

  1. A user-installable entrypoint for the web/desktop client. packages/app already has a real GUI extension system (packages/gui-extensions), but extensions are composed at compile time in src/renderer.ts and src/main.ts. There is no directory an external extension is discovered from, and no exports["./…"] convention mirroring the TUI's exports["./tui"]. An exports["./gui"] (or ./web) entrypoint under the same discovery rules would let a plugin loaded from config contribute to the desktop/web app.
  2. A startup/boot contribution point in the GUI extension SDK. The SDK's registries are Command, MenuItem, Panel, SettingsPage, Server, LinkHandler, TitlebarItem, Slot, Style, MenubarItem, and the slots are window.bottom, session.header, session.panel.end, session.panel.sidebar. None of them is a startup surface. A Splash/Boot registry (or a window.overlay / app.startup slot) with a clear "the app is ready" signal would let a plugin animate at launch and then dismiss itself.

Nice to have: a command/keybind to replay the animation.

Current behaviour

  • The desktop app's UI is packages/app, shipped by packages/desktop; its features (terminal, review, files, browser, SSH, WSL, updater, …) are GUI extensions on packages/gui-extensions.
  • The launch surface is a fixed pulsing-logo splash (packages/app/src/app.tsx), which is not user-customisable.
  • The TUI plugin API (@opencode/plugin/tui, exports["./tui"]) is loaded only by the terminal CLI/TUI. On desktop the app runs opencode-cli serve --service; a TUI plugin configured in tui.json has no effect there, and the desktop process never emits the CLI's V2 TUI / plugin reconciliation log lines.
  • I built a working pixel-whale splash as a TUI plugin (.opencode/plugins/whale-splash/, @opencode/plugin/tui). It plays in the terminal TUI but cannot appear in the desktop app, for the reasons above.

Additional context

I searched for duplicates before filing. The closest open requests are about a plugin/UI surface in the desktop app in general — #41441 (TUI plugin/slot parity in Desktop), #43132 (plugin UI surface for the web/desktop app), #6330 (cross-client UI intent channel), #5971 (sidebar panel API), #11494 (plugin preference tabs), #54440 (make the UI adjustable by the AI / desktop themes). None of them covers a launch-time surface: they ask for commands, dialogs, sidebars and settings, and even if they landed tomorrow there would still be nowhere for a plugin to render a startup animation. This request is specifically about that gap, and I'm happy to fold it into whichever of those takes the shape.

Environment

  • opencode version: 2.0.27 (CLI on PATH); desktop-bundled CLI 2.0.29; desktop app 2.0.29
  • OS: Windows 11 (Windows NT 10.0.26200.9711, x64)
  • Terminal: n/a (desktop app)
  • Shell: cmd.exe
  • Install/channel: latest
  • Active plugins: @firecrawl/opencode, opencode-tavily

Activity

  1. opencode-agent commented on Oct 16, 2026

    @opencode-agent
    Contributor

    Thanks for the detailed request! In short, you'd like a user-installed plugin to be able to play a startup animation in the desktop app and then hand over to the UI. That needs two things: a way to install GUI plugins at runtime, and a startup contribution point in the GUI extension SDK.

    On the first part, the open PR #55246 adds a ./gui export next to . and ./tui, so a plugin listed in opencode.json can contribute to the desktop app. The second part, a launch-time surface (something like a Splash/Boot registry or an app.startup slot with a "the app is ready" signal and a way to dismiss it), isn't covered by any existing issue or PR I could find. A plugin can't do this today, because the current slots (window.bottom, session.header, session.panel.*) all render after the app has loaded.

    Related issues and PRs:

    Maintainers will consider it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions