# tmux-sessionizer opens a git repo as a tmux session from a fuzzy finder

> tms is a Rust command line tool that scans configured paths for git repositories, lets you pick one with a fuzzy finder and opens it as a tmux session, with worktrees opened as windows and a set of session management commands around it. It suits a developer who moves between projects all day, and its configuration lives in a TOML file with a platform specific path.

**jrmoulton/tmux-sessionizer** — Tmux Sessionizer: A tool for opening git repositories as tmux sessions

- Repository: https://github.com/jrmoulton/tmux-sessionizer
- Stars: 688 · Forks: 62
- Language: Rust
- License: MIT
- Published: 2026-10-21 · Updated: 2026-10-21 · Language: en
- Canonical page: https://hysenlabs.com/projects/jrmoulton-tmux-sessionizer

## A fork with a point of view

Tmux Sessionizer is a tmux session manager, and the README is honest about where it came from. It is based on ThePrimeagen's tmux-sessionizer but is opinionated and personalised to the author's specific tmux workflow. That framing matters more than it sounds, because the tool is a set of decisions about how a workflow should behave rather than a neutral utility. The headline behaviour is that git worktrees are automatically opened as new windows, specific directories can be excluded, a default session can be set, and killing a session jumps you to that default. The stated goal is to handle more edge case scenarios, and the README opens with the claim that the fastest way to manage projects is as tmux sessions. The tool is written in Rust, the package is tmux-sessionizer with the binary and library both named tms, and the version is 0.6.1 with releases 0.6.0 and 0.5.0 in 2025 and 2026.

## The commands are the API

The CLI overview in the README is the best description of the tool available, and it reads like a list of workflow verbs. tms on its own scans for all git folders in the specified directories, selects one and opens it as a new tmux session. There is config for the defaults of search paths and excluded directories. There is start, to initialise tmux with the default sessions. switch displays other sessions with a fuzzy finder and a preview window, windows does the same for the current session's windows, kill kills the current session and jumps to another, and sessions shows running sessions with an asterisk on the current one. Then there are rename, which renames the active session and the working directory, refresh, which creates new worktree windows for the selected session, clone-repo and init-repo, bookmark, which makes a directory selectable alongside the git repositories, open-session, and marks, which manages a list of sessions reachable by index. The design intent is that these are bound to tmux keys rather than typed, and the README shows the pattern with a display-popup binding for the picker and a confirm prompt for the kill, where anything other than y aborts.

## Configuration is TOML in a platform specific directory

The config command sets the defaults, and the options are where you can see the opinions. There are search paths with shell like expansions such as tilde supported, a default session to switch to when killing another session, and lists for excluded directories and for removing names from that exclusion list. Then come the behaviours that only matter to someone with a particular setup, such as using the full path when displaying directories, showing initialised submodules, searching submodules for submodules recursively, and a switch-filter-unknown option that only includes sessions from the search paths in the switcher. There is a maximum depths option whose length should match the number of search paths and which defaults to 10, a set of picker colour options for the highlight, text, borders, item count and prompt, and a session sort order that is either Alphabetical or LastAttached. The config file location follows the platform convention, in the platform specific config directory, and the README gives the exact paths for Linux, macOS and Windows, plus a fallback to the home config path where the platform directory cannot be found, and a TMS_CONFIG_FILE environment variable for a custom location.

The three platform locations are:

```bash
Linux: /home/alice/.config/tms/config.toml
macOS: /Users/Alice/Library/Application Support/tms/config.toml
Windows: C:\Users\Alice\AppData\Roaming\tms\config.toml
```

## The dependency list explains the design

The Cargo manifest is worth reading because it says what kind of tool this is. There are two git libraries, gix at 0.88.0 with the attributes feature and jj-lib at 0.46.0, so the tool understands Git attributes and it also knows about Jujutsu, the version control system that treats Git as a backend. The interactive parts are ratatui at 0.29 with serde and crossterm at 0.28, which is a terminal user interface library, and nucleo at 0.5.0 for the fuzzy matching. clap at 4.5 with derive and clap_complete provide the argument parsing and the shell completions. Configuration is read with the config crate at 0.15 with the toml feature and the toml crate at 0.8, and the config path is resolved with dirs at 6.0, which is the standard way to find the platform config directory on each operating system. aho-corasick and shell-words handle the string work. The result is a single binary with terminal drawing, a real fuzzy finder and shell completion, and the presence of jj-lib in particular says the author expects people to work across Git and Jujutsu repositories side by side.

## Worktrees are the model, and that is a choice

The design centre is the worktree. A repository opened as a session gets each of its worktrees as its own window, and refresh exists to generate missing worktree windows for the active session or a named one, which is what you would run after creating a new branch. That makes tms a natural fit for a workflow where a single project is checked out several times at once, on different branches, and you want each visible at a glance rather than hidden behind a session you have to remember the name of. It also means the tool assumes the directory layout of someone who works that way. The rename command follows the same logic, renaming the active session along with the directory name and changing the active directory inside all the panes of the active session, so the panes follow the session. And kill has a configurable target, through tms config --session <name>, defining which session you land in after the kill, with the default session from the same config used when nothing specific is set. The keybinding defaults the README mentions for tmux itself, leader-( and leader-) to switch sessions and leader-p and leader-n to switch windows, are the stock tmux bindings, so the tool layers on top of what you already have.

## Conclusion

Adopt tmux-sessionizer when you work across many git repositories in one day and want a project to become a tmux session from a keyboard shortcut without leaving your editor. Do not adopt it as a general session manager, since the model is built around a configured list of repository paths. Verify first that your repositories live under the search paths you configure, that the shell expansions tms relies on behave as expected on your system, and that the default session tms falls back to after a kill actually exists, since the fallback behaviour depends on it.

## FAQ

### What does tmux-sessionizer do when you run tms?

It scans for all git folders in the specified directories, lets you select one with a fuzzy finder, and opens it as a new tmux session. Git worktrees are automatically opened as new windows, and the README suggests binding it to a tmux key with display-popup so you can open a project without leaving your text editor.

### Where does tmux-sessionizer keep its configuration?

In the platform specific config directory, at /home/alice/.config/tms/config.toml on Linux, under Application Support on macOS and in AppData on Windows, with a fallback to the home config path where the platform directory cannot be found. You can also point it elsewhere with the TMS_CONFIG_FILE environment variable set in your shell profile.

### Which subcommands does tmux-sessionizer provide?

config for the search path and exclusion defaults, start to initialise tmux with the default sessions, switch and windows for the fuzzy pickers, kill to end the current session and jump to another, sessions to list running sessions, rename for the active session and its working directory, refresh to create worktree windows, clone-repo, init-repo, bookmark, open-session and marks for instantly reachable sessions by index.

### Does tmux-sessionizer work with Jujutsu repositories?

The dependency list includes jj-lib at 0.46.0 alongside gix at 0.88.0 for Git, and there are configuration options for showing initialised submodules and searching submodules recursively, so the tool is built to work across both version control systems. It is MIT licensed and written in Rust.

## Sources

- [Issues](https://github.com/jrmoulton/tmux-sessionizer/issues)
- [jrmoulton/tmux-sessionizer on GitHub](https://github.com/jrmoulton/tmux-sessionizer)
- [License: MIT](https://github.com/jrmoulton/tmux-sessionizer/blob/main/LICENSE)
- [README](https://github.com/jrmoulton/tmux-sessionizer/blob/main/README.md)
- [Releases](https://github.com/jrmoulton/tmux-sessionizer/releases)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/jrmoulton-tmux-sessionizer
