ntfy

Send push notifications to your phone or desktop with simple HTTP requests.

  • binwiederhier/ntfy:v2.32.0
  • port 6113
  • Productivity
ntfy screenshot 1ntfy screenshot 2ntfy screenshot 3ntfy screenshot 4

Web App

/
http://localhost:6113/

A simple, self-hosted notification service. Send alerts from any script or app to your phone or desktop with a plain PUT or POST.

Features

  • Publish and subscribe to topics over HTTP
  • Android, iOS and web apps for receiving notifications
  • Users and access rules, locked down by default
  • Messages and users saved in the app data folder

How to use

  1. Open ntfy from your dashboard.
  2. Sign in as admin. The password is in /DATA/AppData/ntfy/password.txt (open it with the Files app) and in the app log.
  3. Subscribe to a topic.
  4. Send a test message with curl -u admin:YOUR-PASSWORD -d "Hello" http://your-server-ip:6113/mytopic.
  5. Add the same server and topic in the ntfy phone app.

Before you install

On first start the app makes an admin account with its own random password, saved in password.txt in the app's folder and shown in the app log. To pick your own password, write it in that file and restart the app. Change it there, not in the ntfy web app, because the app resets it when ntfy restarts. Change localhost in NTFY_BASE_URL to your server's IP so your phone can reach ntfy. For instant iPhone alerts, add NTFY_UPSTREAM_BASE_URL=https://ntfy.sh from the Variables tab.

The settings in the first table are already in the app settings. To use any other one, open the app settings, add the variable with your value, save, and the app restarts with it. A setting you leave out uses its default.

In the app settings

VariableDefault valueDescription
TZ$TZYour time zone. ZimaOS fills this in for you.
NTFY_BASE_URLhttp://localhost:6113The web address of your ntfy server. localhost only works on this device. For other devices, change localhost to your ZimaOS IP, like http://192.168.1.50:6113, or use your public address, like https://ntfy.example.com.

Server

VariableDefault valueDescription
NTFY_UPSTREAM_BASE_URL—Set to https://ntfy.sh so iPhone apps get instant alerts. Only a hidden message ID is sent to ntfy.sh, never your message.
NTFY_BEHIND_PROXYfalseSet to true when ntfy sits behind a reverse proxy, so it reads the real visitor address.

Sign-up and accounts

VariableDefault valueDescription
NTFY_AUTH_DEFAULT_ACCESSdeny-alldeny-all means only signed-in users can read or send. Set to read-write to let anyone use your server.
NTFY_ENABLE_LOGINtrueShows a sign-in page in the web app.
NTFY_REQUIRE_LOGINtrueMakes the web app ask everyone to sign in first.
NTFY_AUTH_USERS—Leave it out and the app makes an admin account with the random password in password.txt. Or list your own users as name:password-hash:role, with every $ in the hash written as $$ and a comma between users; then password.txt is not used.
NTFY_ENABLE_SIGNUPfalseSet to true to let people make their own account in the web app.

Messages

VariableDefault valueDescription
NTFY_CACHE_DURATION12hHow long messages are kept for people who were offline, like 12h or 3d.
NTFY_ATTACHMENT_CACHE_DIR—Turns on file attachments. Set it to a folder like /var/lib/ntfy/attachments.

Email (SMTP)

VariableDefault valueDescription
NTFY_SMTP_SENDER_ADDR—Your email server and port, like smtp.gmail.com:587. Needed to forward notifications by email.
NTFY_SMTP_SENDER_USER—The username for your email server.
NTFY_SMTP_SENDER_PASS—The password for your email server.
NTFY_SMTP_SENDER_FROM—The address emails come from, like [email protected].

Logs

VariableDefault valueDescription
NTFY_LOG_LEVELinfoHow much detail goes in the log. One of trace, debug, info, warn or error.
docker-compose.yml
name: ntfy

