vadymkykalo/railhook

Open-source webhook gateway: send webhooks to your customers and receive them from any provider, with every delivery on record. Self-host in one command, or use Railhook Cloud.

Java

2

1,551 commits

updated Sep 22, 2026

See the code

See what people are saying

SourceMessageScoreDate

I got tired of not knowing whether the customer actually got the webhook, so I built a self-hosted gateway (MIT) (r/selfhosted)

Hey folks, I've been working on Railhook in my spare time and wanted to share it here. And yes, up front: I built it with Claude, so go easy on the tomatoes 😅 I set up a harness with project rules and checks, reviewed the code, and worked through the architecture and implementation myself. I'm…

0

Sep 24, 2026

README

Railhook

Self-hosted, open-source webhook gateway — send webhooks to your customers and receive them from any provider, with every delivery on record.

Latest release CI License: MIT GHCR

Railhook on SaaSHub

Website · Docs · API reference · Railhook Cloud · Changelog

Deliveries: every webhook sent, to which endpoint, and how each attempt went One delivery's attempts: two 503s, then a retry that got a 200 Incoming webhooks from Stripe and GitHub, each signature verified before forwarding

Install

curl -fsSL https://railhook.io/install.sh | bash

On a server with a domain pointed at it, get HTTPS in the same step:

curl -fsSL https://railhook.io/install.sh | bash -s -- --domain hooks.example.com --email ops@example.com

Already running a reverse proxy? Add --behind-proxy instead of --email. Then point the proxy at 127.0.0.1:8080.

Open http://localhost and register — the first account is active immediately.

  • Checks the machine first: Docker with Compose v2, about 4 GiB of RAM, 5 GiB of disk, a free port.
  • Writes a Compose file pinned to the latest release and a .env with freshly generated secrets.
  • Starts everything behind one port. Day two is ./railhook status | logs | upgrade | backup | doctor.

Rather not run it yourself? Railhook Cloud at https://railhook.io is free right now (10,000 events a month, 3 projects, 7 days of history). Paid plans with support and higher limits will come later.

What it does

Outgoing — your app announces an event; Railhook gets it to every endpoint that subscribed.

  • An accepted event is never lost: it is recorded in the same transaction as your write.
  • Customers verify every request — Standard Webhooks headers, with secret rotation.
  • Failures retry on a schedule that runs for more than a day, then land in Failed Messages for bulk retry.
  • Deliveries to one endpoint can arrive in the order the events happened.
  • Time Machine replays a past range as fresh deliveries.
  • Every attempt is on record with the response it got.

Incoming — a provider posts to a URL you own; Railhook checks it and forwards it on.

  • Stripe, GitHub, GitLab, Shopify, Slack, Twilio, Square, Adyen, SendGrid and HubSpot are verified out of the box; generic HMAC covers the rest.
  • Each incoming event is kept as it arrived; a provider's repeat of the same event is not forwarded twice.
  • Forwards reach your destinations with their own retries and Failed Messages.

Everything in the box

DeliveryRetry ladder · per-endpoint ordering · rate limits · shared circuit breaker
Customer portalEmbed a portal where your own customers register endpoints, pick event types, and see and retry their deliveries — in your brand colours
RecoveryFailed Messages with bulk retry · Time Machine replay
SigningHMAC-SHA256 in Standard Webhooks and legacy headers · secret rotation
ShapingRules · JSONPath transformations · schema registry · workflows · wildcard subscriptions
DevelopingCLI tunnel to localhost · test endpoints · transformation preview · delivery dry-run · free webhook tester
AI agentsMCP server at /mcp — Claude, Cursor or any MCP client can send events, manage endpoints and replay deliveries
SecurityTenant isolation · AES-256-GCM secrets at rest · SSRF protection · mTLS · PII masking · audit log
AccessOrganizations and projects · Owner / Developer / Viewer roles · API keys
OperatingPrometheus metrics · Grafana dashboards · 22 alert rules · data retention · GDPR export · Helm chart

Architecture

Outgoing   your app ──▶ api ──▶ outbox (same txn) ──▶ Kafka ──▶ worker ──▶ endpoint
                                                        ▲                     │
                                                        └─── retry ladder ◀───┘
                                                        1m 5m 15m 1h 6h 24h → DLQ

