# Windows Capability Matrix Maps current official Ghostty docs surfaces to noctty behavior on Windows. Cells stay short; rows with real nuance point into the [Notes](#notes) section below. Update rows when Windows behavior changes or when upstream docs add or remove a surface that this fork cares about. Last reviewed: 2026-10-15 (renderer, handoff, graphics and inert-settings notes; other rows 2026-09-02). ## Status legend - `supported` — works on current Windows builds and matches upstream docs closely enough to rely on them. - `partial` — some of the surface works, but Windows behavior is narrower, differently scoped, or still filling in. - `windows-specific` — added or materially changed by this fork; upstream Ghostty docs do not describe it accurately yet. ## Supported | Ghostty docs surface | noctty note | | ------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Configuration](https://ghostty.org/docs/config) and [option reference](https://ghostty.org/docs/config/reference) | Same config grammar and generated docs. Config lives at `%LOCALAPPDATA%\noctty\config.ghostty`; live reload via `Ctrl+Shift+,`. | | [Custom keybindings](https://ghostty.org/docs/config/keybind) | Same `keybind = trigger=action` grammar and `+list-keybinds` flow; defaults are the shared non-macOS set with Windows-specific exceptions. | | [Color Theme](https://ghostty.org/docs/features/theme) | Built-in themes, separate light/dark themes, custom themes, and `+list-themes` ship on Windows. | | [Configuration: `background-opacity`](https://ghostty.org/docs/config/reference) | Transparent terminal backgrounds work on Windows and can be toggled live. | | [Terminal API (VT)](https://ghostty.org/docs/vt) and [VT reference](https://ghostty.org/docs/vt/reference) | The shared Ghostty terminal core carries the documented VT/OSC/Kitty surface. Win32-validated coverage: [windows-vt-conformance.md](windows-vt-conformance.md). | | [Kitty keyboard protocol](https://ghostty.org/docs/vt) | Win32 supplies press, repeat, release, lock, and sided modifier state to the shared encoder. See [keyboard input](#keyboard-input). | | [Features overview: windows, tabs, and splits](https://ghostty.org/docs/features) | Native Win32 windows, tabs, and splits ship today in noctty. | | [Configuration: `scrollbar`](https://ghostty.org/docs/config/reference) | Per-pane graphical scrollbars honor `system` (Windows dynamic-scrollbar preference) or `never`; search matches appear as markers. See [search and scrollbars](#search-and-scrollbars). | | [Configuration: `notify-on-command-finish`](https://ghostty.org/docs/config/reference) | Focus policy, duration threshold, and bell/`notify` actions are applied; `notify` also needs `desktop-notifications`. See [notifications and progress](#notifications-and-progress). | | [Configuration: `clipboard-codepoint-map`](https://ghostty.org/docs/config/reference) | Selection copies apply the map before the clipboard write. See [clipboard and drag-drop](#clipboard-and-drag-drop). | | [Configuration: `clipboard-paste-protection`](https://ghostty.org/docs/config/reference) | Risky clipboard and dropped-content pastes use a native confirmation that previews the payload. See [clipboard and drag-drop](#clipboard-and-drag-drop). | | [Action reference: `copy_to_clipboard:html`](https://ghostty.org/docs/config/keybind/reference) | HTML copy writes CF_HTML and a plain-text fallback in one clipboard transaction. | | Kitty graphics protocol | Parser and renderer support ship, but child APC delivery depends on ConPTY. The bundled source passed the measured payload byte-exactly; the tested in-box fallback stripped it. Sixel is transported but not decoded or drawn, and the replies to Kitty commands, the memory they can use and `q=2` are covered in [inline graphics](windows.md#inline-graphics-replies-sixel-and-memory). See [ConPTY transport](#conpty-transport). | ## Partial | Ghostty docs surface | noctty note | | -------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Shell integration](https://ghostty.org/docs/features/shell-integration) | Upstream shell docs apply; Windows adds PowerShell injection and `cmd.exe` prompt/cwd marks. Clink is required for cmd command-finish marks and exit codes. See [shell integration notes](#shell-integration). | | [Action reference](https://ghostty.org/docs/config/keybind/reference) | Shared action grammar is intact, but upstream mixes in macOS/Linux behavior. For Windows truth, prefer `+show-config --default --docs` plus `+list-keybinds`. | | [Action reference: `toggle_secure_input`](https://ghostty.org/docs/config/keybind/reference) | A local sensitive-input indicator only; no Windows equivalent of macOS Secure Keyboard Entry, and system-wide keyboard hooks are not blocked. | | [Configuration: `auto-update`](https://ghostty.org/docs/config/reference) | Stable-release checking and prompts backed by GitHub Releases. `download` stages installer releases after SHA-256 and Authenticode verification; portable ZIP staging/apply additionally requires a pinned-publisher-signed manifest covering every payload file and otherwise stays on the release-page path. Apply is user-initiated. See [windows.md](windows.md#updates). | | [Configuration: `window-save-state`](https://ghostty.org/docs/config/reference) | Persists windows, tabs, splits, profiles, working directories, and titles under `%LOCALAPPDATA%\noctty\session-state.json`. `window-save-state-scrollback` opts in to bounded plain-text pane snapshots; child processes are not restored. | | [Configuration: `background-blur`](https://ghostty.org/docs/config/reference) | Accepted but inert on every Windows build: nothing in the Win32 runtime opts into a DWM transparency mechanism, so no backdrop material can show. Enabling it logs a warning. See [background blur](#background-blur). | | [Features overview](https://ghostty.org/docs/features) | Accessibility is partial: UI Automation covers the daily chrome and terminal text, but caption buttons, overlay rows, and menus are uncovered. Only NVDA has been measured, with mixed results. See [accessibility notes](#accessibility) and the [screen-reader matrix](accessibility-matrix.md). | | OSC 52 primary/selection clipboard selectors | Windows has one native clipboard: writes with selectors `c`, `s`, and `p` all target it; read replies still echo the requested selector. | | [Configuration: `link-previews`](https://ghostty.org/docs/config/reference) | Link matching, highlighting, and opening work, but the Win32 runtime does not render the preview tooltip. | | [Configuration: `key-remap`](https://ghostty.org/docs/config/reference) | Focused and in-app keybinds plus terminal encoding honor remaps; `global:` hotkeys keep the literal configured chord. See [keyboard input](#keyboard-input). | ## Windows-Specific | Ghostty docs surface | noctty note | | --------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [Features overview](https://ghostty.org/docs/features) | Upstream docs still say Windows support is planned. noctty ships a native Win32 app on Windows 10/11 x64 and ARM64. | | Elevated windows | Separate `runas` windows with integrity-scoped IPC and no elevated session restore. See [Running elevated](windows.md#running-elevated). | | [Features overview: GPU-accelerated rendering](https://ghostty.org/docs/features) | Terminal content renders with OpenGL 4.3+ via WGL by default, or the opt-in D3D11 beta. See [renderer notes](#renderer). | | [Configuration](https://ghostty.org/docs/config) | Windows state/config paths live under `%LOCALAPPDATA%\noctty\...`, not the macOS/Linux paths documented upstream. | | Local automation | Versioned JSON state and stable local verbs for windows, tabs, splits, focus, policy-allowed actions, and control-free text. See [automation.md](automation.md). | | [Features overview](https://ghostty.org/docs/features) | Win32-specific UX: DWM dark caption, high-contrast palette switching, IME, and native context menus. | | Integrated title bar | Windows 11 uses app-owned caption chrome with native caption actions and Snap Layout hover while the tab bar and decorations are visible; `window-show-tab-bar = never` and older builds use the stock caption. | | Universal palette | One blended, fuzzy-ranked command surface. See [universal palette notes](#universal-palette). | | Named layouts | Saves one window's tab/split/profile/cwd/title shape and materializes it in a new window from keybind, palette, or CLI. | | Quick select and copy mode | Visible regex targets plus modal keyboard selection and scrollback navigation. See [windows.md](windows.md#quick-select--copy-mode). | | Native settings | A native settings window with staged, source-preserving saves. See [native settings notes](#native-settings). | | Tab dragging | Same-window reorder and exact-pane drag-to-split. See [tab dragging notes](#tab-dragging). | | Power-aware rendering | `unfocused-render-fps` caps visible background presentation; `power-saver-rendering` controls saver pacing; minimized and DWM-cloaked windows do not present. See [power and battery](windows.md#power-and-battery). | | SSH host discovery | Concrete aliases from `%USERPROFILE%\.ssh\config` appear as system `ssh.exe` launch entries in the picker and palette. | | Windows default terminal | `+register-default-terminal` selects noctty per user through the Windows Terminal 1.24-or-newer OpenConsole handoff; see [windows.md](windows.md#default-terminal). | | Taskbar jump lists | Recent working directories and detected shell profiles launch from the pinned or running taskbar button. See [taskbar jump list](windows.md#taskbar-jump-list). | | Quick terminal and global hotkeys | Configurable edge/center terminal toggled by a bindable action; `global:` bindings use `RegisterHotKey`. See [quick terminal](#quick-terminal). | | Desktop notifications | WinRT Action Center toasts with a local fallback; command-finish and program status toasts focus their pane when clicked. See [notifications and progress](#notifications-and-progress). | | Taskbar progress | OSC 9;4 reports, or the root OSC 7501 status once a program reports one, drive the active pane's taskbar indicator when `progress-style` is enabled. | | Program status (OSC 7501) | Tab badges, taskbar state, rate-limited toasts, UIA `ItemStatus`, and `goto_attention`. See [program status](windows.md#program-status-osc-7501). | | Docked search | Each pane has a docked scrollback search with regex, case, whole-word, navigation, and scrollbar markers. See [search and scrollbars](#search-and-scrollbars). | | Tab overview | The bindable `toggle_tab_overview` action opens a numeric tab switcher; it has no default keybind. | | Drag and drop | Each pane accepts files, plain text, URLs, and HTML. See [clipboard and drag-drop](#clipboard-and-drag-drop). | | Opt-in child-process limits | Retained `linux-cgroup*` keys map to Job Objects for Windows-local children only. See [child-process limits](#child-process-limits). | | `TERM` and terminfo | Children get `TERM=xterm-ghostty`, with its compiled entry installed where Git for Windows tools such as `less`, `vim` and `tput` find it, or `xterm-256color` where it cannot be. See [terminfo](#terminfo). | ## Notes ### ConPTY transport Packaged builds and source builds (`zig build`) carry the side-by-side ConPTY redistributable and fall back to the in-box conhost only when it is missing or fails, with a banner that names the reason. `+version` and the diagnostic-bundle manifest report the active source and the reason. The in-box source answers DA, DSR and DECRQM itself and returns no colour or XTGETTCAP replies; see the [query differential](windows-vt-conformance.md#measured-query-ownership-differential). On this machine the bundled source delivered measured Kitty APC and Sixel DCS payloads byte-for-byte; the in-box source dropped both. Because the in-box source re-renders rather than forwards, it can also reshape repaints. For the `herdr` scenario measured on this conhost vintage it rewrote the application's absolute-CUP redraw into relative, context-dependent cursor motion plus ECH and skipped single cells inside a word, so a terminal that models one of those contexts differently loses the re-anchoring an absolute CUP would have given it; do not infer the same shape for another conhost without measuring it. Releases before 1.3.125 have no bundled pair and always take that path; `NOCTTY_CONPTY=inbox` reproduces it on current builds. See the generation-specific [transport catalog](windows-vt-conformance.md#conpty-transport-generations-and-mangling-catalog). ### Shell integration Upstream docs for automatic `bash` / `elvish` / `fish` / `nushell` / `zsh` injection still apply when those shells are launched on Windows. On top of that: - Automatic PowerShell injection (`powershell.exe`, `pwsh.exe`), with a manual fallback at `%LOCALAPPDATA%\noctty\shell-integration\powershell\integration.ps1`. - PowerShell emits OSC 7 cwd URIs and OSC 133 A / B prompt marks plus OSC 133 D command-finish status, around whatever `prompt` is current (starship, oh-my-posh, hand-written). B follows the visible prompt text: the line reader writes it after the host has drawn the prompt, so the prompt's cells are marked as prompt rather than input, and the prompt string a transcript records carries no mark (without PSReadLine, B still rides in that string). - The prompt is wrapped in a generated `function prompt`, and the line reader through a global alias (`PSConsoleHostReadLine`). A prompt replaced after startup (`. $PROFILE`, a theme re-init, a venv's `Activate.ps1`) is wrapped again before the next line is read; the one prompt drawn before that gets OSC 7, a `133;P;k=i;redraw=0` mark and B from the line reader, but no D. `Get-Command prompt` stays a Function. - OSC 133 C (pre-execution mark, carrying a `cmdline_url` of the command being accepted) goes out when the line reader returns an accepted line, once per line, including a line that repeats the previous history entry, and never for lines PSReadLine 2.0.x replays from the history file. Empty and whitespace-only lines get no C. It needs PSReadLine, which defines the line reader function the host calls; without it there is no C. It previously rode on PSReadLine's `AddToHistoryHandler`, which PSReadLine skips for a repeated line under the default `HistoryNoDuplicates`, and before that on `CommandValidationHandler`, which Enter does not trigger by default. - The integration does not touch `AddToHistoryHandler`: a profile's handler, and PSReadLine's default one that keeps credential-shaped lines out of the on-disk history file, stay exactly as they were. - The user's prompt sees the `$?` their command left, so a prompt that shows it, such as Starship's error status, reports failures inside noctty; under the previous wrapper it always read success. - OSC 133 prompt marks back previous/next prompt navigation, copying the last completed command output, and inserting the last recoverable single-line command back on the prompt from the command palette. Copy-output needs a complete OSC 133;C..D region; insert needs OSC 133;B and OSC 133;C and a B mark that noctty has not itself submitted with Enter since; it does not inspect or modify the shell's line editor, and it does not submit the command — OSC 133 marks are forgeable by any program writing to the terminal, so the user reviews and presses Enter. - PowerShell wraps `ssh` for `ssh-env` and cache-aware `ssh-terminfo`, but does not auto-install remote terminfo; uncached hosts use `xterm-256color`. The wrapper is installed only when an `ssh-*` feature is enabled, and only a wrapper noctty itself installed is ever removed: a `function ssh` defined in the user's `$PROFILE` — which runs before noctty's injected `-Command` — is left in place. - Automatic `cmd.exe` integration wraps the existing `PROMPT` (or cmd's `$P$G` default) to emit OSC 133 A/B prompt marks and OSC 9;9 cwd reports. When the shipped Clink Lua script is present, noctty prepends its directory to `CLINK_PATH`; an already-active Clink can then load it and emit OSC 133 C/D command marks and exit codes. Noctty does not activate Clink. Without the loaded Clink script, prompt/cwd marks still work but command-finish marks and exit codes are unavailable. - Working-directory reports drive tab titles and the directory new tabs and splits start in. OSC 7 must be a URL (`file://`, or the `kitty-shell-cwd://` noctty's own cmd integration sends) whose host is `localhost` or this machine (NetBIOS, DNS host or fully qualified name, in any letter case, with or without a trailing dot), so Git Bash, WSL, fish and nushell reports count and an ssh session's does not. OSC 9;9, the form Windows Terminal documents and oh-my-posh's `osc99` and nushell send, also takes a plain drive-absolute path (`C:\Users\me`, quoted or not) or the `\\wsl.localhost\Distro\...` path `wslpath -w` prints, with no host to check. Network shares, device paths and paths with control bytes are ignored in both. ### Terminfo - The package ships compiled `xterm-ghostty` and `ghostty` entries under `share\terminfo`, in the hex-directory layout (`78\xterm-ghostty`) that ncurses uses on Windows. The Windows build compiles them itself, byte for byte as ncurses 6.6 `tic -x` does. - At startup noctty installs the same entries into `.terminfo` under the home that Git for Windows gives its tools: `HOME` if set, else `HOMEDRIVE` + `HOMEPATH`. That is usually `%USERPROFILE%\.terminfo\78\xterm-ghostty` and `67\ghostty`. Git for Windows' `less`, `vim`, `nano` and `tput` find them there whichever drive the current directory is on, whether they are started from PowerShell, from git, or from Git Bash. - It never replaces a file it did not write. It records the SHA-256 of the entry it installed in `.terminfo\.noctty-installed`, and updates a file only while that file still holds the recorded entry. - It installs nothing in portable mode, which leaves nothing on the host, or when `term` names another entry. - It also installs nothing where it cannot safely know that home: - a home on a network share or mapped network drive, which a disconnected share would let block startup and every new tab (a local path that links to a share through a junction or symbolic link is not detected, as for `ssh` config includes); - `HOMEDRIVE` + `HOMEPATH` that is not a folder, where git.exe falls back to `USERPROFILE` but a tool started directly does not; - a `HOME` that is not an absolute Windows path. - `TERMINFO` is not exported on Windows. Those tools' ncurses splits it on `:`, so a `C:\...` path is searched as a directory `C` relative to the current directory, where a cloned repository can supply the entry. A `/proc/cygdrive/...` path is read by native Windows programs such as Neovim and Helix as a folder at the root of the current drive, which another account can create. - `TERM` falls back to `xterm-256color` whenever it names noctty's entry and the child's home has no such entry, for example in portable mode. `TERM_PROGRAM=ghostty` is set either way. - Standalone MSYS2 and Cygwin keep `HOME` under their own `/home` and do not see the entry. Their `less` and `tput` still report `xterm-ghostty` as unknown unless you copy the two files into that `.terminfo` folder or set `term = xterm-256color`. - WSL passes a Linux process only what `WSLENV` lists. For a launch of `wsl.exe`, noctty lists `COLORTERM`, `TERM_PROGRAM` and `TERM_PROGRAM_VERSION`, and `TERM` when the distribution has a terminfo entry for it (asked with `infocmp`); otherwise the distribution keeps `xterm-256color`. `ssh.exe` sends `TERM` to the server, so a host without the entry needs the `ssh-env` or `ssh-terminfo` shell integration feature, or `term = xterm-256color`. ### Keyboard input The Win32 path supplies press, repeat, and release events to the shared Kitty encoder, with Caps Lock, Num Lock, and left/right modifier state on every physical event. A key's text is what `TranslateMessage` typed for it, taken from the message queue when the key arrives, so a dead key composes with the next key (`'` then `e` types `é` on US-International), every key after it is sent once, and an accent that cannot combine with a key the terminal encodes itself (Enter, Backspace, Tab, Esc, Ctrl+[) is typed before that key, so Backspace cancels it. While a client has Kitty `report_all` enabled, ordinary keys carry that text on the physical event instead of a separate character commit, so press and release keep one identity: the `e` after a dead key reports `é`, AltGr chords ride the same path with the synthetic Ctrl+Alt collapsed, a dead key reports neither its press nor its release (held down, its first repeat that types text is reported as its press), and a dead key that cannot combine delivers both characters on the next key. IME commits remain text without a physical key. Unit tests drive the US-International, German and French layouts through the real `TranslateMessage`; a physical non-US keyboard has not been used. Kitty and modifyOtherKeys encodings survive the pseudo console byte for byte on the two sources measured here — the in-box conhost of Windows `10.0.26200.0` and the bundled OpenConsole `1.24.260710001`; older in-box conhosts are unmeasured. noctty implements Win32 input mode (`CSI ?9001h`), which ConPTY requests at the start of every session: while it is set and no application has asked for the Kitty keyboard protocol, every key event goes to ConPTY as a `KEY_EVENT_RECORD` with the real virtual key, scan code, character, control-key state and repeat count, so console-API readers such as PSReadLine see Shift+Enter, Ctrl+Enter, Ctrl+punctuation, AltGr chords and F13-F24 as Windows reports them (Shift+Enter adds a PSReadLine continuation line instead of running the line). Measured against a real console window on the same keys in [windows-vt-conformance.md](windows-vt-conformance.md#measured-win32-input-mode-records): every measured record agrees with conhost's except a latched dead key's release, where conhost emits the accent twice and Windows Terminal and noctty once; a physical non-US keyboard, IME composition and the in-box conhost as the pty are not measured. An application that reads VT bytes and asked for Kitty keeps those bytes; every other VT-input child, modifyOtherKeys included (conhost does not implement it), receives conhost's re-encoding of the records, as under Windows Terminal. Mouse input for console-API children goes the other way: a child that sets `ENABLE_MOUSE_INPUT` makes the bundled ConPTY ask noctty for SGR mouse reporting (`CSI ?1003;1006h`, `VtIo::Writer::WriteSGR1006`) and decode noctty's reports into `MOUSE_EVENT` records, which a `ReadConsoleInputW` reader receives (measured, `test/windows/hidden-win11-herdr-mouse.ps1`). herdr 0.8.2 in its default client/server mode reads those and its pane focus follows clicks under noctty (`pane current`: `w1:p1`, `w1:p2`, `w1:p1`) and under WezTerm (`w1:p1`, `w1:p2`, `w1:p3`, with the split's pane reported as `w1:p3` there; herdr's own input trace shows the same clicks at the same cells under both). Its `--no-session` (monolithic) mode ignores clicks under both terminals: it leaves the console in mode 0x98 (crossterm's `EnableMouseCapture` on Windows sets the console mode and emits no `CSI ?1000h`) and reads stdin as bytes, which a console never fills from `MOUSE_EVENT` records. That is the audit's G019 observation and it is herdr's, not noctty's. The same observer under WezTerm 20240203's own OpenConsole receives no mouse records at all, with or without `ENABLE_VIRTUAL_TERMINAL_INPUT` and also when it writes `CSI ?1003;1006h` itself (its focus records arrive, so it is attached and read), which fits an OpenConsole built before ConPTY's mouse support (inferred from the release dates, not checked against WezTerm's vendored source). `key-remap` changes modifier state before focused or in-app keybind matching and terminal encoding; it does not change physical key identity. `global:` bindings register the literal configured chord through `RegisterHotKey`, so remaps do not retarget system-wide hotkeys. ### Accessibility The Win32 host exposes a UI Automation root provider; tabs, the new-tab and overflow buttons, docked-search controls, the search result count, host banners, and the terminal scrollbar expose per-widget providers with the patterns their roles require; the command palette and settings sections expose list and selection semantics; and terminal text is available through `ITextProvider` / `ITextRangeProvider` / `ITextProvider2` including real selections. Caption buttons, overlay rows, menus, and toasts are still uncovered. Only NVDA has been measured, on a pre-release branch build, and several chrome elements do not announce their role or state through it — see the [screen-reader matrix](accessibility-matrix.md). ### Renderer Terminal presentation is owned by WGL `SwapBuffers`. A separate D3D11/DirectComposition shell pipeline (recoverable top-level targets, transparent DPI-sized D2D surfaces, DirectWrite host banner text) exists in the source but is not started: `App.init` gives its backend no driver, so chrome text is drawn with GDI. That pipeline does not replace or call the terminal renderer. The default terminal renderer has a hard OpenGL 4.3-via-WGL floor and no software fallback; below it, noctty shows a startup diagnostic naming the detected version and does not launch. The opt-in `renderer = d3d11` beta (feature level 11.0, with Microsoft's WARP software renderer as its own fallback) is a separate terminal path that does not lift that floor for images, custom shaders or background images: those switch the surface to OpenGL, and without a working OpenGL 4.3 driver a healthy D3D11 surface ignores them. See [D3D11 renderer beta](windows.md#d3d11-renderer-beta). ### Background blur `background-blur` has no visible effect on Windows in this build, on any build number, and noctty never asks for a DWM backdrop material. Nothing in the Win32 runtime can show one: the chrome is painted opaquely with GDI, the terminal is an opaque OpenGL child whose framebuffer alpha DWM discards, and nothing opts into `DwmExtendFrameIntoClientArea`, `DwmEnableBlurBehindWindow`, or `WS_EX_NOREDIRECTIONBITMAP`. Measured on Windows 11 build 26200 over a finely striped desktop, which a real blur would smear: with `--background-opacity=0.8 --background-blur=true` the host window read back `WS_EX_LAYERED`, `LWA_ALPHA` alpha 204, and `DWMWA_SYSTEMBACKDROP_TYPE` 4 (`DWMSBT_TABBEDWINDOW`), and its screenshot was byte-identical to the same run with `--background-blur=false` (backdrop 1). Flipping the attribute from outside the process on the same window with `WS_EX_LAYERED` stripped by hand changed nothing either, so the layered alpha that implements `background-opacity` is not the obstacle — a synthetic window that does extend its frame renders a visibly different material per backdrop type whether or not it is layered. The obstacle is that noctty never opts in. Blurred translucency would therefore need a per-pixel window alpha opt-in plus a composition swapchain for the terminal, so the OpenGL content is not flattened opaque on its way through DWM. Enabling `background-blur` logs one warning instead, at startup or when a config reload turns it on; like every other log line in this runtime it goes to stderr, so it is visible where stderr is captured. The Settings window shows the checkbox disabled, labelled "not supported on Windows", so nobody there toggles it and waits for a change. ### Settings accepted without effect noctty keeps the full upstream configuration surface so that a shared config file loads, and only `background-blur` (below) logs a warning when it is set. Searching `src/` (outside `Config.zig`, the doc generators and the tests' deny-lists) on `e6dae0919` finds no code that acts on these keys, so setting them changes nothing on Windows: - `focus-follows-mouse`, `window-inherit-font-size`, `resize-overlay`, `resize-overlay-position` and `resize-overlay-duration`: the Win32 runtime has no code for them (a new window or tab does not inherit an adjusted font size). - `bell-features`, `bell-audio-path` and `bell-audio-volume`: a bell, and the bell part of `notify-on-command-finish-action`, always plays the system `MessageBeep`; the attention, title and border features and the custom sound are not implemented. - `quick-terminal-space-behavior`: copied into the quick-terminal settings, where nothing reads it. - The GTK and X11 keys: `gtk-opengl-debug`, `gtk-single-instance`, `gtk-custom-css`, `gtk-quick-terminal-layer`, `gtk-quick-terminal-namespace`, `gtk-titlebar`, `gtk-titlebar-style`, `gtk-titlebar-hide-when-maximized`, `gtk-toolbar-style`, `gtk-tabs-location`, `gtk-wide-tabs`, `x11-instance-name`, `async-backend` and `_xdg-terminal-exec`. `background-blur` is the one accepted-but-inert key that does log a warning (see [Background blur](#background-blur)). Map a Windows Terminal `bellStyle` to nothing: there is no equivalent setting. ### Universal palette Configurable actions, live tabs, panes, Windows profiles, installed themes, native settings, reviewed help destinations, and keyboard tab-to-pane moves share one typed, fuzzy-ranked list with: - category prefixes (`>`, `@`, `/`, `~`, `:`, `%`, `!`, `?`) and keyboard navigation - stable dispatch IDs and destructive/disabled semantics - UI Automation selection announcements - reversible live theme preview before commit (High Contrast suppresses cosmetic previews but still allows an explicit commit) - a snapshot-validated recent-action provider ### Native settings Appearance, Terminal, Shell, Privacy, Updates, Keybindings, and Advanced sections ship. Edits are staged until Save and applied through an atomic, source-preserving config patch; Advanced shows the pending field diff and keeps the plain-text escape hatch. Owned snapshots survive external reloads, and native fields support reversible live preview, revision-aware external-edit merging, and explicit Keep mine / Use disk conflict resolution. Keybinding editing still uses the text config and CLI discovery commands. ### Tab dragging Same-window reorder and DPI-aware exact-pane drag-to-split ship, with operation-labeled drop previews. Transfers move the complete source split subtree through one authoritative ShellState/native transaction, and undo / redo restore exact tab, pane, split-tree, ratio, and focus identity. The universal palette provides the equivalent keyboard workflow. Cross-window OLE transfer is not shipped. ### Quick terminal No default keybind. Bind `toggle_quick_terminal`; add the `global:` prefix for a system-wide hotkey while noctty is running. Windows can reject a reserved or conflicting trigger. Position, size, monitor, animation, autohide, and focus behavior are configurable. `exclusive` maps to focused input, and `quick-terminal-space-behavior` has no Windows effect. ### Notifications and progress WinRT toasts use noctty's AppUserModelID and fall back to a host banner, then the log, when native delivery fails. `desktop-notifications` gates every toast. Command-finish toasts additionally need `notify-on-command-finish` and a `notify-on-command-finish-action` that includes `notify`. Command-finish and [program status](windows.md#program-status-osc-7501) toasts carry a launch argument and focus the originating pane when clicked; OSC 9 / OSC 777 toasts are display-only. Reliable cold-start activation depends on the installed Start menu shortcut. `notify-on-command-finish-after` and the focus policy are applied before the bell or toast; command marks come from shell integration or OSC 133, which `cmd.exe` does not supply. With `progress-style = true`, terminal progress reports map to normal, paused, error, or indeterminate taskbar states for the active pane in each host. If the taskbar COM interface fails, noctty disables the native indicator. ### Search and scrollbars `Ctrl+Shift+F` opens search for the focused pane. Search state and controls are per pane; results can mark the graphical scrollbar. `scrollbar = system` respects Windows' dynamic-scrollbar preference and stays visible in High Contrast; `never` removes only the visual widget. ### Clipboard and drag-drop `clipboard-paste-protection` controls confirmation for unsafe clipboard pastes and the stricter dropped-payload classifier. The confirmation shows the payload it is about in a read-only monospace pane, capped at 64 KiB of display (the full payload is still what Accept delivers). Three things are replaced with U+FFFD: invalid UTF-8 and NUL, neither of which survives the trip to a Win32 EDIT, and Unicode bidirectional formatting characters (`U+061C`, `U+200E`, `U+200F`, `U+202A`-`U+202E`, `U+2066`-`U+2069`). The bidi replacement is there for a different reason than the other two: those characters are invisible and reorder the text around them, so a pane that rendered them literally could show a different reading order than the payload actually has. That applies to legitimate right-to-left payloads as much as to crafted ones — a genuine RTL paste carrying directional marks will show U+FFFD where they were. Line endings are normalised to CRLF for display, because a Win32 EDIT breaks lines only on CRLF and would otherwise render an LF-only payload as a single line. Every other control character, DEL included, is shown as it is, matching upstream Ghostty's GTK and macOS dialogs. CF_HTML copies also place a plain-text fallback on the clipboard. Dropped files, text, URLs, and HTML are converted to terminal input. Shift changes file/text handling, Ctrl suppresses file-path quoting, and Alt is reserved. `clipboard-codepoint-map` is applied by the shared selection formatter before plain, VT, or HTML bytes reach the clipboard. Clipboard reads, URL copies, OSC 52 writes, and `write_screen_file` exports are not mapped. ### Child-process limits The retained `linux-cgroup`, `linux-cgroup-memory-limit`, `linux-cgroup-processes-limit`, and `linux-cgroup-hard-fail` keys opt Windows-local launches into Job Object enforcement. Off by default; best-effort failures continue without limits unless hard-fail is set. `windows-job-object-kill-on-close` is also opt-in. WSL launches are excluded. ## Maintenance Anchors - `src/config/Config.zig` — config docs, keybinds, feature gates, and limits. - `src/termio/shell_integration.zig` and `src/config/windows_shell.zig` — shell integration and Windows shell detection. - `src/apprt/win32.zig`, `src/apprt/win32_quick_terminal.zig`, `src/apprt/win32_search_bar.zig`, and `src/apprt/win32_scrollbar_geometry.zig` — Win32 runtime and interactive UI. - `src/apprt/win32_toast_winrt.zig`, `src/apprt/win32_toast_activation.zig`, `src/apprt/win32_aumid.zig`, and `src/apprt/win32_taskbar_progress.zig` — notifications and shell progress. - `src/apprt/win32_clipboard_html.zig`, `src/apprt/win32_paste_protection.zig`, `src/apprt/win32_surface_drop_target.zig`, and `src/apprt/win32_job_object.zig` — clipboard, drop, and process limits. - `src/apprt/win32_theme.zig` and `src/apprt/win32_uia/` — theme policy and accessibility providers. - `docs/status.md` and `docs/getting-started.md` — user-facing summaries that should stay aligned with this matrix.