Install Unison UI for macOS

Requirements: macOS 15 (Sequoia) or later, Apple Silicon. Free and open source under the GPLv3.

Two ways to install, whichever fits your setup. Both receive updates through Sparkle. Whether the app checks automatically depends on the choice made at first launch, and a manual check is always available from App menu ▸ Check for Updates.

Homebrew

brew install --cask bcourbage/tap/unison-ui

The app keeps itself up to date through Sparkle, so there is no need to re-run Homebrew to update.

Direct .app download

Download the latest unison-ui-mac-<version>.app.zip from the GitHub Releases page, unzip it, and move unison-ui-mac.app to the Applications folder.

Build from source

Full build instructions are in INSTALL.md. In short: install Xcode, xcodegen, and OCaml 5.5.0 built for the macOS 15 deployment target, then run make build (or make install). A prebuilt OCaml engine is vendored, so an everyday build compiles Swift and links in a few seconds rather than compiling Unison from source.

The unison command

The app bundle includes a command-line launcher. Linked onto your PATH under the name unison, it makes one command serve both of Unison's roles through this app. unison -ui graphic <profile> opens the app and starts that profile's connection and scan right away, stopping at the reconciliation results so you can review before anything is applied. unison -ui text <profile> runs Unison's text interface in the terminal on the app's embedded engine. unison -server, which another machine runs over ssh when it syncs to this Mac, is served by that engine, so a Mac with this app needs no separate Unison installation to be the far side of an SSH profile.

A bare unison <profile>, with no -ui, follows the Default interface preference in Settings ▸ Command Line, which is Graphical unless you save Text. So by default it opens the app on that profile. This is a change from earlier versions, where a bare unison <profile> ran the text interface; pass -ui text, or set the preference to Text, to keep that. For scripts and scheduled jobs, pass -ui text explicitly, since a graphical launch with no available session (over ssh, from cron, or from launchd) is refused with a message rather than run in the terminal. When the app is already running, a unison <profile> request goes to that instance and carries its options (-path, -include, -source), so the profile opens scoped just as it would at a fresh launch. If the app is busy — scanning, showing results, or finishing a run — an accepted request waits and opens the profile once that work finishes, rather than being turned away; a synchronization in progress raises a decision, and some requests are still refused. The manual covers the exact handling.

Homebrew installs create the unison link automatically — unless the unison formula already owns that name, in which case Homebrew installs the app but keeps the formula's command; the manual covers running both. For a direct download, Settings ▸ Command Line can add the app's bundled unison to your login-shell PATH with no administrator password: it shows what unison currently resolves to, writes a marked block to your shell startup file when it can do so safely, and otherwise shows what to add and names the file to edit when it can identify one — when it cannot safely identify the file, such as a redirected ZDOTDIR or an unsupported shell, it says so rather than point at the wrong file. The app also offers this at first launch when nothing on your PATH is named unison. Details, and the note for machines that sync to this Mac over ssh, are in the manual.

Updating

Once installed, the app checks for updates through Sparkle over a cryptographically signed feed. Check any time from App menu ▸ Check for Updates.

Uninstalling