# ghostty-windows
**Repository Path**: xfworld/ghostty-windows
## Basic Information
- **Project Name**: ghostty-windows
- **Description**: AI Terminal
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-05-10
- **Last Updated**: 2026-05-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
Ghostty for Windows
Native Windows port of the Ghostty terminal emulator.
Status
·
Building
·
Shortcuts
·
Configuration
·
Upstream Docs
## About
This is a fork of [Ghostty](https://github.com/ghostty-org/ghostty) that adds **native Windows support** via a Win32 application runtime. It runs as a standalone `.exe` — no WSL, no Cygwin, no compatibility layers.
The goal is to track the upstream main branch while maintaining a native Windows port that leverages Ghostty's cross-platform core (terminal emulation, renderer, font system).
> **Upstream Ghostty** supports Linux (GTK) and macOS natively. This fork adds a `win32` application runtime alongside those existing backends. See the [upstream repository](https://github.com/ghostty-org/ghostty) for the original project.
## Status
**Feature-complete** — 100% apprt action coverage (65/65 actions handled). The terminal is ready for daily use.
### Features
**Terminal**
- Full VT sequence support with OpenGL 4.6 rendering (WGL)
- FreeType + HarfBuzz fonts with DirectWrite system font discovery
- ConPTY shell spawning (cmd.exe, PowerShell, WSL)
- Win32 Input Mode (mode 9001) for full Unicode through ConPTY
- IME support for CJK input (Japanese, Chinese, Korean)
- Per-monitor DPI awareness, window resize with grid reflow
- 463 built-in color themes (same as macOS)
**Windows & Tabs**
- Multiple windows, tabbed interface with custom GDI tab bar
- Tab drag-and-drop reorder, inline rename (double-click), right-click context menu
- Close tab modes: current, all others, all to the right
**Split Panes**
- Split right/down/left/up, navigate between panes
- Mouse drag to resize dividers, double-click to equalize
- Toggle split zoom, equalize all splits
- Independent split tree per tab
**Extras**
- Command palette with filterable actions and keybinding hints
- Quick terminal (slide-in/out from screen edge with global hotkey)
- Find-in-terminal search bar
- URL detection with Ctrl+click to open in browser
- Desktop notifications (OSC 9, OSC 777)
- Background opacity, fullscreen, window decorations toggle
- Font size zoom with inheritance to new tabs/splits
- Config hot-reload, scrollbar
- DWM dark/light chrome and Win11 22H2+ caption color matching the
configured background
- Shell integration for PowerShell (prompt marking, CWD, title)
- Drag a file from Explorer onto the terminal to paste its path
- Visual bell (taskbar flash) when BEL fires on an unfocused window
- Taskbar flash when a command exits non-zero in an unfocused window
- Confirm-close dialog when a programmatic close hits a tab with a
running command
- Auto-update check against GitHub releases (rate-limited to once per
hour); clicking the "Update available" balloon opens the releases
page in your browser
- Horizontal scroll wheels / trackpad gestures (`WM_MOUSEHWHEEL`)
### Platform-Specific Notes
- Inspector (debug overlay) — acknowledged but no Win32 UI yet
- `undo`/`redo` — macOS NSUndoManager only, no Win32 equivalent
- `secure_input` — macOS EnableSecureEventInput only
- Release build + installer (MSI/MSIX) — not yet packaged
## Building
Requires [Zig](https://ziglang.org/download/) 0.15.2 or newer.
### Cross-compile from Linux/WSL2
```bash
zig build -Dapp-runtime=win32 -Dtarget=x86_64-windows
```
The executable is at `zig-out/bin/ghostty.exe`. Copy it to a Windows path and run it.
### Release build
```bash
zig build -Dapp-runtime=win32 -Dtarget=x86_64-windows -Doptimize=ReleaseFast
```
To debug a release build with stderr visible, add `-Dwindows-console=true`
— it links against `/SUBSYSTEM:CONSOLE` instead of the default Windows
GUI subsystem so the process gets a console attached.
## Keyboard Shortcuts
All keybindings are configurable via the `keybind` config option. These are the defaults:
### General
| Action | Shortcut |
|--------|----------|
| New window | `Ctrl+Shift+N` |
| Close surface (tab/pane) | `Ctrl+Shift+W` |
| Close window | `Ctrl+Shift+Q` |
| Toggle fullscreen | `Ctrl+Enter` |
| Command palette | `Ctrl+Shift+P` |
| Open config file | `Ctrl+,` |
| Reload config | `Ctrl+Shift+,` |
| Quit | `Ctrl+Shift+Q` |
### Tabs
| Action | Shortcut |
|--------|----------|
| New tab | `Ctrl+Shift+T` |
| Next tab | `Ctrl+Page Down` |
| Previous tab | `Ctrl+Page Up` |
| Go to tab 1–8 | `Ctrl+1` – `Ctrl+8` |
| Go to last tab | `Ctrl+9` |
| Move tab left | `Ctrl+Shift+Page Up` |
| Move tab right | `Ctrl+Shift+Page Down` |
| Drag reorder | Mouse drag on tab |
| Rename tab | Double-click tab |
| Tab context menu | Right-click tab |
### Split Panes
| Action | Shortcut |
|--------|----------|
| Split right | `Ctrl+Shift+O` |
| Split down | `Ctrl+Shift+E` |
| Focus next pane | `Ctrl+Shift+]` |
| Focus previous pane | `Ctrl+Shift+[` |
| Equalize splits | Configurable (`equalize_splits`) |
| Toggle split zoom | Configurable (`toggle_split_zoom`) |
| Resize split | Mouse drag on divider |
| Equalize split | Double-click divider |
### Text & Clipboard
| Action | Shortcut |
|--------|----------|
| Copy | `Ctrl+Shift+C` |
| Paste | `Ctrl+Shift+V` |
| Select all | `Ctrl+Shift+A` |
| Find | `Ctrl+Shift+F` |
| Find next | `Enter` (in search bar) |
| Find previous | `Shift+Enter` (in search bar) |
| Close search | `Escape` |
### Font Size
| Action | Shortcut |
|--------|----------|
| Increase font size | `Ctrl+=` |
| Decrease font size | `Ctrl+-` |
| Reset font size | `Ctrl+0` |
### Mouse
| Action | Gesture |
|--------|---------|
| Vertical scroll | Mouse wheel |
| Horizontal scroll | Trackpad swipe / horizontal wheel |
| Drag-select | Left-click drag |
| Open URL | `Ctrl+Click` on a detected URL |
| Middle-click paste | Middle button (configurable via `middle-click-action`) |
| Drop file | Drag a file from Explorer onto the terminal — its path is pasted |
### Quick Terminal
The quick terminal requires a keybinding in your config:
```
keybind = global:ctrl+grave_accent=toggle_quick_terminal
```
The `global:` prefix makes it work system-wide, even when Ghostty isn't focused.
## Configuration
Ghostty reads its config file from `%LOCALAPPDATA%\ghostty\config` (or `%XDG_CONFIG_HOME%\ghostty\config` if set). Example:
```
# Font
font-family = JetBrains Mono
font-size = 14
# Colors
background = #1e1e2e
foreground = #cdd6f4
# Shell
command = powershell.exe
# Behavior
quit-after-last-window-closed = true
# Quick terminal (global hotkey)
keybind = global:ctrl+grave_accent=toggle_quick_terminal
```
See the [upstream documentation](https://ghostty.org/docs/config) for the full list of config options. Most settings work on Windows — the exceptions are platform-specific options (GTK, macOS).
## Architecture
The Windows port adds a `win32` application runtime (`src/apprt/win32/`) alongside the existing GTK (Linux) and AppKit (macOS) runtimes. It reuses Ghostty's cross-platform core:
- **Terminal emulation**: Shared VT parser, screen, scrollback (`src/terminal/`)
- **Rendering**: OpenGL 4.3+ with WGL context management (`src/renderer/`)
- **Fonts**: FreeType rasterization + HarfBuzz shaping + DirectWrite discovery (`src/font/`)
- **PTY**: Windows ConPTY via `CreatePseudoConsole` (`src/pty.zig`)
- **I/O**: libxev with IOCP backend (`src/termio/`)
### Key files
```
src/apprt/win32/
App.zig — Win32 message loop, window classes, action dispatch
Window.zig — Top-level container HWND, tab bar, splits, tab lifecycle
Surface.zig — WS_CHILD HWND, WGL context, input, clipboard, search, command palette
QuickTerminal.zig — Quick terminal popup with slide animation
win32.zig — Win32 API type definitions and extern declarations
src/shell-integration/powershell/
ghostty-shell-integration.ps1 — PowerShell prompt marking, CWD, title
```
## Testing
A test harness runs from WSL2 using PowerShell automation:
```bash
bash test/win32/ghostty_test.sh all
```
25+ automated tests cover: launch/close, window properties, keyboard input, multiple windows, clipboard, config loading, scrollbar, close confirmation, URL detection, notifications, window sizing, window resize (real assertion), search bar, config reload, tabs (new/switch/close), opacity, command palette, tab drag reorder, inline tab rename, split panes, font zoom, fullscreen toggle, open config, and quick terminal.
Tab and split tests run in PowerShell sessions:
```bash
powershell.exe -ExecutionPolicy Bypass -File test/win32/test_tabs.ps1 -ExePath path\to\ghostty.exe
powershell.exe -ExecutionPolicy Bypass -File test/win32/test_splits.ps1 -ExePath path\to\ghostty.exe
```
## Syncing with Upstream
This fork tracks `ghostty-org/ghostty` main branch. To sync:
```bash
git remote add upstream https://github.com/ghostty-org/ghostty.git
git fetch upstream
git merge upstream/main
```
`git rerere` is enabled in the local repo so previously-resolved
conflict resolutions get re-applied automatically on subsequent merges.
When resolving conflicts, default to **keep upstream** for any file
outside `src/apprt/win32/`, `dist/windows/`, or `test/win32/`. The
`.win32` switch arms (`.none, .win32 => void` and similar) need to be
preserved in upstream switches that handle apprt variants.
Files most likely to conflict on upstream merges:
- `src/Surface.zig`, `src/config/Config.zig`, `src/font/discovery.zig`,
`src/font/DeferredFace.zig`, `src/font/backend.zig`
- Switch-arm files: `src/apprt/runtime.zig`, `src/apprt.zig`,
`src/datastruct/split_tree.zig`, `src/input/Binding.zig`,
`src/font/face.zig`, `src/terminal/mouse.zig`
## License
Same as upstream Ghostty — see [LICENSE](LICENSE).