Push notifications from anywhere

Live Activities
from your server.

Send push notifications and update iOS Live Activities from scripts, automations, and APIs. One HTTP request. Instantly on your phone.

curl -d "Build #847 deployed to prod" \
  https://api.pushtower.com/send/my-channel
fetch("https://api.pushtower.com/send/my-channel", {
  method: "POST",
  body: "Build #847 deployed to prod"
})
import requests

requests.post("https://api.pushtower.com/send/my-channel",
  data="Build #847 deployed to prod")
http.Post(
  "https://api.pushtower.com/send/my-channel",
  "text/plain",
  strings.NewReader("Build #847 deployed to prod"),
)
reqwest::Client::new()
  .post("https://api.pushtower.com/send/my-channel")
  .body("Build #847 deployed to prod")
  .send().await?;
CI Build #847
45%
9:41
Wednesday, April 9
PushTower
now
CI Build #847
Running tests...
45%
Build
Tests
Deploy
Home Assistant2m ago
Front door unlocked
Motion detected at entrance camera
Uptime Monitor5m ago
SSL cert expiring
api.example.com expires in 7 days

Notifications for things
you actually care about

If it can make an HTTP request, it can send you a push notification. No SDK, no app integration, no vendor dashboard.

🏠

Home Automation

Door opened, washing machine done, temperature dropped below threshold. Get instant alerts from Home Assistant, Node-RED, or any webhook.

POST /send/home {"title":"Garage door open","body":"Left open for 10 min"}
🔧

CI/CD Pipelines

Watch builds and deploys progress in real time on your lock screen with Live Activities. Know instantly when something fails.

GitHub Actions → PushTower → Live Activity on your wrist
📡

Server Monitoring

Disk full, SSL expiring, service down. Push notifications cut through where emails and Slack messages get buried.

POST /send/alerts {"title":"CPU at 95%","priority":"critical"}
🖨️

3D Printing

Know the moment your print finishes or fails. Pipe OctoPrint, Klipper, or BambuLab webhooks straight to your phone.

OctoPrint webhook → PushTower → "Print done (2h 14m)"
📈

Price Alerts

Crypto dipped, stock hit your target, eBay listing price dropped. Run a cron job and get notified exactly when it matters.

crontab → check_price.py → PushTower → your phone
🌱

IoT & Sensors

Soil moisture, air quality, water leak detected. Connect any ESP32, Raspberry Pi, or Arduino sensor to real push notifications.

ESP32 → HTTP POST → PushTower → instant alert

Everything a notification tool
should actually have

No marketing fluff. Just the features you need to get alerts from your stuff to your phone.

iOS Live Activities

Update progress bars, status indicators, and timers on the Dynamic Island and Lock Screen. The only push tool that supports this.

E2E Encryption

AES-256-GCM encryption with per-device keys stored in the Secure Enclave. The server never sees your notification content.

Dead Simple API

One POST request with a title and body. No SDKs, no API keys, no config files, no dashboard to set up first.

Custom Sounds

30+ built-in notification sounds or bring your own. Set different sounds per channel so you know what fired without looking.

Scheduling & Quiet Hours

Schedule notifications for later. Set quiet hours so your phone doesn't buzz at 3am when a backup job finishes.

Self-Hostable

Run PushTower on your own server with Docker. Your data, your infrastructure, your rules. Open source under MIT.

Phone buzzes
in under a minute

No certificates. No Firebase console. No config files. Just install and POST.

1

Install the App

Download PushTower from the App Store. Tap "Get Started" — no account, no email, no password. You get an API key instantly.

2

Send a Request

POST to your channel URL from the getting-started page. Your phone buzzes. That's it — you're set up.

3

Wire It Up

Add the API call to your scripts, CI pipeline, Home Assistant, or cron job. Every notification shows up on your phone in real time.

One POST.
That's the whole API.

No SDK, no client library, no setup wizard. If your language can make an HTTP request, you're good.

curl -X POST https://api.pushtower.com/send/home \
  -d '{
    "title": "Front door unlocked",
    "body": "Opened by John at 6:42 PM",
    "sound": "doorbell",
    "priority": "high"
  }'
