Help
Thanks for buying ServeMon
Your license key is in the email from Polar. Open ServeMon from the menu bar, choose License… from the gear menu, and paste the key. One key activates three Macs; manage activations in the customer portal.
Thanks for renewing
Your existing key now includes another twelve months of updates. Nothing to paste; ServeMon picks it up the next time it validates the key.
Install
Download ServeMon.dmg, drag ServeMon to Applications, and open it. ServeMon lives in the menu bar; there is no Dock icon. With Homebrew: brew tap suresk/tap && brew install --cask suresk/tap/servemon. It needs macOS 14 or later and asks for no permissions and no password.
What gets discovered, and how
ServeMon looks for PostgreSQL, Redis, MySQL and MariaDB, MongoDB, Elasticsearch and OpenSearch, Kafka, RabbitMQ, Mailpit, LocalStack, Memcached, NATS, and MinIO, plus any container a Docker-compatible runtime is running. It finds them four ways, all without running a subprocess:
- Processes. Through libproc, the same interface Activity Monitor uses: process name, executable path, arguments, working directory, and listening sockets. This is how a service is matched to a port.
- Homebrew. By reading the
homebrew.mxcl.<formula>.plistfiles Homebrew installs, in~/Library/LaunchAgents,/Library/LaunchDaemons, and under/opt/homebrew/opt(or/usr/local/opton Intel). Installed-but-stopped services are listed as stopped. ServeMon never runsbrewto find out what is there. - Containers. Through the engine API over the Unix socket of Docker Desktop, OrbStack, Colima, or Podman, whichever sockets exist. Running and exited containers whose image matches a known service are listed; other containers are listed by name. The
dockerCLI is never called. - App bundles. Postgres.app: servers started from
/Applications/Postgres.appare attributed to it.
Discovery runs every 5 seconds while the panel or window is open and every fifth probe cycle while it is hidden.
Sources and badges
Every service carries a badge saying where it came from: Homebrew (with the formula, such as postgresql@17), Docker Desktop, OrbStack, Colima, or Podman (with the container and image), Postgres.app, or Process for a bare binary that matched by name or path but belongs to none of the above. The badge decides which mechanism Start, Stop, and Restart use.
Services running as root or another user (a system-wide mysqld, say) are listed with what libproc shows without privileges: name, PID, path, and uptime, and are probed on their default port. Their arguments, sockets, and working directory are not read, so data directory, config, and log may be blank. 1.0 has no privileged helper.
What the dot colours mean
- Green: the service answered its protocol probe. The number next to it is the round-trip latency.
- Yellow: something is listening on the port but the answer was wrong, or took more than a second.
- Red: the process is running, or the container is up, and the port refused or timed out. This is the case
brew services listreports as started. - Grey: not probed yet, or the probe for that kind is off in Settings.
- No dot: installed or exited but not running. Stopped Homebrew services and exited containers are listed without a dot so you can start them.
The menu bar icon shows one dot per running service, up to eight; after that it shows a count. Click it for the panel.
Details, and where each one comes from
- Version: from the probe reply (Postgres
server_version, RedisINFO, the MySQL handshake, MongoDBbuildInfo), else from the Homebrew keg path (Cellar/postgresql@17/17.6), else fromPG_VERSIONin the data directory. - Port and bind address: the process's listening socket, or the container's published port.
- PID, uptime, memory: libproc. For containers, the runtime's start time.
- Data directory: the process's arguments first (
-D,--pgdata,--dir,--datadir), then its environment (PGDATA), then the Homebrew default (/opt/homebrew/var/postgresql@17), then, for containers, the mount whose destination is the image's data path (/var/lib/postgresql/data). - Config file: arguments (
--config,-c,--defaults-file, Redis's positional.conf), else the Homebrew default. - Log file: the
StandardErrorPathorStandardOutPathin the Homebrew plist, else the Homebrew default (/opt/homebrew/var/log/redis.log). Containers have no log file; the Log tab reads the runtime's log endpoint instead. - Project: the Compose project and working directory from the container's labels, or the git repository containing the process's working directory.
The Log tab shows the last 200 lines and refreshes every 2 seconds while visible. Copy Summary puts one line per service on the clipboard: name, version, source, address, health, data directory, log.
Actions
Start, Stop, and Restart use whatever started the service: brew services start|stop|restart <formula> for Homebrew, the container API for containers, and a signal (SIGTERM, then SIGKILL if you ask) for bare processes and Postgres.app servers. Start and Restart are unavailable for bare processes because ServeMon does not know the command that launched them; stop it here, then start it however you started it before.
Open Client opens Terminal with psql, redis-cli, mysql, or mongosh already pointed at the service (it writes a small .command file in ~/Library/Application Support/ServeMon and opens it). Open Data Directory reveals the data directory in Finder. After the trial, the actions and Open Client need a license; viewing never does.
Connection strings
Each service gets a connection string built from what ServeMon knows: postgresql://postgres@127.0.0.1:5432/postgres, redis://127.0.0.1:6379, and so on. For containers the user, password, and database come from the container's environment (POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, and the MySQL, MongoDB, and RabbitMQ equivalents). Passwords are always masked on screen. Copy Connection String includes the password only when it came from one of those container environment variables, which are local-development defaults by construction. Anything else is copied masked.
Probe settings
Settings › Probes has a toggle per service kind. A probe is one connection and one message: PING to Redis, a startup message to Postgres, reading the handshake MySQL sends first, buildInfo to MongoDB, one HTTP GET to Elasticsearch, OpenSearch, Mailpit, LocalStack, and MinIO, the protocol header to RabbitMQ, version to Memcached. Then the connection closes. Probes run every 5 seconds while the panel or window is open; hidden, every 30 seconds by default (Settings › General offers 15, 30, 60, or off). A service with its probe off keeps a grey dot and is still listed with its details.
License
The 14-day trial is unrestricted. After it ends you can still see everything; Start, Stop, Restart, and Open Client need a license. Buy one, then paste the key into ServeMon › License… (in the gear menu of the panel). One key activates three Macs; free one from the customer portal. A license includes twelve months of updates; after that the app keeps working, and another twelve months is $15.
Uninstalling
Quit ServeMon from the gear menu and drag it to the Trash, or brew uninstall --cask servemon. ServeMon writes only ~/Library/Preferences/com.suresk.servemon.plist and ~/Library/Application Support/ServeMon; delete those too if you want nothing left, or use brew uninstall --zap --cask servemon. Your license key and trial start live in the Keychain under com.suresk.servemon.license. Nothing was installed anywhere else, and your services are untouched.
Demo mode
For screenshots and bug reports without real data: SERVEMON_DEMO=1 replaces discovery with nine fictional services. SERVEMON_OPEN_WINDOW=popover|main|settings|license opens that window on launch and SERVEMON_APPEARANCE=light|dark forces the appearance. For example: SERVEMON_DEMO=1 SERVEMON_OPEN_WINDOW=main /Applications/ServeMon.app/Contents/MacOS/ServeMon.
Not in 1.0
Profiles (start and stop a named set of services together), conflict detection (two services on one port or one data directory), and a privileged helper for services that run as root. Those are next, in that order. Kafka, Elasticsearch, RabbitMQ, LocalStack, and Mailpit are detected and probed when present but have no data-directory or log heuristics outside the container case.
Something else?
Email support@getservemon.com, or open an issue at github.com/suresk/servemon/issues. Include the Copy Summary text if it is about a service that shows the wrong thing.