Enable or disable macOS network services right from the menu bar — without digging through System Settings.
Turning a network interface on or off on macOS is buried. To make Wi-Fi or an Ethernet adapter inactive you have to open System Settings → Network, find the service, open its ⋯ menu, and choose Make Service Inactive — several clicks deep, every time. And once you're juggling more than one connection, System Settings won't tell you at a glance which service is actually carrying your traffic.
crossbar collapses that into a menu bar dropdown: every network service, its current state, and a switch. One click to flip it. That's the whole app.
- Lists your network services (Wi-Fi, Ethernet, Thunderbolt, VPN, …) — the same set System Settings shows — sorted sensibly: wired first, then Wi-Fi, then VPNs and bridges.
- One-click enable/disable per service, straight from the menu bar.
- Shows what's actually routing. A green/yellow/gray dot tells you each service's state, and an "active route" marker calls out the one service currently carrying traffic — so disabling a dormant connection doesn't look like the app did nothing. Dormant services are dimmed so the live ones stand out.
- Shows your Wi-Fi network (SSID) right under the Wi-Fi row.
- Hover for detail — IP address, route state, and router, without cluttering the resting view.
- Menu bar icon reflects overall state — it gains a small badge when a service is disabled, so "I left something off" is visible at a glance.
- macOS 14 (Sonoma) or later to run.
- Xcode 26+ only if you build from source.
brew tap breed007/tap
brew trust breed007/tap # one-time — Homebrew requires trusting third-party taps
brew install --cask crossbar- Download the latest
crossbar-vX.Y.Z-universal.zip(or.dmg) from the Releases page. - Unzip it and move Crossbar.app to
/Applications(or drag it there from the disk image). - Launch it. crossbar is signed and notarized with a Developer ID, so it opens without any Gatekeeper workaround. The binary is universal — runs natively on Apple Silicon and Intel.
git clone https://github.com/breed007/crossbar-macos.git
cd crossbar-macos
open Crossbar.xcodeproj # press ▶ Run, or:
xcodebuild -project Crossbar.xcodeproj -scheme Crossbar -configuration Release buildThen copy the built Crossbar.app to /Applications.
crossbar runs as a menu bar agent — no Dock icon, no app-switcher entry. Look for the crossbar glyph (three nodes on a diagonal) in your menu bar; click it to open the list. Quit from the popover's footer.
Reading network state needs no privileges, but changing it requires root.
crossbar's v1 backend runs Apple's networksetup tool via sudo. To avoid a
password prompt on every toggle, add a narrowly-scoped sudoers rule:
sudo visudo -f /etc/sudoers.d/crossbarAdd this single line (replace breed with your macOS username):
breed ALL=(root) NOPASSWD: /usr/sbin/networksetup -setnetworkserviceenabled *
This grants passwordless sudo for only that one networksetup
subcommand — nothing else — which is a reasonable tradeoff on a personal Mac.
Deleting /etc/sudoers.d/crossbar fully reverts it. Until the rule is in place,
crossbar still runs and shows everything; it just explains how to install the
rule the first time you try to toggle.
To display the connected Wi-Fi SSID, crossbar needs Location Services
permission. This isn't a crossbar quirk: since macOS 14 the system withholds the
SSID from any app that lacks location authorization (CoreWLAN, networksetup,
and system_profiler all redact it). crossbar requests it with a one-time
prompt on first launch and never starts location updates — simply holding
the authorization is what unlocks the network name.
- Allow → the Wi-Fi row shows its SSID.
- Deny → everything else works; the SSID is just omitted.
- Change it any time in System Settings → Privacy & Security → Location Services.
crossbar is built around one fact: reading network state is unprivileged; changing it requires root. Those two halves are cleanly separated by a privilege boundary.
- Read layer — a
StatusMonitorbacked bySCDynamicStorefrom the SystemConfiguration framework. It's fully event-driven (no polling): it subscribes to network-change notifications and refreshes the model when state actually changes. It enumerates services, their enabled state, live IP/link info, and the service order (to compute which service owns the default route). - Write layer — a
PrivilegedToggleprotocol (the seam). The v1 backend shells out tonetworksetupvia the passwordlesssudorule, passing arguments safely as an array (no shell), validating service names against the live set, and serializing toggles. Because the UI only knows the protocol, a future backend (e.g. anSMAppServicedaemon over XPC, no sudoers rule) could drop in without touching the interface.
Built natively in Swift + AppKit. No third-party dependencies.
- No network calls, no telemetry, no analytics. crossbar only reads local system configuration and toggles local services.
- Location permission, if granted, is used solely to read your Wi-Fi SSID locally — it never leaves your Mac, and crossbar requests no location updates.
- The passwordless
sudorule is scoped to exactly onenetworksetupsubcommand.
crossbar deliberately does one thing well. It intentionally does not do network service priority reordering, location switching, proxy or VPN configuration, Bluetooth toggling, or bandwidth/speed/public-IP tooling. If you need those, the per-service Network Settings… link opens Apple's native pane.
See DESIGN.md for the scope philosophy and the reasoning behind each non-goal (including why Bluetooth is deliberately left out).
Issues and PRs are welcome. crossbar is intentionally small — please keep changes focused on its one job: seeing and toggling network services from the menu bar.
See CHANGELOG.md for release history.
MIT © 2026 breed007

