anomalyco / anomalyco/opencode

Layout sunset hard-codes the new layout with no override for desktop users

Open
#49,005 3 comments 9 reactions 1 assignee View on GitHub

@Hona is already working on this.

Since Sep 14, 2026.

Dominant language
TypeScript
Stars
209k
Forks
27.5k
PR merge metrics
PR metrics pending

Description

Layout sunset hard-codes the new layout with no escape hatch for existing desktop users

When the oldInterfaceSunset date passes, desktop users who want to keep the original ("legacy") layout are stuck with the new layout and receive a dismissible notice instead of a toggle. This is a product decision, but there is currently no opt-out or override, and the related threads below have been open for months without a response.

Related (all appear to be the same root cause):

  • #37012
  • #48882
  • #48888
  • #48951
  • #39835
  • #38230
  • #37546
Root cause

All interactivity is gated on oldInterfaceSunset in packages/app/src/context/settings.tsx:

  • oldInterfaceSunset = new Date(2026, 8, 14) (line 63) — once Date.now() >= this, the hub retires the old interface.
  • resolveNewLayoutDesigns(retired, preference, fallback) (line 129) — if (retired) return true ignores any saved user preference.
  • layoutTransitionState (line 116) — available: scheduled && eligible && !retired hides the Settings toggle entirely after the sunset.
  • setNewLayoutDesigns (line 432) — const next = oldInterfaceRetired() ? true : value blocks switching back after the sunset.
  • The effect at line 340 force-sets newLayoutDesigns = true once retired.

There is no environment variable, config key, or CLI flag that overrides any of this.

Verified local workaround

For desktop builds (Electron asar), replacing the following byte-for-byte keeps the toggle available and lets users stay on the old layout:

  1. if (layoutUpgrade()) return true → an empty if (layoutUpgrade()) {} block (removes the force-intro of the new layout for upgraders).
  2. new Date(2026, 8, 14) → a far-future date (e.g. new Date(2099, 0, 14)) so oldInterfaceRetired() stays false and the Settings toggle remains available.

Caveat: in the minified renderer bundle (strict-mode ES module), the replacement must avoid a leading-zero numeric literal (new Date(2099, 0, 01) is an octal literal and throws SyntaxError: Octal literals are not allowed in strict mode, which crashes the whole renderer on startup).

Feature request

Please provide a supported, durable path for existing users to stay on the original layout, for example:

  • An environment variable or setting (e.g. OPENCODE_USE_LEGACY_LAYOUT=1) that keeps the toggle available regardless of the sunset date, or
  • Treating the sunset as "default to new, but respect an explicit saved preference" instead of hard-forcing the new layout (i.e. drop the oldInterfaceRetired() ? true : value gate and the force-set effect), which is what the workaround above effectively does.

If the sunset must stay, a reprieve (like earlier postponements) plus a documented override would still let long-time users keep their preferred interface.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.