services:
  ntfy:
    image: binwiederhier/ntfy:v2.32.0
    container_name: ntfy
    restart: unless-stopped
    stop_grace_period: 40s
    network_mode: bridge
    init: true
    entrypoint:
      - /bin/sh
      - -c
      - |
        export NTFY_CACHE_FILE="$${NTFY_CACHE_FILE:-/var/lib/ntfy/cache.db}"
        export NTFY_AUTH_FILE="$${NTFY_AUTH_FILE:-/var/lib/ntfy/auth.db}"
        export NTFY_AUTH_DEFAULT_ACCESS="$${NTFY_AUTH_DEFAULT_ACCESS:-deny-all}"
        export NTFY_ENABLE_LOGIN="$${NTFY_ENABLE_LOGIN:-true}"
        export NTFY_REQUIRE_LOGIN="$${NTFY_REQUIRE_LOGIN:-true}"
        f=/var/lib/ntfy/password.txt
        if [ -z "$$NTFY_AUTH_USERS" ]; then
          if [ ! -s "$$f" ]; then
            head -c 18 /dev/urandom | od -An -tx1 | tr -d ' \n' > "$$f" || { echo "[icestore] cannot write $$f"; exit 1; }
            chmod 600 "$$f"
            echo "[icestore] first start: sign in as admin with the password $$(cat "$$f")"
          fi
          pw=$$(cat "$$f")
          hash=$$(printf '%s\n%s\n' "$$pw" "$$pw" | ntfy user hash 2>/dev/null)
          [ -n "$$hash" ] || { echo "[icestore] could not hash the password in $$f"; exit 1; }
          NTFY_AUTH_USERS="admin:$$hash:admin"
          export NTFY_AUTH_USERS
          echo "[icestore] admin password: see /DATA/AppData/ntfy/password.txt"
        fi
        exec ntfy serve
    environment:
      - TZ=$TZ
      - NTFY_BASE_URL=http://localhost:6113
    ports:
      - target: 80
        published: "6113"
        protocol: tcp
    volumes:
      - type: bind
        source: /DATA/AppData/$AppID
        target: /var/lib/ntfy
        bind:
          create_host_path: true
    healthcheck:
      test: ["CMD-SHELL", "wget -q --tries=1 http://127.0.0.1:80/v1/health -O - | grep -Eo '\"healthy\"\\s*:\\s*true' || exit 1"]
      interval: 60s
      timeout: 10s
      retries: 3
      start_period: 40s
    deploy:
      resources:
        limits:
          cpus: "1.00"
          memory: 256M
        reservations:
          cpus: "0.00"
          memory: 64M
    labels:
      icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/ntfy/icon.png
    x-casaos:
      id: com.icestore.ntfy
      envs:
        - container: TZ
          description:
            en_US: Your time zone. ZimaOS fills this in for you.
        - container: NTFY_BASE_URL
          description:
            en_US: >-
              The web address of your ntfy server. localhost only works on
              this device. For other devices, change localhost to your ZimaOS
              IP, like http://192.168.1.50:6113, or use your public address,
              like https://ntfy.example.com.
      ports:
        - container: "80"
          description:
            en_US: Web app and API, published on host as 6113.
      volumes:
        - container: /var/lib/ntfy
          description:
            en_US: Saved messages and the user database.

x-casaos:
  id: com.icestore.ntfy
  architectures:
    - amd64
    - arm64
  main: ntfy
  author: HSinghHira
  category: Productivity
  developer: Philipp Heckel
  icon: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/ntfy/icon.png
  thumbnail: https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/ntfy/screenshot-1.png
  screenshot_link:
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/ntfy/screenshot-1.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/ntfy/screenshot-2.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/ntfy/screenshot-3.png
    - https://cdn.jsdelivr.net/gh/HSinghHira/IceStore@main/Apps/ntfy/screenshot-4.png
  title:
    en_US: ntfy
  tagline:
    en_US: Send push notifications to your phone or desktop with simple HTTP requests.
  description:
    en_US: >-
      Visit: [https://icestore.hsinghhira.me/app/ntfy/](https://icestore.hsinghhira.me/app/ntfy/) for full details


      A simple, self-hosted notification service. Send alerts from any
      script or app to your phone or desktop with a plain PUT or POST.


      **Features**


      - Publish and subscribe to topics over HTTP

      - Android, iOS and web apps for receiving notifications

      - Users and access rules, locked down by default

      - Messages and users saved in the app data folder


      **How to use?**


      1. Open ntfy from the Zima OS dashboard.


      2. Sign in as **admin**. The password is in
         /DATA/AppData/ntfy/password.txt (open it with the Files app).


      3. Subscribe to a topic.


      4. Send a test message with `curl -u admin:YOUR-PASSWORD -d "Hello"
         http://YOUR-ZIMAOS-IP:6113/mytopic`.


      5. Add the same server and topic in the ntfy phone app.
  tips:
    before_install:
      en_US: >-
        Visit: [https://icestore.hsinghhira.me/app/ntfy/](https://icestore.hsinghhira.me/app/ntfy/) for full details
  index: /
  port_map: "6113"
  scheme: http
  is_uncontrolled: false
  version: "2.32.0"
  update_at: "2026-10-21"
  release_notes:
    en_US: |-
      - Pinned to binwiederhier/ntfy:v2.32.0 instead of latest.
      - No more admin/admin: each install makes its own random admin password on first start, saved in password.txt in the app folder and shown in the log. Change it by editing that file and restarting. If you installed before, your app still uses admin/admin until you change NTFY_AUTH_USERS (or make it blank) in the app settings.
      - Moved to IceStore. Port changed from 8473 to 6113.
      - NTFY_BEHIND_PROXY and NTFY_UPSTREAM_BASE_URL moved to the Variables tab on the IceStore website. Add NTFY_UPSTREAM_BASE_URL=https://ntfy.sh to get instant alerts on iPhone.
      - NTFY_AUTH_DEFAULT_ACCESS, NTFY_ENABLE_LOGIN, NTFY_REQUIRE_LOGIN and NTFY_AUTH_USERS moved to the Variables tab. The app still locks ntfy down by default when they are left out.
  repo: "https://github.com/binwiederhier/ntfy"
  support: "https://github.com/binwiederhier/ntfy/issues"
  docs: "https://docs.ntfy.sh/"