GitHub

A frugal, native macOS menu-bar app for Syncthing.

It runs Syncthing quietly in the background and gives it a simple menu-bar presence — status at a glance, one click to the web UI, and a small Settings window for updates. No Dock icon, no heavyweight UI.

The Syncthing Menu menu-bar dropdown

Latest release

Getting Started

  1. Download the latest SyncthingMenu-<version>.zip from the Releases page.
  2. Unzip it (double-click in Finder) and drag Syncthing Menu.app into your Applications folder.
  3. Launch it. The build is signed and notarized, so it opens without Gatekeeper warnings. The icon appears in the menu bar — there's no Dock icon.

On first launch it downloads the official Syncthing daemon and starts it in the background. Allow the Local Network prompt so Syncthing can reach your other devices; if you sync folders in protected locations (Desktop, Documents, …) you may also be asked for Full Disk Access (see Permissions). From then on it keeps both Syncthing and itself up to date automatically.

Requires macOS 13 or later.

Why another wrapper?

The official syncthing-macos bundles the Syncthing binary at build time, coupling the daemon's version to the wrapper's. Every Syncthing release needs a new wrapper release, so the bundled daemon drifts whenever the wrapper isn't updated in lockstep.

Syncthing Menu is built around the opposite principle: the daemon updates independently of the app. It downloads the official Syncthing binary at runtime and keeps it current on its own, so the menu-bar app itself rarely needs an update.

How it works

  • Native Swift + AppKit. An NSStatusItem menu-bar agent (LSUIElement) — no Dock icon, minimal idle footprint.
  • Daemon fetched at runtime, not bundled. On first launch the app downloads the official, Apple-signed, universal Syncthing binary from Syncthing's GitHub Releases into ~/Library/Application Support/Syncthing Menu/. The download's SHA-256 is checked, and the binary's Apple Developer ID signature — Syncthing's own — is verified at installation and again before every launch. No Go toolchain is ever needed, and the daemon is exactly what upstream shipped.
  • The app owns daemon updates. Syncthing's autonomous self-upgrade timer is disabled; instead the app checks for new releases and applies them on your terms (see Updates below). Minor updates can install automatically; major versions always ask first.
  • The app updates itself via Sparkle — only for actual changes to the menu-bar app, which are rare.
  • Or it manages nothing at all. If you already run Syncthing yourself, Settings can point the app at your instance instead (see Using your own Syncthing).

The menu

