NotifyMeNotifyMeGitHub
Self-hosted · Open source

Webhook notifications,
straight to your phone.

A Firebase-powered notification bridge for long-running developer and AI-agent jobs. Send one POST request. Get one phone notification.

An alternative to Pushover, ntfy, Bark, Pushbullet, and Telegram-bot alerts.

NotifyMe pager
NotifyMe
Inbox
Claude Codenow

Task finished — tests green

GitHub Actions2m

CI failed on main — 3 red

Crawler14m

Scrape done — 38k pages

The problem

Stop babysitting long-running jobs.

You kick off a job and then keep flipping back to the terminal to see if it's done. NotifyMe ends the manual polling — the job tells you.

Today
  • Refreshing terminals and dashboards by hand.
  • Noisy email and Slack threads you learn to ignore.
  • Discord webhooks that bury the one alert that matters.
  • Missing a failed deploy until someone else notices.
With NotifyMe
  • One lightweight phone push per job, not a feed to scan.
  • Color-coded by status so failures stand out instantly.
  • Tap to jump straight to the run, log, or incident.
  • Works anywhere a script can send an HTTP POST.

Built for the jobs you already run

Claude CodeCodex CLIGitHub Actionsn8nBash scriptsStatuspage incidents
How it works

One POST in, one push out.

No agents to install, no polling. The whole pipeline is four hops from your script to your lock screen.

01

POST webhook

Your script hits your personal webhook URL with a small JSON body.

02

Firebase Function

A Cloud Function validates the payload and resolves your token.

03

Firestore + FCM

The notification is persisted, then pushed via Cloud Messaging.

04

Phone notification

It lands on your phone. Tap it to open the detail or linked URL.

payload — the full webhook contract
{
  "title": "Build passed",
  "message": "main is green — deploy queued",
  "category": "github",
  "status": "success",
  "url": "https://github.com/acme/app/actions"
}

title + message are the body · status maps to a color (closed set) · category organizes the inbox · url makes it tappable.

Features

Everything the inbox needs, nothing it doesn't.

A focused notification app — not another dashboard to babysit.

Personal webhook URL

Every user gets one unguessable POST endpoint. No app keys to juggle.

Push via FCM

Delivered straight to your phone through Firebase Cloud Messaging.

Inbox grouped by day

A paged notification feed, organized so the latest is always on top.

Status colors

A closed set — success, error, warning, info — each maps to a color.

Search & read state

Find any alert and track what you've already seen.

Tappable URLs

Attach a url and the notification deep-links straight to the source.

Bookmarks

Star the alerts worth keeping; they stay in a dedicated list.

Statuspage support

Nested Atlassian Statuspage payloads are normalized automatically.

Self-hosted Firebase

Deploys into your own project. No central server, no shared data.

Use cases

A push for every moment you'd otherwise check manually.

AI agent finished

Claude Code completed the migration task

#claude·success
CI failed

build #482 broke on main — 3 tests red

#github·error
n8n workflow completed

Lead-sync processed 1,204 records

#n8n·success
Crawler done

Scrape job finished — 38k pages indexed

#crawler·info
Statuspage incident

Anthropic: elevated errors on Claude API

#statuspage·warning
Server monitor alert

vps-01 disk usage crossed 90%

#monitor·warning
Open source · Self-hosted

Your Firebase project. Your notifications.

NotifyMe is open source and runs entirely on infrastructure you control. Clone it, deploy it, own it.

No central server

There's no NotifyMe backend to trust. Nothing routes through us.

No hardcoded project IDs

The stack reads your own Firebase config. Nothing is pinned to us.

Your Firebase project

Deploy the Cloud Function and Firestore rules into your own account.

Notifications stay private

Data lives in your Firestore, scoped to your authenticated user.

Examples

Copy, paste, get notified.

The same contract everywhere. Set NOTIFYME_URL to your personal webhook and drop one of these into your workflow.

The whole contract is one POST. Trap errors and notify on both outcomes — the status color reflects how the job ended.

Bash / curl · bash
#!/usr/bin/env bash
set -euo pipefail

notify() {  # notify <status> <title> <message> [url]
  curl -fsS -X POST "$NOTIFYME_URL" \
    -H "Content-Type: application/json" \
    -d "$(jq -n \
      --arg t "$2" --arg m "$3" --arg s "$1" --arg u "${4:-}" \
      '{title:$t, message:$m, category:"cron", status:$s, url:$u}')" \
    >/dev/null || echo "notifyme: send failed" >&2
}

trap 'notify error "Backup failed" "Exited at line $LINENO"' ERR

# ---- your long-running job ----
pg_dump app | gzip > /backups/app.sql.gz
# -------------------------------

notify success "Backup complete" "Nightly snapshot finished in 4m12s"

NOTIFYME_URL looks like https://us-central1-YOUR_PROJECT.cloudfunctions.net/webhook/YOUR_TOKEN — your own Cloud Function endpoint with your routing token.