Get Simple Relay running and test your first reliable HTTP delivery in under 60 seconds.
1. Run Simple Relay
Option A: Using Docker (Recommended)
Run the container in daemon mode, mounting a local folder for persistence:
docker run -d \
--name simple-relay \
-p 8080:8080 \
-v relay-data:/data \
-e RELAY_DB_PATH=/data/relay.db \
-e RELAY_ADMIN_PASSWORD=admin \
ghcr.io/simple-relay/simple-relay:latest
Option B: Standalone Binary
Download the compiled static binary from GitHub Releases or install via Go:
# Using Go 1.22+
go install github.com/simple-relay/simple-relay/cmd/relay@latest
# Run the relay
relay --port 8080 --db ./relay.db
Option C: Build from Source (Git Clone)
Clone the repository and compile the binary with standard Go:
git clone https://github.com/simple-relay/simple-relay.git
cd simple-relay
# Pure Go static build (no CGO required)
CGO_ENABLED=0 go build -o relay ./cmd/relay
# Run the compiled binary
./relay --port 8080 --db ./relay.db
Verify that the relay is healthy:
curl http://localhost:8080/healthz
# {"status":"ok","version":"1.0.0"}
2. Ingest an Inbound Webhook
Simple Relay provides dedicated route endpoints under /api/v1/webhook/:route. Send a test payload:
curl -i -X POST http://localhost:8080/api/v1/webhook/orders \
-H "Content-Type: application/json" \
-d '{"order_id": "ord_99812", "amount": 4200, "currency": "usd"}'
Response:
HTTP/1.1 200 OK
Content-Type: application/json
{"status":"queued","request_id":"01j9x0m1p00000000000000000"}
The raw bytes are durably persisted to storage before the 200 OK response was sent. The delivery dispatcher is now forwarding this payload to your destination endpoint in the background.
3. Test Outbound Proxy with Smart Retries
Route an outgoing request to an upstream service through Simple Relay’s synchronous retry proxy (mode: "sync").
Register an outbound route pointing to httpbin:
curl -X POST http://localhost:8080/api/v1/routes \
-H "Content-Type: application/json" \
-d '{
"name": "httpbin-test",
"type": "outbound",
"mode": "sync",
"path": "/api/v1/relay/httpbin",
"destination_url": "https://httpbin.org/status/200",
"max_attempts": 3,
"timeout_ms": 5000
}'
Now dispatch an outgoing call through the proxy:
curl -i "http://localhost:8080/api/v1/relay/httpbin"
If the upstream server returns a 502 Bad Gateway or 429 Too Many Requests, Simple Relay automatically catches the failure and retries using exponential backoff with full jitter (100ms base, 10s max default) until the request succeeds or max attempts are reached. Non-idempotent methods (POST, PATCH) are safeguarded against unintended duplicate side effects unless an Idempotency-Key is supplied or retry_non_idempotent: true is enabled on the route.
4. Open the Embedded Dashboard
Open your browser and navigate to:
http://localhost:8080/ui/
You can view:
- Inbound and outbound delivery logs.
- Attempt durations and latency graphs.
- Raw request and response payloads.
- Dead Letter Queue (DLQ) entries with one-click re-delivery.
What’s Next?
- Configure HMAC Signatures for Stripe or GitHub.
- Set up Local Webhook Inspection with Cloudflare Tunnel for crash-resilient restarts and one-click replay during local development.
- Understand the Retries and Dead Letter Queue mechanism.
- Inspect daemon health, queue backlog, and DLQ from your terminal using the CLI Reference.
- Check out the complete REST API Reference.