Driftband Run it docker

Self-hosted latency monitoring

See the shape of your latency. Not just its average.

Driftband draws smoke graphs: every ping of every cycle as percentile bands, with a median coloured by packet loss. The way SmokePing taught a generation of network engineers to read a link, rebuilt with a web interface, organizations, two-factor sign-in, alerts that don't spam and an audit trail.

live edge-router-01 203.0.113.10 20 pings / cycle p0 · p2.5 · p10 · p25 · p50 · p75 · p90 · p97.5 · p100
median now
-
median avg
-
jitter (sd)
-
packet loss
-

Simulated in your browser with the same maths Driftband uses on real probes. Hover the graph to read a cycle.

01 / Why smoke

An average lies. The distribution doesn't.

A link that answers in 10 ms most of the time and 180 ms now and then has a fine average and an awful user experience. Driftband keeps every round-trip time of every cycle and shows you where they fall.

  • p25-75The middle half of all pings. The darkest smoke is where your latency usually is.
  • p10-90The middle 80%. Widening here is jitter your users start to feel.
  • p2.5-97.5The middle 95%, before the outliers.
  • min-maxFastest to slowest ping in the cycle. Faint, but it catches the spikes.
  • medianGreen with no loss, then yellow, orange and red as packets go missing. A strip along the bottom marks every cycle with loss.
One probe cycle of 20 pings, sorted, drawn as nested percentile bands around the median, between fainter neighbouring cycles 60 ms40 ms20 ms0 ms pings one cycle min - maxp2.5 - 97.5p10 - 90p25 - 75median

02 / Real screens

This is the actual app, not a mock-up.

Captured from a production Driftband instance that watches public portals and DNS resolvers from Poland, every minute, for months.

Internet / Portale · last 24 hours
Driftband dashboard in dark mode: host tree with Internet, Portale and DNS folders on the left and 24-hour smoke graphs for facebook.com, instagram.com and onet.pl
Select a folder, see every host in it. The tree on the left is the whole navigation: click a folder for all of its hosts, a host for its detail view. Health dots show the last cycle's loss at a glance.

03 / Features

Everything SmokePing users asked for. Nothing they didn't.

Graphs

Percentile smoke

Four nested bands (min-max, p2.5-97.5, p10-90, p25-75) around the median of every cycle, computed from every stored round-trip time.

Loss you can't miss

The median changes colour with packet loss, a strip marks every lossy cycle, and the legend counts how many cycles lost anything.

Ranges, zoom, live

1 hour to everything you have, or a custom from-to. Drag to zoom with full-resolution re-fetch, double-click to reset, and a Live mode that refreshes every 15 seconds.

Synced cursor and real statistics

Hover once, read every host at that moment. Average, max, min, now and standard deviation of the median, computed on the server over every cycle in the window.

Modern and classic

A clean modern chart or a faithful SmokePing/RRDtool rendering, in a dark or light theme, in normal or wide layout.

Hosts and probes

Interactive host tree

Folders and hosts up to three levels deep, like +, ++, +++ in SmokePing. Drag and drop to reorder or move, collapse folders, open any node with a click.

Probe profiles

Interval from 5 seconds, 1 to 100 pings per cycle (never more than the interval in seconds, so a cycle always finishes in time), packets of 12 to 1472 bytes, the most one Ethernet frame carries unfragmented. Four presets, your own profiles, one default, an override per host.

SmokePing config import

Paste or upload your config. The *** Targets *** hierarchy with host, menu and title becomes your Driftband tree. Only plain-text configs are accepted, and every address is checked before anything is created.

Alerts without the noise

Telegram, Slack, Microsoft Teams and email. Loss or latency thresholds that must hold for a while, a lower recovery threshold, reminders and a flap guard. How it works

fping under the hood

Each cycle runs fping -C and keeps every reply, so the distribution is real, not estimated. One container, no external collectors.

Teams and security

