Webhooks that run commands.
Receive. Validate. Execute.
curl -X POST https://your-server/hook/deploy \
-H "Authorization: Bearer $TOKEN" \
-d '{"repo": "myapp", "branch": "main"}'cd /app && git pull origin { branch }
docker compose up -d
echo "deployed { repo } on { branch }"Bearer tokens, HMAC-SHA256 signature verification, or open access. Secrets can reference environment variables. Constant-time comparison prevents timing attacks.
Define a JSON schema per hook. Sendword validates every incoming request and rejects malformed payloads before your command ever runs.
Filter by payload fields (equals, regex, contains), restrict to time windows, enforce cooldowns, and apply rate limits — all before execution begins.
Run shell commands with payload interpolation, execute managed scripts, or forward to HTTP endpoints. Each hook picks one, with per-hook timeout and working directory.
Automatic retries on failure with none, linear, or exponential backoff strategies. Configurable per hook or globally, with max delay caps.
Mutex or queue-based concurrency control prevents resource exhaustion. Optional approval workflows let you gate production deployments behind a human review.
Mask environment variable values and regex patterns in execution logs. Sensitive data never appears in the web UI or log files.
Snapshot your database and config to S3-compatible storage on a cron schedule. Restore with a single command. Retention policies keep storage tidy.
[[hooks]]
name = "Deploy"
slug = "deploy"
[hooks.executor]
type = "shell"
command = "bash deploy.sh { branch }"
[hooks.auth]
mode = "bearer"
token = "${DEPLOY_TOKEN}"[hooks.trigger_rules]
cooldown = "5m"
[[hooks.trigger_rules.payload_filters]]
field = "branch"
operator = "regex"
value = "^(main|release/.*)"
[hooks.concurrency]
mode = "queue"
queue_depth = 5$ sendword serve
listening on 127.0.0.1:8080
# hooks available:
# POST /hook/deploy
# POST /hook/notify
# POST /hook/sync
# dashboard at /Everything lives in sendword.toml. Export as JSON, import it on another machine, version-control the whole thing.
[server]
bind = "0.0.0.0"
port = 8080
[defaults.timeout]
timeout = "30s"
[defaults.retries]
count = 3
backoff = "exponential"
initial_delay = "2s"
max_delay = "60s"
[masking]
env_vars = ["API_KEY", "DB_PASSWORD"]
patterns = ["(token)[=:]\\s*\\S+"]
[backup]
bucket = "my-backups"
schedule = "0 2 * * *"
retention.max_count = 30cargo install sendword