A beautiful terminal multiplexer for running multiple processes. Built with Go, powered by tcell.
- π₯οΈ Full Terminal Emulation - Each process gets a real PTY with ANSI support
- β¨οΈ Interactive Mode - Press Enter to focus and interact with any process
- π¨ Beautiful UI - Color-coded processes with smart grouping
- π Smart Status - Distinguishes crashes from clean exits
- π Zero Config - Works out of the box with sensible defaults
- β‘ Keyboard First - Vim-style navigation (j/k) and shortcuts
- π YAML Config - Simple, readable configuration
- π Dynamic Reordering - Running processes at top, stopped at bottom
- π― Scroll Support - Mouse wheel and keyboard scrolling
# Install
go install github.com/dgocoder/muxy@latest
# Run (uses muxy.yml by default)
muxy
# Or specify a config file
muxy config.yml
# Or build from source
git clone https://github.com/dgocoder/muxy
cd muxy
go build -o muxy main.go
./muxy examples/fullstack.ymlCreate a muxy.yml:
title: myproject # Optional: appears in sidebar (defaults to "MUXY")
splash: banner.txt # Optional: custom ASCII art
processes:
- name: api
command: npm run dev
directory: ./backend
color: green
environment:
PORT: "3000"
- name: web
command: npm start
directory: ./frontend
color: blue
environment:
PORT: "3001"Then run:
muxy # Uses muxy.yml by default| Key | Action |
|---|---|
Tab / j |
Next process |
Shift+Tab / k |
Previous process |
Enter |
Focus into process (interactive mode) |
x |
Kill selected process |
q / Ctrl+C |
Quit (terminates all) |
u / d |
Scroll up/down |
| Key | Action |
|---|---|
Ctrl+Z |
Exit focus, return to navigation |
| All other keys | Sent directly to the process |
muxy intelligently groups and displays process status:
Running Processes
β api (green - running)
β web (blue - running)
ββββββββββββββββββββββββ
Stopped Processes
β― mobile (dimmed - not started)
β worker (dimmed - clean exit)
β database (red - crashed)
β(colored) - Runningβ―(dimmed) - Not started (autostart: false)β(dimmed) - Clean exit (code 0) or manual killβ(red) - Crashed (non-zero exit code)
title: myproject # Sidebar header (optional, default: "MUXY")
splash: splash.txt # Custom ASCII art file (optional)processes:
- name: api # Required: Display name
command: npm run dev # Required: Command to run
directory: ./app # Optional: Working directory
color: green # Optional: green|blue|red|yellow|magenta|cyan|white|gray
autostart: true # Optional: Start automatically (default: true)
environment: # Optional: Environment variables (values support ${VAR} substitution)
PORT: "${PORT:-3000}" # With default value
NODE_ENV: devCheck out examples/fullstack.yml for a complete example:
title: fullstack
processes:
- name: postgres
command: docker run --rm -p 5432:5432 postgres:15-alpine
color: blue
- name: api
command: npm run dev
directory: ./server
color: green
environment:
DATABASE_URL: postgresql://localhost:5432/myapp
PORT: "4000"
- name: web
command: npm start
directory: ./client
color: cyan
environment:
REACT_APP_API_URL: http://localhost:4000
PORT: "3000"muxy supports dynamic environment variable substitution using ${VAR_NAME} syntax. This works in:
- Process commands
- Directory paths
- Environment variable values
- Any string field in the config
processes:
- name: api
command: npm run dev
directory: ${WORK_DIR:-./backend}
environment:
PORT: "${API_PORT:-4000}"
DATABASE_URL: "postgresql://${DB_HOST:-localhost}:${DB_PORT:-5432}/${DB_NAME:-myapp}"
NODE_ENV: "${NODE_ENV:-development}"Default values: Use ${VAR:-default} syntax to provide fallback values when the environment variable is not set.
See examples/env-vars.yml for a complete example.
Set autostart: false for processes you want to start manually:
processes:
- name: mobile
command: npm run ios
autostart: false # Press Enter to start when readyCreate a text file with ASCII art:
__ __ _ _ __ ____ __
| \/ || | | |\ \/ /\ \ / /
| |\/| || | | | \ / \ V /
| | | || |_| | / \ | |
|_| |_| \___/ /_/\_\ |_|
Reference it in your config:
splash: ./my-banner.txtvs tmux/screen
- β Simpler: YAML config vs complex key bindings
- β Modern: Built-in colors, status indicators
- β Process-centric: Manages apps, not shells
vs Overmind/Foreman
- β Interactive mode: Focus into processes
- β Better UX: Grouped status, scroll support
- β Single binary: No Ruby/dependencies
vs Concurrently
- β Full terminal: Not just log aggregation
- β Interactive: Can send input to processes
- β Visual: Sidebar navigation and status
muxy uses:
- tcell - Terminal UI framework
- tcell-term - Terminal emulator (from SST)
- PTY - Each process gets a real pseudo-terminal
This means every process gets full terminal emulation:
- β Colors and ANSI codes
- β Interactive prompts
- β Cursor control
- β Terminal resizing
Process won't start
- Verify the command works in a regular shell
- Check the
directorypath exists - Confirm environment variables are correct
Can't exit
- If focused: Press
Ctrl+Zto unfocus first - Then press
qorCtrl+Cto quit
Garbled output
- Try resizing your terminal window
- Some TUI apps may conflict - use
autostart: falseand run separately
git clone https://github.com/dgocoder/muxy
cd muxy
go mod download
go build -o muxy main.go# Run tests
go test ./...
# Build for multiple platforms
GOOS=linux GOARCH=amd64 go build -o muxy-linux-amd64
GOOS=darwin GOARCH=arm64 go build -o muxy-darwin-arm64
GOOS=windows GOARCH=amd64 go build -o muxy-windows-amd64.exeMIT License - see LICENSE for details
Inspired by:
- SST's mosaic mode - Terminal emulation
- Overmind - Process management UX
- tmux - Terminal multiplexing
Built with β€οΈ using Go and tcell.
β Star us on GitHub if you find muxy useful!
