SENDWORD
DocsGitHub
SENDWORD · OPEN SOURCE · SINGLE BINARY

Stop writing webhook servers.

Sendword receives webhooks, validates payloads, and runs commands. Authentication, filtering, retries, and a dashboard — built in, not bolted on.

Read the DocsGitHub$cargo install sendword
SETUP
ONE TOML FILE
AUTH
BUILT IN
RETRIES
AUTOMATIC
HISTORY
WEB DASHBOARD
— 01 / FEATURES

What you stop building yourself.

Authentication, validation, concurrency control, and execution history — already done.

— 01

Auth, not afterthought

Bearer tokens, HMAC-SHA256, or open access. Secrets reference env vars. Constant-time comparison prevents timing attacks.

— 02

Reject before execute

JSON schema per hook. Malformed payloads are rejected before your command runs.

— 03

Control what fires

Filter by payload fields, restrict to time windows, enforce cooldowns, apply rate limits — all before execution.

— 04

Shell, script, or HTTP

Run commands with payload interpolation, execute managed scripts, or forward to endpoints. Per-hook timeouts and working directories.

— 05

Retries that back off

None, linear, or exponential. Configurable per hook or globally, with max delay caps.

— 06

Concurrency without plumbing

Mutex or queue-based execution prevents conflicts. Approval workflows gate deployments behind human review.

— 07

Secrets stay out of logs

Mask env var values and regex patterns in output. Sensitive data never reaches the dashboard or log files.

— 08

Snapshot, restore, done

Back up database and config to S3-compatible storage on a schedule. Restore with one command. Retention handles cleanup.

— 02 / HOW IT WORKS

Configure. Guard. Run.

Define a hook in TOML, add rules and guards, start the server.

— 01

Define a hook

Name, slug, command, and auth. One TOML block.

— 02

Add guards

Payload filters, cooldowns, rate limits, concurrency barriers.

— 03

Start the server

Hooks are live as POST endpoints. The dashboard shows every execution.

— 03 / CONFIG

One file. Full control.

Everything lives in sendword.toml. Export as JSON, import on another machine, version-control the whole thing.

# sendword.toml
[[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/.*)"