Incoming   provider ──▶ /ingress/{token} ──▶ verify signature ──▶ Kafka ──▶ worker ──▶ destination

docs/ARCHITECTURE.md covers the attempt lifecycle, Claims, ordering, tenancy and the failure modes; CONTEXT.md is the vocabulary it uses.

SDKs

LanguageInstallSource
Node.jsnpm i @railhook/nodesdks/node
Pythonpip install railhooksdks/python
PHPcomposer require railhook/phpsdks/php

Each sends events, manages endpoints and verifies signatures, authenticating with X-API-Key. See SDKs.

CLI

curl -fsSL https://railhook.io/install-cli.sh | bash

Receive webhooks on localhost while you develop — railhook login, then railhook listen 3000. railhook events <projectId> --follow tails events; railhook replay <projectId> --dry-run previews a replay. Install and usage: CLI docs.

AI agents (MCP)

Railhook serves the Model Context Protocol at /mcp, authenticated with a project API key:

claude mcp add --transport http railhook https://railhook.io/mcp \
  --header "Authorization: Bearer $RAILHOOK_API_KEY"

Clients that only speak stdio run npx -y @railhook/mcp. Setup for Cursor and Claude Desktop: MCP docs.

Documentation

For contributors and operators: Architecture · Operations · Upgrading · Roadmap · all repository docs.

Contributing

Bug reports, docs fixes and features are welcome. CONTRIBUTING.md covers setup, the branch to target (develop) and the checks CI runs. Report vulnerabilities privately per SECURITY.md.

License

MIT © Vadym Kykalo. Self-hosted gets every feature — no licence key, no paid tier. Third-party attributions: NOTICE, docs/licenses/.

developer-tools
docker
event-driven
event-gateway
incoming-webhooks
java
kafka
mcp
open-source
outgoing-webhooks
postgresql
self-hosted
spring-boot
standard-webhooks
stripe
webhook-delivery
webhook-gateway
webhooks
webhooks-as-a-service
webhook-testing

Contributors

vadymkykalo

1,533 commits

dependabot[bot]

18 commits

vadymkykalo/railhook

Open-source webhook gateway: send webhooks to your customers and receive them from any provider, with every delivery on record. Self-host in one command, or use Railhook Cloud.

Java

2

1,551 commits

updated Sep 22, 2026

See the code

See what people are saying

SourceMessageScoreDate

I got tired of not knowing whether the customer actually got the webhook, so I built a self-hosted gateway (MIT) (r/selfhosted)

Hey folks, I've been working on Railhook in my spare time and wanted to share it here. And yes, up front: I built it with Claude, so go easy on the tomatoes 😅 I set up a harness with project rules and checks, reviewed the code, and worked through the architecture and implementation myself. I'm…

0

Sep 24, 2026

README

Railhook

Self-hosted, open-source webhook gateway — send webhooks to your customers and receive them from any provider, with every delivery on record.

Latest release CI License: MIT GHCR

Railhook on SaaSHub

Website · Docs · API reference · Railhook Cloud · Changelog

Deliveries: every webhook sent, to which endpoint, and how each attempt went One delivery's attempts: two 503s, then a retry that got a 200 Incoming webhooks from Stripe and GitHub, each signature verified before forwarding

Install

curl -fsSL https://railhook.io/install.sh | bash

On a server with a domain pointed at it, get HTTPS in the same step:

curl -fsSL https://railhook.io/install.sh | bash -s -- --domain hooks.example.com --email ops@example.com

Already running a reverse proxy? Add --behind-proxy instead of --email. Then point the proxy at 127.0.0.1:8080.

Open http://localhost and register — the first account is active immediately.

  • Checks the machine first: Docker with Compose v2, about 4 GiB of RAM, 5 GiB of disk, a free port.
  • Writes a Compose file pinned to the latest release and a .env with freshly generated secrets.
  • Starts everything behind one port. Day two is ./railhook status | logs | upgrade | backup | doctor.

Rather not run it yourself? Railhook Cloud at https://railhook.io is free right now (10,000 events a month, 3 projects, 7 days of history). Paid plans with support and higher limits will come later.

What it does

