Replace tmux on Windows with a GPU-accelerated, natively multiplexing terminal. Zero dependencies, one config file, works out of the box on Windows 10/11.
If you use tmux on Linux or macOS and want the same experience on Windows, this repo gives you a fully configured WezTerm setup that matches — and in many ways exceeds — tmux.
No WSL required. No Cygwin. No extra tools. Just one PowerShell command.
Open PowerShell (no admin needed) and run:
irm https://raw.githubusercontent.com/Muminur/tmux-alternative-windows/main/install.ps1 | iexThis installs and configures everything automatically:
| Step | Component | What it does |
|---|---|---|
| 1 | WezTerm | GPU-accelerated terminal with built-in multiplexer |
| 2 | PowerShell 7 | Modern shell with ANSI colour support |
| 3 | FiraCode Nerd Font | Programming font with ligatures + Nerd Font glyphs |
| 4 | wezterm.lua | Neon dark theme, tmux keybindings, session save/restore |
| 5 | PS7 profile | Neon prompt and syntax highlighting |
| 6 | zoxide | Smart cd replacement with frecency-based directory jumping |
| 7 | Starship | Cross-shell prompt with git/language indicators |
Requirement: Windows 10/11 with
winget(App Installer from the Microsoft Store)
# Only refresh config files — skip WezTerm/PS7/Font reinstall
irm .../install.ps1 | iex # then add -Update
# Skip individual components
install.ps1 -SkipZoxide -SkipStarship -SkipFont
# Preview all steps without executing
install.ps1 -DryRun| Flag | Effect |
|---|---|
-Update |
Re-download wezterm.lua and PS profile only |
-SkipWezTerm |
Skip WezTerm install |
-SkipPS7 |
Skip PowerShell 7 install |
-SkipFont |
Skip FiraCode Nerd Font install |
-SkipZoxide |
Skip zoxide install |
-SkipStarship |
Skip Starship install |
-DryRun |
Print all steps without executing |
Two PowerShell 7 panes side-by-side. Neon cyan split line. Status bar shows workspace name, active process, and clock. Opens automatically on WezTerm launch.
Right-side status bar: zoom indicator, workspace (cyan), pane count, process name (purple), git branch (yellow), battery, and live clock.
tmux requires WSL or Cygwin on Windows — it is a Linux tool bolted onto Windows. WezTerm is a native Windows application built from scratch, with a full terminal multiplexer included.
| Feature | tmux via WSL | WezTerm native |
|---|---|---|
| Pane splitting | Yes | Yes |
| Persistent sessions | Yes | Yes |
| Named session save/restore | tmux-resurrect plugin | Built-in |
| Auto-save every 15 min | tmux-continuum plugin | Built-in |
| Vim-style copy mode | Yes | Yes |
| Named workspaces / sessions | Yes | Yes |
| SSH remote sessions | Yes | Yes |
| GPU-accelerated rendering | No | Yes |
| Runs natively on Windows (no WSL) | No | Yes |
| Font ligatures | No | Yes |
| Lua scripting and automation | No | Yes |
| Window transparency and blur | No | Yes |
| One-command install | No | Yes |
| Broadcast input to all panes | No | Yes |
| Zoom indicator in status bar | No | Yes |
| Git branch in status bar | No | Yes |
This config implements the same session persistence policy as the popular tmux plugins — and extends it with named sessions:
| tmux plugin | WezTerm equivalent |
|---|---|
tmux-resurrect — manual save/restore |
LEADER + Ctrl+S / LEADER + Ctrl+R |
tmux-resurrect — named sessions |
LEADER + Ctrl+N / LEADER + Ctrl+L |
tmux-continuum — auto-save every 15 min |
Built-in auto-save timer |
tmux-continuum — auto-restore on start |
Auto-restores on mux server startup |
What is saved:
- All workspace names (equivalent to tmux sessions)
- Active workspace (restored on next launch)
- All tab titles (equivalent to tmux windows)
- All pane working directories
- Pane layout (split directions reconstructed from saved positions)
Save files: %USERPROFILE%\.wezterm_sessions\
last.json— most recent auto/manual saveprev.json— backup of previous save (one rollback slot)<name>.json— named sessions (unlimited slots)
Named sessions let you maintain multiple independent workspace layouts — like separate tmux session collections for different projects.
LEADER + Ctrl+N → prompt for a name, saves to ~/.wezterm_sessions/<name>.json
LEADER + Ctrl+L → fuzzy-pick from saved names and restore
LEADER + Ctrl+D → fuzzy-pick from saved names and delete
On startup:
1. Check if mux server already has workspaces → if yes, reattach (no restart)
2. Check if ~/.wezterm_sessions/last.json exists → if yes, restore it
(restores to the active workspace that was open when last saved)
3. Otherwise → create default 'main' workspace with 2-pane layout
Every 15 minutes:
Auto-save all workspaces to last.json
LEADER + Ctrl+S:
Save immediately + show "SAVED" in status bar for 30 seconds
LEADER + Ctrl+R:
Restore from last.json into current session (adds workspaces)
| Badge | Colour | Meaning |
|---|---|---|
WAIT |
Magenta | Leader key is active |
ZOOM |
Yellow | A pane is zoomed fullscreen |
SAVED |
Green | Session was saved (shows for 30 s) |
| Workspace name | Cyan | Current workspace |
Np |
Yellow | Number of panes in active tab |
| Process name | Purple | Foreground process |
| Branch name | Yellow | Git branch of active pane's CWD |
| Battery | Green/Red | Battery level |
| Clock | Dim | Day, date, time |
The leader key is CTRL+B — same as the tmux default.
| Keybinding | Action |
|---|---|
LEADER + | or % |
Split pane right (vertical divider) |
LEADER + - or " |
Split pane down (horizontal divider) |
LEADER + h/j/k/l |
Navigate panes (vim-style) |
LEADER + Arrow keys |
Navigate panes |
LEADER + H/J/K/L |
Resize pane by 5 cells |
LEADER + z |
Zoom pane fullscreen toggle |
LEADER + x |
Close current pane |
LEADER + o |
Visual pane picker |
LEADER + { / } |
Rotate panes |
| Keybinding | Layout | Use case |
|---|---|---|
LEADER + A |
7-pane agent grid | Multi-agent (Claude Code etc.) |
LEADER + Shift+2 |
2-pane side-by-side | Code + Terminal |
LEADER + Shift+3 |
3-pane code layout | Editor + Tests + Logs |
| Keybinding | Action |
|---|---|
LEADER + Ctrl+X |
Prompt for text and send it to all panes in the active tab |
Useful with the 7-pane agent layout: run the same setup command across all agents simultaneously.
| Keybinding | Action |
|---|---|
LEADER + c |
New tab |
LEADER + n / p |
Next / previous tab |
LEADER + 1–9 |
Switch to tab by number |
LEADER + , |
Rename tab |
LEADER + & |
Close tab |
| Keybinding | Action |
|---|---|
LEADER + w |
Fuzzy workspace switcher |
LEADER + s |
Full launcher (workspaces + tabs + apps) |
LEADER + W |
Create new named workspace |
LEADER + $ |
Rename current workspace |
LEADER + D |
Connect to SSH domain |
LEADER + d |
Detach GUI — closes the window, mux server keeps running |
| Keybinding | Action |
|---|---|
LEADER + Ctrl+S |
Save session — writes all workspaces/tabs/panes to disk |
LEADER + Ctrl+R |
Restore session — recreates workspaces from last save |
LEADER + Ctrl+B |
Restore backup — restores from the previous save (prev.json) |
LEADER + Ctrl+N |
Save named session — prompt for a name, save to <name>.json |
LEADER + Ctrl+L |
List named sessions — fuzzy-pick and restore a named session |
LEADER + Ctrl+D |
Delete named session — fuzzy-pick and delete a named session |
Enter with LEADER + [, exit with q or Esc.
| Key | Action |
|---|---|
h/j/k/l |
Move cursor |
w / b / e |
Word forward / backward / end |
0 / $ |
Start / end of line |
g / G |
Top / bottom of scrollback |
v |
Character selection |
V |
Line selection |
Ctrl+v |
Block/rectangle selection |
y |
Yank (copy) to clipboard and exit |
/ |
Search forward |
n / N |
Next / previous match |
q or Esc |
Exit copy mode |
| Keybinding | Action |
|---|---|
CTRL+Shift+C |
Copy to clipboard |
CTRL+Shift+V |
Paste from clipboard |
| Right-click | Paste (mouse shortcut) |
CTRL+click |
Open URL under cursor |
CTRL+= / CTRL+- |
Increase / decrease font size |
CTRL+0 |
Reset font size |
LEADER + r |
Reload config without restart |
LEADER + e |
Open current selection (or viewport) in $EDITOR |
LEADER + f |
Search scrollback buffer |
LEADER + Space |
Quick select any text pattern |
LEADER + u |
Quick select URL and open in browser |
LEADER + ? |
Show all key assignments |
Press LEADER + A to expand the current tab into a 7-pane workspace — ideal for running multiple Claude Code agents in parallel:
+----------+----------+----------+----------+
| Agent 1 | Agent 2 | Agent 3 | Agent 4 | <- top 60%
+----------+----------+----------+----------+
| Agent 5 | Agent 6 | Agent 7 | <- bottom 40%
+----------+----------+---------------------+
Each pane opens a PowerShell 7 session labelled Agent-1 through Agent-7.
Press LEADER + Shift+2 — splits the current pane 50/50 horizontally:
+---------------------+---------------------+
| Editor | Terminal |
+---------------------+---------------------+
Press LEADER + Shift+3 — editor on the left, tests and logs stacked on the right:
+---------------------+----------+
| | Tests |
| Editor +----------+
| | Logs |
+---------------------+----------+
Note: Layout shortcuts add panes to the current tab. Close unwanted panes with
LEADER + x.
WezTerm includes a built-in session server — like tmux new-session but with nothing extra to install.
Auto-attach is enabled by default. WezTerm starts a persistent mux server on launch and reconnects to your existing workspaces automatically.
Connect manually from a new terminal window:
wezterm connect mux| Action | What happens | Session preserved? |
|---|---|---|
| Close the WezTerm window (X button / Alt+F4) | GUI closes, mux server keeps running | Yes |
| Open WezTerm again | Auto-reconnects to running mux server, all panes intact | Yes |
| Say Yes to "kill all panes?" | Processes are killed, session is gone | No |
CTRL+D in a shell |
Exits that shell, closes that pane only | That pane lost |
Rule of thumb: To preserve your session without a save file, always close the WezTerm window — never say "yes" to killing panes.
With session save/restore (LEADER + Ctrl+S), you can safely kill the mux server and fully restore your workspace layout on next startup.
Q: What does LEADER+Ctrl+S save?
It saves all workspace names, the active workspace, tab titles, and pane working directories to %USERPROFILE%\.wezterm_sessions\last.json. On the next startup (or when you press LEADER+Ctrl+R), WezTerm recreates those workspaces and opens panes in the correct directories.
Q: Does it save running processes?
No — terminal output and running processes are not saved. This matches the behaviour of tmux-resurrect. Your shell restarts fresh in the correct working directory.
Q: How often does auto-save run?
Every 15 minutes, matching tmux-continuum's default interval. The green SAVED badge in the status bar confirms each save. To change the interval, edit AUTOSAVE_SECS in wezterm.lua.
Q: What is prev.json and how do I restore from it?
Every time a save runs (manual or auto), the previous last.json is renamed to prev.json before being replaced. Press LEADER + Ctrl+B to restore from it. Named sessions are not affected by this rotation.
Q: How do named sessions differ from the main save slot?
Named sessions (LEADER + Ctrl+N) write to a separate <name>.json file and never overwrite last.json or prev.json. They persist indefinitely until you delete them with LEADER + Ctrl+D. Use them for project-specific layouts you want to keep permanently.
Q: I closed WezTerm and my terminal output is gone. Can I get it back?
No — terminal output lives in RAM. Once the mux server exits, the scrollback is permanently gone. This is a fundamental property of all terminal multiplexers. Use LEADER+Ctrl+S before closing to save your workspace layout.
Q: How much scrollback history is kept during a live session?
20,000 lines (configurable via config.scrollback_lines in wezterm.lua). Use LEADER+f to search, LEADER+e to open a selection in your editor, or CTRL+SHIFT+K to clear the buffer.
Add remote servers to wezterm.lua and connect with LEADER + D:
config.ssh_domains = {
{ name = 'dev', remote_address = '10.0.0.10', username = 'ubuntu' },
{ name = 'prod', remote_address = 'prod.example.com', username = 'deploy' },
}WezTerm also auto-reads ~/.ssh/config — no extra setup for hosts already defined there.
| Element | Value |
|---|---|
| Background | #0d0d1a (near-black indigo) |
| Foreground | #ffffff (pure white) |
| Cyan accent | #00ffe1 (splits, active tab, workspace badge) |
| Magenta | #ff00aa (leader key indicator) |
| Green | #00ff88 (session saved badge) |
| Yellow | #ffe566 (pane count, git branch, zoom badge) |
| Cursor | Blinking cyan bar |
| Backdrop | Windows Acrylic blur |
| Font | FiraCode Nerd Font Medium 14px |
| Ligatures | calt, clig, liga, ss01, ss03, ss05 |
The included profile (Microsoft.PowerShell_profile.ps1) auto-detects installed tools:
| Tool | Auto-detected? | Behaviour |
|---|---|---|
| Starship | Yes | Uses Starship for the prompt (git, language, docker indicators) |
| zoxide | Yes | Enables z <dir> for smart frecency-based navigation |
| Neither | — | Falls back to built-in neon prompt with git branch |
Install both via the installer, or separately:
winget install Starship.Starship
winget install ajeetdsouza.zoxidewinget install --id WezFurlong.WezTerm --source wingetwinget install --id Microsoft.PowerShell --source wingetDownload FiraCode.zip from the nerd-fonts releases page. Extract and install — no admin needed:
$fontsDir = "$env:LOCALAPPDATA\Microsoft\Windows\Fonts"
$regPath = "HKCU:\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"
New-Item -Force -ItemType Directory $fontsDir | Out-Null
Get-ChildItem "$env:TEMP\FiraCode" -Filter *.ttf | ForEach-Object {
$dst = Join-Path $fontsDir $_.Name
Copy-Item $_.FullName $dst -Force
Set-ItemProperty -Path $regPath -Name ($_.BaseName + " (TrueType)") -Value $dst
}New-Item -ItemType Directory -Force "$env:USERPROFILE\.config\wezterm"
Invoke-WebRequest "https://raw.githubusercontent.com/Muminur/tmux-alternative-windows/main/wezterm.lua" `
-OutFile "$env:USERPROFILE\.config\wezterm\wezterm.lua"
Copy-Item "$env:USERPROFILE\.config\wezterm\wezterm.lua" "$env:USERPROFILE\.wezterm.lua"| Component | Default path |
|---|---|
| WezTerm binary | C:\Program Files\WezTerm\ |
| PowerShell 7 | C:\Program Files\PowerShell\7\ |
| FiraCode Nerd Font | %LOCALAPPDATA%\Microsoft\Windows\Fonts\ |
| WezTerm config (primary) | %USERPROFILE%\.config\wezterm\wezterm.lua |
| WezTerm config (fallback) | %USERPROFILE%\.wezterm.lua |
| PowerShell profile | %USERPROFILE%\Documents\PowerShell\Microsoft.PowerShell_profile.ps1 |
| Session save directory | %USERPROFILE%\.wezterm_sessions\ |
The config lives at ~/.config/wezterm/wezterm.lua. WezTerm hot-reloads on save — press LEADER + r to force reload. A toast notification confirms the reload.
config.font_size = 14.0 -- font size
config.window_background_opacity = 0.97 -- 0.0 transparent, 1.0 solid
config.leader = { key = 'a', mods = 'CTRL' } -- change leader key
-- Window decorations: 'TITLE | RESIZE' shows OS title bar with minimize/maximize/close buttons
config.window_decorations = 'TITLE | RESIZE'
-- Change auto-save interval (seconds)
local AUTOSAVE_SECS = 10 * 60 -- 10 minutes instead of 15
-- Add SSH servers
config.ssh_domains = {
{ name = 'myserver', remote_address = '192.168.1.1', username = 'admin' },
}winget error: "Failed when searching source: msstore" / certificate error 0x8a15005e
The Microsoft Store source sometimes has SSL certificate issues on corporate or restricted networks. Add --source winget to skip the msstore source:
winget install --id WezFurlong.WezTerm --source winget
winget install --id Microsoft.PowerShell --source wingetThe installer script already includes --source winget.
Font shows boxes or question marks
wezterm ls-fonts --list-system | Select-String firaIf nothing appears, reinstall the font. The config falls back to JetBrainsMono, then Cascadia Code, then Consolas.
Config not loading after install
WezTerm reads ~/.config/wezterm/wezterm.lua first, then ~/.wezterm.lua. The installer writes both. If neither loads, fully quit WezTerm from the system tray and reopen.
A toast notification saying "Config reloaded" confirms a successful hot-reload via LEADER + r.
Window title bar buttons (minimize / maximize / close) not showing
The config uses config.window_decorations = 'TITLE | RESIZE' which displays the OS title bar with all three window control buttons. If you previously had 'RESIZE' in your config, the title bar was hidden. Re-download wezterm.lua or set:
config.window_decorations = 'TITLE | RESIZE'Error: "local is a built-in domain"
Old config has name = 'local' in unix_domains. The current config uses name = 'mux'. Re-download wezterm.lua to fix.
Session restore creates duplicate workspaces
Press LEADER + Ctrl+R only when starting fresh. If you already have workspaces open, the restore will add more. Close unwanted workspaces with LEADER + &.
LEADER+A does nothing / agent layout does not open
Make sure you are running the latest wezterm.lua from this repo. Earlier versions had a Lua forward-reference bug that silently prevented the agent layout from spawning. Re-download with:
install.ps1 -Updatewezterm-mux-server.exe is running in Task Manager — is that normal?
Yes. wezterm-mux-server.exe is the background process that keeps your sessions alive between GUI window opens. It is safe and expected. Killing it is equivalent to tmux kill-server.
Stop-Process -Name wezterm-mux-server -ErrorAction SilentlyContinueUse LEADER + Ctrl+S before killing it to save your session first.
WSL errors in panes on startup
The config defaults to PowerShell 7. If WSL is not installed, some launcher entries may error. Install WSL with:
wsl --installGit branch not showing in status bar
The status bar queries git in the background for the active pane's directory. If git is not in PATH or the directory is not a git repo, the branch segment is hidden. Results are cached for 10 seconds per directory to avoid performance impact.
tmux-alternative-windows/
├── install.ps1 # One-line installer script
├── wezterm.lua # Full WezTerm Lua config (all features)
├── Microsoft.PowerShell_profile.ps1 # Neon PS7 profile (Starship/zoxide auto-detect)
├── screenshots/
│ ├── wezterm-2pane-neon.png # 2-pane neon dark layout
│ └── wezterm-status-bar.png # Status bar detail
└── README.md
Open an issue or pull request. Suggestions welcome for:
- Additional colour themes
- More SSH domain examples
- WSL integration improvements
- Extra keybinding configurations
- Additional layout presets
- WezTerm official documentation
- WezTerm Lua API reference
- tmux-resurrect — the tmux plugin this feature mirrors
- tmux-continuum — the tmux plugin this auto-save mirrors
- FiraCode Nerd Font releases
- PowerShell 7 on GitHub
- Starship prompt
- zoxide
MIT — use freely, fork, and modify as you like.

