A macOS menu bar app that lists the Macs on your Tailscale tailnet by name instead of by IP, and gets you into them with one click — Screen Sharing or an SSH session in your terminal of choice.
It replaces the ritual of opening Finder, hitting ⌘K, and typing (or
remembering) an IP address. RemoteMac does not reimplement VNC or SSH — it
just points macOS's own Screen Sharing and your terminal at the right
address.
The menu bar panel — your tailnet's Macs by name, with live status dots:
Per-device settings — override the display name, SSH user, and Screen Sharing port for any device, or add machines manually:
General settings — pick the terminal SSH opens in, set the fallback SSH user, and choose the interface language:
- Automatic Tailscale discovery — every Mac on your tailnet shows up by name, no configuration required.
- Manual hosts — add machines that aren't on your tailnet by name and address.
- Per-device settings — SSH user, display name, Screen Sharing port, and show/hide, all overridable per machine.
- Status at a glance — a dot per device: available, sharing off, offline, or not found.
- One-click Screen Sharing — opens macOS's built-in Screen Sharing app.
- SSH in your terminal — Ghostty, iTerm2, Terminal, or Warp; only the ones actually installed on your Mac show up as options.
- Copy IP / open SMB — quick actions for when you need the raw address or a Finder connection instead.
- Quick connect — a Spotlight-style window to search and connect without touching the menu.
- Background refresh — statuses update every 30 seconds, so the dots are current before you even open the menu.
- English and Polish, following your Mac's language or a manual override.
- Launch at login.
- macOS 15 or newer
- Tailscale (App Store or standalone build — either works)
- Screen Sharing enabled on the Macs you want to reach (System Settings → General → Sharing → Remote Management or Screen Sharing)
brew install --cask radnok/tap/remote-macOr grab the .zip from
Releases and drag
RemoteMac.app into /Applications.
The app is signed with a Developer ID certificate and, once notarization is set up, will be notarized by Apple, so it opens without a Gatekeeper warning. See Releases below for the current state of that pipeline.
You'll need a Swift 6 toolchain (ships with recent Xcode). There's no Xcode project — it's a Swift package.
swift test # run the test suite (165 tests)
./Scripts/build-app.sh # build, assemble, and sign the .app
open ~/Applications/RemoteMac.appScripts/build-app.sh builds a release binary, assembles the .app bundle,
embeds Sparkle.framework for auto-updates, and signs everything with the
Developer ID identity it finds in your keychain. If you have more than one it
will list them and ask you to pick:
SIGN_IDENTITY=<sha1> ./Scripts/build-app.sh
echo <sha1> > .signing-identity # or save the choice; it's gitignoredSettings are stored as plain, pretty-printed JSON at:
~/Library/Application Support/io.eightlines.remotemac/settings.json
It's meant to be hand-editable — there's no proprietary format or binary plist involved. Passwords are never stored there or anywhere else in the app; Screen Sharing keeps its own credentials in the macOS keychain.
- An open Screen Sharing port means the service is listening, not that login will succeed. RemoteMac only checks TCP reachability — it cannot and does not verify credentials.
- Warp can't be driven programmatically. Its automation API refuses to submit commands, so for Warp, RemoteMac opens the app and copies the SSH command to your clipboard for you to paste.
- Terminal.app needs an Automation permission the first time you use it from RemoteMac (macOS will prompt for it). Ghostty and iTerm2 don't require any extra permission.
Maintainers only. Pushing a vX.Y.Z tag runs
.github/workflows/release.yml, which
builds, signs, notarizes, publishes a GitHub release, updates the
Sparkle appcast on gh-pages, and bumps the
Homebrew cask. Scripts/release.sh <version> does the same thing locally.
Both need credentials that are not in this repo — a Developer ID certificate,
notarization credentials, and the Sparkle signing key.
Scripts/setup-ci-secrets.sh populates them as repository secrets.
MIT © Konrad Alfaro



