A macOS app for SSH tunnels — local port forwarding and SOCKS5 proxies with a native UI, without memorizing ssh -L / ssh -D.
| Dashboard | Tunnels |
|---|---|
![]() |
![]() |
| SSH configs | Settings |
|---|---|
![]() |
![]() |
Developers often tunnel databases, Redis, or HTTP services through SSH. Doing that from the terminal works, but remembering hosts, ports, keys, and reconnecting after drops gets tedious.
Marmot gives you a macOS-native app to:
- Save reusable SSH configs (key or password)
- Create local port forwarding and SOCKS5 tunnels in one click
- See status, logs, and the equivalent SSH command at a glance
- Auto-reconnect when a connection drops
- Port forwarding (
ssh -L) with service presets: MySQL, PostgreSQL, Redis, MongoDB, Memcached, HTTP, and more - SOCKS5 dynamic proxy (
ssh -D) - Reusable SSH profiles — one host config, many tunnels
- Local port auto-assign when left empty
- Dashboard for active tunnels and disconnect-all
- Equivalent SSH command on each tunnel (copy-ready)
- Keepalive, timeout, and auto-reconnect
- Light / Dark / System appearance
- English & 简体中文 (follow system or pick manually)
- Command palette (⌘K-style) for quick navigation
- Signed auto-updates from GitHub Releases
- macOS 13.0+
- Apple Silicon (
aarch64) or Intel (x86_64)
Download the latest DMG from Releases:
- Open
Marmot-*-*.dmgand drag Marmot into Applications - If macOS blocks the app (unsigned / first open), right-click → Open, or run:
xattr -cr /Applications/Marmot.app- Open SSH → create a config (host, user, key or password)
- Open Tunnels → New Tunnel → pick port forwarding or SOCKS5
- Connect — use the local address shown in the tunnel detail
- Rust 1.96.1+
- macOS with Xcode Command Line Tools
cargo run -p marmotcargo test --workspace
cargo fmt --all
cargo clippy --workspace --all-targets -- --deny warningsRequires cargo-packager 0.11.8.
./scripts/make-icon.sh # if icon.icns is missing
./scripts/package-macos.sh # writes to dist/Push a v* tag to trigger GitHub Actions release builds.
crates/
├── marmot/ # App binary & packaging assets
├── marmot-core/ # Domain models & state
├── marmot-storage/ # JSON persistence + encrypted secrets
├── marmot-tunnel/ # russh tunnel service
└── marmot-ui/ # GPUI UI, themes, i18n
On macOS, app data lives under:
~/Library/Application Support/marmot/
├── config.json # SSH configs, tunnels, settings
├── secrets.enc # Encrypted credentials (AES-256-GCM)
├── .master_key # Local master key
└── logs.json # Activity logs
| Layer | Choice |
|---|---|
| Language | Rust |
| UI | GPUI + gpui-component |
| SSH | russh |
| Async | Tokio |
| Packaging | cargo-packager (.app / .dmg) |
| Auto-update | cargo-packager-updater + GitHub Releases |
Issues and PRs are welcome. Please run fmt, clippy, and tests before submitting.



