I switched from Konsole to Wezterm recently. The selling point: tabs that work like a browser. Ctrl+T for new tab, Ctrl+W to close, Ctrl+Tab to cycle. After years of muscle memory from Chrome and Firefox, having the same shortcuts in my terminal just makes sense.

Other things I like:

  • GPU-accelerated rendering (fast, smooth)
  • Config hot-reloads on save (no restart needed)
  • Lua config file (scriptable if you want, ignorable if you don’t)
  • Pane splits built in (like tmux, but native)
  • Cross-platform (same config works on Linux, Mac, and Windows)

Installation

Linux (Debian/Ubuntu)

The distro packages are often outdated. Use the official repo:

curl -fsSL https://apt.fury.io/wez/gpg.key | sudo gpg --yes --dearmor -o /usr/share/keyrings/wezterm-fury.gpg
echo 'deb [signed-by=/usr/share/keyrings/wezterm-fury.gpg] https://apt.fury.io/wez/ * *' | sudo tee /etc/apt/sources.list.d/wezterm.list
sudo apt update && sudo apt install -y wezterm

Also grab JetBrains Mono (excellent programming font):

sudo apt install fonts-jetbrains-mono

To set as default terminal:

sudo update-alternatives --install /usr/bin/x-terminal-emulator x-terminal-emulator /usr/bin/wezterm 50
sudo update-alternatives --set x-terminal-emulator /usr/bin/wezterm

Mac

brew install --cask wezterm

JetBrains Mono:

brew tap homebrew/cask-fonts
brew install --cask font-jetbrains-mono

Windows

Download the installer from wezfurlong.org/wezterm or use winget:

winget install wez.wezterm

JetBrains Mono: download from jetbrains.com/lp/mono and install, or use Scoop:

scoop bucket add nerd-fonts
scoop install JetBrains-Mono

Config

Config location:

  • Linux/Mac: ~/.config/wezterm/wezterm.lua
  • Windows: C:\Users\<username>\.config\wezterm\wezterm.lua

Create the directory if it doesn’t exist.

Linux/Windows Config

local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- Appearance
config.color_scheme = 'Catppuccin Mocha'
config.window_background_opacity = 1.0
config.hide_tab_bar_if_only_one_tab = false
config.use_fancy_tab_bar = true
config.window_decorations = "RESIZE"

-- Font
config.font = wezterm.font_with_fallback {
  'JetBrains Mono',
  'Fira Code',
  'monospace',
}
config.font_size = 11.0

-- Scrollback
config.scrollback_lines = 10000

