Ship on hook. One webhook, one command. Receive a POST → git pull → run your deploy script. Configure the deployment via YAML or env vars. No SaaS, no containers. Just Node and your repo.
Built for indie devs, micro-SaaS, and open-source projects that want simple, self-hosted deploys.
npm install -g shiphookcd /path/to/your/repo
shiphookBy default Shiphook listens on port 3141. Send a POST to trigger a deploy:
curl -X POST http://localhost:3141/It runs git pull in the repo, then your script (default: npm run deploy). Response is JSON with pull and run output.
- No vendor lock-in — Your server, your script, your Git. No third-party deploy service.
- YAML or env — Put
shiphook.yamlin your repo (or set env vars). Env overrides file. Run and point your Git webhook at it. - Fits your stack — Use
npm run deploy,pnpm build,./deploy.sh, or anything else. - Secret-based auth — Set
SHIPHOOK_SECRET; send it asX-Shiphook-SecretorAuthorization: Bearer <secret>so only your Git provider can trigger deploys.
Add a shiphook.yaml in your repo (see shiphook.example.yaml) or set env vars. Env overrides the file.
| Option | Default | Description |
|---|---|---|
port / SHIPHOOK_PORT |
3141 |
Server port. |
repoPath / SHIPHOOK_REPO_PATH |
current dir | Repo path for git pull and script. |
runScript / SHIPHOOK_RUN_SCRIPT |
npm run deploy |
Command run after pull. |
secret / SHIPHOOK_SECRET |
— | If set, request must send this (header or Bearer). |
path / SHIPHOOK_PATH |
/ |
Webhook path (e.g. /deploy). |
- Repo → Settings → Webhooks → Add webhook.
- Payload URL:
https://your-server:3141/(or your path). - Secret: (optional) Same as
SHIPHOOK_SECRET. - Events: Push events.
- Save. Every push triggers a deploy.
Full docs (install, config, webhooks, programmatic API): Documentation
import { createShiphookServer, loadConfig } from "shiphook";
const config = loadConfig();
const server = createShiphookServer(config);
await server.start();MIT.