Blur never actually applied. GPUI's Windows backend drives
SetWindowCompositionAttribute's ACCENT_POLICY, not the DWM system
backdrop: Transparent maps to ACCENT_ENABLE_TRANSPARENTGRADIENT
(transparent, no blur) and Blurred to ACCENT_ENABLE_ACRYLICBLURBEHIND.
wallpaper.rs pinned the appearance to Transparent and relied on
DWMWA_SYSTEMBACKDROP_TYPE, which the accent policy overrides — so the
window went see-through without a trace of blur. Pick the appearance
from the setting, drop the DWM call so a single mechanism owns
compositing, and write Opaque once before the target appearance: Win11's
DWM caches the acrylic layer, and without tearing the accent policy down
first, turning blur off left the blur on screen.
Sidebar tab rows used w_full inside the overflow-hidden scroll list, so
the percentage width never resolved and rows fell back to shrink-to-fit
— row width tracked the file name, and rows carrying an icon shifted
their status slot right by one icon. Use an explicit pixel width derived
from the sidebar width, clip overflow, and derive the label budget from
that same number so truncation cannot push the row wider again.
Add "import terminal directory" as the pinned first row of the
default-shell dropdown, mirroring the old shell's
Display::import_terminal_directory (scan, upsert, save) with the
blocking IO on a background task. Imported profiles now appear in that
dropdown too, so an import has a visible result.
Restore the Alacritty attribution dropped when the acknowledgements were
rewritten for GPUI: the terminal core's provenance in the tech-stack
table, a paragraph beside the GPUI credit, and the derivation notice
pointing at THIRD-PARTY-NOTICES. Document the Markdown rendering
capabilities, and record the two gpui-component input patches in the
workspace manifest.
The 1.1.0 entries covered only part of the cycle's 70 commits. Added what was
missing on both sides: the rebuilt GPUI shell as the default window, AI session
forking, AI turn-state detection, the full settings page, tab rename/color/
export, split panes with session restore, AI provider settings and the runtime
control CLI, built-in box-drawing geometry, mouse-semantics parity, and the
Markdown/image reader; on the fixed side the ConPTY cursor drift after resize,
the user PowerShell profile not loading (#30), the shrink-grow reflow round
trip, the cursor focus/blink state machine (#21), Esc reaching Claude Code,
the busy-process close confirmation, notification anchoring, acrylic opacity,
brand-icon scaling, Relaxed-mode glyph width, and tab launch identity.
Removed the multi-protocol remote backup entry: the feature is hidden in
1.1.0, so it must not be announced. Contributors now lists only the PR author.
The published release notes were updated in place with the same content.
`ContextMenuExt::context_menu()` wraps the host element and keys its element
state by a hardcoded "context-menu" id. The wrapper's id enters the
GlobalElementId stack *before* the wrapped row's own `("sidebar-tab", ix)`,
so every sidebar tab row resolved to the same state — the same
`Rc<RefCell<ContextMenuSharedState>>`. Opening one menu set `open = true` for
all rows, and each row then re-rendered the same PopupMenu entity at the same
anchor. The panel is opaque so the stack was invisible, but the popover shadow
is not: its alpha composited once per tab. That is the whole of "the more tabs,
the thicker the right-click shadow" — no packaging or config involvement.
The tab menu now uses the same carrier as the file tree: rows only record the
anchor and index, and a single `deferred(anchored(PopupMenu))` is drawn from
the workspace root, so the component's own popover shadow stays single-layer.
The menu is dropped when the TABS section folds, and skipped when its captured
index no longer exists.
Alongside it:
- CHANGELOG: 1.1.0 gains this fix and issue #38 (two notify wrappers wrapping
each other until Codex's config.toml reached 130MB); release date moves to
2026-08-18.
- docs/release-notes/v1.1.0.md: release notes in the 1.0.0 format, with PR
credits, reporter credits, and a pointer to the issue templates.
- README / THIRD-PARTY-NOTICES: GPUI and gpui-component are credited and
declared — both Apache-2.0, compiled as lightly patched forks.
- .gitignore: ignore the whole `.probe-*/` family instead of one name at a time.
- SSH settings: the modal private-key file dialog now runs on a dedicated
thread with results returned via oneshot and dropped when the editor
generation changed. Running it inside the update borrow let the dialog's
message pump re-enter the GPUI wndproc and panic the AppCell — the
"click add private key, window vanishes" crash. Includes the reworked
host editor panel and dialog owner-HWND plumbing (file_dialog, cli).
- Markdown reader: GitHub-flavored HTML semantics land in the local
gpui-component fork (align="center" blocks, badge rows in one line,
<br/> document order, <a><img/></a> badges keep image + link);
changelog entries and the fork patch ledger recorded here.
- Packaging: freshness guards refuse binaries older than the newest
source change, the staged exe must report the release version, all four
ps1 carry a UTF-8 BOM, and the zip drops the 20MB fonts/ copy (the
embedded font materializes on demand via ensure_bundled_font_on_disk).
- Size budget: release profile goes thin-LTO + codegen-units=1 +
strip=symbols + opt-level=s with render/shaping/VT hot crates pinned at
O3 — nebula.exe 136MB → 93MB, both packages 54.4MB → 28.6MB.
- Tab row: width no longer tracks content (w_full rows shipped in a fresh
binary), tab bar collapse behavior tuned; probe/packaging scratch dirs
ignored.
Convert local and HTTP GIF/WebP to a still PNG before gpui's img element, which panics when a frame index is reused on a static image. Release zip and installer now rebuild nebula with gpui-shell against the local component fork.
Register a ureq HttpClient so document tabs can fetch http(s) images. Also lands OSC 8/URL links, configurable terminal bell, and the rest of the 1.1.0 GPUI changelog.
Win32 input emits Esc down+up with uChar=27 so Claude Code sees 0x1b;
kitty flags encode CSI 27u instead of a bare escape. The TABS plus
button now creates the configured default shell; the dots keep the
profile picker. Plus/dots use the old 20px chrome size.
Checkpoint remaining GPUI parity work in the tree (settings rewrite,
math overlay, SSH settings, SVN status).
Use declarative screen evidence beneath exact hooks so more AI clients surface working and blocked states, while safe resume and fork commands preserve agent sessions across restarts.
Settings page now mirrors the legacy shell's layout: left section nav (Appearance / Profiles / Providers / SSH / Network / Interaction / Keymap / Advanced / Backup, same names and order as NebulaSettingsSection) with single-section content on the right. nebula-settings grows the full key-value surface ported verbatim from nebula_settings_load - language, shell, startup_directory, ghost/accept/completion_style, cjk_bold_regular, tab_reveal, density, new_tab_position, cell_width_mode, fetch, keep_session, restore_session, resume_ai, tray, blur, opacity, background (hex), panel_resize, ssh proxy trio, quick_terminal_hotkey - with factory defaults asserted item-by-item in tests (9 passing). Fixes a real unit bug: the font_size key stores LOGICAL PIXELS (legacy persists size/scale), not points - the GPUI shell was multiplying by 4/3 and rendering every terminal a third too large. Editors that depend on unmigrated subsystems (keymap table, SSH hosts, AI providers, backup) show explicit placeholders pointing at the legacy page; both shells keep reading and writing the same nebula_settings.txt.
First product-facing settings surface in the GPUI shell, kept strictly as a thin view: every semantic (keys, value domains, theme tables, persistence format) lives in the shared nebula-settings crate that was ported verbatim from the legacy shell. The pane edits theme / font size / cursor shape / cursor blink / copy-on-select / powerline via library Select/Checkbox/Button components and writes back through the new persist_keys (in-place key replacement preserving line order, unknown keys and comments - 3 new unit tests, 8/8 passing), so both shells keep reading the same nebula_settings.txt. Changes hot-apply: the workspace re-derives global Settings, pushes palette/font-size/fonts/copy_on_select into every open terminal view and re-syncs window chrome light/dark to the theme; cursor shape and font family take effect for new tabs, matching the legacy semantics. Entry points: titlebar gear button, Ctrl+comma, singleton settings tab in the sidebar.