-- Browser-like keybindings
config.keys = {
  { key = 't', mods = 'CTRL', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'w', mods = 'CTRL', action = wezterm.action.CloseCurrentPane { confirm = false } },
  { key = 'Tab', mods = 'CTRL', action = wezterm.action.ActivateTabRelative(1) },
  { key = 'Tab', mods = 'CTRL|SHIFT', action = wezterm.action.ActivateTabRelative(-1) },
  { key = '1', mods = 'CTRL', action = wezterm.action.ActivateTab(0) },
  { key = '2', mods = 'CTRL', action = wezterm.action.ActivateTab(1) },
  { key = '3', mods = 'CTRL', action = wezterm.action.ActivateTab(2) },
  { key = '4', mods = 'CTRL', action = wezterm.action.ActivateTab(3) },
  { key = '5', mods = 'CTRL', action = wezterm.action.ActivateTab(4) },
  { key = '6', mods = 'CTRL', action = wezterm.action.ActivateTab(5) },
  { key = '7', mods = 'CTRL', action = wezterm.action.ActivateTab(6) },
  { key = '8', mods = 'CTRL', action = wezterm.action.ActivateTab(7) },
  { key = '9', mods = 'CTRL', action = wezterm.action.ActivateTab(-1) },
  { key = 'T', mods = 'CTRL|SHIFT', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'e', mods = 'CTRL|SHIFT', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
  { key = 'h', mods = 'CTRL|SHIFT', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },
  { key = 'w', mods = 'CTRL|SHIFT', action = wezterm.action.CloseCurrentTab { confirm = false } },
}

-- Copy on select + click URLs without modifier + smaller scroll increment
config.mouse_bindings = {
  { event = { Up = { streak = 1, button = 'Left' } }, mods = 'NONE', action = wezterm.action.CompleteSelection 'ClipboardAndPrimarySelection' },
  { event = { Up = { streak = 1, button = 'Left' } }, mods = 'NONE', action = wezterm.action.OpenLinkAtMouseCursor, mouse_reporting = false },
  { event = { Down = { streak = 1, button = { WheelUp = 1 } } }, mods = 'NONE', action = wezterm.action.ScrollByLine(-2) },
  { event = { Down = { streak = 1, button = { WheelDown = 1 } } }, mods = 'NONE', action = wezterm.action.ScrollByLine(2) },
}

return config

Mac Config

Same thing, but with Cmd instead of Ctrl (and slightly larger font for Retina):

local wezterm = require 'wezterm'
local config = wezterm.config_builder()

-- Appearance
config.color_scheme = 'Catppuccin Mocha'
config.window_background_opacity = 1.0
config.hide_tab_bar_if_only_one_tab = false
config.use_fancy_tab_bar = true
config.window_decorations = "RESIZE"

-- Font
config.font = wezterm.font_with_fallback {
  'JetBrains Mono',
  'Fira Code',
  'monospace',
}
config.font_size = 13.0

-- Scrollback
config.scrollback_lines = 10000

-- Browser-like keybindings (Cmd on Mac)
config.keys = {
  { key = 't', mods = 'CMD', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'w', mods = 'CMD', action = wezterm.action.CloseCurrentPane { confirm = false } },
  { key = 'Tab', mods = 'CTRL', action = wezterm.action.ActivateTabRelative(1) },
  { key = 'Tab', mods = 'CTRL|SHIFT', action = wezterm.action.ActivateTabRelative(-1) },
  { key = '1', mods = 'CMD', action = wezterm.action.ActivateTab(0) },
  { key = '2', mods = 'CMD', action = wezterm.action.ActivateTab(1) },
  { key = '3', mods = 'CMD', action = wezterm.action.ActivateTab(2) },
  { key = '4', mods = 'CMD', action = wezterm.action.ActivateTab(3) },
  { key = '5', mods = 'CMD', action = wezterm.action.ActivateTab(4) },
  { key = '6', mods = 'CMD', action = wezterm.action.ActivateTab(5) },
  { key = '7', mods = 'CMD', action = wezterm.action.ActivateTab(6) },
  { key = '8', mods = 'CMD', action = wezterm.action.ActivateTab(7) },
  { key = '9', mods = 'CMD', action = wezterm.action.ActivateTab(-1) },
  { key = 'T', mods = 'CMD|SHIFT', action = wezterm.action.SpawnTab 'CurrentPaneDomain' },
  { key = 'e', mods = 'CMD|SHIFT', action = wezterm.action.SplitHorizontal { domain = 'CurrentPaneDomain' } },
  { key = 'h', mods = 'CMD|SHIFT', action = wezterm.action.SplitVertical { domain = 'CurrentPaneDomain' } },
  { key = 'w', mods = 'CMD|SHIFT', action = wezterm.action.CloseCurrentTab { confirm = false } },
}

-- Mouse bindings (copy on select, click URLs, smaller scroll)
config.mouse_bindings = {
  { event = { Up = { streak = 1, button = 'Left' } }, mods = 'NONE', action = wezterm.action.CompleteSelection 'ClipboardAndPrimarySelection' },
  { event = { Up = { streak = 1, button = 'Left' } }, mods = 'NONE', action = wezterm.action.OpenLinkAtMouseCursor, mouse_reporting = false },
  { event = { Down = { streak = 1, button = { WheelUp = 1 } } }, mods = 'NONE', action = wezterm.action.ScrollByLine(-2) },
  { event = { Down = { streak = 1, button = { WheelDown = 1 } } }, mods = 'NONE', action = wezterm.action.ScrollByLine(2) },
}

return config

Keybindings Summary

ActionLinux/WindowsMac
New tabCtrl+TCmd+T
Close paneCtrl+WCmd+W
Close tabCtrl+Shift+WCmd+Shift+W
Next tabCtrl+TabCtrl+Tab
Previous tabCtrl+Shift+TabCtrl+Shift+Tab
Jump to tab NCtrl+1-9Cmd+1-9
Split horizontalCtrl+Shift+ECmd+Shift+E
Split verticalCtrl+Shift+HCmd+Shift+H

Notes

Tab bar as title bar: The config uses window_decorations = "RESIZE" which removes the traditional title bar. The tab bar is always visible and acts as a draggable surface for moving the window.

Panes vs tabs: Tabs are separate terminal sessions. Panes are splits within a single tabโ€”useful for seeing two things at once (e.g., editor and logs) without switching tabs.

Copy on select: Selecting text with the mouse automatically copies it to the clipboard. Standard on Linux, less common on Mac, but I find it useful everywhere.

Clickable URLs: Single-click on any URL to open it in your browser. No modifier key needed.

Scroll speed: Config sets scroll to 2 lines per wheel tick (default is 3). Adjust the -2 and 2 values if you want faster/slower.

Hot reload: Save the config file and changes apply immediately. No restart required.