Self-hosted Hetzner Cloud availability monitoring—simple to install, visual at a glance, and fully controlled from your browser.
Track server types and locations over time, inspect current and historical availability, and receive ntfy notifications when capacity returns.
Docker · Python · SQLite · ntfy · English & Deutsch
HetznerWatch runs locally on macOS, Windows and Linux. You do not need Git,
Python or a .env file.
Install Docker Desktop on macOS or Windows and make sure it is running. On Linux, install Docker Engine. The official Docker installation guide covers all supported systems.
Open Terminal (macOS/Linux) or PowerShell (Windows), paste this command, and press Enter:
docker run -d --name hetznerwatch --restart unless-stopped -p 8080:8080 -v hetznerwatch-data:/data ghcr.io/heiselanalytics/hetznerwatch:latestDocker downloads the ready-to-use image, starts it in the background and keeps
all settings and history in the persistent volume hetznerwatch-data.
Open http://localhost:8080 and go to Settings. Add a Hetzner Cloud API token with Read permission. Settings save automatically; after the token is accepted, HetznerWatch loads the catalog and starts the first check.
Create the token in Hetzner Cloud Console under Project → Security → API Tokens → Generate API Token. Copy it immediately because it is only shown once. See the official Hetzner documentation.
Build HetznerWatch from source instead
git clone https://github.com/HeiselAnalytics/HetznerWatch.git
cd HetznerWatch
docker compose up -d --buildWhen upgrading from a version that used .env, Docker Compose imports an
existing HCLOUD_TOKEN into SQLite on the first start. The old file can be
removed after the token is shown as configured in Settings.
Stop or start HetznerWatch without deleting its data:
docker stop hetznerwatch
docker start hetznerwatchInstall the latest published image while keeping the data volume:
docker pull ghcr.io/heiselanalytics/hetznerwatch:latest
docker rm -f hetznerwatch
docker run -d --name hetznerwatch --restart unless-stopped -p 8080:8080 -v hetznerwatch-data:/data ghcr.io/heiselanalytics/hetznerwatch:latestThis option is intended for an always-on Linux server, VPS or NAS. Install
Docker Engine and the
Docker Compose plugin first.
No Git checkout, Python installation or .env file is required.
Run these commands on the server:
mkdir -p hetznerwatch
cd hetznerwatch
curl -fsSL https://raw.githubusercontent.com/HeiselAnalytics/HetznerWatch/main/compose.server.yml -o compose.ymldocker compose up -dThe configuration downloads the published image, restarts HetznerWatch after a
server reboot and stores its database in the persistent Docker volume
hetznerwatch-data.
The server configuration publishes port 8080 on all network interfaces. If
your server firewall or hosting provider uses inbound rules, allow TCP port
8080, then open:
http://YOUR-SERVER-IP:8080
For permanent internet access, use a domain and place HetznerWatch behind an authenticated HTTPS reverse proxy. HetznerWatch does not provide its own user login, so an unrestricted public port would allow other people to control its monitoring and notification settings.
When using ntfy, enter the externally reachable HTTPS dashboard address in Settings → Dashboard URL so tapping a notification opens HetznerWatch.
Run the commands inside the hetznerwatch directory:
# Install the latest image
docker compose pull
docker compose up -d
# View logs
docker compose logs -f
# Stop the application; the data volume is retained
docker compose down- Visual per-check timeline for selected server type/location pairs
- Long-term availability views for 24 hours, 7, 30 and 90 days
- Current Hetzner catalog and monthly gross prices
- Configurable monitoring interval and pause/resume control
- Optional ntfy notifications with a configurable dashboard click link
- English by default, with German available in Settings
- Heisel Analytics branding by default, replaceable with an image URL
- All application settings managed in the UI and persisted in SQLite
- Automatic 120-day retention cleanup
HetznerWatch preconfigures the public server https://ntfy.sh and a persistent,
memorable random topic made from words and numbers, for example
hetznerwatch_amber482falcon073river916cobalt. Notifications stay disabled
until setup is complete:
- Install the ntfy app on Android or iPhone.
- Copy the generated topic from Settings → ntfy notifications.
- In the app, add a subscription on
https://ntfy.shwith exactly that topic. - Enable ntfy in HetznerWatch and choose Send test message.
Use New topic to generate another value. This never happens automatically, because every ntfy app must then subscribe to the new topic.
Anyone who knows a public topic can read or publish to it, so keep the generated
value private. The dashboard link must be reachable from the phone; localhost
only works on the HetznerWatch host. See the official smartphone guide.
The click action is described in the publish documentation.
View logs:
docker logs -f hetznerwatchStop the application:
docker stop hetznerwatchThe named Docker volume hetznerwatch-data keeps the SQLite database when the
container is stopped, removed or replaced.
Settings, history and service credentials are stored in the local SQLite database in the Docker volume. Secret values are never returned by the settings API, but they are not encrypted at rest. Protect filesystem and Docker access, back up the volume, and place HetznerWatch behind an authenticated HTTPS reverse proxy before exposing it to a network or the internet.
HetznerWatch is not affiliated with Hetzner or ntfy.
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
python -m unittest -vSee CONTRIBUTING.md and SECURITY.md.