Skip to content

[FEATURE]: Opt-in option to disable the exit splash (for embedded/white-label use) #38010

Description

@limoncello

Feature hasn't been suggested before.

  • I have verified this feature I'm about to request hasn't been suggested before.

I checked the two prior issues the bot flagged. Neither was rejected on merit:
#36609 ("Add option to hide splash/startup screen", "splash": false) was
auto-closed for not following the template within the 2-hour window — the
closing note explicitly says "Feel free to open a new issue that follows our
issue templates." #11373 was about skipping the entry splash to open
directly to the chat view
and was auto-closed after 90 days of inactivity.
This request follows the template and focuses on the exit splash for
embedded/white-label use, which neither covers.

Describe the enhancement you want to request

Context. We ship a CLI that runs opencode as its coding engine,
configured and branded for our product. Users never type opencode — they
type our command. Everything on the way in and out is themed via config and a
TUI plugin (custom home_logo, home_footer, theme, commands), which works
well.

The one thing we can't reach is the exit splash. On quit the TUI writes
the wordmark plus:

  Session   <title>
  Continue  opencode --mini -s <session-id>

to the scrollback. In an embedded context this is confusing: it shows a
product name and a opencode … command the user's shell doesn't have (our
binary is named differently and lives elsewhere), so the resume hint is dead.

Per #31813 the exit banner is intentional and its absence was treated as a
bug — so I'm not asking to remove it or change the default. I'm asking for
an opt-in way to disable it.

Proposed API (either or both, defaulting to today's behavior):

  1. An env var in the existing OPENCODE_DISABLE_* family:
    OPENCODE_DISABLE_EXIT_SPLASH=true (and OPENCODE_DISABLE_ENTRY_SPLASH
    for symmetry).
  2. A tui.json key: "exitSplash": false (or "splash": false).

Where it hooks in. The gate already exists internally, it just isn't
reachable from outside:

  • packages/opencode/src/cli/cmd/run/runtime.lifecycle.ts (~L322):
    const show = renderer.isDestroyed ? false : next.showExitshowExit
    would just need to also honor the env/config flag.
  • packages/opencode/src/cli/cmd/run/splash.ts — the exit branch rendering
    the wordmark, Session and Continue opencode --mini -s ….

Why a plugin isn't enough. TUI plugins can fill slots (home_logo,
home_footer) but there's no exit slot, and showExit / the Lifecycle
object aren't exposed to plugins — so an embedder can rebrand everything except
this one banner.

Workarounds and why they're bad. SIGKILL instead of a graceful quit
skips close() and the banner but loses clean session teardown; filtering
stdout doesn't work because it's terminal escape output, not a text stream,
and the TUI needs a real TTY so a pipe breaks rendering.

Happy to send a PR if a maintainer sketches the preferred shape (env var vs
config key vs both).

Metadata

Metadata

Assignees

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