Outgoing — your app announces an event; Railhook gets it to every endpoint that subscribed.

  • An accepted event is never lost: it is recorded in the same transaction as your write.
  • Customers verify every request — Standard Webhooks headers, with secret rotation.
  • Failures retry on a schedule that runs for more than a day, then land in Failed Messages for bulk retry.
  • Deliveries to one endpoint can arrive in the order the events happened.
  • Time Machine replays a past range as fresh deliveries.
  • Every attempt is on record with the response it got.

Incoming — a provider posts to a URL you own; Railhook checks it and forwards it on.

  • Stripe, GitHub, GitLab, Shopify, Slack, Twilio, Square, Adyen, SendGrid and HubSpot are verified out of the box; generic HMAC covers the rest.
  • Each incoming event is kept as it arrived; a provider's repeat of the same event is not forwarded twice.
  • Forwards reach your destinations with their own retries and Failed Messages.

Everything in the box

DeliveryRetry ladder · per-endpoint ordering · rate limits · shared circuit breaker
Customer portalEmbed a portal where your own customers register endpoints, pick event types, and see and retry their deliveries — in your brand colours
RecoveryFailed Messages with bulk retry · Time Machine replay
SigningHMAC-SHA256 in Standard Webhooks and legacy headers · secret rotation
ShapingRules · JSONPath transformations · schema registry · workflows · wildcard subscriptions
DevelopingCLI tunnel to localhost · test endpoints · transformation preview · delivery dry-run · free webhook tester
AI agentsMCP server at /mcp — Claude, Cursor or any MCP client can send events, manage endpoints and replay deliveries
SecurityTenant isolation · AES-256-GCM secrets at rest · SSRF protection · mTLS · PII masking · audit log
AccessOrganizations and projects · Owner / Developer / Viewer roles · API keys
OperatingPrometheus metrics · Grafana dashboards · 22 alert rules · data retention · GDPR export · Helm chart

Architecture

Outgoing   your app ──▶ api ──▶ outbox (same txn) ──▶ Kafka ──▶ worker ──▶ endpoint
                                                        ▲                     │
                                                        └─── retry ladder ◀───┘
                                                        1m 5m 15m 1h 6h 24h → DLQ

Incoming   provider ──▶ /ingress/{token} ──▶ verify signature ──▶ Kafka ──▶ worker ──▶ destination

docs/ARCHITECTURE.md covers the attempt lifecycle, Claims, ordering, tenancy and the failure modes; CONTEXT.md is the vocabulary it uses.

SDKs

LanguageInstallSource
Node.jsnpm i @railhook/nodesdks/node
Pythonpip install railhooksdks/python
PHPcomposer require railhook/phpsdks/php

Each sends events, manages endpoints and verifies signatures, authenticating with X-API-Key. See SDKs.

CLI

curl -fsSL https://railhook.io/install-cli.sh | bash

Receive webhooks on localhost while you develop — railhook login, then railhook listen 3000. railhook events <projectId> --follow tails events; railhook replay <projectId> --dry-run previews a replay. Install and usage: CLI docs.

AI agents (MCP)

Railhook serves the Model Context Protocol at /mcp, authenticated with a project API key:

claude mcp add --transport http railhook https://railhook.io/mcp \
  --header "Authorization: Bearer $RAILHOOK_API_KEY"

Clients that only speak stdio run npx -y @railhook/mcp. Setup for Cursor and Claude Desktop: MCP docs.

Documentation

For contributors and operators: Architecture · Operations · Upgrading · Roadmap · all repository docs.

Contributing

Bug reports, docs fixes and features are welcome. CONTRIBUTING.md covers setup, the branch to target (develop) and the checks CI runs. Report vulnerabilities privately per SECURITY.md.

License

MIT © Vadym Kykalo. Self-hosted gets every feature — no licence key, no paid tier. Third-party attributions: NOTICE, docs/licenses/.

developer-tools
docker
event-driven
event-gateway
incoming-webhooks
java
kafka
mcp
open-source
outgoing-webhooks
postgresql
self-hosted
spring-boot
standard-webhooks
stripe
webhook-delivery
webhook-gateway
webhooks
webhooks-as-a-service
webhook-testing

Contributors

vadymkykalo

1,533 commits

dependabot[bot]

18 commits

Languages

Java

56.4%

TypeScript

29.2%

MDX

8.4%

Shell

1.3%

Python

1.3%

JavaScript

1.3%