Click the menu-bar icon for:

  • Live status — a colored dot and a one-line state: running, syncing, paused, starting, stopped, failed, or needing attention (a folder Syncthing can't access).
  • Open Syncthing — Syncthing's full web interface in your browser.
  • Folders — your sync folders; click one to open it in Finder.
  • Rescan All and Pause All Devices ⇄ Resume All Devices.
  • Start Syncthing — appears when the daemon is stopped or has failed.
  • Update … to X — a direct install action per channel, appearing only while that update is pending.
  • Activity… — a live, file-by-file view of what Syncthing is doing (below).
  • Settings… — update preferences for both channels, Open at login, and Full Disk Access setup. Carries a caution badge when a folder needs attention.
  • About Syncthing Menu — versions and release-notes links for both.
  • Quit — stops the daemon it manages, then exits.

The menu-bar icon itself reflects state: a quiet monochrome mark when all is well, distinct marks while syncing or paused, an alert mark when the daemon can't run or a folder needs attention, and a badged variant when an update is available. Its tooltip always carries the full one-line story.

Activity

A live view of what Syncthing is doing, file by file: each change, which device made it, and its progress from detected through delivered, applied, or failed. Rows filter by change type and origin and sort by any column, and the window can be pinned above others. Holding ⌥ over the menu item turns it into Activity (Reset Layout)…. The window costs nothing while closed.

The Syncthing Menu Activity window

Permissions

When the app manages Syncthing, it launches the daemon directly as a background process, so on a couple of occasions macOS may ask you to grant it access. This is expected.

Local Network

The first time Syncthing tries to reach other devices, macOS shows a Local Network prompt. Allow it — Syncthing needs local-network access to discover and sync with your other machines.

Full Disk Access (only sometimes)

macOS protects certain locations (Desktop, Documents, Pictures, Downloads, and external/network volumes). If you sync a folder in one of those, Syncthing may need Full Disk Access. Folders in ordinary locations need nothing.

Settings includes a Set Up Full Disk Access… helper that reveals the exact file to grant and opens the right System Settings pane. One important detail: the file to enable is the lowercase syncthing binary this app manages — if you also run the standalone Syncthing app, that's a separate entry and granting it won't help.

Updates

Two independent update channels, surfaced as matching cards in Settings (the Syncthing channel only while the app manages the daemon):

  • Syncthing (the daemon): auto-check is on by default. Automatic install of minor updates is off by default (you can turn it on); major updates always ask first. After an update is applied, the app restarts the daemon so it comes back up cleanly.
  • Syncthing Menu (the app): delivered through Sparkle; auto-check is on by default. Automatic install is off by default — with it on, updates download in the background and install silently, no dialogs.

Every version shown is a link to its release notes, and each card notes when it last checked.

The Syncthing Menu Settings window

Using your own Syncthing

Already running Syncthing yourself? In Settings, set Syncthing ismanaged by me and give it the port and API key of your local instance — the key is in Syncthing's web interface under Actions → Settings → General. The card reports the live connection state as you type.

The app is then purely an interface: menu, status, folders, and Activity work as usual, but it never downloads, starts, stops, or updates Syncthing, and quitting leaves your daemon running. Everything above describes the default, managed by this app.

Troubleshooting & reporting a problem

Syncthing Menu logs through the macOS unified logging system under the subsystem io.github.gtunes-dev.SyncthingMenu. To watch events live, use Console.app (filter by that subsystem) or:

log stream --predicate 'subsystem == "io.github.gtunes-dev.SyncthingMenu"'

To capture recent history for a bug report:

log show --last 2h --predicate 'subsystem == "io.github.gtunes-dev.SyncthingMenu"' > syncthing-menu.log

The daemon the app manages also keeps its own rotating log file, which survives app restarts:

~/Library/Application Support/Syncthing Menu/home/syncthing.log

When filing an issue, please attach both logs along with the app and Syncthing versions from the About box. Before posting, review both logs and redact anything you'd rather not share — the daemon log in particular can mention your folder names and paths, device names and IDs, and local network addresses. Issues are public.

Building

Requires Xcode 26 on a macOS 26 host. The project format itself needs only Xcode 16, but the layered AppIcon.icon compiles only on macOS 26 — which is what CI uses.

# Open in Xcode and run, or build unsigned from the CLI:
xcodebuild -project SyncthingMenu.xcodeproj -target SyncthingMenu \
  -configuration Debug CODE_SIGNING_ALLOWED=NO build
# Run the test suite:
Scripts/test.sh

To run a locally signed build from Xcode, set your team in the target's Signing & Capabilities tab.

Project layout

Sources/                 Swift sources, asset catalog, and the layered app icon
Tests/                   Unit + integration tests (Swift Testing; run with Scripts/test.sh)
Config/                  Info.plist + entitlements (referenced via build settings)
Scripts/                 test.sh, release + notarization, icon and dev helpers
design/                  Icon and logo design sources
docs/                    Screenshots used by this README
.github/workflows/       ci.yml (build + tests), release.yml, soak-build.yml
SyncthingMenu.xcodeproj  App + test targets

Sources/ is a file-system-synchronized Xcode group: adding a file to the directory adds it to the target, with no project edit needed. Each source file opens with a comment explaining its role.

Distribution identity

Bundle identifier: io.github.gtunes-dev.SyncthingMenu (permanent — it's the app's identity for preferences and the Sparkle update feed).

Signed with an Individual Apple Developer ID, so the code signature reads Developer ID Application: Greg Friedman (<TeamID>). The 10-character Team ID may appear in project files once signing is configured; that's expected and not sensitive. Signing certificates and notarization credentials are never committed (see .gitignore).

Acknowledgments

Syncthing is an independent project; this is an unofficial wrapper and is not affiliated with or endorsed by it. Syncthing Menu downloads and runs the official Syncthing binary unmodified.

The Syncthing logo used in this app is © The Syncthing Authors / Kastelo AB and is licensed under the Mozilla Public License 2.0.

License

MIT — see LICENSE. Copyright © 2026 Greg Friedman.

Read the original on github.com ↗