EgressBar is a native macOS menu bar utility that shows where your current public internet traffic exits: city, region, country, IP address, ASN, and ISP.
It is useful when switching VPNs, proxies, Wi-Fi networks, or cloud workspaces and you want a quick sanity check from the menu bar.
- macOS 13 or newer
- Swift 5.9 or newer
Give the following instructions to a local agent to install EgressBar automatically on a Mac:
Install EgressBar from https://github.com/AmAzing129/EgressBar on this Mac.
Steps:
1. Verify that Xcode Command Line Tools and Swift are available:
`xcode-select -p` and `swift --version`.
2. Clone the repository to `~/EgressBar` if it is not already present:
`git clone https://github.com/AmAzing129/EgressBar.git ~/EgressBar`.
If `~/EgressBar` already exists, run `git -C ~/EgressBar pull`.
3. Build the project:
`cd ~/EgressBar && make build`.
4. Package the macOS app bundle:
`cd ~/EgressBar && make package`.
5. Launch the packaged app:
`open ~/EgressBar/.build/EgressBar.app`.
6. Confirm that `~/EgressBar/.build/EgressBar.app/Contents/MacOS/EgressBar`
exists and that EgressBar is visible in the macOS menu bar.
Do not move the app bundle after packaging unless the user asks for a different
install location. The packaged app is required for the Launch at Login toggle;
`make run` is only for development.
- Menu bar title like
Los Angeles, California, US - Menu details for IP, network status, location, country, city, region, ASN, ISP, and last updated time
- Manual refresh
- Configurable automatic refresh interval (1–1440 whole minutes; default: 10 minutes)
- Network-change refresh via
NWPathMonitor - Automatic refresh on macOS system proxy changes, with client-specific node-switch detection for FlClash
- Copy current IP to the pasteboard
- Optional Launch at Login toggle
- Optional IPinfo token stored in the macOS Keychain
Open the menu bar menu, choose Settings..., and enter the Refresh interval (minutes). Click Apply to save it and refresh immediately. The automatic refresh timer restarts with the new interval; no app restart is needed.
The interval is saved locally and restored when EgressBar launches. New installs use 10 minutes. Refresh Now also saves the current settings and refreshes; Cancel discards edits to the token, interval, and proxy-change monitoring.
Startup, network changes, and manual refreshes can trigger additional IPinfo requests between automatic refreshes.
Node-switch detection is client-specific. EgressBar does not provide universal node-switch detection for every proxy application. macOS system proxy settings and a proxy application's internal node selection are separate signals:
| Signal | Coverage | Limits |
|---|---|---|
| macOS system proxy settings | Changes to proxy on/off state, address, or port, regardless of which client changes those settings | Switching a node while keeping the same local proxy address and port may leave these settings unchanged |
| Saved node selections | Dedicated adapters for FlClash and FlClash for oixCloud, using compatible local storage | Other clients, including Surge and Clash Verge, do not have a node-selection adapter in this version |
Refresh when proxy changes is enabled by default in Settings. EgressBar checks local routing state every two seconds and waits 1.5 seconds after a detected change to let the proxy client settle. Rapid changes are combined into one refresh, and a change during an IP request queues another refresh afterward. IP lookups use a new connection so a tunnel through the previous node is not reused. Unchanged local state does not send additional IPinfo requests.
The FlClash adapters recognize the application identifiers com.follow.clash
and com.oixcloud.clash. They compare the running client's current profile,
proxy mode, and saved node selections. Paths are resolved from the current
user's home directory at runtime. EgressBar compares routing fields from local
preferences and opens database.sqlite read-only; no controller API is needed.
These adapters work for users with compatible client storage and contain no
machine-specific paths, profile IDs, node names, or credentials.
This detects saved selections, including manually choosing another group or node. Automatic failover within a group may not update these saved selections. Other clients, older FlClash storage formats, and future incompatible schemas may not expose a detectable node change. In those cases, use the regular refresh interval or Refresh. Temporary read failures are ignored and retried.
The displayed IP is the exit used for the IPinfo request. With per-domain proxy rules, other sites can use a different exit.
Build:
make buildRun from source:
make runRun the proxy-change detection tests (using temporary databases and preferences):
swift testmake package
open .build/EgressBar.appUse the packaged app for the Launch at Login toggle. make run is intended for
development.
The default bundle identifier is com.amazing.egressbar. For your own release
builds, override it at package time:
BUNDLE_ID=com.example.egressbar make packageWithout a token, EgressBar uses:
https://ipinfo.io/json
With a token, EgressBar uses:
https://ipinfo.io/json?token=...
You can set the token in Settings. Development builds may also read
IPINFO_TOKEN from the environment when no Keychain token has been saved.
EgressBar does not collect analytics and does not run its own backend. It sends requests to IPinfo so IPinfo can return your public egress location and network metadata. See PRIVACY.md for details.
Screenshots should be captured from a packaged build. Avoid publishing images that include a real personal IP address or precise home/work location; redact those values or use a test network.
Contributions are welcome. See CONTRIBUTING.md.
MIT. See LICENSE.