Local-first remote development CLI for VPS workflows.
devup creates an ephemeral Mutagen sync, opens SSH port forwards, optionally runs a remote command, and cleans everything up on exit/CTRL+C.
- Ephemeral Mutagen sync session with configurable sync mode (default:
one-way-safe) - Waits for initial sync to complete before opening the SSH shell
- Repeatable
-p/--portmappings (3000or3000:3001) - Optional SSH identity file via
-i/--identity - Optional local path override via
-l/--local - Optional remote command via
--cmd - Auto-reconnect on disconnect via
--reconnect - Remote target directory auto-create (
mkdir -p) - Interactive shell starts in the target remote directory
- Automatic cleanup of Mutagen session on exit or interruption
- Reads
.gitignoreand.mutagenignorefor sync exclusions - Startup dependency checks for
sshandmutagen
- Go 1.25+
- Mutagen
- OpenSSH client
Install Mutagen:
brew install mutagen-io/mutagen/mutagenor:
sudo apt install mutagen openssh-clientmake buildsudo make installBy default this installs to /usr/local/bin/devup.
To use a different prefix:
sudo make install PREFIX=/opt/devupsudo make uninstallUse the tap release guide in docs/homebrew-tap.md. Formula template is in Formula/devup.rb.
Install via Homebrew tap:
brew tap mutagen-io/mutagen
brew tap chnthkksn/devup
brew install devupUninstall:
brew uninstall devup
brew untap chnthkksn/devupdevup [user@]host:/remote/path [flags]
Flags:
-p, --port <mapping>Port forward (repeatable)-l, --local <path>Local folder to sync (default: current directory)-i, --identity <file>SSH identity file (private key)--cmd <command>Command to run on remote after connect--sync-mode <mode>Mutagen sync mode (default:one-way-safe)--reconnectAuto-reconnect SSH on disconnect--versionPrint version and exit
Sync modes: two-way-safe, two-way-resolved, one-way-safe, one-way-replica
Examples:
# Same local/remote port
devup ubuntu@host:/apps/api -p 3000
# Different local:remote port
devup ubuntu@host:/apps/api -p 3000:3001
# Multiple ports
devup ubuntu@host:/apps/api -p 3000 -p 5173:5173 -p 27017
# Local path override
devup ubuntu@host:/apps/api -l ~/projects/api -p 3000
# Custom SSH identity file
devup ubuntu@host:/apps/api -i ~/.ssh/my_key
# Run remote command and auto-reconnect on crash
devup ubuntu@host:/apps/api -p 3000 --cmd "npm run dev" --reconnect
# Two-way sync (changes on remote sync back to local)
devup ubuntu@host:/apps/api --sync-mode two-way-safeRun tests:
make testAutomate tagging and GitHub release creation:
scripts/release.sh v0.2.0The script validates dependencies, checks for a clean git tree, runs tests, pushes the tag, and creates a GitHub release with autogenerated notes.
MIT. See LICENSE.
