Status:Built and tested, not released

Ramzes

Self-hosted notification router: one endpoint, routes decide who is told, where and how often.

License
AGPLv3
Built as
One Rust binary with its web UI inside
Stores in
SQLite or Postgres
The Ramzes overview: events received by severity over the last day, the share of deliveries that arrived, and the noisiest sources and topics.
The overview: what arrived, where it went and what needs attention.

The problem

Every service, monitor and pipeline sends its own alerts to its own channel. The same failure is repeated, a burst arrives as a flood, a message goes out in the middle of quiet hours, and when nobody acknowledges it, nothing else happens. Afterwards, nobody can say who was told what.

How it works

How Ramzes routes an event to the right people
  1. Sources: JSON API, Alertmanager, Grafana, GitHub, Sentry
  2. Routes: Topic, severity, labels or a payload expression
  3. Noise control: Dedup; Grouping; Quiet hours; Rate limit
  4. Channels: Slack, Teams, email, PagerDuty, webhooks

What it does

Routes
Match on topic, severity, source, labels or an expression over the payload. The route tester shows what every route would do with an event, including routes you have not saved.
Noise control
Per route: dedup, grouping, quiet hours in a time zone and a rate limit. Silences mute matching events on every route.
Escalation and acknowledgement
Tell someone else when nobody acknowledges in time. Acknowledge from the UI, the API, a link in the message or a button in Slack.
Sources and channels
A JSON API, plus webhooks for Alertmanager, Grafana, GitHub, GitLab and Sentry. Out to Slack, Teams, Discord, email, ntfy, Telegram, Pushover, PagerDuty, Opsgenie, a signed webhook, or your own connector in YAML.
Delivery you can trust
An event is acknowledged only after it is stored. Deliveries retry with backoff, a connection that keeps failing is paused, and failures can be sent again in bulk.
Configuration as data
Every change is kept with a diff and can be rolled back; export and import move a configuration between instances.

Try it

git clone https://github.com/softberries/ramzes.git && cd ramzes
docker compose -f deploy/compose.yaml up --build

One endpoint, and a record of everything

Your services send events to one HTTP endpoint and get 202 once the event is stored. Routes decide who is told, on which channel and how often: duplicates are counted instead of repeated, bursts are grouped into one message, and messages can wait out quiet hours. For every event the UI shows which routes matched and what each delivery attempt answered.

Status: built and tested, not released

All of the design is built and tested, but nothing is released yet, and no channel or source has been run against its live service: request formats follow each service’s documentation and are pinned by tests. There is no published image, so Ramzes is built from a checkout.

What is not built: several instances working together, roles, single sign-on and an audit log. The documentation lists every limit that is fixed in the code.

Writing about Ramzes