WezTerm
For me, WezTerm basically exists only for Windows. Its biggest advantage is that a single Lua config works across Linux, macOS, and Windows, so I can directly reuse it on that Windows machine, synced via chezmoi, without having to maintain a separate terminal setup.
Only a few lines in the config actually affect the user experience:
config.front_end = "WebGpu" -- Uses GPU (Vulkan/Metal/DX12) for smooth scrolling and large outputs
config.max_fps = 144 -- Keeps up with high-refresh-rate displays, not locked to 60
config.font = wezterm.font("JetBrains Mono") -- Same font as the editor/Ghostty
-- Several Ctrl+Shift shortcuts for tabs/splits
It’s worth mentioning that WezTerm actually has a built-in multiplexer (panes/tabs/sessions, and it can even connect to remote muxers like mosh), and you can write Lua event hooks for deep customization. On Windows, I just use its built-in tabs, which are sufficient for daily use, so I don’t layer on another multiplexer.
However, on Linux, I actually don’t use these features; instead, I use Ghostty + Zellij with a division of labor — which is the real point I want to make. My habit is to let the terminal handle rendering only, and hand off sessions to the multiplexer: this way, if the connection drops or I accidentally close the window, the session remains intact; split layouts can be saved; and keybindings remain consistent across any terminal. The terminal thus becomes a replaceable layer; if I want to switch to a different terminal one day, my workflow remains unaffected — which is also why I can easily switch between Ghostty and WezTerm.