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
- Homebrew:
brew uninstall --cask unison-ui - Manual: move
unison-ui-mac.appto the Trash. To also remove saved settings, rundefaults delete net.courbage.unison-ui-mac.