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.

Windows · Recommended

Portable

Single executable — download the zip, extract, and run wispterm.exe.

Download zip →
Windows · With browser

Portable + WebView2

Bundles WebView2Loader.dll for the embedded browser side panel.

Download zip →
macOS · Beta

macOS DMG

Signed and notarized .dmg for Apple Silicon and Intel. Requires macOS 13+. Open the DMG and drag WispTerm.app to Applications.

Linux · Experimental

AppImage

Portable x86_64 AppImage for community testing. It bundles SDL3; expect rough edges while the Linux port matures.

Download AppImage →
Source

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.

Open command centerCtrl/CmdShiftP
New session (launcher)Ctrl/CmdShiftT
New windowCtrl/CmdShiftN
Toggle tab sidebarCtrl/CmdShiftB
Toggle file explorerCtrl/CmdShiftAlt/OptE
Toggle AI Copilot sidebarCtrl/CmdShiftA
Split to the rightCtrl/CmdShift+
Split downwardCtrl/CmdShift-
Equalize splitsCtrl/CmdShiftZ
Close panel / tab / windowCtrl/CmdShiftW
Maximize / restore windowAlt/OptEnter
Move focus by directionAlt/Opt
Previous panelCtrl/CmdShift[
Next panelCtrl/CmdShift]
Previous tabCtrlShiftTab
Next tabCtrlTab
Jump to tab 1–9Alt/Opt19
Increase font sizeCtrl/Cmd+
Decrease font sizeCtrl/Cmd
Copy selectionCtrl/CmdShiftC
Paste textCtrl/CmdV
Paste clipboard imageCtrl/CmdShiftV
Open config fileCtrl/Cmd,
Show/hide Quake drop-downCtrl`

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).