A high-performance shell prompt written in Rust, optimized for speed and clarity.
Demo • Features • Installation • Documentation • Contributing
About
Paneship is a blazingly-fast, modern shell prompt that displays essential workspace information with minimal overhead. Powered by a persistent background daemon and asynchronous metadata updates, it renders in ~2.5ms on average—delivering snappy shell interactions without sacrificing functionality.
Built for developers who work with large Git repositories, tmux environments, and value both speed and clarity.
✨ Features
- Ultra-fast rendering (~2.5ms average) via daemon-driven architecture
- Async background worker for Git status and language version detection
- Broad shell support – Bash, Zsh, Fish, PowerShell, Nushell, Elvish, Xonsh, and more
- Tmux-aware – Automatic pane width detection and responsive truncation
- Rich Git integration – Branch name, file counts, and smart cache invalidation
- Language detection – Automatic version info for Rust, Node.js, Python, Go, and more
- Command timing – Last command duration in human-readable format
- Fully customizable – Simple TOML configuration for colors, icons, and layout
- Lightweight & efficient – Written in Rust with minimal resource footprint
Demo
Quick Start
Installation
Install from crates.io:
Or build from source:
Setup
Initialize Paneship for your shell:
# Automatic setup (recommended)
# Example for Zsh
For manual setup, add one of the following to your shell config:
Zsh (~/.zshrc)
Bash (~/.bashrc)
Fish (~/.config/fish/config.fish)
paneship init fish | source
PowerShell ($PROFILE)
Invoke-Expression (&paneship init powershell)
Nushell (config.nu)
mkdir ~/.cache/paneship
paneship init nushell | save --force ~/.cache/paneship/init.nu
source ~/.cache/paneship/init.nu
For other shells (Elvish, Xonsh, Tcsh, Ion, Cmd), use paneship init <shell>.
Configuration
Paneship reads configuration from ~/.config/paneship/config.toml. If no file exists, sensible defaults apply.
Example Config
[]
= "📁"
= 3
= true
[]
= ""
= "+"
= "~"
= "?"
[]
= "❯"
= "❯"
[]
= "2;37"
= "1;32"
[]
= "🦀"
= "1;33"
[]
= "⬢"
= "1;32"
Configuration Options
| Section | Option | Default | Description |
|---|---|---|---|
directory |
icon |
"" |
Symbol before directory path |
truncation_length |
3 |
Path components to display | |
truncate_to_repo |
true |
Show only repo name inside repos | |
git |
branch_icon |
"" |
Symbol before branch name |
staged_icon |
"+" |
Symbol for staged changes | |
unstaged_icon |
"~" |
Symbol for unstaged changes | |
untracked_icon |
"?" |
Symbol for untracked files | |
status |
success_icon |
"❯" |
Cursor for successful exit |
failure_icon |
"❯" |
Cursor for failed exit | |
metadata |
time_color |
"2;37" |
ANSI color code for time |
paneship_color |
"1;32" |
ANSI color code for metadata |
Prompt Layout
~/.../paneship main ~2 · 📦 v1.0.0 🦀 1.95.0 11ms 20:56
❯
Line 1 - Left (Context):
- Directory (project-aware path truncation)
- Git branch and status icons
- Package version
Line 1 - Right (Metadata):
- Detected language and version
- Last command duration
- Current time
Line 2:
- Cursor character (customizable)
Architecture
Daemon-Driven Design
Paneship uses a client-daemon architecture for optimal performance:
- Thin Client – Sends context (CWD, exit code, width) via Unix socket
- Persistent Daemon – Maintains cache and renders prompts
- Background Worker – Handles heavy operations asynchronously
- Smart Invalidation – Updates cache based on Git HEAD and exit codes
This design ensures the shell never blocks, and cached data is always available.
Performance
| Prompt | Avg Render Time |
|---|---|
| Paneship (Daemon) | ~2.5ms |
| Paneship (Cold Start) | ~35ms |
| Starship | ~20ms |
| Oh My Zsh | ~150ms+ |
Benchmarks on 2021 MacBook Pro; results vary by system and repository size.
Commands
Rendering
Initialization
Daemon Management
Benchmarking
Development
Prerequisites
- Rust 1.70+
- Cargo
Building
# Build debug version
# Build release version
Testing
# Run all tests
# Run tests with output
Code Quality
# Run clippy linter
# Format code
# Check formatting
Benchmarking
Documentation
- CONTRIBUTING.md – Contribution guidelines
- Example Config – Configuration reference
- Crates.io – Package info
- Docs.rs – API documentation
Troubleshooting
Prompt not updating
Check daemon status:
Start daemon manually:
&
High CPU usage
- Verify Git repository health:
git fsck - Check language detection speed:
paneship render --cwd <path> - Increase cache TTL in config for large monorepos
Incorrect directory display
Adjust truncate_to_repo in config:
true– Shows only repository name and relative pathfalse– Shows full home-relative path
Roadmap
- Nix shell integration
- User-defined prompt modules via plugins
- System package manager integration
- VSCode integrated terminal support
- Performance profiling mode
- Right-side prompt support (Zsh, Fish)
Contributing
Contributions are welcome! Please read CONTRIBUTING.md for:
- How to report bugs
- How to propose features
- Guidelines for pull requests
- Code style and standards
License
This project is licensed under the MIT License – see LICENSE file for details.
Acknowledgments
Built with:
- Gitoxide (gix) – Fast Git operations
- unicode-width – Unicode width handling
- toml – Configuration parsing
- bincode – Serialization
Support
- 📝 GitHub Discussions
- 🐛 GitHub Issues
- 📖 Check documentation and examples
Made with ❤️ by the Paneship community