I love WezTerm! In the author's spirit of obsessive tweaking, here's a completely inconsequential configuration change I made.
By default, WezTerm doesn't have a scrollbar, but you can easily enable it with:
config.enable_scroll_bar = true
But now you always have a scrollbar, just a big line on the side when there's no scrollback or you're in alternate screen mode. Horrible! So, here's an event handler that will automatically hide the scrollbar when not needed, giving it the same behavior as scrollbars in modern applications:
-- Hide the scrollbar when there is no scrollback or alternate screen is active
wezterm.on("update-status", function(window, pane)
local overrides = window:get_config_overrides() or {}
local dimensions = pane:get_dimensions()
overrides.enable_scroll_bar = dimensions.scrollback_rows > dimensions.viewport_rows and not pane:is_alt_screen_active()
window:set_config_overrides(overrides)
end)
And that kinda sums up the development philosophy of WezTerm. It has basically all the building blocks you'd ever need with nice APIs. It's set up quite usably by default, but anything that's missing you can probably implement yourself.
WezTerm on nix here, it just works, it's very fast and combined with spaceship it shows everything I need. And nix makes sure in whichever environment I'm in, it will be installed
I had used urxvt forever before and the simple solution that works (even for ssh e.g.) is to ring the terminal bell, and urxvt just sets the window urgency hint upon that. I just do that in shell prompt unconditionally because if it's triggered in a focused window, then nothing happens. But if it's from a different workspace, I get this nice visual cue in my top bar for free.
But features like setting urgency isn't available in wezterm (understandable, as it's not a cross-platform thing). I could patch that in the source, but the Emacser in me chose to do something more unholy. By default Lua is started in safe mode, which means loading shared C module is forbidden. I disabled that, and now use a bunch of missing stuff written in Rust and Zig interfaced with cffi. Don't recall ever having a crash so I am surprised by some of the other comments.
Yeah, I use wezterm for remote editing at work because it has the best support for chords over ssh, and everything basically just works out of the box. Really convenient
The thing I love most about wezterm is the `wezterm cli list --format json`, and being able to get various values like the cwd of any terminal by window id.
While I don't much tweak my actual wezterm config at all. I use that a lot for various scripts to launch other terminals/file managers in the same directory as the currently active terminal...
Wezterm was great, but I had to stop using it recently because it keeps crashing immediately (across two different computers) on CachyOS/Arch :/
It's just broken on KDE permanently I guess :/ There have beem tickets about it, and there is an AUR repo with a patch that used to fix it... but :/
Was already worried about the project given that it hasn't seen a new release in quite a long time. Got the feeling that the maintainer has mostly moved on.
It's been almost a year for me now but I had also stopped using it due to crashes. And since it shares a process for all your windows, it would close all my windows which just drove me nuts after awhile.
Though for me, I only wanted the absolute bare minimum, which Alacritty covers. I was sad to lose ligatures, but Alacritty is stable and very fast.
WezTerm is great. When I switched back to Linux from Apple there were very few things I missed. iTerm2 was one of them, but since I found WezTerm I am pretty happy.
I tried to use it on Windows as well but unfortunately the Antivirus freaks out on it. When I looked into it it was because of a small utility `strip-ansi-escapes` which is so simple that even I could see that it is a false positive. I tried to report it to Microsoft and other Antivirus companies with some success but in the end I gave up an this Sisyphus task.
I love WezTerm! The cross-platform config is easy to version control (unlike iTerm2) and I've added a couple integrations that I use constantly:
The first is hashing the working directory / (or remote hostname if I'm SSH'd into a host) to set tab title colors- much easier to find the right tab that way.
The second is writing a script to open tabs with in a certain order and set their titles. I don't use tmux, but this let's me recreate my preferred layout for projects quite easily.
I found wezterm pane resizing to be very glitchy, and using native panes along with the muxing server was about 80% of the reason I wanted to use it. But for whatever reason, maybe font related, the resizing logic is unstable and it gets into weird states, glitching and flickering etc. Nightly vs stable made bo difference.
Could someone sell me on one of these alternative terminals (kitty, ghostty, wez, etc)? There is probably something I am missing not using GPU backed rendering, but I don’t know what I don’t know.
All I want is terminals to share config across MacOS, Linux and ideally Windows and have great support for SSHing into low end boxes with some minimal persistence solution like tmux on them. In an ideal world I would not have to think about mouse capture and scroll modes, they’d work seamlessly across my device and the devices I’m SSHed into.
It shocked me when I got back into playing with multiple machines after over a decade that this mostly still does not exist.
Instead we’re finally doing gpu rendering (which is amazing but … surprising for this to be the 2025 topic du jour?)
Wezterm runs everywhere, but lets me customise it once and keep that config uniform across all machines.
I can have a single config [0], wrap that in a nix expression [1] for anywhere that runs home-manager / NixOS and then also check it out and symlink on Windows machines as my portal to WSL. As my preferences change, my tooling stays consistent and familiar everywhere it's needed.
I really love the following things that I can do with kitty:
- Access the scrollback buffer in neovim
- Access the last command output in neovim
- Animated cursor trails. It sounds dumb at first but I find that when sharing my screen, the cursor trails help other people keep track of my cursor when using neovim.
Here are my configs to quickly load @screen_scrollback or @last_cmd_output in neovim
Gotta give a shoutout regarding Ghostty [1]. I keep switching terminal apps; I'm on an iTerm2 kick right now… but I used Ghostty for a while and it's pretty damn cool.
Anecdotally, it feels the fastest to me. Also GPU-accelerated and super configurable. It's amazing how a guy (Mitchell Hashimoto)[2] leaves the company he co-founded before it was sold to IBM.
I tried a few of them and they were all way slower than xfce4-terminal. So I just kept using that.
I don't really dump megabytes of text into the terminal, they might have an edge there? (I found that xterm is much faster than xfce4-terminal for that.)
I have a very silly primary reason for preferring the Kitty terminal - I configured it to look very minimalistic and compact. It doesn't even have the customary app titlebar at the top. The other benefit is that it's actually a lot faster to start up than Terminal.app when you first invoke it. I know iTerm2 is really well-liked, but to me, it gave the "Breakin' 2: Electric Boogaloo" vibes.
Kitty and wez both have the ability to present graphics on the terminal which may sound like a solution in search of a problem, but once you start using the capability, it's hard to live without it.
Wez is also cross platform so I get to use it on my Linux and Mac and my (Ugh) Windows work machine. Configuration being done in Lua is also something I quite like, but your mileage may vary on that one.
All I know is that on MacOS iTerm2 is unmatched. Every few months I go in search of something similar to it (as a backup), and every single time, after trying countless terminals, I give up. The closest I've found is WezTerm, and even that is a pale shadow of Iterm2
I switched from iTerm to WezTerm and haven’t looked back. It feels faster and it’s simpler to configure. I only have a basic use case, though, as tmux does all the heavy work for me. People with an appetite for more features might legitimately prefer iTerm, but I can’t endorse the comment “pale shadow of iTerm” for all use cases.
I just recently decided to replace iterm2 with wezterm when I started moving macbook over to nix. iterm2 is about the only one that didn’t work well for this, since you can’t source control the configuration (import/export doesn’t cut it)
Any of the ones you mentioned would probably work good with nix too. I don’t really care about the config being scriptable at all, it was just the first terminal that easily let me set all of the keyboard shortcuts I wanted, so I stuck with it.
iTerm2 does support source control; I've got my settings in a git repo managed by Chezmoi. In the settings dialog, under "General" -> "Settings", there's an "External settings: Load settings from a custom folder or URL" option.
I've also gone wez from iterm2, and you hit upon why. Don't ever make me click on things. I can't script => modify => export clicking on things. When you make me click on things, you've defined my interface for me, which I did not ask for.
1. quick-select the output in the terminal (select files/paths, urls, etc and either copy or paste them at the cursor). This is very useful as you often don't have the foresight to pipe the command to pipe the output of the command to some selection mechanism and even placing text on the line-editor is not that easy by default.
2. view images (sixel or kitty protocol). This is pretty useful visual analog to cat that doesn't require opening another program and works over ssh. Also for video.
There are some other nice utilities for doing things like downloading files directly in the terminal (it2dl for iterm and kitten transfer for kitty).
kitty doesn't work out of the box on macos if I remember; you have to set configuration for option/command etc.
> Could someone sell me on one of these alternative terminals (kitty, ghostty, wez, etc)?
Because these terminals all use the Kitty protocol, you can finally detect a single ESC press without a timeout hack as well as use shift with arrow keys to do text selection.
The fact that it has taken until 2025 to be able to do something this basic is pathetic.
The only thing I want from WezTerm is a warning when I'm about to close a tab. The tabs are too small and the x is easy to hit by accident... thousand lines of bash history and temp env vars gone in an instant.
Otherwise, it's awesome and my default terminal everywhere.
oh, you might be doing it via the UI, I turn off all the UI elements and hotkey everything, if you use hotkeys you can add a thing like :- action = wezterm.action.CloseCurrentTab { confirm = true },
WezTerm is an absolute joy to use: Scriptable (in Lua), allows creating your own shortcuts, has a command palette, has something like tmux (called mux) for which I have created lua scripts to setup my workspace for different projects. Something like tmuxinator impelemented in WezTerm. - I still use tmux, but mux is nice as well, and I can use splits and navigation natively in WezTerm, no need for prefix-{command} like in tmux. But can have workspaces in WezTerm.
It allows adding a custom background image, also transparent background, and I can toggle all of that via my custom shortcuts: Transparent on/off, background image on/off/rotate randomly.
It is such a joy to use and so beautiful. That plus neovim, yazi file browser, and lazygit: Dreamteam. Best dev environment I ever had.
I love WezTerm! In the author's spirit of obsessive tweaking, here's a completely inconsequential configuration change I made.
By default, WezTerm doesn't have a scrollbar, but you can easily enable it with:
But now you always have a scrollbar, just a big line on the side when there's no scrollback or you're in alternate screen mode. Horrible! So, here's an event handler that will automatically hide the scrollbar when not needed, giving it the same behavior as scrollbars in modern applications: And that kinda sums up the development philosophy of WezTerm. It has basically all the building blocks you'd ever need with nice APIs. It's set up quite usably by default, but anything that's missing you can probably implement yourself.Thanks, I've copied that into my config!
WezTerm on nix here, it just works, it's very fast and combined with spaceship it shows everything I need. And nix makes sure in whichever environment I'm in, it will be installed
Wezterm is a lot of fun. I played around with notifications and copy/paste which work even through ssh back to the host.
https://blog.gripdev.xyz/2025/01/08/wezterm-easily-copy-text...
Wasn't aware of user-var-changed, cool write-up!
I had used urxvt forever before and the simple solution that works (even for ssh e.g.) is to ring the terminal bell, and urxvt just sets the window urgency hint upon that. I just do that in shell prompt unconditionally because if it's triggered in a focused window, then nothing happens. But if it's from a different workspace, I get this nice visual cue in my top bar for free.
But features like setting urgency isn't available in wezterm (understandable, as it's not a cross-platform thing). I could patch that in the source, but the Emacser in me chose to do something more unholy. By default Lua is started in safe mode, which means loading shared C module is forbidden. I disabled that, and now use a bunch of missing stuff written in Rust and Zig interfaced with cffi. Don't recall ever having a crash so I am surprised by some of the other comments.
Yeah, I use wezterm for remote editing at work because it has the best support for chords over ssh, and everything basically just works out of the box. Really convenient
I get the error `Your store is blocked` when trying to load the images
Same
Me too- these images are very important to the blog post, I wish I could see them
Sorry, I ran out of the free Blob Storage transfer quota, should be fixed now
The thing I love most about wezterm is the `wezterm cli list --format json`, and being able to get various values like the cwd of any terminal by window id. While I don't much tweak my actual wezterm config at all. I use that a lot for various scripts to launch other terminals/file managers in the same directory as the currently active terminal...
Wezterm was great, but I had to stop using it recently because it keeps crashing immediately (across two different computers) on CachyOS/Arch :/
It's just broken on KDE permanently I guess :/ There have beem tickets about it, and there is an AUR repo with a patch that used to fix it... but :/
Was already worried about the project given that it hasn't seen a new release in quite a long time. Got the feeling that the maintainer has mostly moved on.
It's been almost a year for me now but I had also stopped using it due to crashes. And since it shares a process for all your windows, it would close all my windows which just drove me nuts after awhile.
Though for me, I only wanted the absolute bare minimum, which Alacritty covers. I was sad to lose ligatures, but Alacritty is stable and very fast.
Ghostty replaced wezterm for me, plus it supports ligatures and is just as fast as alacritty.
> Was already worried about the project given that it hasn't seen a new release in quite a long time
IIRC the maintainer was moving countries. Not saying that's the main or only reason, but it is likely a factor.
WezTerm is great. When I switched back to Linux from Apple there were very few things I missed. iTerm2 was one of them, but since I found WezTerm I am pretty happy.
I tried to use it on Windows as well but unfortunately the Antivirus freaks out on it. When I looked into it it was because of a small utility `strip-ansi-escapes` which is so simple that even I could see that it is a false positive. I tried to report it to Microsoft and other Antivirus companies with some success but in the end I gave up an this Sisyphus task.
I have zero problem with WezTerm on Windows.
I love WezTerm! The cross-platform config is easy to version control (unlike iTerm2) and I've added a couple integrations that I use constantly:
The first is hashing the working directory / (or remote hostname if I'm SSH'd into a host) to set tab title colors- much easier to find the right tab that way.
The second is writing a script to open tabs with in a certain order and set their titles. I don't use tmux, but this let's me recreate my preferred layout for projects quite easily.
See https://github.com/bbkane/dotfiles/tree/master/wezterm if any of this sounds useful to you!
This post would be a lot better if all the images weren't broken.
Sorry, I ran out of the free Blob Storage transfer quota, should be fixed now
I found wezterm pane resizing to be very glitchy, and using native panes along with the muxing server was about 80% of the reason I wanted to use it. But for whatever reason, maybe font related, the resizing logic is unstable and it gets into weird states, glitching and flickering etc. Nightly vs stable made bo difference.
Could someone sell me on one of these alternative terminals (kitty, ghostty, wez, etc)? There is probably something I am missing not using GPU backed rendering, but I don’t know what I don’t know.
All I want is terminals to share config across MacOS, Linux and ideally Windows and have great support for SSHing into low end boxes with some minimal persistence solution like tmux on them. In an ideal world I would not have to think about mouse capture and scroll modes, they’d work seamlessly across my device and the devices I’m SSHed into.
It shocked me when I got back into playing with multiple machines after over a decade that this mostly still does not exist.
Instead we’re finally doing gpu rendering (which is amazing but … surprising for this to be the 2025 topic du jour?)
+1 -- consistency is key.
Wezterm runs everywhere, but lets me customise it once and keep that config uniform across all machines.
I can have a single config [0], wrap that in a nix expression [1] for anywhere that runs home-manager / NixOS and then also check it out and symlink on Windows machines as my portal to WSL. As my preferences change, my tooling stays consistent and familiar everywhere it's needed.
[0]: https://git.sr.ht/~kb/env/tree/main/item/dotfiles/wezterm.lu...
[1]: https://git.sr.ht/~kb/env/tree/main/item/programs/wezterm.ni...
I really love the following things that I can do with kitty:
- Access the scrollback buffer in neovim
- Access the last command output in neovim
- Animated cursor trails. It sounds dumb at first but I find that when sharing my screen, the cursor trails help other people keep track of my cursor when using neovim.
Here are my configs to quickly load @screen_scrollback or @last_cmd_output in neovim
map kitty_mod+z launch --stdin-source=@screen_scrollback --type=overlay /bin/zsh -c "nvim +$ +'nnoremap q ZQ'"
map kitty_mod+v launch --stdin-source=@last_cmd_output --type=overlay /bin/zsh -c "nvim +$ +'nnoremap q ZQ'"
Gotta give a shoutout regarding Ghostty [1]. I keep switching terminal apps; I'm on an iTerm2 kick right now… but I used Ghostty for a while and it's pretty damn cool.
Anecdotally, it feels the fastest to me. Also GPU-accelerated and super configurable. It's amazing how a guy (Mitchell Hashimoto)[2] leaves the company he co-founded before it was sold to IBM.
[1]: https://ghostty.org
[2]: https://www.youtube.com/watch?v=l_qY2p0OH9A
Can ghostty pipe the scrollback buffer to nvim?
You can get cursor trail on any terminal these days...
Can you access the scrollback buffer in nvim?
I tried a few of them and they were all way slower than xfce4-terminal. So I just kept using that.
I don't really dump megabytes of text into the terminal, they might have an edge there? (I found that xterm is much faster than xfce4-terminal for that.)
I have a very silly primary reason for preferring the Kitty terminal - I configured it to look very minimalistic and compact. It doesn't even have the customary app titlebar at the top. The other benefit is that it's actually a lot faster to start up than Terminal.app when you first invoke it. I know iTerm2 is really well-liked, but to me, it gave the "Breakin' 2: Electric Boogaloo" vibes.
Kitty and wez both have the ability to present graphics on the terminal which may sound like a solution in search of a problem, but once you start using the capability, it's hard to live without it.
Wez is also cross platform so I get to use it on my Linux and Mac and my (Ugh) Windows work machine. Configuration being done in Lua is also something I quite like, but your mileage may vary on that one.
I was using Wezterm because of the cross platform and the lua config (let's me reuse my mad lua skilz from keeping my nvim config).
The thing that made me switch to Ghostty was the image support in wez didn't play well with tmux.
After testing wez, kitty, and Ghostty, I ended up going with Ghostty.
I do miss the idea of the whole lua config thing, but since I never did anything with it, I can't treat that as a practical concern.
All I know is that on MacOS iTerm2 is unmatched. Every few months I go in search of something similar to it (as a backup), and every single time, after trying countless terminals, I give up. The closest I've found is WezTerm, and even that is a pale shadow of Iterm2
I switched from iTerm to WezTerm and haven’t looked back. It feels faster and it’s simpler to configure. I only have a basic use case, though, as tmux does all the heavy work for me. People with an appetite for more features might legitimately prefer iTerm, but I can’t endorse the comment “pale shadow of iTerm” for all use cases.
> Could someone sell me on one of these alternative terminals (kitty, ghostty, wez, etc)?
* They're very fast and the scrolling is very smooth, especially on a 120 Mhz (ProMotion) refresh rate on MacBook Pros.
* While TMUX runs on all of them, they have built-in multiplexing, so you terminal sessions without requiring TMUX.
* Super configurable and in some cases programable
* Excellent typeface support, including ligatures, which I liker
* A quality of life issue: you don't have to copy and paste URLs; you just right-click them in the terminal.
* Excellent typeface support
I just recently decided to replace iterm2 with wezterm when I started moving macbook over to nix. iterm2 is about the only one that didn’t work well for this, since you can’t source control the configuration (import/export doesn’t cut it)
Any of the ones you mentioned would probably work good with nix too. I don’t really care about the config being scriptable at all, it was just the first terminal that easily let me set all of the keyboard shortcuts I wanted, so I stuck with it.
iTerm2 does support source control; I've got my settings in a git repo managed by Chezmoi. In the settings dialog, under "General" -> "Settings", there's an "External settings: Load settings from a custom folder or URL" option.
I've also gone wez from iterm2, and you hit upon why. Don't ever make me click on things. I can't script => modify => export clicking on things. When you make me click on things, you've defined my interface for me, which I did not ask for.
I suppose I'm a bit of an extremist, though.
Low latency full screen editor is really nice if you have a reasonably fast monitor and appreciate or need a terminal based editor.
The main features I use are
1. quick-select the output in the terminal (select files/paths, urls, etc and either copy or paste them at the cursor). This is very useful as you often don't have the foresight to pipe the command to pipe the output of the command to some selection mechanism and even placing text on the line-editor is not that easy by default.
2. view images (sixel or kitty protocol). This is pretty useful visual analog to cat that doesn't require opening another program and works over ssh. Also for video.
There are some other nice utilities for doing things like downloading files directly in the terminal (it2dl for iterm and kitten transfer for kitty).
kitty doesn't work out of the box on macos if I remember; you have to set configuration for option/command etc.
To be completely honest, the reason I switched was for true-color support in my editor (vim), rather than being limited to just 256 colors.
> Could someone sell me on one of these alternative terminals (kitty, ghostty, wez, etc)?
Because these terminals all use the Kitty protocol, you can finally detect a single ESC press without a timeout hack as well as use shift with arrow keys to do text selection.
The fact that it has taken until 2025 to be able to do something this basic is pathetic.
The only thing I want from WezTerm is a warning when I'm about to close a tab. The tabs are too small and the x is easy to hit by accident... thousand lines of bash history and temp env vars gone in an instant.
Otherwise, it's awesome and my default terminal everywhere.
you can configure that...
Please show me where. It only works for tabs that have a running process.
oh, you might be doing it via the UI, I turn off all the UI elements and hotkey everything, if you use hotkeys you can add a thing like :- action = wezterm.action.CloseCurrentTab { confirm = true },
WezTerm is an absolute joy to use: Scriptable (in Lua), allows creating your own shortcuts, has a command palette, has something like tmux (called mux) for which I have created lua scripts to setup my workspace for different projects. Something like tmuxinator impelemented in WezTerm. - I still use tmux, but mux is nice as well, and I can use splits and navigation natively in WezTerm, no need for prefix-{command} like in tmux. But can have workspaces in WezTerm.
It allows adding a custom background image, also transparent background, and I can toggle all of that via my custom shortcuts: Transparent on/off, background image on/off/rotate randomly.
It is such a joy to use and so beautiful. That plus neovim, yazi file browser, and lazygit: Dreamteam. Best dev environment I ever had.
It is impossible for me to take seriously someone who puts spotify into their command line terminal.