Organizations and roles

Separate tenants with their own hosts, profiles, alerts, retention and audit log. Owner, admin and member roles that owners and admins can switch at any time; single-use invite links that expire after 48 hours.

Two-factor sign-in

TOTP with any authenticator app or hardware TOTP key, QR enrollment and replay protection. Passwords hashed with Argon2id.

A complete audit log

Every change, every sign-in, every failed sign-in and every refused permission check, with user, time and client IP.

Hardened by default

Rate-limited sign-in, HttpOnly session cookies, a strict Content Security Policy, and an automated security test suite that covers every API endpoint.

Data and operations

PostgreSQL, with rollups

Raw cycles plus 5-minute and 1-hour rollups, so a week or a year renders in milliseconds and your browser never chews through hundreds of thousands of points.

Retention you choose

Keep 1, 2 or 3 years per organization. A housekeeper removes older data every day.

Platform administration

For whoever runs the instance: all organizations and users, blocking, password resets, a global audit log and a database growth forecast.

Self-hosted, no telemetry

One Docker image and PostgreSQL. Your measurements stay on your servers.

04 / Migration

Your SmokePing tree, in one paste.

No rewriting years of carefully curated targets. Driftband reads the *** Targets *** section and builds the tree for you. Probes and alerts stay behind, every host gets your default profile, and branches deeper than three levels are flattened.

/etc/smokeping/config.d/TargetsSmokePing
*** Targets ***
probe = FPing
menu  = Top

+ Internet
menu  = Internet

++ DNS
title = Public resolvers

+++ Cloudflare
menu  = Cloudflare 1.1.1.1
host  = 1.1.1.1

+++ Google
menu  = Google 8.8.8.8
host  = 8.8.8.8

++ Portals
+++ wikipedia
host  = wikipedia.org
HostsDriftband
  • Internet
    • DNS
      • Cloudflare 1.1.1.1 1.1.1.1
      • Google 8.8.8.8 8.8.8.8
    • Portals
      • wikipedia wikipedia.org

Then drag, rename or re-profile anything from the web interface.

05 / Notifications

Alerts that don't cry wolf.

Get told when a link really is in trouble, and only once. Every rule waits for the problem to last, recovers on a lower threshold, and goes quiet when a link starts flapping instead of flooding your phone.

Packet loss over almost three hours with alert rule markers: a one-minute blip is ignored, a sustained outage alerts once after five minutes, recovery is announced only after loss stays below the recovery threshold, and a flapping link produces one notice instead of a storm 100%50%0% alert at 20%recovered below 5% blip: ignored ALERT RESOLVED ALERT FLAPPING: one notice STABLE holds 5 min 12%: still alerting 10 state changes, 2 messages
One rule on a troubled link, computed with the same logic Driftband runs: alert at 20% or more for 5 minutes, resolve below 5% for 5 minutes, flapping after 4 state changes within an hour. A blip, an outage and an hour of flapping: five messages in total.

Telegram

A bot posts to a private chat, a group or a channel. You need the bot token from @BotFather and the chat id.

Slack

An incoming webhook posts to the channel of your choice, with a link back to Driftband.

Microsoft Teams

A Workflows webhook ("Post to a channel when a webhook request is received") receives an Adaptive Card, red for alerts and green for recoveries.

Email

Any SMTP server with STARTTLS or TLS, signed in with a password or with OAuth 2.0, including a ready preset for Microsoft 365.

  • conditionPacket loss (%) or median latency (ms), measured over the last few probe cycles of each host, so one bad cycle never alerts on its own.
  • holds forThe condition must stay true for as many minutes as you choose before anything is sent.
  • recoveryA lower threshold with its own duration (hysteresis), so a link hovering at the limit does not ping-pong. The recovery message is optional.
  • flap guardToo many state changes in a window turn into a single "flapping" notice; the next message comes when the link has settled.
  • remindersOptionally repeat the alert every N minutes while it is still firing.
  • scopeEvery host, a folder with everything below it, or a single host. One rule, as many channels as you like.
  • whoOwners and admins create channels and rules; members can see them. Every change is in the audit log, every delivery in the history.
