March 26, 2026

I BUILT THE WIFI NOTIFICATION macOS SHOULD HAVE HAD ALL ALONG

Here's something that's been driving me insane for years. You're in the middle of a Zoom call. Or pushing code. Or downloading something that took twenty minutes to get to 94%. And your WiFi silently drops.

No notification. No sound. No banner. Nothing. The WiFi icon in the menu bar changes to empty bars and hopes you notice. You don't. You find out three minutes later when your video freezes and your terminal hangs and you look up at the menu bar and think: how long has that been like that?

Every time, the same thought: why doesn't Apple just tell me?

So I built it myself.

macOS has had WiFi since 1999. It still doesn't notify you when it drops. That's twenty-seven years of silence.

MEET SIGNALDROP

SignalDrop is a lightweight macOS menu bar app that does one thing: tells you the moment your WiFi connection changes. Disconnect, reconnect, signal degradation, network switches — instant native macOS notifications for all of it.

It uses zero battery. It runs entirely on your Mac with no analytics, no telemetry, no accounts. And it solves a problem that's annoyed every Mac user since WiFi existed.

Get SignalDrop on the Mac App Store

macOS 13 Ventura or later · Universal binary (Apple Silicon + Intel) · $4.99 one-time

Get on the Mac App Store

No ads · No tracking · No telemetry · No subscription

WHAT IT DOES

Click the WiFi icon in your menu bar and you get a clean status overview: your current network, signal strength in dBm, internet reachability, a timeline of recent events, and daily stats showing how many times your connection dropped and total downtime.

When your WiFi drops, you get an immediate macOS notification with the network name. When it reconnects, you get another one — this time showing exactly how long you were offline. "Back on HomeWiFi — 47s offline." That downtime duration is something I've never seen in any other tool. It turns an invisible problem into a measurable one.

THE FULL FEATURE SET

Feature What It Does
Disconnect alerts Instant notification when WiFi drops, with network name
Reconnect alerts Notification with exact downtime duration
Signal warnings Alerts before your connection drops (below -75 dBm)
SSID change detection Know when your Mac silently switches networks
Dead network detection Notifies when WiFi is connected but internet is unreachable
Internet reachability Distinguishes "WiFi up, no internet" from "WiFi down"
Per-network reliability tracking Uptime % + disconnect count per saved network
ISP-ready outage receipt One-click paste-ready report for ISP support chats
Connection quality grade A through F based on rolling 24-hour stability
Event log Full history in SQLite, exportable as CSV
Notification throttling Smart dedup prevents spam during WiFi flapping
Daily stats Total disconnects and downtime in the menu bar

THE DEAD NETWORK FIX

This is the feature that convinced me this needed to exist as an app, not just a notification script.

You know the scenario: you walk into a coffee shop. Your Mac auto-connects to a saved network — maybe the shop's old router, maybe a hotspot you used once. The WiFi shows full bars. Connected. Looks fine. But the network has no internet. It's dead.

The only way macOS lets you escape? Forget the network. Delete it from your saved networks entirely. Next time you're at that coffee shop and the WiFi actually works, you have to re-enter the password.

SignalDrop catches this state. The moment it detects you have WiFi but no actual internet, you get an "Internet Unreachable" notification in real time. You know to switch networks instead of staring at a Zoom window wondering whether it's frozen or you're disconnected.

Note: in the Mac App Store version (1.0.2), SignalDrop detects and notifies you about the dead-network state, but cannot programmatically disconnect for you — Apple's app sandbox prohibits modifying network configuration. Automatic dead-network leave-and-rejoin is a planned Pro-tier feature for a future major version.

SignalDrop catches dead networks the moment they go dead. macOS should have done this from day one.

HOW IT WORKS (AND WHY IT USES ZERO BATTERY)

Every other WiFi monitoring tool I found uses some version of the same approach: poll the WiFi status every few seconds. Check if it changed. Wait. Check again. This wastes CPU cycles, drains battery, and — critically — misses events that happen between polls.

SignalDrop doesn't poll at all. It uses Apple's CoreWLAN framework to register for kernel-level WiFi events. When your WiFi state changes, the OS notifies SignalDrop directly. The app is essentially asleep until something happens.

MONITORING LAYER

CWEventDelegate.linkDidChange → WiFi connect/disconnect

CWEventDelegate.ssidDidChange → Network switches

CWEventDelegate.linkQualityDidChange → Signal degradation

CWEventDelegate.powerDidChange → WiFi radio on/off

NWPathMonitor → Internet reachability

The result: zero polling loop, zero battery impact, zero missed events. The app binary is 248KB. It sits in your menu bar doing nothing until the instant something changes — then it reacts in milliseconds.

EVENT HOOKS: AUTOMATION FOR POWER USERS

Note: Event Hooks are an advanced feature from SignalDrop's early developer-distributed builds. The Mac App Store version (1.0.2) ships with the core monitor + reliability + ISP-receipt features but omits Event Hooks, since Apple's app sandbox prohibits launching arbitrary shell scripts. Hooks are on the roadmap for a future "Pro" tier; details TBD. Reach out via the support page if you have a hooks use-case you'd want to see prioritized.

For the historical (developer-distributed) build: every WiFi event in SignalDrop could trigger a custom shell script. Drop an executable .sh file into the hooks folder and it runs automatically with full event context passed as environment variables.

# Post to Slack when WiFi drops
~/Library/Application Support/SignalDrop/hooks/

on-disconnect.sh
#!/bin/bash
curl -X POST "https://hooks.slack.com/your/webhook" \
  -d "{\"text\":\"WiFi dropped from $SIGNALDROP_SSID at $(date)\"}"

Available hooks: on-disconnect.sh, on-connect.sh, on-ssid-change.sh, on-signal-weak.sh, on-internet-lost.sh, on-internet-restored.sh. Each receives SIGNALDROP_EVENT, SIGNALDROP_SSID, SIGNALDROP_BSSID, SIGNALDROP_RSSI, and SIGNALDROP_TIMESTAMP as environment variables.

Pause your torrent client when WiFi drops. Alert your team on Slack. Trigger a home automation scene. Log to a remote server. Whatever you want.

PRIVACY: ZERO NETWORK REQUESTS

SignalDrop makes zero network requests. No analytics. No telemetry. No update checks. No data leaves your Mac, ever. The WiFi event log is a local SQLite database. Preferences are local UserDefaults. That's it.

The only reason the app asks for Location Services is because Apple requires it for apps to read WiFi network names on macOS 14 and later. Your location is never stored, logged, or transmitted. If you deny the permission, SignalDrop still works — it just can't show you the network name.

THE TECHNICAL DETAILS

For anyone who wants to know what's inside:

The codebase is a single Swift target with no external runtime dependencies — only Apple's own frameworks (CoreWLAN, Network, AppKit, SwiftUI, UserNotifications, ServiceManagement). Sandboxed for the Mac App Store, hardened runtime enabled.

Get SignalDrop

$4.99 on the Mac App Store. Signed and sandboxed by Apple. The WiFi notification Apple forgot to build.

Get on the Mac App Store

Includes all future 1.x updates · Learn more

WHY THIS EXISTS

I searched for a macOS WiFi disconnect notifier. The options were: heavyweight network monitoring suites that cost real money, shell script hacks that drain battery and miss events between polls, or Hammerspoon configurations that require a 100MB scripting runtime.

There was no lightweight, event-driven, native macOS app that just tells you when your WiFi drops. So I built one. The per-network reliability tracking and the one-click ISP-receipt feature were what pushed it from "personal utility" to "something other people need."

If your WiFi has ever dropped without you knowing — and it has — give SignalDrop a try.