A Milestone, txm new release
The first time I worked with the Linux terminal I was young, I didn’t know much about computers. It was just a new thing to try. That was a cool thing to do anyway. But it felt strange compared to the GUI world I was part of for the last couple of weeks. Still, the terminal got a special place for me since then. Life went on, and now I do development full-time, and my hobbies surround programming too.
When you work in the terminal long enough, you develop habits. You also inherit habits from the systems you log into. On one server, tmux
is installed and configured just right. On another, you’re stuck with GNU screen
. And sometimes, you get the freedom to try something new like zellij
. Each of these tools is powerful in its own way, but moving between them is where the pain begins. For me, actually remembering the syntax of tmux
was the annoying part. Yes, I could have modified the tmux
config and customized it to be easier for me to use, but carrying that customization everywhere felt like building a wrapper around it anyway. It’s not that tmux
commands are hard, or that screen’s syntax is impossible to learn, it’s that when you’ve memorized one, the others slow you down. Splitting a pane, renaming a window, or checking your session list suddenly becomes a mental context switch. In high-focus workflows, even small interruptions add up.
That’s where txm
comes in.
What txm is and why I built it
txm
stands for Terminal Multiplexer Manager. The idea is simple: give me one consistent set of commands, and let the tool worry about whether I’m on tmux
, screen
, or zellij
.
With txm
, I:
- Don’t have to remember that
tmux split-window
becomesscreen split
or thatzellij
calls it a “pane” but treats it differently. - Can jump between panes and windows with the same keystrokes and commands across backends.
- Can keep my workflows consistent whether I’m on my laptop, a remote server, or inside a dev container.
- Can have confidence that my muscle memory will carry over between tools.
The big jump to v0.3.0
Until this point, txm
had the basics, support for tmux
and screen
, basic session management, some window commands. It was already useful for me day to day.
But v0.3.0
changes the scope completely, introducing:
- Full
zellij
backend support - Improved backend configuration with environment variable override and persistent settings
- More robust backend validation with clearer error messages
- A large internal refactor to make future changes easier
This is the first release where txm
feels like a “real” tool rather than a personal experiment.
Full zellij support
Adding zellij
wasn’t a matter of just mapping tmux
commands to zellij
equivalents. The architecture is different, zellij
has tabs instead of windows, and pane focus works differently.
In v0.3.0
:
txm list-windows
inzellij
now lists tab names with meaningful context, instead of just IDs.- Pane navigation commands map to
zellij
’s expected behavior, so moving between panes feels natural. - Backend-specific quirks (like how
zellij
handles focus) are handled internally, you don’t have to remember them.
Example:
# Works the same in tmux, screen, and zellij
txm split-window mysession mywindow v
txm next-window mysession
txm rename-window mysession "logs"
In zellij
, that last command will rename the active tab, not just an internal ID.
Backend configuration and fallback
Before v0.3.0
, switching backends meant manually changing settings or commands. Now you can set it once and override it when needed.
- Persistent setting:
txm config set backend zellij
- Temporary override:
TXM_DEFAULT_BACKEND=tmux txm create dev-session
Backend selection priority:
TXM_DEFAULT_BACKEND
environment variable (temporary)- Config file at
~/.txm/config
(persistent) - Default to
tmux
if available, otherwise the first available backend
CLI and documentation updates
A couple of small but important changes:
-h
and--help
now explicitly show all commands and options- The man page has been updated with backend-specific examples, so you know exactly how commands behave in
tmux
,screen
, orzellij
- Backend validation now gives clear error messages instead of silent failures
Example:
$ txm --backend=banana create mysession
Error: invalid backend "banana"
Valid backends are: tmux, screen, zellij
Behavior fixes
A few of the changes that make daily use smoother:
show
command now displays the correct active backend from config or fallbackzellij
pane logic no longer causes focus jumps- Screen session handling in tests and real use is more reliable
- Development install update process is cleaner
Behind the scenes, why this matters for the future
The visible features are only half the story. This release also involved moving to a standard Go project structure, splitting each backend into its own file, migrating backend calls to the modular system, rewriting unit tests to focus on core logic, and moving integration tests into separate GitHub Actions workflows. This makes adding new features, or even a fourth backend, much easier and safer.
What’s next
Some ideas I am exploring include advanced session recovery so you can pick up where you left off, even across machines, remote backend management to manage multiplexers over SSH from a single txm command, and custom command sets that let you map your own shortcuts to backend actions.
Get txm
You can find the source code, issues, and releases on GitHub txm repository:
For a quick try, you can use the following one line install script. I don’t recommend this as this practice is huge security problem, but it can be useful for testing purposes. Please take your time to understand what the script does before running it.
Quick install (user-local)
curl -s https://raw.githubusercontent.com/MohamedElashri/txm/main/utils/install.sh | bash
System-wide install
curl -s https://raw.githubusercontent.com/MohamedElashri/txm/main/utils/install.sh | sudo bash -s -- --system
From source
git clone https://github.com/MohamedElashri/txm
cd txm/src
go build -o txm
sudo mv txm /usr/local/bin/
Once installed, run:
txm --help
To see all available commands.
Final word
txm
v0.3.0
is the release where my vision starts to feel somehow real. One tool, one workflow, three backends. It makes working across different environments less about “remembering the right syntax” and more about “just doing the thing you came here to do.”
So if you live in tmux
but sometimes get dropped into screen
, or if you want to explore zellij
without changing your workflow, this tool can be of help to you.