Gotify

Simple self-hosted push notification server

Home Automation ★ 15.9k stars Easy setup MIT

Gotify is a self-hosted push notification server written in Go. Applications send messages through a REST API and users receive them via the web UI or the Gotify Android app. It ships as a single binary or Docker image with plugin support.

Key features

  • Self-hosted push notifications
  • REST API for sending
  • Android app and web UI
  • Plugin support

Pros & cons

Strengths

  • Very lightweight
  • Simple to integrate

Trade-offs

  • Android-focused apps
  • No native iOS app

Gotify replaces

Last reviewed Aug 26, 2026 · 837 words

If anyone in your house carries an iPhone, pick ntfy instead; Gotify has no iOS app and the maintainers have said for years that one is not coming. For an Android-only household, Gotify is the tidier tool: a single Go binary, a SQLite file, a REST endpoint you can hit from curl, and an app that keeps a WebSocket open to your server so the notification path never touches Google, Apple, or a third-party relay. It uses about 64 MB of RAM and I have run one for years without a single upgrade breaking anything.

Up in 3 minutes

services:
  gotify:
    image: gotify/server:latest
    environment:
      - GOTIFY_DEFAULTUSER_NAME=admin
      - GOTIFY_DEFAULTUSER_PASS=pick-something-long
    volumes:
      - ./data:/app/data
    ports:
      - "8080:80"
    restart: unless-stopped

The web UI on port 80 inside the container is where you create "applications", each of which gets its own token. One token per sender (backup script, monitoring, the doorbell) means you can revoke one without touching the others and the app shows you which source a message came from. Put it behind a reverse proxy with TLS; the Android client needs WebSockets passed through, which Caddy does without configuration and nginx needs the Upgrade and Connection headers for. The data directory holds the SQLite database and any uploaded app icons, and it is the entire backup.

Sending a message is one curl call

curl -s "https://push.example.com/message?token=AbCdEf123" \
  -F "title=Backup finished" \
  -F "message=restic: 42 files added, 1.2 GB, 3m14s" \
  -F "priority=5"

That is the whole integration surface, which is why it slots into anything with a shell. A cron job's last line, a trap on failure, a Home Assistant REST command, a Node-RED HTTP node: all of them are three lines. Messages also accept a JSON body with extras for Markdown rendering and click-through URLs, so a monitoring alert can link straight to the dashboard. Uptime Kuma has a native Gotify notification type, and Apprise speaks it as gotify://, so most self-hosted tools already know how to reach it without custom code.

Priority decides whether the phone buzzes

The number in that curl call is the piece most people get wrong. Gotify priorities run 0 to 10, and the Android app maps them to notification channels: 0 is silent and does not show at all, 1 to 3 appear in the shade with no sound, 4 to 7 make a normal sound and vibration, and 8 to 10 use the high-importance channel that pushes through a phone's usual quiet settings. Send everything at 5 and you will train yourself to ignore it within a week. My working scheme is 2 for "a script finished normally", 5 for "a human should look at this today", and 8 for "a disk is full or the house is on fire". You can also set a default priority per application in the web UI so the sending script does not need to care.

The Android app costs some battery, and that is the trade

The client keeps a persistent connection to your server rather than relying on Firebase, which is the entire privacy point and also why Android will try to kill it. Install it from F-Droid or the Play Store, then exempt it from battery optimisation in system settings, or notifications will arrive in bursts when the phone wakes. On modern phones the real-world cost is a few percent a day. If you would rather not fight the OS, ntfy can use Firebase for delivery while still letting you self-host the server, which is a reasonable compromise Gotify deliberately does not offer.

Plugins exist; you probably will not need them

Gotify has a plugin system, but plugins are Go shared objects compiled against the exact server version, so a plugin built for one release fails to load on the next. In practice most people use none and do integration on the sending side. The one worth knowing about is the webhook plugin that lets external services post to a URL without an app token. If your reason for wanting a notification server is to consolidate alerts from a dozen homelab services, the pairing that works is Gotify for delivery plus something like Uptime Kuma or the monitoring stack in homelab monitoring and uptime doing the deciding.

What I'd do

Android house, one server: Gotify behind Caddy, one application token per sender, priorities 2/5/8 as above, app exempted from battery optimisation. Back up the data folder with everything else. Mixed household, or you want a public relay for a phone that is not always on your VPN, or you want to subscribe to someone else's topic: ntfy, and accept a slightly busier configuration. Either way, stop routing your backup-failed alerts through a free-tier commercial push service; a 64 MB container on hardware you already own does this job better.

Compare Gotify

1 head-to-head comparisons.

Similar home automation apps