AlphornBeta
Open source · Self-hostable

Notifications, where they belong.

One endpoint, every channel. Alphorn routes any webhook to Slack, Discord, email, push, and 20+ channels in total, with smart filters and automatic retries.

Data stored in the EUBuilt in Austria

How it works

Three steps, zero complexity

From incoming webhook to delivered notification in milliseconds.

1

Receive

POST webhooks to a public endpoint. JSON, plain text, or Slack-compatible payloads, with presets for GitHub, Grafana, Sentry, and more.

2

Filter

Apply rules by priority, tags, title, message content, or JSON payload paths.

3

Deliver

Route to any channel with automatic retries and failure notifications.

Integrations

Route to any channel

From Slack to PagerDuty, deliver notifications wherever your team already works. One webhook in, every channel out.

Developer experience

Integrate in minutes

Send a notification with a single HTTP request. No SDK required.

curl -X POST https://app.alphorn.dev/n/V1StGXR8_Z5jdHi6B-myT \
  -H "Authorization: Bearer $ALPHORN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Deploy complete",
    "message": "v2.1.0 is live on production",
    "priority": 3,
    "tags": ["deploy", "production"]
  }'

See it in action

Built for how you actually work

One webhook endpoint, every workflow. Pick your role to see a real setup.

One deploy event, every team informed

Announce every deploy with one curl from your pipeline. Alphorn fans it out to the engineering Slack and your community Discord, and a tag filter keeps non-production deploys out of the public channel.

deploy.completed
GitHub Actions
deploy.completed
Alphorn
Slack · #engineering
Deployed v2.1.0 to production
a1b2c3d… · by @alex
Discord · #changelogtags has any of production
Deployed v2.1.0 to production
a1b2c3d… · by @alex

Features

Everything you need

Built for developers who want reliable notification routing without the complexity.

Filtering Rules

Route messages by priority, tags, title, message, or JSON payload paths. Combine conditions with AND/OR logic.

Automatic Retries

Failed deliveries get up to 5 attempts with exponential backoff. Get notified when a delivery permanently fails.

Real-time Streaming

Stream notifications via Server-Sent Events. Build live dashboards and real-time integrations.

Source Presets & Templates

Point GitHub, Grafana, Alertmanager, Sentry, or Stripe straight at Alphorn. Templates map any JSON payload to title, message, tags, and priority, no glue code.

Throttling & Loop Protection

Per-channel rate limits keep you under Slack, Discord, and Telegram limits without using up retries. Signed trace headers stop webhook loops.

Projects & Teams

Isolate teams in projects. Role-based access control with owner, admin, and read-only member roles.

SSO & Two-Factor Auth

Sign in with GitHub, Google, or Microsoft, or any OIDC provider (Keycloak, Okta, Entra) when self-hosting. TOTP 2FA with project-wide enforcement, and an invite-only mode for private instances.

MCP Server for AI Agents

Give Claude Code, Cursor, or Codex a send_notification tool. Get pinged when an agent finishes, fails, or needs your input.

Open Source

Self-host on your own infrastructure. No vendor lock-in. Fully open source and auditable.

Self-hosting

Own your infrastructure

Deploy Alphorn on your own infrastructure. Just PostgreSQL, no exotic dependencies, no vendor lock-in.

PostgreSQL only

No MongoDB, no Redis: one database to manage

Scale horizontally

Run several web and worker instances; a standalone SSE server handles live streams

Run anywhere

Docker image or straight from source with Node.js 22.12+

Bring your own SSO

Keycloak, Okta, Entra, or any OIDC provider, plus invite-only sign-up

docker-compose.yml
services:
  alphorn:
    image: ghcr.io/alphorn-dev/alphorn:latest
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://alphorn:secret@db:5432/alphorn
      BETTER_AUTH_SECRET: your-secret-key
      BETTER_AUTH_URL: http://localhost:3000
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:3000/api/health || exit 1"]
      interval: 30s
      timeout: 5s
      retries: 3
      start_period: 60s
    restart: unless-stopped

  db:
    image: postgres:18-alpine
    environment:
      POSTGRES_USER: alphorn
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: alphorn
    volumes:
      - pgdata:/var/lib/postgresql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U alphorn"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

volumes:
  pgdata:

Pricing

Simple, transparent pricing

Start free. Scale as you grow. Self-host for free, forever.

Free

For side projects and testing

€0
  • 3,000 messages/month
  • 3 webhooks
  • 3 channels
  • 7-day retention
  • Community support
Most Popular

Pro

For growing teams and startups

€25/mo
  • 25,000 messages/month
  • 15 webhooks
  • Unlimited channels
  • 30-day retention
  • +10K messages for €5

Business

For scaling infrastructure

€79/mo
  • 500,000 messages/month
  • Unlimited webhooks
  • Unlimited channels
  • 90-day retention
  • +10K messages for €5

Or self-host Alphorn on your own infrastructure, free forever.

Prices exclude VAT, which is added at checkout where applicable.

Enterprise

Custom pricing

For large organizations with custom needs. Dedicated support with SLA, custom retention and volume, self-hosting assistance.

Contact us

FAQ

Frequently asked questions

Everything you need to know before getting started.

Is Alphorn free?

Yes. The hosted Free plan includes 3,000 messages/month, 3 webhooks, 3 channels, and 7-day retention. Alphorn is also fully open source: you can self-host it on your own infrastructure for free, forever.

Can I self-host Alphorn?

Yes. Alphorn is designed to be self-hostable. It runs as a Docker container and only needs PostgreSQL (no Redis, no MongoDB, no external queue). Deploy it with Docker Compose or run it from source with Node.js 22.12+.

Which channels are supported?

Slack, Discord, Microsoft Teams, Telegram, Email (SMTP), PagerDuty, Pushover, ntfy, generic webhooks, and more. See the full list on the channels page.

How does routing work?

You send a webhook to Alphorn with a title and message. Priority, tags, and payload are optional. Routing rules decide which channels receive the message based on tags, priority, or content. Retries and real-time streaming are built in.

How is this different from Novu, Knock, or ntfy?

Alphorn is self-hostable and focused on routing webhook events to messaging channels, not on building an in-app notification inbox. It has a simpler data model than Novu/Knock and more channels and filtering than ntfy. See the comparison pages for details.

Do you offer an enterprise plan?

The Enterprise plan covers custom message volume, custom retention, a dedicated SLA, and self-hosting assistance. Get in touch and we'll set something up.

Where is my data stored?

In the cloud version, data is stored in the EU. If you self-host, the data never leaves your infrastructure. See the Privacy Policy and DPA for details.

Still have questions? Get in touch.

Ready to route your notifications?

Get started in minutes. No credit card required.