Releases: shiweis/ghostty-windows
Release list
win-v1.2.0 — upstream sync + macOS parity batch
Upstream sync (264 commits from ghostty-org/ghostty main, through e1d31deaa) plus a large macOS-parity feature batch, hardened by an adversarial review pass.
Highlights
Fixed
- CJK IME input works again — Chinese/Japanese/Korean composition was completely broken (the IME never received its keys); the composition now also renders inline at the cursor with the candidate window anchored to it.
- Clipboard security guards were silently bypassed — paste-protection and OSC 52 read/write authorization now actually prompt.
- AltGr layouts (German/Polish/…) no longer corrupt input into control sequences.
- Whole-window close (X button / Alt+F4) confirms when processes are still running.
- libghostty-vt: double/triple-click selection timing fixed on Windows.
Added
- Taskbar progress for OSC 9;4 progress reports
- Right-click context menu on the terminal
- Command-finished notifications (bell and/or toast, config-gated), click-to-focus notifications
window-theme(dark/light/system) for the title bar;background-bluracrylic- Global hotkeys for any
global:keybind; re-registered on config reload - Search match counter, hovered-URL preview bubble, resize overlay (cols × rows)
- User-defined
command-palette-entrycommands in the palette - X1/X2 mouse buttons,
window-decoration = none,window-position-x/y - Renderer occlusion: hidden tabs / zoomed-out splits / minimized windows stop rendering
See CHANGELOG.md for the complete list.
Install
Download ghostty-windows-x64.zip, extract ghostty.exe anywhere, and run it. Self-contained — no installer or runtime dependencies.
Config file: %LOCALAPPDATA%\ghostty\config (open with Ctrl+,). Most upstream options work on Windows.
Ghostty for Windows 1.1.0
win-v1.1.0
Upstream sync (63 commits from ghostty-org/ghostty main) plus a batch of
Win32 input and UX fixes that surfaced during parity testing against macOS.
Highlights
Keyboard / input correctness
- Dead-key composition fixed for pt-BR ABNT2 and similar layouts
(~+a→ã,´+e→é, …). Affected both the default and
Win32 Input Mode paths (PowerShell + PSReadLine). - JIS
shift+5arriving as5inside Claude Code's prompt is fixed.
Win32 Input Mode is now the apprt's exclusive wire format when DEC
mode 9001 is active. - JIS layout no longer drifts to a US-like mapping after a dead key.
- Alt-modified keybindings (
Alt+-,Alt+\, …) no longer ring the
system bell.
Stability
- No more freeze after extended use under heavy ConPTY output. The
oleacc/MSAA accessibility round-trip that wedged the UI thread is
bypassed (we don't expose terminal-cell-level accessibility yet).
UI polish
- Themed scrollbar replaces the native white
WS_VSCROLL. Paints in
the terminal's colors; honors the OS "Always show scrollbars" setting. - Inline tab rename: text displays cleanly, commits on focus loss
(Win32 convention), keybindings likeCtrl+Shift+Pwork while
renaming. - Command palette and search bar auto-dismiss on focus loss.
- Clicking on the terminal actually takes keyboard focus.
toggle_background_opacitystate inherits to new windows.
Upstream changes
Notable fixes from the upstream merge: zero-width grapheme attachment
during pending wrap, command-palette-entry clearing parity with
keybind, libghostty-vt C API expansion, iTerm2 color schemes update,
Basque (eu) localization, and macOS-side polish that doesn't affect
Windows.
Full diff: win-v1.0.1...win-v1.1.0
Ghostty for Windows 1.0.1
win-v1.0.1 — 2026-04-29
Added
- Horizontal scroll support via WM_MOUSEHWHEEL.
- File drag-and-drop onto a terminal pastes the file path(s), quoting if
whitespace is present. present_terminalaction now restores+focuses the window.mouse_visibilityaction toggles the cursor via SetCursor(NULL).command_finishedflashes the taskbar button on non-zero exit when the
window is unfocused.float_windowaction sets/clears WS_EX_TOPMOST.toggle_visibilityhides/shows all top-level windows.size_limitaction enforces minimum/maximum window dimensions via
WM_GETMINMAXINFO.color_change(OSC 10/11) updates the class background brush so the
resize-flash matches.ring_bellnow also flashes the taskbar when the window is unfocused.- Confirm-close dialog when programmatically closing a tab while a shell
command is running. - Built-in
ghostty.icois used for the window icon and tray notifications
(was the generic Windows app icon). - New windows cascade 30px from the most recently created window.
- Build option
-Dwindows-console=truekeeps stderr visible in release
builds for debugging. - Title-bar color tracks the configured background on Windows 11 22H2+
(DWMWA_CAPTION_COLOR), and dark/light chrome is chosen by background
luminance instead of being hardcoded dark. - Title-bar chrome refreshes on config reload.
- Clicking the update-available balloon opens the GitHub releases page
in the user's default browser. - Update-check requests are rate-limited to once per hour via a
persisted timestamp at%LOCALAPPDATA%/ghostty/update_check_at. - VS_VERSION_INFO resource is filled in (Explorer → Properties → Details
shows real values; signtool tooling has version metadata to attach). - Application manifest declares UTF-8 active codepage, longPathAware,
and supportedOS GUIDs for Windows 7 through 11. test_window_size_confignow hard-fails (was non-blocking) if the
configured window width didn't take effect.test_resizeis a real test (was permanently SKIPPED).ghostty_test.shpre-kills leftover processes and retries the exe
copy once, eliminating intermittent EBUSY in batch runs.
Changed
- Update-check version source is now
build_config.version(set by the
win-v git tag at build time) instead of a hardcoded constant that drifted
every release. - Build accepts
win-vX.Y.Ztags as a separate version namespace from
upstream'svX.Y.Z(which still must matchbuild.zig.zon). - Manifest declares UTF-8 active codepage, longPathAware, and supportedOS
for Windows 7-11. - All Win32 bindings use
callconv(.winapi)instead ofcallconv(.c).
Identical ABI on x64 today; correct WNDPROC type, future-proof for x86. - DirectWrite locale fallback chain widened: en-US, en-us, en-GB, en before
index 0. - DragDropFiles, FlashWindowEx, ShowCursor, GetSystemMetrics,
SetClassLongPtrW, SIF_TRACKPOS bindings added. - DrawTextW binding moved from
gdi32touser32(correct DLL).
Fixed
- C1:
cleanupAllSurfaceswas deinit'ing a local copy of each SplitTree,
leaving stale arena pointers; now deinits in place and resets the slot
to.empty. - C2: A
closingflag is now set before posting WM_CLOSE for the last
tab; queued mouse/keyboard events are dropped while it's set so they
can't allocate into a window about to be freed. - C6: Packaging now includes
share/terminfo/ghostty.terminfo(the
resourcesDir sentinel on Windows). Without it, fresh ZIP installs
silently failed to load themes. - C7: Update-check version is now passed via heap pointer through
WPARAM/LPARAM instead of a static buffer with no fence. - DirectWrite no longer panics when the factory or system font collection
is unavailable (Wine, restricted SKUs); discovery returns empty and
callers fall back to bundled JetBrains Mono. - ToUnicode scancode mask was 0x1FF; including bit 24 (extended-key flag)
produced wrong translations for AltGr layouts. - Palette
scroll_offset @intCastcould panic when the popup was too
small to render any items. - IME
ImmGetCompositionStringWbyte length now uses@divTruncwith
parity check instead of@divExact(which would panic on odd input). high_surrogatebuffer is cleared on focus loss and IME composition
start so a stray surrogate can't pair with the next character key.selectTab(_)clamps the discriminant non-negative before@intCast.tab_rectsis zero-initialized so input handlers reading it before
the first WM_PAINT see a no-match instead of stack garbage.moveTabTonow cancels any in-progress tab rename.paintTabBarbrush failures no longer skip the geometry update at the
bottom of the loop (was piling subsequent tabs on top of the failed
one).QuickTerminal.onWindowDestroyedunconditionally KillTimers the
animation timer.- Search/palette popup fonts are rebuilt on DPI change.
- Multi-button mouse capture: SetCapture/ReleaseCapture only run on the
0→nonzero and nonzero→0 transitions of a button-mask. show_child_exitedMessageBoxW now actually formats the exit code
into the body text instead of building it and discarding.- Desktop and update notifications use distinct (uID, timer-id) pairs so
one's auto-cleanup doesn't NIM_DELETE the other's icon. paintPalettefont and bg brush are cached for the popup lifetime
instead of allocated per repaint.- Process HANDLE in
Command.zigis nowCloseHandled on deinit. - Several upstream features that had been dropped during past merges
(R1-R9 in the audit) were restored:GHOSTTY_SURFACE_IDenv var, the
processLinksrenderer-state mutex,semantic_prompt_boundaryin
link detection,middle-click-actionconfig option, defaultmove_tab
keybinding, DECBKM mode 67, macOS-only scroll magnitude flooring,
freetype_windowsbackend variant, theGHOSTTY_ENUM_TYPEDmacro and
GHOSTTY_MODE_REPORT_MAX_VALUEsentinel.
Ghostty for Windows v1.0.0
First release of the native Windows port of Ghostty.
Features
- Native Win32 terminal with OpenGL 4.6 rendering (WGL)
- Tabs (drag reorder, inline rename, right-click context menu)
- Split panes (resize via mouse drag, zoom, navigate)
- Command palette (Ctrl+Shift+P) with keybinding hints
- Quick terminal (slide-in/out with global hotkey)
- 486 built-in color themes
- DirectWrite font discovery with proper codepoint fallback
- Shell integration for PowerShell
- DPI-aware UI, dark mode, background opacity
- Auto-update notification via GitHub releases
- Find-in-terminal search bar, URL detection, desktop notifications
- 25 automated integration tests, all passing
Install
- Download
ghostty-windows-x64-win-v1.0.0.zipbelow - Extract anywhere
- Run
ghostty.exe
Config file: %LOCALAPPDATA%\ghostty\config
Keyboard Shortcuts
| Action | Shortcut |
|---|---|
| New tab | Ctrl+Shift+T |
| Close tab/pane | Ctrl+Shift+W |
| Command palette | Ctrl+Shift+P |
| Split right / down | Ctrl+Shift+O / E |
| Navigate splits | Ctrl+Shift+[ / ] |
| Copy / Paste | Ctrl+Shift+C / V |
| Find | Ctrl+Shift+F |
| Fullscreen | Ctrl+Enter |
| Zoom in/out/reset | Ctrl+= / - / 0 |
Full docs: README