#nocwhat lands in the channel
[ALERT] edge-router-01 (203.0.113.10): packet loss 62.0%
Packet loss has been at or above 20% for 5 min.
Rule: Core links · Organization: Acme

[RESOLVED] edge-router-01 (203.0.113.10): packet loss 1.2%
Back below 5% for 5 min.

[FLAPPING] branch-vpn: packet loss keeps crossing 20%
4 state changes in 60 min. Further alerts for this
host are paused until it is stable.

Secrets such as bot tokens, webhook URLs and SMTP passwords are stored encrypted and never shown again after saving.

06 / Why Driftband exists

A thank-you letter to SmokePing.

I have run SmokePing almost since the day it appeared, on networks I built and looked after: data centers, offices, ISP and customer links. It is still one of the most honest tools in networking. It shows the whole distribution of latency instead of a comforting average, and once you have read a smoke graph you never want to go back.

Tobi Oetiker released SmokePing in 2001. In 2013 he announced SmokePing 3, a sponsored rewrite with a new web front end. It never shipped. The 2.x line still sees an occasional release, and plenty of people still rely on it every day. So do I.

But the world around it moved on. Teams share infrastructure. Customers want to see their own links and nobody else's. Security reviews ask about two-factor sign-in and audit trails. Editing a text file over SSH and guarding a CGI script with .htaccess no longer cuts it.

Driftband is what I wanted SmokePing 3 to be. The same smoke and the same honesty, with a web interface for everything, organizations and roles, two-factor sign-in, an audit log and a one-paste migration path. It does not reuse SmokePing code: it is a tribute, not a fork.

Łukasz Morawski
Łukasz Morawskicreator of Driftband · about
  1. SmokePing 0.99.4

    Tobi Oetiker publishes the first public release: an ICMP latency logger and grapher built on RRDtool.

  2. SmokePing 1.0

    The smoke graph becomes a staple of network operations.

  3. SmokePing 3 announced

    A sponsored rewrite with a new web front end is announced. It is never released.

  4. SmokePing 2.8.2

    The 2.x line carries on with maintenance releases.

  5. SmokePing 2.9.0

    The latest release at the time of writing, still configured through text files.

  6. Driftband

    Smoke graphs with a web interface, teams, 2FA and an audit log.

SmokePing 2.x compared with Driftband
 SmokePing 2.xDriftband
Smoke graphs, loss colouringYes, the originalYes, modern and classic style
ConfigurationText config file, reload the daemonWeb interface, drag and drop, SmokePing import
ChartsStatic RRDtool imagesInteractive: zoom, synced cursor, live refresh
Users and access controlLeft to the web serverBuilt-in accounts, roles, invites
Multiple teams or customersNoIsolated organizations
Two-factor sign-inNoTOTP
Audit logNoEvery action, including failed sign-ins
StorageFixed-size RRD filesPostgreSQL with rollups, 1 to 3 years
Probe typesMany: FPing, DNS, HTTP, TCP, SSH and moreICMP (fping)
AlertsPattern-based alerts by email or scriptTelegram, Slack, Teams, email; hysteresis and flap guard
Distributed probingMaster and slavesNot yet

Try it first

Kick the tyres on test.driftband.app.

Create a free organization on the public test instance and use everything: the host tree, smoke graphs, SmokePing import, notifications, teams and two-factor sign-in. It runs with a few limits so it stays fast for everyone.

10hosts per organization
60 sshortest probe interval
56 Blargest ICMP packet
0limits when you self-host

07 / Self-host

One compose file. Five minutes.

Driftband ships as a single Docker image, lukmorawski/driftband on Docker Hub, and stores everything in PostgreSQL.

$ docker pull lukmorawski/driftband:0.1.0

Pin an exact version such as 0.1.0 in production; 0.1 follows patch releases and latest is the newest release. All tags on Docker Hub.

docker-compose.ymlYAML
services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: driftband
      POSTGRES_PASSWORD: ${DB_PASSWORD:?set DB_PASSWORD in .env}
      POSTGRES_DB: driftband
    volumes:
      - dbdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U driftband"]
      interval: 5s
      retries: 10

  driftband:
    image: lukmorawski/driftband:0.1.0
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      DATABASE_URL: postgres://driftband:${DB_PASSWORD:?set DB_PASSWORD in .env}@db:5432/driftband?sslmode=disable
      SECRET_KEY: ${SECRET_KEY:?set SECRET_KEY in .env}
    ports:
      - "8080:8080"
    # non-root image, no capabilities needed:
    # fping uses unprivileged ICMP sockets
    read_only: true
    cap_drop: [ALL]
    security_opt: ["no-new-privileges:true"]
    sysctls:
      net.ipv4.ping_group_range: "0 2147483647"

volumes:
  dbdata:
  1. Save the file and start it

    Put a database password and a secret key in .env, then start the stack:
    printf 'DB_PASSWORD=%s\nSECRET_KEY=%s\n' "$(openssl rand -hex 24)" "$(openssl rand -hex 32)" > .env
    docker compose up -d

  2. Create your organization

    Open port 8080, register, and you are the owner.

  3. Add hosts or import

    Build the tree in the browser, or paste your SmokePing Targets under Settings, Import.

  4. Invite the team

    Generate invite links for admins and members. Turn on two-factor sign-in.

Environment variables
DATABASE_URLPostgreSQL connection string (required).
LISTENHTTP listen address, default :8080.
SECRET_KEY32-byte key (hex or base64) that encrypts notification secrets, kept outside the database. Created in step 1.
APP_URLPublic address of your Driftband, linked from notifications.
TRUSTED_PROXIESCIDRs or addresses of your reverse proxy (and CDN, if any), so client IPs and HTTPS are detected correctly. Defaults to loopback and private ranges.

For production, put Driftband behind a reverse proxy with HTTPS: session cookies are marked Secure automatically.

08 / FAQ

Questions, answered plainly.

What is Driftband?

Driftband is a self-hosted network latency monitor. It pings your hosts on a schedule and draws smoke graphs: the full distribution of round-trip times as shaded percentile bands, with a median line coloured by packet loss. It runs as one Docker container next to PostgreSQL.

How is Driftband related to SmokePing?

Driftband is inspired by SmokePing, created by Tobias Oetiker in 2001, and keeps its way of showing latency. It is a new implementation written in Go and JavaScript and contains no SmokePing code. It adds what SmokePing never had built in: a web interface for configuration, organizations and roles, two-factor sign-in and an audit log.

Can I import my existing SmokePing configuration?

Yes. Paste your SmokePing config or upload the file. Driftband reads the *** Targets *** section, recreates the + / ++ / +++ folder and host hierarchy with host, menu and title, and attaches your default probe profile to every host. Probes and alerts are not imported, branches deeper than three levels are flattened, and the import only adds to your tree. Only plain-text configuration files are accepted (up to 2 MB and 1000 hosts per import); binary files, scripts and invalid host addresses are refused before anything is created.

What exactly does Driftband measure?

ICMP echo round-trip time and packet loss. Each probe cycle runs fping in count mode and sends several pings to the host; Driftband stores every individual round-trip time, so it can show percentiles instead of a single average.

Can I configure how each host is sampled?

Yes, with probe profiles: the interval between cycles (5 seconds or more), the number of pings per cycle (1 to 100, and never more than the interval in seconds) and the ICMP packet size (12 to 1472 bytes, which is a 1500-byte Ethernet frame minus the IPv4 and ICMP headers). Every organization starts with Standard (20 pings every 60 s), Fast (every 30 s), Coarse (every 300 s) and Large packet (15 pings of 1400 bytes). You can create your own, mark one as the default and choose a profile per host.

