I currently use WaveTerm and it's pretty good. (But a bit laggy sometimes, i think it's electron based)
But both your terminal and waveterm are missing an important UX feature.
When you keep appending vertical terminals to the right (in the same view). They all get squished, to fit in the current window width.
Instead, I would love a horizontal scroll at the bottom, so I can have infinite termnial appending without having them squeezed to be smaller and smaller.
Nice work!
I have actually been working on something similar.
Main differentiators:
- Based on tmux, so you can connect to a persistent session from multiple devices
- Responsive, resizes sidebar based on mobile/desktop client connecting
- Status indicator icons for major LLM CLIs (needs input/thinking)
- Completely built into tmux, emulator-agnostic
- Supports grouping of windows
- Supports color and emoji-coding windows / panes / window groups
- It's higly configurable using yaml
Hey, this looks seriously awesome. Love the ideas here, specifically: the programmability (I haven't tried it yet, but had been considering learning tmux partly for this), layered UI, browser w/ api. Looking forward to giving this a spin. Also want to add that I really appreciate Mitchell Hashimoto creating libghostty; it feels like an exciting time to be a terminal user.
Some feedback (since you were asking for it elsewhere in the thread!). Happy to go into more detail about any of these if it's helpful:
- It's not obvious/easy to open browser dev tools (cmd-alt-i didn't work), and when I did find it (right click page -> inspect element) none of the controls were visible but I could see stuff happening when I moved my mouse over the panel
- Would be cool to borrow more of ghostty's behavior:
- hotkey overrides - I have some things explicitly unmapped / remapped in my ghostty config that conflict with some cmux keybindings and weren't respected
- command palette (cmd-shift-p) for less-often-used actions + discoverability
- cmd-z to "zoom in" to a pane is enormously useful imo
> hotkey overrides - I have some things explicitly unmapped / remapped in my ghostty config that conflict with some cmux keybindings and weren't respected
We need to be better about this; right now you can modify keyboard shorcuts with cmd+, in the GUI. Planning on making it a config file in the spirit of ghostty though, not sure if we want to reuse ghostty's config file though since it might become a maintenance burden for them...
> command palette (cmd-shift-p) for less-often-used actions + discoverability
yes
> cmd-z to "zoom in" to a pane is enormously useful imo
Thinking of the right way to design this. Like hypothetically we can expand it, but what happens if you make a vertical/horizontal split, or cmd+t to make a new tab? I guess we could just "merge" it back into the original space which would be pretty cool.
IMO (re zoom behavior):
if you make a new tab, it should add a new tab as normal and stay zoomed in. the tab bar (of the currently zoomed in panel) would still be at the top while zoomed in, and workspaces still appear to the side
if you make a new split (or navigate splits), it would zoom you back out (contract the panel) and just split/navigate the way it normally would
I had sort of the same idea. https://wingthing.ai/ This idea started at “sandbox” and worked its way toward “remote access”. But same thoughts about muxing sessions. Love being able to leave and reattach while an agent is working. I’ll give yours a shot!
I've been looking for something like this. It was just two weeks ago I had Claude modify Wezterm to add tree-style vertical reorderable tabs. It works OK but your solution is nicer.
So I've been using cmux for a few hours this morning, and I like it. One thing I'd like to disable is the reordering of tab groups. Currently it shows the most recent notifications on top. This also makes the keyboard shortcut for a given conversation change all the time, which is a cognitive burden for me.
I like what you did here and with your direction with the stack. We have some common overlap. Last week I started clauding up something to manage my Claude sessions. It is built on Tauri 2 using xterm.js. It has is project-based and each project has resumable sessions. I borrowed inspiration from Happy coder and clauded an Expo app so I can claude remotely on-the-go. It has been a force multiplier in my clauding with developing new features and addressing bugs and defects. It was a pretty amazing feeling when I started using it to further its own development. There's a slew of other features as I adapt it to my development style.
Mobile interface is definitely nice. Planning on adding iOS app since libghostty works there too! And I imagine that having your main terminal app be synced directly to your phone must be nice, though it doesn't solve the problem of closing my laptop.
Would love to hear what other features have been particularly beneficial to your dev style too. Some directions I'm interested in is having everything be programmable; so my coding agent can set up workspaces for me, click through browsers to test things, etc. And having a main Claude Code manage subagents that have their own easily visible terminal windows.
Wow! That would be incredible! I don't have the agents control the browsers like you are doing. I'm watching to see what you do though because that is incredible. The performance hit is real though -- I may look at libghostty.
I went the similar path of going vertical tabs after having worked that way in iTerm2 for months. Here's what I currently have:
Project-based organization -- Group sessions by working directory with a visual icon strip sidebar.
Multiple session types -- Claude Code sessions, standalone terminal shells, and embedded browser tabs.
Session persistence -- Terminal output is logged and replayed on relaunch so you never lose context.
Session resume -- Claude Code sessions detect their session ID automatically and resume where you left off.
Planning mode -- Draft and refine plans in a built-in text editor, then send them to Claude with one click.
Planning templates -- Start plans from structured templates for bug reports, feature requests, code reviews, refactors, and more.
Auto-titling -- Generic session names are replaced with descriptive titles generated by Claude after the first exchange.
Theming -- Light and dark themes with full CSS variable control.
Native menus and keyboard shortcuts -- macOS-native menu bar with comprehensive shortcut coverage.
Resizable layout -- Adjustable sessions sidebar width with state persistence across restarts.
Dock badge -- macOS dock icon shows the number of actively working Claude sessions.
Pin and archive -- Pin important sessions to the top or archive completed ones to keep the list clean.
Session card view -- See all sessions in a sortable grid with activity stats, token counts, and quick actions.
File tracker -- See which files Claude creates, modifies, and deletes in a live sidebar panel.
Macros -- One-click buttons for frequently used commands like /clear or commit this work.
Remote mode -- Monitor and control sessions from your phone via an encrypted WebSocket relay.
It has become my development hub where I can iterate very quickly.
Very cool stuff! Would be curious if the stuff you've built is open sourced? Having a bunch of Claude Codes will definitely eat a ton of CPU/RAM. libghostty should help to a certain extent, but at some scale, you'll probably a custom optimized agent loop or remote VMs.
It isn't open sourced, just a private repo on GitHub. I built it as a pet project just throwing things at the wall seeing how far I could go in a short time as a means to an end. Currently, I cannot commit time to maintaining an open source project and it would be negligent of me to put something out there that would stagnate. As quickly as my app shaped up, I bet I could claude something from scratch and implement the features that have worked out for me. There are many rough edges that I just work around that you have a better grasp on, like notifications.
I really like having ~8-12 active Ghostty windows tiled so I can keep an eye on everyone's progress, and then I'll expand one or two for deeper work. Would love to see some sort of auto-expand/contract so I can keep an eye on everything but then when I foreground a pane it grows, or something like that.
Looks like this could be really cool, but it's a buggy mess. Can't switch top tabs, can't close tabs. Once I lose focus in a tab, I can't ever type again in that terminal tab. Can't switch between the different sidebar tabs, either.
It doesn't have built-in notifications and there's no panel to see all the open sessions, but I wonder how hard that would be to add.
I've used zmx since I ran into it a few weeks ago. Uses libghostty as well. It's great because it allows me to replace tmux completely in all my ssh sessions, and can keep one session per assistant.
zmx solves persistence well, and I like their minimalism (not supporting windows, tabs, or splits). I think it's possible to make a CLI wrapper for zmx that adds notifications though, so you can have some niceties of cmux without switching to a new terminal. Lowkey we might explore this direction as well.
ive been working on glue for zmx+kitty (would do ghostty if it had proper ipc/scripting support). just changed the repo visibility on on gh cwelsys/kmux.
Nice. I should add notifications to https://github.com/rcarmo/webterm - I already have sparklines as a CPU usage indicator and live thumbnails, but a visual highlight should be easy to add.
Just took it for a spin, thought it was pretty nice. Some quirks with the tab dragging, you never really know what it's going to do on mouseup, a drop-target indicator would help.
Ah, I regret training myself into Caps Lock to Escape. Well, a personal problem then. It doesn't seem to have copy-paste support that I have in my Ghostty but I bet that's a config somewhere.
I tried this, but found it annoying that it will add a slight delay. Totally makes sense if you've been running on caps lock -> escape for a long time. I've bound caps lock -> ctrl and left ctrl -> escape.
Ah! Thanks for explaining that. I totally keep forgetting, to my own detriment, libghostty exists. It’s mighty cool to see it being used more and more to build cool new terminals (like yours and the mobile terminal that showed up here the other day).
I missed the mobile terminal and I've been hunting for a good one, did a search for past week but found nothing, if you had a link handy that would be great - thank you.
Hey, this is great. And looks similiar to WaveTerm https://www.waveterm.dev/
I currently use WaveTerm and it's pretty good. (But a bit laggy sometimes, i think it's electron based)
But both your terminal and waveterm are missing an important UX feature.
When you keep appending vertical terminals to the right (in the same view). They all get squished, to fit in the current window width.
Instead, I would love a horizontal scroll at the bottom, so I can have infinite termnial appending without having them squeezed to be smaller and smaller.
Nice work! I have actually been working on something similar.
Main differentiators: - Based on tmux, so you can connect to a persistent session from multiple devices - Responsive, resizes sidebar based on mobile/desktop client connecting - Status indicator icons for major LLM CLIs (needs input/thinking) - Completely built into tmux, emulator-agnostic - Supports grouping of windows - Supports color and emoji-coding windows / panes / window groups - It's higly configurable using yaml
https://github.com/brendandebeasi/tabby
Hey, this looks seriously awesome. Love the ideas here, specifically: the programmability (I haven't tried it yet, but had been considering learning tmux partly for this), layered UI, browser w/ api. Looking forward to giving this a spin. Also want to add that I really appreciate Mitchell Hashimoto creating libghostty; it feels like an exciting time to be a terminal user.
Some feedback (since you were asking for it elsewhere in the thread!). Happy to go into more detail about any of these if it's helpful:
- It's not obvious/easy to open browser dev tools (cmd-alt-i didn't work), and when I did find it (right click page -> inspect element) none of the controls were visible but I could see stuff happening when I moved my mouse over the panel
- Would be cool to borrow more of ghostty's behavior:
Thanks for the feedback! Mitchell Hashimoto is awesome. Have a PR for fixing devtools here: https://github.com/manaflow-ai/cmux/pull/117
> hotkey overrides - I have some things explicitly unmapped / remapped in my ghostty config that conflict with some cmux keybindings and weren't respected
We need to be better about this; right now you can modify keyboard shorcuts with cmd+, in the GUI. Planning on making it a config file in the spirit of ghostty though, not sure if we want to reuse ghostty's config file though since it might become a maintenance burden for them...
> command palette (cmd-shift-p) for less-often-used actions + discoverability
yes
> cmd-z to "zoom in" to a pane is enormously useful imo
Thinking of the right way to design this. Like hypothetically we can expand it, but what happens if you make a vertical/horizontal split, or cmd+t to make a new tab? I guess we could just "merge" it back into the original space which would be pretty cool.
IMO (re zoom behavior): if you make a new tab, it should add a new tab as normal and stay zoomed in. the tab bar (of the currently zoomed in panel) would still be at the top while zoomed in, and workspaces still appear to the side
if you make a new split (or navigate splits), it would zoom you back out (contract the panel) and just split/navigate the way it normally would
I had sort of the same idea. https://wingthing.ai/ This idea started at “sandbox” and worked its way toward “remote access”. But same thoughts about muxing sessions. Love being able to leave and reattach while an agent is working. I’ll give yours a shot!
Would love your feedback and suggestions!
I've been looking for something like this. It was just two weeks ago I had Claude modify Wezterm to add tree-style vertical reorderable tabs. It works OK but your solution is nicer.
So I've been using cmux for a few hours this morning, and I like it. One thing I'd like to disable is the reordering of tab groups. Currently it shows the most recent notifications on top. This also makes the keyboard shortcut for a given conversation change all the time, which is a cognitive burden for me.
Makes sense, added as issue: https://github.com/manaflow-ai/cmux/issues/205
I like what you did here and with your direction with the stack. We have some common overlap. Last week I started clauding up something to manage my Claude sessions. It is built on Tauri 2 using xterm.js. It has is project-based and each project has resumable sessions. I borrowed inspiration from Happy coder and clauded an Expo app so I can claude remotely on-the-go. It has been a force multiplier in my clauding with developing new features and addressing bugs and defects. It was a pretty amazing feeling when I started using it to further its own development. There's a slew of other features as I adapt it to my development style.
Mobile interface is definitely nice. Planning on adding iOS app since libghostty works there too! And I imagine that having your main terminal app be synced directly to your phone must be nice, though it doesn't solve the problem of closing my laptop.
Would love to hear what other features have been particularly beneficial to your dev style too. Some directions I'm interested in is having everything be programmable; so my coding agent can set up workspaces for me, click through browsers to test things, etc. And having a main Claude Code manage subagents that have their own easily visible terminal windows.
Wow! That would be incredible! I don't have the agents control the browsers like you are doing. I'm watching to see what you do though because that is incredible. The performance hit is real though -- I may look at libghostty.
I went the similar path of going vertical tabs after having worked that way in iTerm2 for months. Here's what I currently have:
Project-based organization -- Group sessions by working directory with a visual icon strip sidebar.
Multiple session types -- Claude Code sessions, standalone terminal shells, and embedded browser tabs.
Session persistence -- Terminal output is logged and replayed on relaunch so you never lose context.
Session resume -- Claude Code sessions detect their session ID automatically and resume where you left off.
Planning mode -- Draft and refine plans in a built-in text editor, then send them to Claude with one click.
Planning templates -- Start plans from structured templates for bug reports, feature requests, code reviews, refactors, and more.
Auto-titling -- Generic session names are replaced with descriptive titles generated by Claude after the first exchange.
Theming -- Light and dark themes with full CSS variable control.
Native menus and keyboard shortcuts -- macOS-native menu bar with comprehensive shortcut coverage.
Resizable layout -- Adjustable sessions sidebar width with state persistence across restarts.
Dock badge -- macOS dock icon shows the number of actively working Claude sessions.
Pin and archive -- Pin important sessions to the top or archive completed ones to keep the list clean.
Session card view -- See all sessions in a sortable grid with activity stats, token counts, and quick actions.
File tracker -- See which files Claude creates, modifies, and deletes in a live sidebar panel.
Macros -- One-click buttons for frequently used commands like /clear or commit this work.
Remote mode -- Monitor and control sessions from your phone via an encrypted WebSocket relay.
It has become my development hub where I can iterate very quickly.
Very cool stuff! Would be curious if the stuff you've built is open sourced? Having a bunch of Claude Codes will definitely eat a ton of CPU/RAM. libghostty should help to a certain extent, but at some scale, you'll probably a custom optimized agent loop or remote VMs.
It isn't open sourced, just a private repo on GitHub. I built it as a pet project just throwing things at the wall seeing how far I could go in a short time as a means to an end. Currently, I cannot commit time to maintaining an open source project and it would be negligent of me to put something out there that would stagnate. As quickly as my app shaped up, I bet I could claude something from scratch and implement the features that have worked out for me. There are many rough edges that I just work around that you have a better grasp on, like notifications.
I really like having ~8-12 active Ghostty windows tiled so I can keep an eye on everyone's progress, and then I'll expand one or two for deeper work. Would love to see some sort of auto-expand/contract so I can keep an eye on everything but then when I foreground a pane it grows, or something like that.
Ah, like a way to maximize the current pane you're focused on?
Yep! Also a simple text editor pane would be sweet too.
Haha, it's like we're moving towards an IDE but starting from the opposite direction.
My two cents - don’t do it. There’s plenty of terminal editors (and personal opinions about them) to chose from. You will end up reinventing an IDE.
Hm... any idea how I might script `git worktree` into the new-pane action?
Currently experimenting with agent-of-empires for tmux+worktrees to parallelize code changes.
No built in way to override new-pane actions right now, but `cmux --help` can automate all parts of cmux.
So you can make your own script that can make new panels/workspaces and just invoke it from the terminal:
I think we should make this easier though, open to suggestions!Vertical tabs for a terminal emulator seems killer, I'll be trying this out for sure.
Yes it's cool. I wonder if other terminal emulator apps like WezTerm, iTerm etc also has this feature?
iTerm2 has vertical tabs too
https://iterm2.com/3.0/documentation-preferences.html#:~:tex...
Looks like this could be really cool, but it's a buggy mess. Can't switch top tabs, can't close tabs. Once I lose focus in a tab, I can't ever type again in that terminal tab. Can't switch between the different sidebar tabs, either.
Sorry you likely encountered this issue: https://github.com/manaflow-ai/cmux/issues/103
The latest release (0.57.0) should fix it.
Have you looked into zmx? [0]
It doesn't have built-in notifications and there's no panel to see all the open sessions, but I wonder how hard that would be to add.
I've used zmx since I ran into it a few weeks ago. Uses libghostty as well. It's great because it allows me to replace tmux completely in all my ssh sessions, and can keep one session per assistant.
[0]: https://github.com/neurosnap/zmx
zmx solves persistence well, and I like their minimalism (not supporting windows, tabs, or splits). I think it's possible to make a CLI wrapper for zmx that adds notifications though, so you can have some niceties of cmux without switching to a new terminal. Lowkey we might explore this direction as well.
ive been working on glue for zmx+kitty (would do ghostty if it had proper ipc/scripting support). just changed the repo visibility on on gh cwelsys/kmux.
Nice. I should add notifications to https://github.com/rcarmo/webterm - I already have sparklines as a CPU usage indicator and live thumbnails, but a visual highlight should be easy to add.
If I were you, I'd just start always in what you call "dashboard mode". Its underwhelming to start it up and not see the "boxes" :)
That’s what I do, via docker compose.
Cool project! How are you liking ghostty-web so far?
I use it every day multiple hours a day and I forget it’s a web terminal until I hit Ctrl+W on Firefox :)
Just took it for a spin, thought it was pretty nice. Some quirks with the tab dragging, you never really know what it's going to do on mouseup, a drop-target indicator would help.
Would love to be able to color the sidebar tab.
Nice work!
Thanks! Will add drop target and sidebar coloring.
Should be in latest release!
Looks really useful! Does this support the new Claude Code agent teams feature, so it will open all the team members in their own pane?
We're working on a tmux/it2 compatibility layer to make this happen!
This is pretty slick, man. The only thing is that the Ctrl-Cmd-] is too hard to press but I'll just use the number thing.
Thank! I personally have caps lock mapped ctrl... but open to suggestions! Since it's hard to handle both horizontal and vertical tabs.
Ah, I regret training myself into Caps Lock to Escape. Well, a personal problem then. It doesn't seem to have copy-paste support that I have in my Ghostty but I bet that's a config somewhere.
Get the best of both worlds by having it be Ctrl when held down + pressed with another key and Esc when you press and release it by itself.
Well, there's a fantastic idea. Apparently so many people are already in this better world: https://gist.github.com/tanyuan/55bca522bf50363ae4573d4bdcf0...
I have Karabiner Elements so I added it and it's amazing!
I tried this, but found it annoying that it will add a slight delay. Totally makes sense if you've been running on caps lock -> escape for a long time. I've bound caps lock -> ctrl and left ctrl -> escape.
> copy-paste support that I have in my Ghostty
Want to fix this, how do I reproduce? Select with mouse and cmd+c seems to work for me.
Oh thank you. Perhaps it's something in my Ghostty. Here's a gist to work with:
https://gist.github.com/roshan/b2a073e2377f370ce83cf7c4ea6d8...
I'm on MacOS 15.7.4 on an M4 Max Macbook
Should be fixed in latest release (0.58.0). Please let me know if it's still an issue!
Thanks for repro, taking a look!
Awesome work, keen to try it out tomorrow. Can I make the notifications work with Gemini CLI and Kiro CLI too?
Thanks! Yup, notifications can be triggered via cli:
And afaik, both Gemini/Kiro should have stop hooks. If they send OSC notifications, then notifications will "just work" as well.Docs: https://www.cmux.dev/docs/notifications
Gave this a run and it was pretty intuitive. Good work!
Thanks!
Got a bunch of errors when starting Claude.
Could you file an issue with more details: https://github.com/manaflow-ai/cmux/issues
Would greatly appreciate it!
vertical tabs are a great idea for ghostty!
This looks cool. I honestly haven’t ever thought about using vertical tabs in a terminal window but that seems nice.
One question though, have you thought about trying to upstream any of this into Ghostty instead of making an entirely different app?
Upstreaming into Ghostty would be very difficult as it's not actually a fork, I just used libghostty under the hood.
Ah! Thanks for explaining that. I totally keep forgetting, to my own detriment, libghostty exists. It’s mighty cool to see it being used more and more to build cool new terminals (like yours and the mobile terminal that showed up here the other day).
I missed the mobile terminal and I've been hunting for a good one, did a search for past week but found nothing, if you had a link handy that would be great - thank you.
VSCode has vertical tabs for it's terminals like this, but on the right side.
Good idea, but I don't want to move to another terminal now, will stick with Ghossty
It's an open discussion. I also have a PR ready, but they are working on stability before a release, which means a pause on new features right now. https://github.com/ghostty-org/ghostty/discussions/2549
Fair enough! I like Ghostty a lot too, and the only reason I built this was because I wanted vertical tabs and nicer notifications.
since you built it, you might know if there's some addons/plugins for ghostty that make working across many LLM sessions more delightful?
18 (!) releases in two days. This is some really fast coding.
Lots of stuff to iron out pre-launch!
when you say pre-launch, what do you mean exactly ?
With this one, small tweak it is perfect:
osascript << 'EOF' use framework "Foundation" use framework "AppKit"
set ghosttyIconPath to "/Applications/Ghostty.app/Contents/Resources/Ghostty.icns" set cmuxAppPath to "/Applications/cmux.app"
-- Read the icon file set iconImage to current application's NSImage's alloc()'s initWithContentsOfFile:ghosttyIconPath
-- Set it as the custom icon for cmux.app current application's NSWorkspace's sharedWorkspace()'s setIcon:iconImage forFile:cmuxAppPath options:0 EOF
((The ghost pairs well with Kiro, what can I say?))
:ghost: