Accept HTTP.
Store it. Show it.
One binary, zero dependencies. No Postgres, no Redis, no Docker Compose. scp it to a box, run it, done.
Everything you need. Nothing you don't.
Built with the TigerBeetle philosophy: deterministic resource usage, pre-allocated bounds, no surprise OOM.
One binary, zero deps
No Postgres, no Redis, no Docker Compose. scp it to a box, run it, done.
Embedded SQLite
WAL mode, crash-safe, deterministic resource bounds. Data lives in a single directory.
Live dashboard
Built-in SPA with live polling, syntax-highlighted JSON, and full request inspector.
134 tests
Every handler, every edge case, every error path. cargo test is the only gate.
Tiny footprint
Optimized release build with LTO, stripped symbols, and panic = abort.
Bounded resources
Pre-allocated limits on hooks, payloads, and requests. Nothing grows without limit.
Up and running in 60 seconds
cargo build --release# Build the optimized binary
./target/release/hookbin serve --port 8080# Start the server
curl -s http://localhost:8080/api/hooks -X POST | jq .# => { "id": "abc123xyz", "url": "/h/abc123xyz", ... }
curl -X POST http://localhost:8080/h/abc123xyz \
-H "Content-Type: application/json" \
-d '{"event": "deploy", "status": "success"}'# => 200 OK
open http://localhost:8080# View it in the dashboard
Clean, predictable endpoints
All endpoints return structured JSON with error suggestions.
| Method | Path | Description |
|---|---|---|
| POST | /h/{hook_id} | Ingest a webhook |
| GET | /api/hooks | List all hooks |
| POST | /api/hooks | Create a new hook |
| GET | /api/hooks/{id} | Get hook details |
| DELETE | /api/hooks/{id} | Delete a hook |
| GET | /api/hooks/{id}/requests | List captured requests |
| GET | /api/hooks/{id}/requests/{rid} | Get a single request |
| GET | /health | Health check |
| GET | / | Dashboard (embedded SPA) |
Structured error responses:
{
"error": "not found: hook abc123xyz",
"suggestion": "Check the hook ID and try again"
}Three-layer config
Defaults -> TOML file -> CLI flags. CLI always wins.
# hookbin.toml
port = 8080
data = "/var/lib/hookbin"
max_hooks = 50
max_payload = 2097152
max_requests = 500
retention = 43200 # 12 hours
rate_limit = 30 # requests per minute