How do I read a smoke graph?

The darkest band holds the middle 50% of pings, the lighter bands the middle 80% and 95%, and the faintest band the full range from fastest to slowest ping. The wider the smoke, the more jitter. The median line is green when nothing was lost and turns yellow, orange and red as loss grows; a strip along the bottom marks every cycle with loss.

Can several teams or customers share one Driftband?

Yes. Each organization has its own hosts, probe profiles, retention setting and audit log, fully isolated from other organizations. Owners and admins invite people with single-use links that expire after 48 hours, and can switch anyone except the owner between the admin and member roles at any time.

How are accounts protected?

Passwords are hashed with Argon2id. Users can enable TOTP two-factor authentication with any authenticator app or hardware TOTP key, with replay protection. Sign-in and password confirmations are rate limited, sessions use HttpOnly cookies, and every action, including failed sign-ins and refused permission checks, is written to the audit log. An automated security test suite covers every API endpoint.

How much storage does Driftband need?

Each probe cycle is stored with all of its round-trip times, plus 5-minute and 1-hour rollups for fast long-range charts. On a production instance this costs about 370 bytes per cycle, so one host with one cycle per minute needs roughly 190 MB per year. Each organization keeps 1, 2 or 3 years of history; older data is removed automatically.

Which notification channels does Driftband support?

Telegram (a bot posting to a chat, group or channel), Slack (an incoming webhook), Microsoft Teams (a Workflows webhook that receives an Adaptive Card) and email over any SMTP server with STARTTLS or TLS, signed in with a password or with OAuth 2.0 client credentials, including a ready preset for Microsoft 365. One rule can notify several channels, and every channel has a test button.

How does Driftband avoid false alarms and alert storms?

A rule measures packet loss or median latency over the last few probe cycles, so a single bad cycle never counts. The condition must then hold for the number of minutes you set before anything is sent. Recovery uses a lower threshold with its own duration, so a link hovering around the limit does not alternate between alert and recovery. If the state still changes too often within a window, Driftband sends one flapping notice and stays quiet until the link has settled. Gaps without measurements never complete a condition.

Who can configure notifications?

Owners and admins of an organization create and edit channels and alert rules; members can see them, the active alerts and the delivery history. Bot tokens, webhook URLs, SMTP passwords and OAuth client secrets are stored encrypted and are never shown again after saving. Every change is recorded in the audit log.

Does Driftband support probe types other than ICMP?

Not yet. Driftband measures ICMP round-trip time and packet loss with fping. If you depend on DNS, HTTP or TCP probes, SmokePing still covers those cases.

Can I try Driftband without installing it?

Yes. The public test instance at https://test.driftband.app has every feature. Each organization there can have up to 10 hosts, probe intervals of at least 60 seconds and ICMP packets of at most 56 bytes. A self-hosted Driftband has none of these limits; its administrator can set a host limit per organization if needed.

How do I install Driftband?

With Docker Compose: run the lukmorawski/driftband image, pinned to a version tag such as 0.1.0, next to PostgreSQL 16, open the web interface and create your organization. The image runs as a non-root user and needs no extra Linux capabilities: fping uses unprivileged ICMP sockets. Put it behind a reverse proxy with HTTPS for production. The compose file above is all you need.

What does Driftband cost and what is the license?

Driftband is free, self-hosted software licensed under the GNU Affero General Public License v3.0 (AGPL-3.0). There is no usage limit and no telemetry. If you run a modified version as a network service, the AGPL asks you to offer its source code to your users.

09 / Start

Put some smoke on your network.

Free, self-hosted, AGPL-3.0. Import your SmokePing targets and see the shape of your latency in five minutes.