WispTerm
A fast, modern terminal for Windows, macOS, and experimental Linux, written in Zig, powered by libghostty-vt.
Ships for Windows, macOS (Apple Silicon & Intel), and an experimental Linux AppImage.
Quick start
Three steps to a productive WispTerm session: install the app, point the AI Copilot at an LLM provider, and teach your SSH servers to report their working directory.
1 · Install
Grab the latest Windows or macOS build, or build from source with Zig. Jump to install options ↓
2 · Configure an LLM provider
Open the session launcher (Ctrl/CmdShiftT), choose AI Agent, and fill in a base URL, API key, and model — DeepSeek V4 is the default. Switch later with /model or the model label. Configure the LLM provider →
3 · Configure your SSH servers
Add a small OSC 7 snippet to the remote shell so downloads and dragged uploads land in the directory you actually cd'd to. SSH server setup ↓
Built for daily work
WispTerm layers practical features on top of Ghostty's terminal core — splits, tabs, AI agent tools, a file explorer, themes, background images, and an opt-in remote-access client.
Ghostty's emulation
Uses libghostty-vt for VT parsing and terminal state, so behavior matches Ghostty closely.
Native font stack
Native font discovery with per-glyph fallback, FreeType rasterization, Ghostty-style metrics.
Splits & tabs
Vertical/horizontal splits, tab strip, focus-follows-mouse, equalize sizes, spatial focus movement.
AI agent tabs
Chat tabs can act as local agents: read terminal snapshots, run shell commands (PowerShell on Windows, shell on macOS/Linux), work with WSL and SSH sessions, load skills, switch models in-session with /model, keep tool approval inside WispTerm, and export full or clean Markdown records. Explore the AI workflow or see use cases.
Copilot where you work
Use Ctrl/CmdShiftA, the command center, or the terminal's right-edge Copilot handle to open the in-context sidebar for the focused terminal.
453 themes built-in
Ghostty-compatible theme files. Defaults to Poimandres; browse previews in the theme gallery and switch from the command center.
Background images
PNG/JPG/BMP/GIF/TGA wallpapers with per-cell opacity blending and four scaling modes.
File explorer & previews
Browse local, WSL, and SSH files. Preview Markdown, text, CSV, TSV, and images without leaving the terminal.
Embedded browser
Open http(s) URLs in a side WebView2 (Windows) or WKWebView (macOS) panel. SSH sessions tunnel loopback URLs automatically.
Kitty Graphics
Display inline images and PDFs from remote shells via imgcat.py / pdfcat.py helpers.
Custom shaders
Ghostty-compatible GLSL post-processing. Effects apply uniformly to terminal and wallpaper.
Sprite rendering
Crisp box drawing, block elements, braille patterns, and powerline symbols at any size.
Opt-in remote access
Share a session key over a Cloudflare-hosted relay. Disabled by default — your shell stays local.
Hot-reload config
Press Ctrl+, to edit; saving applies changes without restarting.
Install
Pre-built releases for Windows, macOS, and experimental Linux are published per version. Pick the package that fits your platform and workflow.
Portable
Single executable — download the zip, extract, and run wispterm.exe.
Portable + WebView2
Bundles WebView2Loader.dll for the embedded browser side panel.
macOS DMG
Signed and notarized .dmg for Apple Silicon and Intel. Requires macOS 13+. Open the DMG and drag WispTerm.app to Applications.
AppImage
Portable x86_64 AppImage for community testing. It bundles SDL3; expect rough edges while the Linux port matures.
Download AppImage →Build from source
Clone the repo and build with Zig. On Windows: zig build. On macOS: zig build macos-app -Dtarget=aarch64-macos.
git clone https://github.com/xuzhougeng/wispterm
cd wispterm
# Windows
zig build -Doptimize=ReleaseFast
# macOS (Apple Silicon)
zig build macos-app -Dtarget=aarch64-macos
Configure with a single file
WispTerm uses a Ghostty-compatible key = value config. Default path: %APPDATA%\wispterm\config on Windows, ~/Library/Application Support/wispterm/config on macOS. Press Ctrl+, (Cmd+, on macOS) to open it; CLI flags override file values.
font-family = Cascadia Code
font-size = 14
cursor-style = bar
cursor-style-blink = true
theme = Poimandres
window-width = 120
window-height = 32
scrollback-limit = 10000000
custom-shader = path\to\shader.glsl
background-image = C:\Users\me\Pictures\wallpaper.png
background-opacity = 0.85
background-image-mode = fill
# Opt-in remote access (disabled by default)
remote-enabled = false
remote-server-url = https://remote.example.com
remote-device-name = Workstation
remote-session-key = Workstation
# AI Chat agent tools
ai-agent-enabled = true
ai-agent-permission = ask # ask | auto | full
ai-agent-output-limit = 16384
Run wispterm --help for the full flag list, or wispterm --show-config-path to print the resolved config path.
SSH downloads & uploads that follow your current directory
WispTerm can download a relative file path from SSH terminal output, and upload dragged files into the interactive SSH shell's current directory — but only when the remote shell reports that directory with OSC 7, the same terminal convention Ghostty's shell integration uses.
When OSC 7 is missing, the helper ssh.exe / scp.exe commands open a fresh session that usually sees the login directory, not the directory you cd'd to. In that case WispTerm shows “SSH cwd unknown; click for setup” instead of guessing ~/file.
Add one of these snippets to the remote shell's startup file, then start a new WispTerm SSH session.
Bash — ~/.bashrc
__wispterm_report_cwd() {
printf '\033]7;file://%s%s\a' "${HOSTNAME:-localhost}" "$PWD"
}
PROMPT_COMMAND="__wispterm_report_cwd${PROMPT_COMMAND:+;$PROMPT_COMMAND}"
Zsh — ~/.zshrc
__wispterm_report_cwd() {
printf '\033]7;file://%s%s\a' "${HOST:-localhost}" "$PWD"
}
autoload -Uz add-zsh-hook
add-zsh-hook chpwd __wispterm_report_cwd
add-zsh-hook precmd __wispterm_report_cwd
Fish — ~/.config/fish/config.fish
function __wispterm_report_cwd --on-variable PWD
printf '\e]7;file://%s%s\a' (hostname) (string escape --style=url $PWD)
end
__wispterm_report_cwd
Keyboard shortcuts
Defaults from src/keybind.zig. Modal overlays intercept keys first. Ctrl/Cmd means Ctrl on Windows/Linux, Cmd on macOS; Alt/Opt means Alt on Windows/Linux, Option on macOS. Ctrl+` and Ctrl+Tab stay on Ctrl on all platforms.
FAQ
Why isn’t my default PowerShell Administrator?
Shells inherit WispTerm’s privilege level. A normal launch uses a standard token (even for admin accounts under UAC). WispTerm does not auto-elevate new tabs.
How do I get an elevated shell?
Right-click wispterm.exe or your shortcut and choose Run as administrator; new tabs in that window stay elevated. For a one-off elevated console elsewhere, use Start-Process pwsh -Verb RunAs (UAC prompt).
How do I enable copy on select and paste on right-click?
Set copy-on-select = true and right-click-action = paste in your config file (%APPDATA%\wispterm\config on Windows, ~/Library/Application Support/wispterm/config on macOS). If you want right-click to copy when a selection is active and paste otherwise, use right-click-action = copy-or-paste instead.
How do I connect to older bastions or SSH servers?
Set ssh-legacy-algorithms = true in your config file. This enables compatibility options for older hosts that still require ssh-rsa, ssh-dss, legacy Diffie-Hellman key exchange, or CBC ciphers.
First launch opens a black window?
On weak integrated-GPU machines, close all WispTerm windows and start it again; the next launch should use the recorded GDI fallback. If it still opens black, add wispterm-d3d-present = false to %APPDATA%\wispterm\config and reopen WispTerm.
Can I switch AI models without starting over?
Yes. In an AI Chat tab or Copilot sidebar, type /model to open the saved-profile picker, /model <name> to switch directly, or click the model label in the header. WispTerm summarizes the prior transcript for the new model and keeps the switch local to that session.
Why did an SSH download or upload lose the current directory?
WispTerm can download relative SSH paths and upload dragged files into the interactive SSH shell's current directory only when the remote shell reports OSC 7. If OSC 7 is missing, helper ssh.exe / scp.exe commands start a fresh session that usually sees the login directory, not the directory you cd'd to. Configure your remote shell to emit OSC 7 — see the SSH setup snippets above.
What is the AI Chat / Agent prompt length limit?
WispTerm now allows up to 65536 bytes for one draft in the AI Chat / Agent input box. This is the per-message input limit before you press Enter, not the full conversation context limit.
Why does Remote mirror the local terminal size on phones?
The desktop WispTerm app is the source of truth for PTY state, Ghostty VT state, scrollback, cursor position, and split layout. The browser receives layout snapshots and output bytes from that local session, so it can rearrange panels for mobile, but it does not create an independent phone-sized terminal grid. True mobile reflow would require resizing the local terminal itself or adding a separate remote PTY/viewport model.
Credits
- Original project: arya-s/phantty — the Zig + libghostty-vt foundation and the Windows terminal core.
- Terminal emulation: ghostty-org/ghostty via
libghostty-vt. - Image decoding: stb_image (vendored through the Ghostty dependency).