toes/docs/WEBHOOKS.md

2.5 KiB

Rev Webhooks for Toes

Deploy Toes apps by saving to rev.host — no manual deploy step, no rsync scripts.

How It Works

rev save "fix combat"  →  rev.host  →  relay (sneaker.toes.space)  →  toes.local pulls + deploys

toes.local can't receive inbound connections (home NAT), so it maintains an outbound connection to a relay — same tunnel infrastructure used by toes share.

Setup Flow

  1. In the Toes dashboard (or toes CLI via SSH), enable rev webhooks for an app
  2. Toes connects to the relay and gets a stable webhook URL
  3. Add that URL in rev.host project settings as a webhook endpoint
  4. Done — rev save and rev merge now trigger deploys

What Toes Does on Webhook

  1. Receives event from relay (repo, ref, timestamp)
  2. Pulls latest from rev.host (needs a rev auth token stored in Toes env)
  3. Runs scripts.predeploy if defined in package.json (type-check, build, etc.)
  4. Runs bun install
  5. Restarts the app

CLI

# Enable/disable rev webhooks
toes webhook enable [name]    # Shows the relay URL to paste into rev.host
toes webhook disable [name]

# Manual trigger (pull latest and deploy now)
toes deploy [name]

# Check webhook status
toes webhook status [name]

Settings UI

App settings page gets a "Rev Webhooks" section:

  • Toggle to enable/disable
  • Displays the relay URL (copy button)
  • Field for rev.host auth token
  • Last deploy timestamp + status
  • "Deploy Now" button (manual trigger)

Auth

Toes needs read access to pull from rev.host. Store a rev API token per-app (or globally):

toes env set -g REV_TOKEN rt_abc123
# or per-app
toes env set my-app REV_TOKEN rt_abc123

Predeploy Scripts

Project-specific build steps go in package.json:

{
  "scripts": {
    "toes": "bun run --watch index.tsx",
    "predeploy": "bunx tsc --noEmit && bun build client/main.tsx --outdir dist --minify"
  }
}

Toes runs predeploy after pulling but before restarting. If it exits non-zero, the deploy is aborted and the previous version stays running.

Open Questions

  • Should the relay URL be per-app or per-Toes-instance? (Per-instance with app routing via path seems simpler: https://sneaker.toes.space/hooks/<instance-id>/<app-name>)
  • Webhook secret/signature verification — rev.host should sign payloads so the relay can't be spoofed
  • Should toes deploy work without webhooks enabled? (Just pull from rev.host on demand — useful as a migration path from deploy.sh)
  • Rollback: toes rollback [name] to revert to previous rev version?