Skip to content
0 Stars Free & MIT licensed

Know your network died — on every monitor.

offline-banner is a yellow top-strip for NixOS desktops that appears while your network is offline and slides away the moment it's back. It tells you why ("Network link is down" vs "No internet connection") and how long you've been offline.

A warning, not a page: static yellow, no flashing, no urgency theater. It pushes your bar down instead of covering it — and never asks NetworkManager, which lies on NM-unmanaged uplinks.

configuration.nix
# flake.nix
inputs.offline-banner.url = "github:LarsArtmann/offline-banner";

# your NixOS configuration
services.offline-banner.enable = true;
Demo

See it work end-to-end.

Link drops, the strip slides in, the caption ticks, the link returns — 24 seconds, the real banner behavior.

24 seconds · captured behavior, real module colors · MP4

How It Works

Built to do one thing well.

One boolean, honestly derived and honestly displayed. No applet framework, no NM lies, no flashing.

Every monitor, one truth

One layer-shell surface per connected output. No screen left quietly lying to you.

Pushes down, never covers

An animated exclusive zone (InOutCubic, 450 ms) that your bar slides beneath — nothing hidden, nothing unreachable.

Debounced, with a memory

Two failed probes (~10 s) before it appears — one lost ping changes nothing. 'last online 4m 12s ago' while it's up.

Sandboxed by contract

A strict systemd sandbox — reads /sys, pings, talks Wayland; nothing else. Asserted line-by-line by a flake check.

Fail visible, never silent

A probe that cannot run counts as a failure. Journal lines and a JSON state file rewritten on every probe.

Tune live, no rebuild

OFFLINE_BANNER_* env vars mirror every option — retune a running system with a drop-in, or force-show with demo mode.

Detection

A two-leg probe that doesn't lie.

Never NetworkManager — it reads `none` on NM-unmanaged uplinks while the internet is perfectly reachable. Live-verified on the origin host.

L1

Link leg — kernel carrier

Reads /sys/class/net/*/carrier

Virtual ifaces excluded: lo, veth, tailscale, docker…
L2

Internet leg — one ICMP echo

Reads ping 9.9.9.9

An IP, never a name — the banner must not depend on DNS

A probe that cannot even run counts as a failure — fail visible, never fail silent

Without / With

The difference is on screen.

Connectivity loss stops being a mystery and becomes a warning.

Without offline-banner
Dead call, stalled build, endless spinner — nothing on screen says it's not your fault.
The NM tray icon reads "connecting…" on a static-IP uplink that was never NM-managed.
One bar widget covers one screen; the other two lie to you.
With offline-banner
A yellow strip slides in on every monitor ~10 s after the network is actually gone.
It says why: "Network link is down" vs "No internet connection" — and how long ("last online 4m 12s ago").
The first clean probe slides it away and re-arms for the next outage.

One boolean in your config. Every screen tells the truth.

Behavior as shipped in v0.1.0 — see the FEATURES inventory for per-claim evidence.

Built For

Who is this for?

Four desktops where a quiet yellow strip earns its place.

NixOS flake users

One input, one option — not a network applet framework.

Multi-monitor desktops

A single bar widget leaves every other screen guessing.

Static-IP / hybrid hosts

NM-unmanaged uplinks make NetworkManager indicators read the wrong answer.

Journal people

journalctl and a state file you can trust more than a tray icon that silently died.

Get Started

Two lines. That's the whole install.

Free, MIT-licensed, and hardened by contract — the sandbox is asserted by a flake check.