Ship
Tell Claude to ship it.
Deploy apps and websites to your own server. Automatic HTTPS. No daemon. Just SSH, systemd, and Caddy doing their jobs.
How it works
Ship is a set of Claude skills. Tell Claude what to deploy. Claude handles it. Server is source of truth — Claude checks the server directly, always current.
Skills
| Skill | What it does |
|---|---|
/ship-setup |
One-time VPS setup. Installs Caddy, saves host config |
/ship-status |
What's running, what port, how much disk. Asks server directly |
/ship-deploy |
Deploy something. Claude asks what it needs to know |
/ship-binary |
Upload binary, wire up systemd + Caddy, back up SQLite first |
/ship-static |
Rsync dist folder, Caddy serves it |
/ship-env |
Read/write env vars. Never wipes what's already there |
/ship-caddy |
Manage per-app Caddy config. Validates before reloading |
/ship-service |
Start, stop, restart, logs |
Install
cp -r skills/ship-* ~/.claude/skills/
Quick start
1. Set up VPS
/ship-setup
Claude asks for SSH host, domain, nickname. Done. Or skip Claude entirely:
bash ~/.claude/skills/ship-setup/setup.sh ubuntu@1.2.3.4 example.com prod --default
2. Deploy
/ship-deploy
Claude asks a few questions. Deploys. You go touch grass.
3. Check what's running
/ship-status
Config
~/.config/ship/config.json — lives on your machine, created by /ship-setup.
{
"default": "prod",
"hosts": {
"prod": {
"host": "ubuntu@1.2.3.4",
"domain": "example.com"
},
"staging": {
"host": "ubuntu@5.6.7.8",
"domain": "staging.example.com"
}
}
}
Multiple hosts supported. "Deploy to staging" just works.
Server layout
/usr/local/bin/<name> # binary
/var/lib/<name>/data/ # persistent data (SQLite lives here)
/var/lib/<name>/backups/ # SQLite backups before each deploy
/var/www/<name>/ # static site files
/etc/systemd/system/<name>.service # systemd unit
/etc/caddy/sites-enabled/<name>.caddy # Caddy config
/etc/ship/env/<name>.env # env vars
/etc/ship/ports/<name> # allocated port
Requirements
- Ubuntu 20.04+ or Debian 11+
- SSH access
- Claude Code
License
MIT
