October 30, 2021 update: is back!

You may have noticed frequent outages over the last two weeks. There was an uptick in usage which stressed the small but mighty infrastructure that powers

To keep pace with usage, I've overhauled the server:

-- Paul lets you send notifications to your own phone or desktop with minimal fuss. This is primarily useful for tracking the progress of long-running compute jobs.

Quick Start

How it Works

Each user of is assigned a channel, identified by a random string. Devices which support the Web Push API, including Chrome and Firefox for desktop and Android, can subscribe to notifications on a channel and show a pop-up notification. Other devices, such as iOS Safari, do not yet support the API needed for background notifications, but they can still be used to see a list of recent notifications.

Each channel has its own HTTPS endpoint. When you POST a message to that endpoint, relays it to every subscription on that channel. uses standard APIs for both sending and subscribing to notifications, which means that it can be used without installling any software. If you prefer, you can use the command-line tool and Python package to simplify integration with your workflow.


Command-line interface

The command-line interface and Python API are part of the notify-run Python package. You can install both using the pip package manager

pip install notify-run

Once it has been installed, you can register a new channel like so:

notify-run register

Alternatively, you can configure it to use a channel that already exists:

notify-run configure[channel name]

The configuration is stored in the ~/.config/notify-run file in your home directory. It will be picked up by subsequent runs of notify-run as well as the notify_run Python module.


When used inside a Jupyter notebook, the subscribe link is clickable and a QR code is displayed.


Notify includes a callback for Keras which sends a progress notification at the end of each epoch. After configuring an endpoint above, import NotifyCallback from notify_run.keras and pass it in the callback parameter to a Keras fit method.

from notify_run.keras import NotifyCallback
# model is a Keras model that you have created elsewhere., y, callbacks=[NotifyCallback()])

Open source

This public instance is freely provided for your convenience, but does not have an SLA and should not be used for notification messages containing private data. Usage is tracked to prevent abuse, and rate limited to 20 API requests per minute.

The server is written in Rust and available under an MIT license. Self-hosting is possible, but is not a prioritized use case.

Issues and Questions

If you find bugs or have other questions, please file a bug report, send me an email, or tweet at me.