{"id":10633422,"url":"https://github.com/joshmedeski/sesh","last_synced_at":"2026-02-23T22:24:38.210Z","repository":{"id":214415859,"uuid":"736435794","full_name":"joshmedeski/sesh","owner":"joshmedeski","description":"Smart session manager for the terminal","archived":false,"fork":false,"pushed_at":"2025-04-02T14:34:21.000Z","size":4047,"stargazers_count":1009,"open_issues_count":56,"forks_count":59,"subscribers_count":7,"default_branch":"main","last_synced_at":"2025-05-14T04:54:25.851Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joshmedeski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-12-27T22:47:28.000Z","updated_at":"2025-05-13T20:36:33.000Z","dependencies_parsed_at":"2023-12-28T03:28:52.864Z","dependency_job_id":"500f77e5-a61d-4ea6-9cfc-ac5197ea236d","html_url":"https://github.com/joshmedeski/sesh","commit_stats":null,"previous_names":["joshmedeski/sesh"],"tags_count":66,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshmedeski%2Fsesh","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshmedeski%2Fsesh/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshmedeski%2Fsesh/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joshmedeski%2Fsesh/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joshmedeski","download_url":"https://codeload.github.com/joshmedeski/sesh/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254169422,"owners_count":22026212,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-06-02T15:36:35.153Z","updated_at":"2026-02-23T22:24:38.203Z","avatar_url":"https://github.com/joshmedeski.png","language":"Go","funding_links":[],"categories":["公用事业公司","Recently Updated","Go","Utilities","\u003ca name=\"tools\"\u003e\u003c/a\u003eTools and session management"],"sub_categories":["实用程序/Miscellaneous","[Oct 18, 2024](/content/2024/10/18/README.md)","Utility/Miscellaneous"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg width=\"256\" height=\"256\" src=\"https://github.com/joshmedeski/sesh/blob/main/sesh-icon.png\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eSesh, the smart terminal session manager\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/joshmedeski/sesh/actions/workflows/ci-cd.yml\"\u003e\n    \u003cimg alt=\"tests\" src=\"https://github.com/joshmedeski/sesh/actions/workflows/ci-cd.yml/badge.svg\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://goreportcard.com/report/github.com/joshmedeski/sesh\"\u003e\n    \u003cimg alt=\"goreport\" src=\"https://goreportcard.com/badge/github.com/joshmedeski/sesh\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://opensource.org/licenses/MIT\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv align=\"center\"\u003e\n\n[English](README.md) | [简体中文](README.zh-cn.md)\n\n\u003c/div\u003e\n\nSesh is a CLI that helps you create and manage tmux sessions quickly and easily using zoxide.\n\n\u003cdiv style=\"width:50%\"\u003e\n  \u003ca href=\"https://youtu.be/-yX3GjZfb5Y?si=iFG8qNro1hmZjJFY\" target=\"_blank\"\u003e\n    \u003cimg src=\"./smart-tmux-sessions-with-sesh.jpeg\" alt=\"Smart tmux sessions with sesh\"\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\nWatch the video to learn more about how to use sesh to manage your tmux sessions.\n\n## How to install\n\n\u003cdetails\u003e\n  \u003csummary\u003eHomebrew\u003c/summary\u003e\n\nTo install sesh, run the following [homebrew](https://brew.sh/) command:\n\n```sh\nbrew install sesh\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eArch Linux AUR\u003c/summary\u003e\n\nTo install sesh, run the following [yay](https://aur.archlinux.org/packages/yay) command:\n\n```sh\nyay -S sesh-bin\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eGo\u003c/summary\u003e\n\nAlternatively, you can install Sesh using Go's go install command:\n\n```sh\ngo install github.com/joshmedeski/sesh/v2@latest\n```\n\nThis will download and install the latest version of Sesh. Make sure that your Go environment is properly set up.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eConda\u003c/summary\u003e\n\nTo install sesh, run **one** of the following commands, depending on your setup:\n\n* Conda/(micro)mamba users\n```sh\n# Replace with mamba/micromamba if required\nconda -c conda-forge install sesh\n```\n\n* Pixi users\n```sh\npixi global install sesh\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eNix\u003c/summary\u003e\n\nSee the [nix package directory](https://search.nixos.org/packages?channel=unstable\u0026show=sesh\u0026from=0\u0026size=50\u0026sort=relevance\u0026type=packages\u0026query=sesh) for instructions on how to install sesh through the nix platform.\n\n\u003c/details\u003e\n\n**Note:** Do you want this on another package manager? [Create an issue](https://github.com/joshmedeski/sesh/issues/new) and let me know!\n\n## Shell Completion\n\nSesh supports shell completion (tab completion) for Bash, Zsh, Fish, and PowerShell. This helps you discover commands, flags, and arguments by pressing the Tab key.\n\n\u003cdetails\u003e\n  \u003csummary\u003eBash\u003c/summary\u003e\n\n```sh\n# Generate completion script\nsesh completion bash \u003e sesh-completion.bash\n\n# Install system-wide (recommended)\nsudo cp sesh-completion.bash /etc/bash_completion.d/\n\n# Or install user-only\nmkdir -p ~/.local/share/bash-completion/completions\ncp sesh-completion.bash ~/.local/share/bash-completion/completions/sesh\n\n# Reload your shell\nsource ~/.bashrc\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eZsh\u003c/summary\u003e\n\n```sh\n# Generate completion script\nsesh completion zsh \u003e _sesh\n\n# Install system-wide (recommended)\nsudo mkdir -p /usr/local/share/zsh/site-functions\nsudo cp _sesh /usr/local/share/zsh/site-functions/\n\n# Or install user-only\nmkdir -p ~/.zsh/completions\ncp _sesh ~/.zsh/completions/\necho 'fpath=(~/.zsh/completions $fpath)' \u003e\u003e ~/.zshrc\necho 'autoload -U compinit \u0026\u0026 compinit' \u003e\u003e ~/.zshrc\n\n# Reload your shell\nsource ~/.zshrc\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003eFish\u003c/summary\u003e\n\n```sh\n# Generate and install completion\nsesh completion fish \u003e ~/.config/fish/completions/sesh.fish\n\n# Reload fish configuration\nsource ~/.config/fish/config.fish\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n  \u003csummary\u003ePowerShell\u003c/summary\u003e\n\n```powershell\n# Generate completion script\nsesh completion powershell \u003e sesh.ps1\n\n# Create PowerShell profile directory if it doesn't exist\nmkdir -p (Split-Path $PROFILE)\n\n# Add to PowerShell profile\nAdd-Content $PROFILE \". /path/to/sesh.ps1\"\n\n# Reload PowerShell\n\u0026 $PROFILE\n```\n\n\u003c/details\u003e\n\nAfter setting up completion, you can press Tab while typing `sesh` to see available commands, flags, and arguments.\n\n## Extensions\n\n## Raycast Extension\n\nThe [sesh companion extension](https://www.raycast.com/joshmedeski/sesh) for [Raycast](https://www.raycast.com/) makes it easy to use sesh outside of the terminal.\n\nHere are limitations to keep in mind:\n\n- tmux has to be running before you can use the extension\n- The extension caches results for a few seconds, so it may not always be up to date\n\n\u003ca title=\"Install sesh Raycast Extension\" href=\"https://www.raycast.com/joshmedeski/sesh\"\u003e\u003cimg src=\"https://www.raycast.com/joshmedeski/sesh/install_button@2x.png?v=1.1\" height=\"64\" alt=\"\" style=\"height: 64px;\"\u003e\u003c/a\u003e\n\n## Ulauncher Extension\n\nFor Linux users using [Ulauncher](https://ulauncher.io/) there are two extensions to use sesh outside the terminal:\n- [Sesh Session Manager](https://ext.ulauncher.io/-/github-jacostag-sesh-ulauncher)\n- [SESHion Manager](https://ext.ulauncher.io/-/github-mrinfinidy-seshion-manager)\n\nHere are limitations to keep in mind for Sesh Session Manager:\n\n- tmux has to be running before you can use the extension\n\n\n## Walker launcher usage (Linux)\n\nCreate an action directly on $XDG_CONFIG_HOME/config.toml\n\n\n```\n[[plugins]]\nname = \"sesh\"\nprefix = \";s \"\nsrc_once = \"sesh list -d -c -t -T\"\ncmd = \"sesh connect --switch %RESULT%\"\nkeep_sort = false\nrecalculate_score = true\nshow_icon_when_single = true\nswitcher_only = true\n```\n\n### For the dmenu mode you can use:\n\n#### Fish shell:\nset ssession $(sesh l -t -T -d -H | walker -d -f -k -p \"Sesh sessions\"); sesh cn --switch $ssession\n\n#### Bash/Zsh:\nssession=$(sesh l -t -T -d -H | walker -d -f -k -p \"Sesh sessions\"); sesh cn --switch $ssession\n\n##### For dmenu launchers replace walker -dfk with dmenu or rofi)\n\n### How to use\n\n### tmux for sessions\n\n[tmux](https://github.com/tmux/tmux) is a powerful terminal multiplexer that allows you to create and manage multiple terminal sessions. Sesh is designed to make managing tmux sessions easier.\n\n### zoxide for directories\n\n[zoxide](https://github.com/ajeetdsouza/zoxide) is a blazing fast alternative to `cd` that tracks your most used directories. Sesh uses zoxide to manage your projects. You'll have to set up zoxide first, but once you do, you can use it to quickly jump to your most used directories.\n\n### Basic usage\n\nOnce tmux and zoxide are setup, `sesh list` will list all your tmux sessions and zoxide results, and `sesh connect {session}` will connect to a session (automatically creating it if it doesn't exist yet). It is best used by integrating it into your shell and tmux.\n\n#### fzf\n\nThe easiest way to integrate sesh into your workflow is to use [fzf](https://github.com/junegunn/fzf). You can use it to select a session to connect to:\n\n```sh\nsesh connect $(sesh list | fzf)\n```\n\n#### tmux + fzf\n\nIn order to integrate with tmux, you can add a binding to your tmux config (`tmux.conf`). For example, the following will bind `ctrl-a T` to open a fzf prompt as a tmux popup (using `fzf-tmux`) and using different commands to list active sessions (`sesh list -t`), configured sessions (`sesh list -c`), zoxide directories (`sesh list -z`), and find directories (`fd...`).\n\n```sh\nbind-key \"T\" run-shell \"sesh connect \\\"$(\n  sesh list --icons | fzf-tmux -p 80%,70% \\\n    --no-sort --ansi --border-label ' sesh ' --prompt '⚡  ' \\\n    --header '  ^a all ^t tmux ^g configs ^x zoxide ^d tmux kill ^f find' \\\n    --bind 'tab:down,btab:up' \\\n    --bind 'ctrl-a:change-prompt(⚡  )+reload(sesh list --icons)' \\\n    --bind 'ctrl-t:change-prompt(🪟  )+reload(sesh list -t --icons)' \\\n    --bind 'ctrl-g:change-prompt(⚙️  )+reload(sesh list -c --icons)' \\\n    --bind 'ctrl-x:change-prompt(📁  )+reload(sesh list -z --icons)' \\\n    --bind 'ctrl-f:change-prompt(🔎  )+reload(fd -H -d 2 -t d -E .Trash . ~)' \\\n    --bind 'ctrl-d:execute(tmux kill-session -t {2..})+change-prompt(⚡  )+reload(sesh list --icons)' \\\n    --preview-window 'right:55%' \\\n    --preview 'sesh preview {}'\n)\\\"\"\n```\n\nYou can customize this however you want, see `man fzf` for more info on the different options.\n\n#### tmux + [television](https://github.com/alexpasmantier/television)\n\nIf you prefer to use television instead of fzf, you can add a binding to your tmux config that opens the [sesh channel](https://alexpasmantier.github.io/television/docs/Users/community-channels-unix#sesh) in a tmux popup.\n\n```sh\nbind-key \"T\" display-popup -E -w 80% -h 70% -d '#{pane_current_path}' -T 'Sesh' tv sesh\n```\n\nUse `Ctrl-s` to cycle through the sources, and `Ctrl-d` to kill the highlighted session.\n\n## gum + tmux\n\nIf you prefer to use [charmbracelet's gum](https://github.com/charmbracelet/gum) then you can use the following command to connect to a session:\n\n```sh\nbind-key \"K\" display-popup -E -w 40% \"sesh connect \\\"$(\n sesh list -i | gum filter --limit 1 --no-sort --fuzzy --placeholder 'Pick a sesh' --height 50 --prompt='⚡'\n)\\\"\"\n```\n\n**Note:** There are less features available with gum compared to fzf, but I found its matching algorithm is faster and it has a more modern feel.\n\n\u003e [!WARNING]\n\u003e As of [gum v0.15.0](https://github.com/charmbracelet/gum/releases/tag/v0.15.0) you have to add the `--no-strip-ansi` in order to display the icons correctly.\n\nSee my video, [Top 4 Fuzzy CLIs](https://www.youtube.com/watch?v=T0O2qrOhauY) for more inspiration for tooling that can be integrated with sesh.\n\n#### sesh picker\n\nSesh has a built-in picker that can be used as a tmux popup:\n\n```sh\nbind-key \"K\" display-popup -h 90% -w 50% -E \"sesh picker -i\"\n```\n\n## zsh keybind\n\nIf you use zsh, you can add the following keybind to your `.zshrc` to connect to a session:\n\n```sh\nfunction sesh-sessions() {\n  {\n    exec \u003c/dev/tty\n    exec \u003c\u00261\n    local session\n    session=$(sesh list -t -c | fzf --height 40% --reverse --border-label ' sesh ' --border --prompt '⚡  ')\n    zle reset-prompt \u003e /dev/null 2\u003e\u00261 || true\n    [[ -z \"$session\" ]] \u0026\u0026 return\n    sesh connect $session\n  }\n}\n\nzle     -N             sesh-sessions\nbindkey -M emacs '\\es' sesh-sessions\nbindkey -M vicmd '\\es' sesh-sessions\nbindkey -M viins '\\es' sesh-sessions\n```\n\nAfter adding this to your `.zshrc`, you can press `Alt-s` to open a fzf prompt to connect to a session.\n\n## Recommended tmux Settings\n\nI recommend you add these settings to your `tmux.conf` to have a better experience with this plugin.\n\n```sh\nbind-key x kill-pane # skip \"kill-pane 1? (y/n)\" prompt\nset -g detach-on-destroy off  # don't exit from tmux when closing a session\n```\n\n## Bonus\n\n### Last\n\nThe default `\u003cprefix\u003e+L` command will \"Switch the attached client back to the last session.\" However, if you close a session while `detach-on-destroy off` is set, the last session will not be found. To fix this, I have a `sesh last` command that will always switch the client to the second to last session that has been attached.\n\nAdd the following to your `tmux.conf` to overwrite the default `last-session` command:\n\n```sh\nbind -N \"last-session (via sesh) \" L run-shell \"sesh last\"\n```\n\n### Connect to root\n\nWhile working in a nested session, you may way to connect to the root session of a git worktree or git repository. To do this, you can use the `--root` flag with the `sesh connect` command.\n\nI recommend adding this to your `tmux.conf`:\n\n```sh\nbind -N \"switch to root session (via sesh) \" 9 run-shell \"sesh connect --root $(pwd)\"\n```\n\n### Filter by root\n\nIf you want to filter your search by the root of the active project, you can modify your piker by using the `sesh root` command:\n\n```sh\nbind-key \"R\" display-popup -E -w 40% \"sesh connect \\\"$(\n  sesh list -i -H | gum filter --value \\\"$(sesh root)\\\" --limit 1 --fuzzy --no-sort --placeholder 'Pick a sesh' --prompt='⚡'readme\n)\\\"\"\n```\n\nI have this bound to `\u003cprefix\u003e+R` so I can use an alternative binding.\n\n**Note:** This will only work if you are in a git worktree or git repository. For now, git worktrees expect a `.bare` folder.\n\n## Configuration\n\nYou can configure sesh by creating a `sesh.toml` file in your `$XDG_CONFIG_HOME/sesh` or `$HOME/.config/sesh` directory.\n\n```sh\nmkdir -p ~/.config/sesh \u0026\u0026 touch ~/.config/sesh/sesh.toml\n```\n\n### Custom Config Path\n\nYou can specify a custom config file path using the `--config` (or `-C`) flag. This is useful for NixOS wrappers, maintaining separate work/private configurations, or testing.\n\n```sh\nsesh -C /path/to/custom/sesh.toml list\nsesh --config /path/to/custom/sesh.toml connect my-session\n```\n\nThe flag works with any subcommand. When specified, the file must exist or sesh will return an error. Without the flag, sesh uses the default config path.\n\n### Schema (Editor Autocomplete)\n\nSesh provides a [JSON Schema](https://json-schema.org/) for `sesh.toml` that enables autocomplete, validation, and documentation in your editor. This works with any editor that supports the [taplo](https://taplo.tamasfe.dev/) TOML language server.\n\n#### Quick Setup\n\nAdd this line to the top of your `sesh.toml`:\n\n```toml\n#:schema https://github.com/joshmedeski/sesh/raw/main/sesh.schema.json\n```\n\nThat's it! Taplo will read the directive and apply the schema automatically.\n\n#### Neovim\n\nMake sure you have taplo installed:\n\n```sh\nbrew install taplo\n```\n\nIf you're using [nvim-lspconfig](https://github.com/neovim/nvim-lspconfig), taplo should work out of the box with the `#:schema` directive above. Alternatively, you can configure the schema association directly:\n\n```lua\nrequire(\"lspconfig\").taplo.setup({\n  settings = {\n    taplo = {\n      schema = {\n        associations = {\n          [\".*sesh\\\\.toml$\"] = \"https://github.com/joshmedeski/sesh/raw/main/sesh.schema.json\",\n        },\n      },\n    },\n  },\n})\n```\n\n### Blacklist\n\nYou may want to blacklist certain tmux sessions from showing up in the results. For example, you may want to exclude your `scratch` directory from the results.\n\n```sh\nblacklist = [\"scratch\"]\n```\n\n### Directory Length\n\nControl how many directory components are used for session names. Default is 1 (only the directory basename).\n\n```toml\ndir_length = 2  # Uses last 2 directories: \"projects/sesh\" instead of just \"sesh\"\n```\n\n\u003e [!NOTE] \n\u003e Works great with [tmux-floax](https://github.com/omerxx/tmux-floax)\n\n### Sorting\n\nIf you'd like to change the order of the sessions shown, you can configure `sort_order` in your `sesh.toml` file\n\n```toml\nsort_order = [\n    \"tmuxinator\", # show first\n    \"config\",\n    \"tmux\",\n    \"zoxide\", # show last\n]\n```\n\nThe default order is `tmux`, `config`, `tmuxinator`, and then `zoxide`.\n\nYou can omit session types if you only care about the order of specific ones.\n\n```toml\nsort_order = [\n  \"config\", # resulting order: config, tmux, tmuxinator, zoxide\n]\n```\n### Cache\n\nSesh can cache session lists to speed up repeated calls. Caching is opt-in and disabled by default. When enabled, sesh stores results at `$XDG_CACHE_HOME/sesh/sessions.gob` (default `~/.cache/sesh/sessions.gob`) and uses a stale-while-revalidate strategy with a 5-second TTL:\n\n- **Cold start**: no cache exists, fetches live data and writes the cache\n- **Fresh hit** (within 5s): returns cached data instantly\n- **Stale hit** (after 5s): returns cached data instantly and refreshes the cache in the background\n\nThe cache is also refreshed automatically after `sesh connect`.\n\n```toml\ncache = true\n```\n\n### Default Session\n\nThe default session can be configured to run a command when connecting to a session. This is useful for running a dev server or starting a tmux plugin.\n\nAdditionally, you can define a preview command that runs when previewing the session's directory. This can be handy for displaying files with tools like [eza](https://github.com/eza-community/eza) or [lsd](https://github.com/lsd-rs/lsd).\n\nNote: The `{}` will be automatically replaced with the session's path.\n\n```toml\n[default_session]\nstartup_command = \"nvim -c ':Telescope find_files'\"\npreview_command = \"eza --all --git --icons --color=always {}\"\n```\n\nIf you want to disable the default start command on a specific session, you can set `disable_startup_command = true`.\n\n### Session Configuration\n\nA startup command is a command that is run when a session is created. It is useful for setting up your environment for a given project. For example, you may want to run `npm run dev` to automatically start a dev server.\n\n**Note:** If you use the `--command/-c` flag, then the startup script will not be run.\n\nI like to use a command that opens nvim on session startup.\n\nYou can also define a preview command to display the contents of a specific file using [bat](https://github.com/sharkdp/bat) or any another file previewer of your choice.\n\n```toml\n[[session]]\nname = \"Downloads 📥\"\npath = \"~/Downloads\"\nstartup_command = \"ls\"\n\n[[session]]\nname = \"tmux config\"\npath = \"~/c/dotfiles/.config/tmux\"\nstartup_command = \"nvim tmux.conf\"\npreview_command = \"bat --color=always ~/c/dotfiles/.config/tmux/tmux.conf\"\n```\n\n### Path substitution\nIf you want to use the path of the selected session in your startup or preview command, you can use the `{}` placeholder.  \nThis will be replaced with the session's path when the command is run.\n\nAn example of this in use is the following, where the `tmuxinator` default_project uses the path as key/value pair using [ERB syntax](https://github.com/tmuxinator/tmuxinator?tab=readme-ov-file#erb):\n```toml\n[default_session]\nstartup_command = \"tmuxinator start default_project path={}\"\npreview_command = \"eza --all --git --icons --color=always {}\"\n```\n\n### Multiple windows\n\nIf you want your session to have multiple windows you can define windows in your configuration. You can then use these window layouts in your sessions. These windows can be reused as many times as you want and you can add as many windows to each session as you want.\n\nNote: If you do not specify a path in the window, it will use the session's path.\n\n```toml\n[[session]]\nname = \"Downloads 📥\"\npath = \"~/Downloads\"\nstartup_command = \"ls\"\n\n[[session]]\nname = \"tmux config\"\npath = \"~/c/dotfiles/.config/tmux\"\nstartup_command = \"nvim tmux.conf\"\npreview_command = \"bat --color=always ~/c/dotfiles/.config/tmux/tmux.conf\"\nwindows = [ \"git\" ]\n\n[[window]]\nname = \"git\"\nstartup_script = \"git pull\"\n```\n\n### Wildcard Configuration\n\nWildcard configs let you define session settings that apply to any directory matching a glob pattern, instead of creating a `[[session]]` entry for each project. This is useful when you have a directory full of projects that should all use the same startup command.\n\n```toml\n[[wildcard]]\npattern = \"~/projects/*\"\nstartup_command = \"nvim\"\n\n[[wildcard]]\npattern = \"~/work/*\"\nstartup_command = \"make dev\"\npreview_command = \"ls -la\"\n```\n\nWhen you run `sesh connect ~/projects/myapp`, sesh matches the path against your wildcard patterns and automatically creates a session named from the directory (using git remote or folder name), runs the configured startup command, and adds the path to zoxide.\n\nAvailable fields:\n\n| Field | Description |\n|-------|-------------|\n| `pattern` | Glob pattern to match directories (e.g. `~/projects/*`) |\n| `startup_command` | Command to run on session creation (supports `{}` for path) |\n| `preview_command` | Command to run when previewing the session |\n| `disable_startup_command` | Set to `true` to suppress the startup command |\n\n**Note:** Patterns use Go's `filepath.Match` syntax which supports `*` (any sequence), `?` (single character), and `[...]` (character classes). Recursive matching with `**` is not supported -- `~/projects/*` matches `~/projects/foo` but not `~/projects/foo/bar`. Explicit `[[session]]` configs always take priority over wildcard matches. If multiple wildcards match, the first one in config order wins.\n\n### Listing Configurations\n\nSession configurations will load by default if no flags are provided (the return after tmux sessions and before zoxide results). If you want to explicitly list them, you can use the `-c` flag.\n\n```sh\nsesh list -c\n```\n\nSet the file as an executable and it will be run when you connect to the specified session.\n\n## Contributing\n\nWant to contribute? Check out our [Contributing Guide](CONTRIBUTING.md) to get started.\n\n## Background (the \"t\" script)\n\nSesh is the successor to my popular [t-smart-tmux-session-manager](https://github.com/joshmedeski/t-smart-tmux-session-manager) tmux plugin. After a year of development and over 250 stars, it's clear that people enjoy the idea of a smart session manager. However, I've always felt that the tmux plugin was a bit of a hack. It's a bash script that runs in the background and parses the output of tmux commands. It works, but it's not ideal and isn't flexible enough to support other terminal multiplexers.\n\nI've decided to start over and build a session manager from the ground up. This time, I'm using a language that's more suited for the task: Go. Go is a compiled language that's fast, statically typed, and has a great standard library. It's perfect for a project like this. I've also decided to make this session manager multiplexer agnostic. It will be able to work with any terminal multiplexer, including tmux, zellij, Wezterm, and more.\n\nThe first step is to build a CLI that can interact with tmux and be a drop-in replacement for my previous tmux plugin. Once that's complete, I'll extend it to support other terminal multiplexers.\n\n## Contributors\n\n\u003ca href=\"https://github.com/joshmedeski/sesh/graphs/contributors\"\u003e\n  \u003cimg src=\"https://contrib.rocks/image?repo=joshmedeski/sesh\" /\u003e\n\u003c/a\u003e\n\nMade with [contrib.rocks](https://contrib.rocks).\n\n## Star History\n\n[![Star History Chart](https://api.star-history.com/svg?repos=joshmedeski/sesh\u0026type=Date)](https://www.star-history.com/#joshmedeski/sesh\u0026Date)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshmedeski%2Fsesh","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoshmedeski%2Fsesh","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoshmedeski%2Fsesh/lists"}