Install
Sealmesh runs on macOS and Linux, on arm64 and x86_64. Windows isn't supported yet (see Status).
Homebrew
brew install sealmesh/tap/sealmesh # CLI and daemon
brew install sealmesh/tap/sealmesh-mcp # MCP server, for coding agents
brew install sealmesh/tap/sealmesh-server # the router, if you run one
Shell installer
Downloads the prebuilt binary for your platform from the latest GitHub release:
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/SealMesh/sealmesh/releases/latest/download/sealmesh-installer.sh | sh
Every binary and its checksum is also on the releases page.
Cargo
cargo install --locked sealmesh sealmesh-mcp
--locked is required, not a precaution. Without it cargo ignores the lockfile and re-resolves every dependency, and that resolution fails: gix pulls in bisync, and every published version of bisync is yanked. If you see a resolution error naming a yanked crate, you left the flag off.
From source
With Rust 1.95 or newer (the repository pins 1.95.0):
git clone https://github.com/SealMesh/sealmesh.git
cd sealmesh
cargo install --locked --path crates/sealmesh
cargo install --locked --path crates/sealmesh-mcp
The path names the crate, not the workspace root, which is a virtual manifest with no binary.
Router image
docker pull ghcr.io/sealmesh/sealmesh-server:latest
A distroless, non-root image listening on 8787 with history in /data. See Run a router.
Keep it running
On macOS, a launchd agent at ~/Library/LaunchAgents/dev.sealmesh.daemon.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key><string>dev.sealmesh.daemon</string>
<key>ProgramArguments</key>
<array><string>/opt/homebrew/bin/sealmesh</string><string>daemon</string></array>
<key>EnvironmentVariables</key>
<dict><key>PATH</key><string>/opt/homebrew/bin:/usr/bin:/bin</string></dict>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>StandardOutPath</key><string>/Users/YOU/Library/Logs/sealmesh.log</string>
<key>StandardErrorPath</key><string>/Users/YOU/Library/Logs/sealmesh.log</string>
</dict>
</plist>
launchctl load -w ~/Library/LaunchAgents/dev.sealmesh.daemon.plist
tail -f ~/Library/Logs/sealmesh.log
PATHmatters. The daemon reads its token by runninggh, and launchd starts with an environment that doesn't include Homebrew.- Keep the log out of
/tmp. It's world-writable, and launchd would create the file world-readable and follow a symlink already sitting there.
The daemon reconnects on its own after sleep, network changes or a router restart. On Linux, run sealmesh daemon as a systemd user service. No unit file ships yet.
Uninstall
launchctl unload -w ~/Library/LaunchAgents/dev.sealmesh.daemon.plist
rm ~/Library/LaunchAgents/dev.sealmesh.daemon.plist
rm -rf ~/.config/sealmesh ~/.cache/sealmesh ~/.local/state/sealmesh
brew uninstall sealmesh # or: cargo uninstall sealmesh
There's nothing to ask anyone to delete: the router holds no snapshot of you.