1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
# Ship
Deploy Go binaries and static sites to a VPS with automatic HTTPS. No agent on the server — just SSH, systemd, and Caddy.
## How it works
Ship is a set of Claude skills. Instead of a rigid CLI that bakes in assumptions, Claude reasons about what to do using a family of narrow, composable skills. The server is the source of truth — no local state file that can go stale.
## Skills
| Skill | What it does |
|-------|-------------|
| `/ship-setup` | One-time VPS config. Installs Caddy, creates directories, saves host to `~/.config/ship/config.json` |
| `/ship-status` | Show all running apps, ports, domains, and disk usage — derived live from server |
| `/ship-deploy` | Deploy a binary or static site — orchestrates the skills below |
| `/ship-binary` | Upload a pre-built binary, configure systemd + Caddy, back up SQLite |
| `/ship-static` | Rsync a dist folder, configure Caddy to serve it |
| `/ship-env` | Read/write env vars with merge semantics — never wipes existing vars |
| `/ship-caddy` | Manage per-app Caddyfile — validates before reloading |
| `/ship-service` | systemd control: start, stop, restart, logs |
## Install
Copy the `skills/` directory into `~/.claude/skills/`:
```bash
cp -r skills/ship-* ~/.claude/skills/
```
## Quick start
### 1. Set up your VPS
```
/ship-setup
```
Claude asks for SSH host, domain, and nickname. Saves to `~/.config/ship/config.json`. Installs Caddy on the server.
Or run the script directly:
```bash
bash ~/.claude/skills/ship-setup/setup.sh ubuntu@1.2.3.4 example.com prod --default
```
### 2. Deploy
```
/ship-deploy
```
Claude asks what you're deploying (binary or static site), where it is, what to call it, and any env vars. Handles the rest.
### 3. Check status
```
/ship-status
```
Shows all running apps, ports, URLs, and disk usage — no local state file, reads directly from server.
## Config
`~/.config/ship/config.json` — created by `/ship-setup`. Supports multiple hosts:
```json
{
"default": "prod",
"hosts": {
"prod": {
"host": "ubuntu@1.2.3.4",
"domain": "example.com"
},
"staging": {
"host": "ubuntu@5.6.7.8",
"domain": "staging.example.com"
}
}
}
```
Deploy to a specific host: "deploy foodtracker to staging"
## Server layout
```
/usr/local/bin/<name> # binary
/var/lib/<name>/ # work directory
/var/lib/<name>/data/ # persistent data (SQLite lives here)
/var/lib/<name>/backups/ # SQLite backups (made before each binary swap)
/var/www/<name>/ # static site files
/etc/systemd/system/<name>.service # systemd unit
/etc/caddy/sites-enabled/<name>.caddy # per-app Caddy config
/etc/ship/env/<name>.env # environment variables
/etc/ship/ports/<name> # allocated port number
```
## Requirements
- VPS running Ubuntu 20.04+ or Debian 11+
- SSH access
- Claude Code with skills support
## License
MIT
|