Skip to content
Nowlark

Notifications from anything you run.

Send an alert from a script, a server or any other tool that can reach a web address, and your iPhone lights up.

Download Nowlark on the App Store

Free to download, with nothing to sign up for. Also on Apple Watch.

Each message from your scripts and tools arrives like this.

Notifications that ask.

Your script asks Deploy v2.4 to production? You tap Approve on the notification, and the script gets a signed answer.

  • Approve or deny, yes or no, or up to three answers you write, such as Ship it, Hold or Roll back
  • One answer per notification, recorded once. You choose how long it stays open, from ten seconds to seven days
  • Your code hears the answer by a callback signed with your secret, or asks for the receipt when it likes
  • Answer from your iPhone or your Mac
Deploy v2.4 to production?Deploy script · now
ApproveDenyLater
Sent to Apple9:41:02
Opened9:41:40
Answer: ApproveSigned with your secret, sent to your code

Type a title. Watch it arrive.

Try it here: type a title and press Send to see it join the stack below. From your code, the same alert is one web request.

Cron · Logs rotated

Six services rotated, 3.1 GB freed.

media-01 · Disk almost full

94% on /data. About six hours left.

Send it from your codeIn curl, Python or JavaScript, or from apps that already speak Prowl.
curl https://nowlark.com/v1/notify \
  -H "X-Nowlark-Key: $NOWLARK_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"source":"Backup","title":"Finished",
       "body":"412 GB in 38 minutes, no errors."}'
import json, os, shutil, time, urllib.request

free = shutil.disk_usage("/data").free / 2**30
if free < 50:
    body = json.dumps({
        "source": "srv-01",
        "title": "Disk almost full",
        "body": f"{free:.0f} GB left on /data.",
        "priority": 2,
        "dedupe_key": "disk-" + time.strftime("%Y-%m-%d"),
        "links": [{"label": "Open in Slack", "url": "slack://open"}],
    }).encode()
    urllib.request.urlopen(urllib.request.Request(
        "https://nowlark.com/v1/notify", data=body,
        headers={"X-Nowlark-Key": os.environ["NOWLARK_API_KEY"],
                 "Content-Type": "application/json"},
    ))
const res = await fetch(
  "https://nowlark.com/v1/notify", {
    method: "POST",
    headers: {
      "X-Nowlark-Key": process.env.NOWLARK_API_KEY,
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      source: "srv-01",
      title: "Disk almost full",
      body: "38 GB left on /data.",
      priority: 2,
      links: [{ label: "Open in Slack", url: "slack://open" }],
    }),
  },
);
Notification type
Prowl
Server
https://nowlark.com
API key
Your Nowlark key, nlk_…
Priority
-2 to 2, same as before

Settings › Connect an App in the app has your key, and this command with the key already in it, ready to copy.

200 OK
{
  "id": "ntf_5f3c…",
  "duplicate": false,
  "muted": false,
  "delivered": 2,
  "devices": 2,
  "remaining": 999,
  "reset_at": 1789665600.0
}

delivered is how many of your devices Apple accepted it for. Send a dedupe_key and the same alert arriving twice is delivered once, so a job that retries on a schedule cannot wake you again.

How it works.

Three steps from opening the app to your first notification from a script.

Get it free from the App Store, allow notifications, then tap Send a Test.

Settings › Connect an App › Create Your Key. It can only send: a leaked key can't read your history or touch your account.

Paste one command into your script or terminal. Settings › Connect an App has the address, the key and the line, ready to copy.

Start free. Upgrade when you need more.

Free covers 1 device and 1 month of history. The Upgrade Pass: every device, a year of history.

Free

App Store
$0

For one phone, with no ads.

  • Delivered through Apple's push service at every priority, including time-sensitive
  • 1,000 requests an hour per key, no monthly limit
  • 1 device and 1 API key
  • 1 month of history
  • Urgent notifications that repeat until you open them
  • Links, sources, themes and iCloud Sync

Upgrade Pass

App Store
$9.99

a year, or $24.99 once for life. Optional.

  • Every device you own
  • A separate key for each script
  • History for 3 months, 6 months or a year
  • Images and buttons on notifications
  • Your choice of tones, per priority and per source
  • Yearly: features released while it's active stay yours after it ends
  • Once for life: everything, including what we add later

Free and the Upgrade Pass are bought in the App Store and paid through Apple, in your currency. Teams is bought on the web and paid through Paddle, our reseller.

Your data, stated plainly.

If Nowlark ever closes, you get at least 90 days' notice first. The privacy policy covers the rest.

Where your account lives
Your iPhoneSigned in
Your iCloudYour account
Nowlark's serversNo password

Already using Prowl or ntfy?

Change the address and the key. Everything else stays as it is.

Coming from Prowl?

Point your script at Nowlark and use a Nowlark key. Nothing else changes.

−https://api.prowlapp.com/publicapi/add+https://nowlark.com/publicapi/add−apikey=<your Prowl key>+apikey=nlk_…
The add and verify calls work as on Prowl: the same fields, replies and priorities.

Using an app with an ntfy option?

Choose ntfy, set the server and paste your key as the access token.

−server: https://ntfy.sh+server: https://nowlark.com−token: (none)+token: nlk_…
Any topic name works. Uptime Kuma, Apprise and changedetection.io connect this way.

Set up with an AI agent.

Paste one prompt into the coding agent you already use. It isn't done until a test reaches your phone.

  1. 1
    Reads your projectIt looks at your code before asking anything.
  2. 2
    Asks what it can't findWhat should wake you, and what should stay quiet.
  3. 3
    Builds it and proves itA small send function, then a real test on your phone.

Works withClaude CodeCodexCursorCopilot

Your next alert, on your phone.

Free, with nothing to sign up for. Or start a team.