Skip to main content

macOS internet connection monitor

Project description

mb-netwatch

macOS internet connection monitor. Tracks latency, VPN status, and public IP at a glance via a menu bar icon.

Status: Under active development.

What it monitors

Three types of checks run continuously in the background:

  • Latency — HTTP probes against captive portal endpoints every 2 seconds (first response wins)
  • VPN status — tunnel interface and routing table detection every 10 seconds
  • Public IP — address and country code via plain-text IP services every 60 seconds

See docs/probes.md for detailed algorithms, endpoints, and design rationale.

CLI commands

  • mb-netwatch probe — one-shot connectivity probe, print result
  • mb-netwatch probed — run continuous background measurements
  • mb-netwatch tray — run menu bar UI process
  • mb-netwatch watch — live terminal view of measurements
  • mb-netwatch start [probed|tray] — start processes in the background (no argument = both)
  • mb-netwatch stop [probed|tray] — stop background processes (no argument = both)

Architecture

General CLI application architecture patterns are described in docs/cli-architecture.md. Database schema and storage rules are in docs/db.md. Below is the project-specific structure.

Core (core/)

Central application layer. Holds database, business logic, and probe implementations. Consumers never import from core/ directly — they receive a Core instance and access everything through it:

  • core.db — database (reads and writes)
  • core.config — application configuration
  • core.service — business logic (running probes, storing results)

Consumers

Three independent consumers of Core:

  • CLI (cli/) — command-line interface. Each command receives Core and Output via CoreContext.
  • Daemon (daemon.py) — long-running background process. Orchestrates scheduling (loops, timers, signals) and delegates all probe/store logic to core.service.
  • Tray (tray.py) — macOS menu bar UI. Polls core.db for latest results and updates the icon.

Processes

Two long-running processes in normal operation:

  • probed (mb-netwatch probed) — runs the daemon; measures latency every 2 s, VPN status every 10 s, public IP every 60 s; writes to SQLite via core.service.
  • tray (mb-netwatch tray) — UI only; reads latest samples from SQLite via core.db, updates menu bar icon and dropdown.

The tray must not perform network probing directly. This separation keeps UI responsive and simplifies debugging.

Storage

SQLite database at ~/.local/mb-netwatch/netwatch.db (WAL mode). See docs/db.md for schema, deduplication strategy, and retention rules.

Configuration

Optional TOML config at ~/.local/mb-netwatch/config.toml. The file is not created automatically — create it only if you want to override defaults. All keys are optional — only specify what you want to change.

[probed]
latency_interval = 2.0   # seconds between latency probes (default: 2.0)
vpn_interval = 10.0      # seconds between VPN status checks (default: 10.0)
ip_interval = 60.0       # seconds between public IP lookups (default: 60.0)
purge_interval = 3600.0  # seconds between old-data purge runs (default: 3600.0)
latency_timeout = 5.0    # HTTP timeout for latency probes (default: 5.0)
ip_timeout = 5.0         # HTTP timeout for IP/country lookups (default: 5.0)
retention_days = 30      # days to keep raw rows before purging (default: 30)

[tray]
poll_interval = 2.0      # seconds between tray DB polls (default: 2.0)
ok_threshold_ms = 300    # latency below this → OK (default: 300)
slow_threshold_ms = 800  # latency below this → SLOW, at or above → BAD (default: 800)
stale_threshold = 10.0   # seconds before data is considered stale (default: 10.0)

[watch]
poll_interval = 0.5      # seconds between terminal view DB polls (default: 0.5)

The menu bar shows a fixed-width 3-character title: 2-letter country code + status symbol ( OK / SLOW / BAD / DOWN), e.g. US●. Click the menu bar icon to see the exact latency in the dropdown. If probed stops writing data, the symbol changes to (en dash) after stale_threshold seconds (default 10). While waiting for the first data, a middle dot · is displayed.

Installation

uv tool install mb-netwatch
mb-netwatch start

Tech stack

  • Python 3.14
  • aiohttp — HTTP probes
  • psutil — network interface inspection for VPN detection
  • mm-clikit — CLI toolkit (Typer enhancements, SQLite, process management)
  • mm-pymac — macOS menu bar app

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mb_netwatch-0.0.6.tar.gz (26.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mb_netwatch-0.0.6-py3-none-any.whl (26.1 kB view details)

Uploaded Python 3

File details

Details for the file mb_netwatch-0.0.6.tar.gz.

File metadata

  • Download URL: mb_netwatch-0.0.6.tar.gz
  • Upload date:
  • Size: 26.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mb_netwatch-0.0.6.tar.gz
Algorithm Hash digest
SHA256 890aa5d8f03be7e4a0a9708c10ac096450ce9d3219b8824d536415169c9768cb
MD5 676759ff4d60290dba903dc739030445
BLAKE2b-256 6f2375bb12167f707e4056e7fa62db2d4e5098244c2cb8989e71325e9a6efb71

See more details on using hashes here.

File details

Details for the file mb_netwatch-0.0.6-py3-none-any.whl.

File metadata

  • Download URL: mb_netwatch-0.0.6-py3-none-any.whl
  • Upload date:
  • Size: 26.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.4 {"installer":{"name":"uv","version":"0.11.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for mb_netwatch-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 0d53ffc71b968d564fcdc76f04364f0cece5ebd7494dedab81617eed7d6d93c6
MD5 e72dde5ff0ea43f13e86ac303f854e32
BLAKE2b-256 715994470beab3619e5a9c5d7d4f600fbf26e7d1f36baf2e203f5159bdce28f8

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page