fetch("https://api.pushtower.com/send/home", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    title: "Front door unlocked",
    body: "Opened by John at 6:42 PM",
    sound: "doorbell",
    priority: "high"
  })
})
import requests

requests.post("https://api.pushtower.com/send/home", json={
    "title": "Front door unlocked",
    "body": "Opened by John at 6:42 PM",
    "sound": "doorbell",
    "priority": "high"
})
body := strings.NewReader(`{
  "title": "Front door unlocked",
  "body": "Opened by John at 6:42 PM",
  "sound": "doorbell",
  "priority": "high"
}`)
http.Post(
  "https://api.pushtower.com/send/home",
  "application/json", body,
)
curl -X POST https://api.pushtower.com/send/ci \
  -d '{
    "activityId": "build-847",
    "event": "update",
    "title": "CI Build #847",
    "message": "Deploying to production...",
    "progress": 85
  }'
fetch("https://api.pushtower.com/send/ci", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    activityId: "build-847",
    event: "update",
    title: "CI Build #847",
    message: "Deploying to production...",
    progress: 85
  })
})
import requests

requests.post("https://api.pushtower.com/send/ci", json={
    "activityId": "build-847",
    "event": "update",
    "title": "CI Build #847",
    "message": "Deploying to production...",
    "progress": 85
})
body := strings.NewReader(`{
  "activityId": "build-847",
  "event": "update",
  "title": "CI Build #847",
  "message": "Deploying to production...",
  "progress": 85
}`)
http.Post(
  "https://api.pushtower.com/send/ci",
  "application/json", body,
)

Simple pricing,
no surprises

Start free. Upgrade when you need Live Activities, encryption, or more volume.

Free
For trying it out
$ 0 /month
  • 200 notifications/mo
  • 3 channels
  • Scheduling & quiet hours
  • Custom sounds
  • Priority levels
  • Live Activities
  • E2E encryption
  • Channel aliases
  • Analytics
Get Started
Ultimate
For power users
$ 6.99 /month
  • 100,000 notifications/mo
  • 50 channels
  • Scheduling & quiet hours
  • Custom sounds
  • Priority levels
  • Live Activities
  • E2E encryption
  • Channel aliases
  • Analytics
Go Ultimate

Paid plans support the development of PushTower as an open-source project. ❤️

Questions, answered

Is there a free plan?

Yes. The Free plan includes 200 notifications per month and 3 channels — enough for personal scripts, hobby projects, and home automations. No credit card required.

What are iOS Live Activities and the Dynamic Island?

Live Activities are persistent updates that appear on the iOS lock screen and inside the Dynamic Island on iPhone 14 Pro and newer. PushTower lets you start, update, and end Live Activities with a single HTTP request — perfect for CI builds, deploys, rides, deliveries, or any long-running process.

Can I self-host PushTower?

Yes. PushTower is open source under the MIT license. You can run the entire stack on your own server with Docker — unlimited notifications, no plan restrictions, no telemetry.

Do you charge per device?

No. PushTower charges per notification sent, not per device. Subscribe as many phones, tablets, and Macs as you want to any channel.

What happens if I exceed my monthly limit?

Notifications beyond your plan limit are rejected with an HTTP 429 response. You can upgrade at any time, and the limit resets at the start of every billing month.

Can I cancel anytime?

Yes. Subscriptions can be cancelled from your account at any time. You keep paid features until the end of your current billing period, then drop back to the Free plan automatically.

Is end-to-end encryption really end-to-end?

Yes. On Pro and Ultimate plans, payloads are encrypted on your device or server before they leave, and decrypted only on the receiving device. PushTower servers cannot read message contents.

Which languages and tools are supported?

Any tool that can make an HTTP request. We provide examples for cURL, JavaScript, Python, Go, and Rust, but PushTower also works seamlessly with shell scripts, GitHub Actions, n8n, Home Assistant, Zapier, and Make.

Prefer to self-host? PushTower is open source under MIT. Run it on your own server with Docker — free, unlimited, no restrictions. View on GitHub
⚡ Early access

Your phone should buzz
for things that matter.

PushTower is invite-only while we onboard early users. Drop your email and we'll let you know the moment your account is ready.

No spam. One email when access opens. Unsubscribe in one click.