aboutsummaryrefslogtreecommitdiffstats

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