{"id":33926687,"url":"https://github.com/marlocarlo/psmux","last_synced_at":"2026-02-17T15:00:39.430Z","repository":{"id":326907295,"uuid":"1107175402","full_name":"marlocarlo/psmux","owner":"marlocarlo","description":"Tmux on Windows Powershell - tmux alternative for PowerShell, Windows Terminal, cmd.exe. Includes psmux, pmux, and tmux commands. This is your Tmux on Windows","archived":false,"fork":false,"pushed_at":"2026-02-16T19:26:10.000Z","size":2347,"stargazers_count":165,"open_issues_count":3,"forks_count":12,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-02-17T01:30:07.647Z","etag":null,"topics":["cli","powershell","psmux","rust","terminal","terminal-multiplexer","tmux","tmux-alternative","tmux-on-windows","tmux-powershell","tmux-win","tmux-windows","win-tmux","windows","windows-terminal","windows-tmux"],"latest_commit_sha":null,"homepage":"https://psmux.pages.dev/","language":"Rust","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/marlocarlo.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-30T18:09:19.000Z","updated_at":"2026-02-16T21:33:53.000Z","dependencies_parsed_at":null,"dependency_job_id":"70fedae7-74d4-47ea-8812-529c2a60bbd3","html_url":"https://github.com/marlocarlo/psmux","commit_stats":null,"previous_names":["marlocarlo/psmux"],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/marlocarlo/psmux","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlocarlo%2Fpsmux","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlocarlo%2Fpsmux/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlocarlo%2Fpsmux/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlocarlo%2Fpsmux/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/marlocarlo","download_url":"https://codeload.github.com/marlocarlo/psmux/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/marlocarlo%2Fpsmux/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29548201,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-17T14:33:00.708Z","status":"ssl_error","status_checked_at":"2026-02-17T14:32:58.657Z","response_time":100,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["cli","powershell","psmux","rust","terminal","terminal-multiplexer","tmux","tmux-alternative","tmux-on-windows","tmux-powershell","tmux-win","tmux-windows","win-tmux","windows","windows-terminal","windows-tmux"],"created_at":"2025-12-12T10:28:32.503Z","updated_at":"2026-02-17T15:00:39.418Z","avatar_url":"https://github.com/marlocarlo.png","language":"Rust","funding_links":[],"categories":["Table of Contents"],"sub_categories":[],"readme":"```\n╔═══════════════════════════════════════════════════════════╗\n║   ██████╗ ███████╗███╗   ███╗██╗   ██╗██╗  ██╗            ║\n║   ██╔══██╗██╔════╝████╗ ████║██║   ██║╚██╗██╔╝            ║\n║   ██████╔╝███████╗██╔████╔██║██║   ██║ ╚███╔╝             ║\n║   ██╔═══╝ ╚════██║██║╚██╔╝██║██║   ██║ ██╔██╗             ║\n║   ██║     ███████║██║ ╚═╝ ██║╚██████╔╝██╔╝ ██╗            ║\n║   ╚═╝     ╚══════╝╚═╝     ╚═╝ ╚═════╝ ╚═╝  ╚═╝            ║\n║          Terminal Multiplexer for Windows                 ║\n╚═══════════════════════════════════════════════════════════╝\n```\n\n# psmux\n\n**A terminal multiplexer for Windows** — the tmux alternative you've been waiting for.\n\npsmux brings tmux-style terminal multiplexing to Windows natively. No WSL, no Cygwin, no compromises. Built in Rust for Windows Terminal, PowerShell, and cmd.exe.\n\n\u003e 💡 **Tip:** psmux includes `tmux` and `pmux` aliases, so you can use your muscle memory!\n\n## Why psmux?\n\nIf you've used tmux on Linux/macOS and wished you had something similar on Windows — this is it.\n\n- **Windows-native** — Built specifically for Windows 10/11\n- **Works everywhere** — Windows Terminal, PowerShell, cmd.exe, ConEmu, etc.\n- **No dependencies** — Single binary, just works\n- **tmux-compatible** — Same commands, same keybindings, zero learning curve\n- **Aliases included** — Use `psmux`, `pmux`, or `tmux` command, your choice\n\n![psmux in action - monitoring system info](psmux_sysinfo.gif)\n\n## Features\n\n- Split panes horizontally and vertically\n- Multiple windows with tabs\n- Session management (attach/detach)\n- Mouse support for resizing panes and clicking tabs\n- Copy mode with vim-like keybindings\n- **Scrollback history** (configurable, default 2000 lines)\n- Synchronized input to multiple panes\n- **Automatic window rename** from foreground process (like tmux)\n- **Status bar** with full tmux format variable support\n- **Theming** — full style customization (fg, bg, bold, dim, italics, etc.)\n- **Hooks** — run commands on events (after-new-window, etc.)\n- **Monitor activity/silence** — flag windows with new output\n- **Layouts** — even-horizontal, even-vertical, main-horizontal, main-vertical, tiled\n- **Format engine** — 100+ tmux-compatible variables and modifiers\n- **Config file** — drop-in compatible with `.tmux.conf`\n\n![psmux windows and panes](psmux_windows.gif)\n\n## Requirements\n\n- Windows 10 or Windows 11\n- **PowerShell 7+** (recommended) or cmd.exe\n  - Download PowerShell: `winget install --id Microsoft.PowerShell`\n  - Or visit: https://aka.ms/powershell\n\n## Installation\n\n### Using Cargo (Recommended)\n\n```powershell\ncargo install psmux\n```\n\nThis installs `psmux`, `pmux`, and `tmux` binaries to your Cargo bin directory.\n\n### Using Scoop\n\n```powershell\nscoop install https://raw.githubusercontent.com/marlocarlo/psmux/master/scoop/psmux.json\n```\n\n### Using Chocolatey\n\n```powershell\nchoco install psmux\n```\n\n### From GitHub Releases\n\nDownload the latest `.zip` from [GitHub Releases](https://github.com/marlocarlo/psmux/releases) and add to your PATH.\n\n### From Source\n\n```powershell\ngit clone https://github.com/marlocarlo/psmux.git\ncd psmux\ncargo build --release\n```\n\nBuilt binaries:\n\n```text\ntarget\\release\\psmux.exe\ntarget\\release\\pmux.exe\ntarget\\release\\tmux.exe\n```\n\nOptional (install from local source into Cargo bin path):\n\n```powershell\ncargo install --path .\n```\n\n## Usage\n\nUse `psmux`, `pmux`, or `tmux` — they're identical:\n\n```powershell\n# Start a new session\npsmux\npmux\ntmux\n\n# Start a named session\npsmux new-session -s work\ntmux new-session -s work\n\n# List sessions\npsmux ls\ntmux ls\n\n# Attach to a session\npsmux attach -t work\ntmux attach -t work\n\n# Show help\npsmux --help\ntmux --help\n```\n\n## Key Bindings\n\nDefault prefix: `Ctrl+b` (same as tmux)\n\n| Key | Action |\n|-----|--------|\n| `Prefix + c` | Create new window |\n| `Prefix + %` | Split pane left/right |\n| `Prefix + \"` | Split pane top/bottom |\n| `Prefix + x` | Kill current pane |\n| `Prefix + \u0026` | Kill current window |\n| `Prefix + z` | Toggle pane zoom |\n| `Prefix + n` | Next window |\n| `Prefix + p` | Previous window |\n| `Prefix + 0-9` | Select window by number |\n| `Prefix + d` | Detach from session |\n| `Prefix + ,` | Rename current window |\n| `Prefix + t` | Show clock |\n| `Prefix + s` | Session chooser/switcher |\n| `Prefix + o` | Select next pane |\n| `Prefix + w` | Window/pane chooser |\n| `Prefix + [` | Enter copy/scroll mode |\n| `Prefix + {` | Swap pane up |\n| `Prefix + ]` | Paste from buffer |\n| `Prefix + q` | Display pane numbers |\n| `Prefix + Arrow` | Navigate between panes |\n| `Ctrl+q` | Quit |\n\n### Copy/Scroll Mode\n\nEnter copy mode with `Prefix + [` or `Prefix + {` to scroll through terminal history:\n\n| Key | Action |\n|-----|--------|\n| `↑` / `k` | Scroll up 1 line |\n| `↓` / `j` | Scroll down 1 line |\n| `PageUp` / `b` | Scroll up 10 lines |\n| `PageDown` / `f` | Scroll down 10 lines |\n| `g` | Jump to top of scrollback |\n| `G` | Jump to bottom |\n| `←` / `h` | Move cursor left |\n| `→` / `l` | Move cursor right |\n| `v` | Start selection |\n| `y` | Yank (copy) selection |\n| `Mouse drag + release` | Select text and copy to clipboard |\n| `Esc` / `q` | Exit copy mode |\n\nWhen in copy mode:\n- The pane border turns **yellow** \n- `[copy mode]` appears in the title\n- A scroll position indicator shows in the top-right corner\n- Mouse selection in copy mode is copied to the Windows clipboard on release\n\n## Scripting \u0026 Automation\n\npsmux supports tmux-compatible commands for scripting and automation:\n\n### Window \u0026 Pane Control\n\n```powershell\n# Create a new window\npsmux new-window\n\n# Split panes\npsmux split-window -v          # Split vertically (top/bottom)\npsmux split-window -h          # Split horizontally (side by side)\n\n# Navigate panes\npsmux select-pane -U           # Select pane above\npsmux select-pane -D           # Select pane below\npsmux select-pane -L           # Select pane to the left\npsmux select-pane -R           # Select pane to the right\n\n# Navigate windows\npsmux select-window -t 1       # Select window by index (default base-index is 1)\npsmux next-window              # Go to next window\npsmux previous-window          # Go to previous window\npsmux last-window              # Go to last active window\n\n# Kill panes and windows\npsmux kill-pane\npsmux kill-window\npsmux kill-session\n```\n\n### Sending Keys\n\n```powershell\n# Send text directly\npsmux send-keys \"ls -la\" Enter\n\n# Send keys literally (no parsing)\npsmux send-keys -l \"literal text\"\n\n# Special keys supported:\n# Enter, Tab, Escape, Space, Backspace\n# Up, Down, Left, Right, Home, End\n# PageUp, PageDown, Delete, Insert\n# F1-F12, C-a through C-z (Ctrl+key)\n```\n\n### Pane Information\n\n```powershell\n# List all panes in current window\npsmux list-panes\n\n# List all windows\npsmux list-windows\n\n# Capture pane content\npsmux capture-pane\n\n# Display formatted message with variables\npsmux display-message \"#S:#I:#W\"   # Session:Window Index:Window Name\n```\n\n### Paste Buffers\n\n```powershell\n# Set paste buffer content\npsmux set-buffer \"text to paste\"\n\n# Paste buffer to active pane\npsmux paste-buffer\n\n# List all buffers\npsmux list-buffers\n\n# Show buffer content\npsmux show-buffer\n\n# Delete buffer\npsmux delete-buffer\n```\n\n### Pane Layout\n\n```powershell\n# Resize panes\npsmux resize-pane -U 5         # Resize up by 5\npsmux resize-pane -D 5         # Resize down by 5\npsmux resize-pane -L 10        # Resize left by 10\npsmux resize-pane -R 10        # Resize right by 10\n\n# Swap panes\npsmux swap-pane -U             # Swap with pane above\npsmux swap-pane -D             # Swap with pane below\n\n# Rotate panes in window\npsmux rotate-window\n\n# Toggle pane zoom\npsmux zoom-pane\n```\n\n### Session Management\n\n```powershell\n# Check if session exists (exit code 0 = exists)\npsmux has-session -t mysession\n\n# Rename session\npsmux rename-session newname\n\n# Respawn pane (restart shell)\npsmux respawn-pane\n```\n\n### Format Variables\n\nThe `display-message` command supports these variables:\n\n| Variable | Description |\n|----------|-------------|\n| `#S` | Session name |\n| `#I` | Window index |\n| `#W` | Window name |\n| `#P` | Pane ID |\n| `#T` | Pane title |\n| `#H` | Hostname |\n\n### Advanced Commands\n\n```powershell\n# Discover supported commands\npsmux list-commands\n\n# Server/session management\npsmux kill-server\npsmux list-clients\npsmux switch-client -t other-session\n\n# Config at runtime\npsmux source-file ~/.psmux.conf\npsmux show-options\npsmux set-option -g status-left \"[#S]\"\n\n# Layout/history/stream control\npsmux next-layout\npsmux previous-layout\npsmux clear-history\npsmux pipe-pane -o \"cat \u003e pane.log\"\n\n# Hooks\npsmux set-hook -g after-new-window \"display-message created\"\npsmux show-hooks\n```\n\n### Target Syntax (`-t`)\n\npsmux supports tmux-style targets:\n\n```powershell\n# window by index in session\npsmux select-window -t work:2\n\n# specific pane by index\npsmux send-keys -t work:2.1 \"echo hi\" Enter\n\n# pane by pane id\npsmux send-keys -t %3 \"pwd\" Enter\n\n# window by window id\npsmux select-window -t @4\n```\n\n## Configuration\n\npsmux reads its config on startup from the **first file found** (in order):\n\n1. `~/.psmux.conf`\n2. `~/.psmuxrc`\n3. `~/.tmux.conf`\n4. `~/.config/psmux/psmux.conf`\n\nConfig syntax is **tmux-compatible** — most `.tmux.conf` lines work as-is.\n\n### Basic Config Example\n\nCreate `~/.psmux.conf`:\n\n```tmux\n# Change prefix key to Ctrl+a\nset -g prefix C-a\n\n# Enable mouse\nset -g mouse on\n\n# Window numbering base (default is 1)\nset -g base-index 1\n\n# Customize status bar\nset -g status-left \"[#S] \"\nset -g status-right \"%H:%M %d-%b-%y\"\nset -g status-style \"bg=green,fg=black\"\n\n# Cursor style: block, underline, or bar\nset -g cursor-style bar\nset -g cursor-blink on\n\n# Scrollback history\nset -g history-limit 5000\n\n# Prediction dimming (disable for apps like Neovim)\nset -g prediction-dimming off\n\n# Key bindings\nbind-key -T prefix h split-window -h\nbind-key -T prefix v split-window -v\n```\n\n### Choosing a Shell\n\npsmux launches **PowerShell 7 (pwsh)** by default. You can change this:\n\n```tmux\n# Use cmd.exe\nset -g default-shell cmd\n\n# Use PowerShell 5 (Windows built-in)\nset -g default-shell powershell\n\n# Use PowerShell 7 (explicit path)\nset -g default-shell \"C:/Program Files/PowerShell/7/pwsh.exe\"\n\n# Use Git Bash\nset -g default-shell \"C:/Program Files/Git/bin/bash.exe\"\n\n# Use Nushell\nset -g default-shell nu\n\n# Use Windows Subsystem for Linux (via wsl.exe)\nset -g default-shell wsl\n```\n\nYou can also launch a window with a specific command without changing the default:\n\n```powershell\npsmux new-window -- cmd /K echo hello\npsmux new-session -s py -- python\npsmux split-window -- \"C:/Program Files/Git/bin/bash.exe\"\n```\n\n### All Set Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `prefix` | Key | `C-b` | Prefix key |\n| `base-index` | Int | `1` | First window number |\n| `pane-base-index` | Int | `0` | First pane number |\n| `escape-time` | Int | `500` | Escape delay (ms) |\n| `repeat-time` | Int | `500` | Repeat key timeout (ms) |\n| `history-limit` | Int | `2000` | Scrollback lines per pane |\n| `display-time` | Int | `750` | Message display time (ms) |\n| `display-panes-time` | Int | `1000` | Pane overlay time (ms) |\n| `status-interval` | Int | `15` | Status refresh (seconds) |\n| `mouse` | Bool | `on` | Mouse support |\n| `status` | Bool | `on` | Show status bar |\n| `status-position` | Str | `bottom` | `top` or `bottom` |\n| `focus-events` | Bool | `off` | Pass focus events to apps |\n| `mode-keys` | Str | `emacs` | `vi` or `emacs` |\n| `renumber-windows` | Bool | `off` | Auto-renumber windows on close |\n| `automatic-rename` | Bool | `on` | Rename windows from foreground process |\n| `monitor-activity` | Bool | `off` | Flag windows with new output |\n| `monitor-silence` | Int | `0` | Seconds before silence flag (0=off) |\n| `synchronize-panes` | Bool | `off` | Send input to all panes |\n| `remain-on-exit` | Bool | `off` | Keep panes after process exits |\n| `aggressive-resize` | Bool | `off` | Resize to smallest client |\n| `set-titles` | Bool | `off` | Update terminal title |\n| `set-titles-string` | Str | | Terminal title format |\n| `default-shell` | Str | `pwsh` | Shell to launch |\n| `default-command` | Str | | Alias for default-shell |\n| `word-separators` | Str | `\" -_@\"` | Copy-mode word delimiters |\n| `prediction-dimming` | Bool | `on` | Dim predictive text |\n| `cursor-style` | Str | | `block`, `underline`, or `bar` |\n| `cursor-blink` | Bool | `off` | Cursor blinking |\n| `bell-action` | Str | `any` | `any`, `none`, `current`, `other` |\n| `visual-bell` | Bool | `off` | Visual bell indicator |\n| `status-left` | Str | `[#S] ` | Left status bar content |\n| `status-right` | Str | | Right status bar content |\n| `status-style` | Str | `bg=green,fg=black` | Status bar style |\n| `status-left-style` | Str | | Left status style |\n| `status-right-style` | Str | | Right status style |\n| `status-justify` | Str | `left` | Tab alignment: `left`, `centre`, `right` |\n| `message-style` | Str | `bg=yellow,fg=black` | Message style |\n| `message-command-style` | Str | `bg=black,fg=yellow` | Command prompt style |\n| `mode-style` | Str | `bg=yellow,fg=black` | Copy-mode highlight |\n| `pane-border-style` | Str | | Inactive border style |\n| `pane-active-border-style` | Str | `fg=green` | Active border style |\n| `window-status-format` | Str | `#I:#W#F` | Inactive tab format |\n| `window-status-current-format` | Str | `#I:#W#F` | Active tab format |\n| `window-status-separator` | Str | `\" \"` | Tab separator |\n| `window-status-style` | Str | | Inactive tab style |\n| `window-status-current-style` | Str | | Active tab style |\n| `window-status-activity-style` | Str | `reverse` | Activity tab style |\n| `window-status-bell-style` | Str | `reverse` | Bell tab style |\n| `window-status-last-style` | Str | | Last-active tab style |\n\nStyle format: `\"fg=colour,bg=colour,bold,dim,underscore,italics,reverse\"`\n\nColours: `default`, `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `cyan`, `white`, `colour0`–`colour255`, `#RRGGBB`\n\n### Environment Variables\n\n```powershell\n# Default session name used when not explicitly provided\n$env:PSMUX_DEFAULT_SESSION = \"work\"\n\n# Disable prediction dimming (useful for apps like Neovim)\n$env:PSMUX_DIM_PREDICTIONS = \"0\"\n\n# These are set INSIDE psmux panes (tmux-compatible):\n# TMUX       — socket path and server info\n# TMUX_PANE  — current pane ID (%0, %1, etc.)\n```\n\n### Neovim Rendering Workaround\n\nIf Neovim looks slow inside psmux or shows a \"shadow\" effect until you move the cursor, disable psmux prediction dimming in `~/.psmux.conf`:\n\n```tmux\nset -g prediction-dimming off\n```\n\nYou can also disable it for the current shell only:\n\n```powershell\n$env:PSMUX_DIM_PREDICTIONS = \"0\"\npsmux\n```\n\nTo make it persistent for new shells:\n\n```powershell\nsetx PSMUX_DIM_PREDICTIONS 0\n```\n\n## License\n\nMIT\n\n---\n\n## About psmux\n\n**psmux** (PowerShell Multiplexer) is a terminal multiplexer built specifically for Windows. It is an alternative to tmux for Windows users who want terminal multiplexing without WSL or Cygwin.\n\n### Keywords\n\nterminal multiplexer, tmux for windows, tmux alternative, tmux windows, windows terminal multiplexer, powershell multiplexer, split terminal windows, multiple terminals, terminal tabs, pane splitting, session management, windows terminal, powershell terminal, cmd terminal, rust terminal, console multiplexer, terminal emulator, windows console, cli tool, command line, devtools, developer tools, productivity, windows 10, windows 11, psmux, pmux\n\n### Related Projects\n\n- [tmux](https://github.com/tmux/tmux) — The original terminal multiplexer for Unix/Linux/macOS\n- [Windows Terminal](https://github.com/microsoft/terminal) — Microsoft's modern terminal for Windows\n- [PowerShell](https://github.com/PowerShell/PowerShell) — Cross-platform PowerShell\n\n### FAQ\n\n**Q: Is psmux cross-platform?**  \nA: No. psmux is built exclusively for Windows. For Linux/macOS, use tmux.\n\n**Q: Does psmux work with Windows Terminal?**  \nA: Yes! psmux works great with Windows Terminal, PowerShell, cmd.exe, ConEmu, and other Windows terminal emulators.\n\n**Q: Why use psmux instead of Windows Terminal tabs?**  \nA: psmux offers session persistence (detach/reattach), synchronized input to multiple panes, and tmux-compatible keybindings.\n\n**Q: Can I use tmux commands with psmux?**  \nA: Yes! psmux includes `tmux` and `pmux` aliases. Commands like `tmux new-session`, `tmux attach`, `tmux ls` all work.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarlocarlo%2Fpsmux","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarlocarlo%2Fpsmux","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarlocarlo%2Fpsmux/lists"}