Home Self-hosted standup bot

A standup bot on your own servers, in your own region

One container, one database, one HTTPS URL Slack can reach. Where the answers physically sit, and what it takes to keep them there.

Add to Slack installs Morgenruf on the free hosted instance CloudDrove runs. Self-hosting is the same MIT code.

Morgenruf is a self-hostable Slack standup bot: one container and a Postgres database, deployed with Docker Compose or Helm, with every answer stored in a database you control. It is MIT licensed and free, and the same code also runs as a free hosted instance for teams that would rather not run it.

Last reviewed September 26, 2026

MIT licence · latest release 1.9.14, 2026-10-01 · Helm chart · every release

git clone https://github.com/morgenruf/morgenruf.git
cd morgenruf/app && cp .env.example .env   # add your Slack app values
docker compose up -d

View on GitHub

Why teams self-host a standup bot

Self-hosting decides one thing before anything else: which machine, in which country, holds the answers. Everything else on this page follows from that. Three reasons come up, in this order:

  • The answers are sensitive. A standup is a daily log of what is broken, what is late and who is stuck. Plenty of companies are fine with that in a vendor's cloud. Regulated ones are not, and it is not a preference they can be argued out of. Here the answers sit in whatever Postgres you point it at, in whatever region that database is in.
  • The bill grows with the team. Per-seat pricing means the cost of three questions a morning rises every time you hire.
  • They already run things. If you have a cluster and a Postgres, adding one more small service is an afternoon.
Slack your workspace Morgenruf one process Postgres your database events messages reads and writes scheduler, inside the process Three things at the core No queue, no cache, optional services off by default
Where the answers physically sit when you self-host: your Postgres, in the region you chose.

What running it actually involves

  • One container. A Python process. Not a queue, a worker pool and a cache.
  • One database. Postgres 13 or newer. Migrations run themselves on start.
  • An HTTPS URL. Slack posts events to it. A Cloudflare tunnel is enough and needs no open port.
  • Upgrades. Pull the image and restart, or helm upgrade.
  • Backups. pg_dump. There is no other state.

What leaves your network

A self-hosted install talks to Slack only, plus Zoom, email (Resend), an AI provider or PostHog analytics if the operator turns those on. By default that means slack.com: the app calls it to read channel membership, open DMs and post the summary, and Slack calls your HTTPS URL back with events. Answers, blockers, participation, coffee chat pairings and kudos are written to your Postgres. There is no licence check. Each optional service stays silent until you configure it: Zoom when someone links an account for coffee chats, Resend when you set up digest email, an AI provider when you add a key for summaries, and PostHog when you set a PostHog key. You can watch that on the egress rules, and since it is MIT licensed and readable end to end you can check the claim rather than take it.

Which makes the residency answer short. The data lives in the region your database lives in, under the retention your backups already have, and a deletion or subject access request is a query against a schema you own.

What it costs

A small VPS and a managed Postgres, or nothing extra if you already run both. There is no seat component at any size, which is the whole economic argument: the difference between hosted and self-hosted grows with your headcount, not with your usage. What the hosted standup bots charge per person is on the comparison pages, if you want to do the arithmetic for your own team.

Where it runs

  • Kubernetes with the published Helm chart, ingress, HTTPRoute or a tunnel
  • Docker Compose on a VPS, a homelab box or a spare Mac mini
  • Anywhere else a container and a Postgres can live

The same image and the same database either way. Every way of running it is written up step by step, and the choice is mostly about what your team already operates.

Standups in the dashboard with completion sparklines

The dashboard runs on your own domain, behind your own auth.

The part people underestimate

Not the install. The Slack app: scopes, a redirect URL, and the fact that a workspace which installed before a feature existed has not granted that feature's scopes. That page exists because it is where setups actually stall. It helps to read what the bot does inside Slack first, because the scopes follow from it and half of them are for features you may not switch on. If you would rather hand the whole job over, CloudDrove does paid setup and hosting on your own infrastructure.

Questions

About self-hosting

What are the minimum requirements?

One small container and a Postgres. A single vCPU with 512MB is enough for a team of dozens; the work is bursty and short.

Does it need a public IP?

No. A Cloudflare tunnel gives Slack an HTTPS URL without opening a port or running an ingress controller.

How do upgrades work?

Pull the new image and restart. Migrations run in an init container before the app starts, and are written to be safe against a live database.

Is there a hosted version?

Yes. Add to Slack installs Morgenruf on a free hosted instance run by CloudDrove, in about two minutes. This page is about the other route: the same MIT code on your own servers.

Free for every seat, and that is the whole pricing page

Add to Slack puts Morgenruf on the free hosted instance CloudDrove runs, in about two minutes. Or self-host the same MIT code with Docker Compose or Helm and pay only for the server.