Installation
Get Merlin Agent up and running in under two minutes!
For the full platform support matrix (which OSes, distribution methods, and platform-gated features are supported), see Platform Support.
Quick Install
Desktop packages on macOS or Windows
Download the package for your platform from the Merlin website.
- Windows: download
Merlin-Setup-0.1.5-x64.exefrom the releases page (or the download button on the landing page) and run it. It installs per-machine intoC:\Program Files\Merlin, adds Start Menu and desktop shortcuts, and registers an uninstaller in Apps & Features. The preview build is unsigned, so SmartScreen asks for More info → Run anyway. The.appinstallerdownload is the signed lane instead: open it with Windows App Installer and it installs the signed MSIX bundle and records its update source. Microsoft Store packages have separate Store ownership. - macOS (Apple Silicon): download
Merlin-Setup-0.1.5-arm64.dmgfrom the same release, open it, then copyMerlin.appto Applications. This preview build is unsigned and not notarized — Gatekeeper refuses the first launch, so right-click the app → Open (or runxattr -dr com.apple.quarantine /Applications/Merlin.apponce).
Bundled packages contain the agent, Python, supported dependencies, and prebuilt interfaces. First launch does not build that base runtime. Provider access and optional integrations can still require network access.
A Merlin-Setup bootstrap installer is different: it downloads a source
installation and builds the desktop app. Light is a remote-only build variant,
not a bundled local runtime. See Merlin Desktop.
The macOS installer is Apple Silicon only. macOS on x86 (Intel) processors is not a supported platform.
Without Merlin Desktop:
For a command-line only install without Merlin Desktop, run:
Linux / macOS / WSL2
curl -fsSL https://merlin-agent.epinoiahorizon.com/install.sh | bash
Windows (native)
Run in powershell:
iex (irm https://merlin-agent.epinoiahorizon.com/install.ps1)
If you want to install & run Merlin Desktop after a command-line only install, simply run
merlin desktop
Android / Termux
Use the Termux APT package on aarch64 Android devices.
Configure its signed repository before running pkg install merlin-agent.
The desktop/server scripts are not the Termux installation path.
What the source installer does
The scripts clone the source, bootstrap uv, and delegate dependency preparation
to PM. PM provides pinned Python, Node.js, npm, ripgrep, and FFmpeg. The source
installation selects the all Python extra, not every optional extra.
PM also installs the browser and computer-use tools by default: agent-browser
and its pinned Chromium, and cua-driver (the computer-use driver, on macOS,
Windows and glibc Linux). If a download fails, the install still completes and
prints the command to retry. The default browser driver (browser-harness, the
engine of the Browser Use CLI) is a regular Python dependency, so every install,
the Desktop app included, already has it.
Other optional tools use their feature-specific installation paths.
To leave the browser tools out, pass --skip-browser on POSIX or -SkipBrowser
on Windows; for the computer-use driver, --skip-computer-use /
-SkipComputerUse. Merlin remembers these choices: later installs and
merlin update do not add them back. Run merlin pm install agent-browser or
merlin pm install cua-driver to install them and undo the choice.
The scripts create a launcher and prepare the data directory. Interactive runs
also invoke setup and gateway configuration. --non-interactive on POSIX, or
-NonInteractive on Windows, skips stages that need input. The optional
--include-desktop / -IncludeDesktop stage builds the desktop from source.
On a terminal the scripts show one status line per step and write the output
of git, uv and the builds to logs/install.log under the Merlin data
directory; a failed step prints its last lines and the log path. CI (CI or
GITHUB_ACTIONS set), redirected output, --verbose / -Verbose or
MERLIN_INSTALL_VERBOSE=1 stream everything instead.
Install layout
| Method | Code | CLI entry point | Default user data |
|---|---|---|---|
| POSIX source script | ~/.merlin/merlin-agent/ | ~/.local/bin/merlin wrapper | ~/.merlin/ |
| Windows source script | %LOCALAPPDATA%\merlin\merlin-agent\ | %LOCALAPPDATA%\merlin\bin\ | %LOCALAPPDATA%\merlin\ |
| Desktop bundle | Inside the installed app package | Packaged launchers; Windows execution aliases | Platform default Merlin data directory |
| Docker | /opt/merlin/ | Image entrypoint and merlin shim | Mounted /opt/data/ |
| Termux APT | $PREFIX/lib/merlin-agent/ | Symlinks in $PREFIX/bin/ | ~/.merlin/ |
MERLIN_HOME selects user data. The POSIX script's --dir selects its source
checkout independently. Windows provides -MerlinHome and -InstallDir.
Running the POSIX script as root does not select an automatic FHS layout:
it uses root's home unless you provide an explicit source path.
PM's tool store and per-install Python generations have separate lifetimes. See Package management for their locations. Do not remove the data root to repair an application installation.
After Installation
Reload your shell and start chatting:
source ~/.bashrc # or: source ~/.zshrc
merlin # Start chatting!
To reconfigure individual settings later, use the dedicated commands:
merlin model # Choose your LLM provider and model
merlin tools # Configure which tools are enabled
merlin gateway setup # Set up messaging platforms
merlin config set # Set individual config values
merlin config get # Inspect individual config values
merlin setup # Or run the full setup wizard to configure everything at once
One subscription covers 300+ models plus the Tool Gateway (web search, image generation, TTS, cloud browser). Skip the per-tool key juggling:
merlin setup --portal
That logs you in, sets Atlas as your provider, and turns on the Tool Gateway in one command.
You don't need to rebuild your setup from scratch. Restore a full backup with merlin import (see Exporting Merlin to another machine), or bring over a single agent with merlin profile import (see Moving a single profile to another machine). Note that a profile export excludes credentials by design, so an export alone is not a full backup — merlin backup vs merlin profile export explains which to use.
Prerequisites
For the POSIX source script, provide Git, curl, tar, and SHA-256 utilities. Windows can bootstrap its pinned Git for Windows archive when Git is absent. The script always downloads its verified uv pin; a uv already on your PATH is never used.
Current first-party installations run on Python 3.14. The broader
>=3.11,<3.15 range in pyproject.toml lets older Python installations
run the updater before PM switches them to 3.14; it does not promise current
runtime support on 3.11–3.13. PM selects the managed tool versions from
pm/lock.json; it does not adopt arbitrary system Node versions as the
installed runtime.
Source builds can require a native compiler and platform development libraries. Building Electron from source adds Node native-module requirements. These build prerequisites do not apply to installing a complete desktop package. Linux Chromium also requires system libraries supplied by the distribution.
Nix is no longer an explicitly supported install path (best-effort only). If you already use Nix (on NixOS, macOS, or Linux), there's a dedicated setup path with a Nix flake, declarative NixOS module, and optional container mode. See the Nix & NixOS Setup guide.
Manual / Developer Installation
For a source checkout, start with the PM developer workflow. It covers activation, daily commands, dependency refresh, and current bootstrap limits. Development Setup covers the separate test environment and checks.
Non-Sudo / System Service User Installs
Run the source installer as the intended service user. Its home, tool store, configuration, and launcher must belong to that user.
-
As an administrator, install the source-build prerequisites and any Linux libraries needed by the selected browser backend.
-
As the service user, run the regular installer:
curl -fsSL https://merlin-agent.epinoiahorizon.com/install.sh | bash -
Add the actual launcher directory to the service user's shell environment:
export PATH="$HOME/.local/bin:$PATH" -
Run
merlin doctorfrom that account. Use the installed wrapper, not a hardcodedvenv/bin/merlinpath. -
For a Linux user service that must survive logout, enable lingering as an administrator:
sudo loginctl enable-linger SERVICE_USER
The current source installer does not run Playwright's --with-deps step or
provide a package-manager-specific sudo fallback. PM manages tool binaries;
the administrator supplies system libraries. See
Browser automation and
Messaging Gateway.
Troubleshooting
| Problem | Solution |
|---|---|
merlin: command not found | Reload your shell (source ~/.bashrc) or check PATH |
API key not set | Run merlin model to configure your provider, or merlin config set OPENROUTER_API_KEY your_key |
| Missing config after update | Run merlin config check then merlin config migrate |
For more diagnostics, run merlin doctor — it will tell you exactly what's missing and how to fix it.
Symlinked home directories and external storage
Merlin supports a symlinked MERLIN_HOME and symlinked home subdirectories,
including hooks, skills, sessions, and logs. During home initialization,
existing directory links are preserved, and permissions on linked directories
(and descendants such as logs/curator) are left to their owner.
If a link target is missing, inaccessible, or not a directory, initialization stops with a storage error naming the path and link target. Merlin does not replace the link or create its missing target: doing so could write data onto the local disk while an external or NAS volume is unmounted. Check the reported link, restore the mount or correct its target, and verify access permissions before retrying. For a deliberately new dotfiles target, create it yourself only after confirming the intended storage is available.
merlin doctor reports these failures as storage problems, not invalid YAML.
Keep your existing config.yaml; running merlin setup is not the repair for an
unavailable directory. This is a directory-availability check, not a mount monitor:
an existing directory cannot establish that the intended volume is mounted.
Install method auto-detection
The update owner depends on the running installation, not only its data home.
Source checkouts use the managed Git update path. Desktop bundles, Docker,
Nix, and Termux packages retain their package owner's update mechanism.
merlin doctor reports installation provenance. See
Updating & Uninstalling before changing package-owned files.