Desktop cockpit for Sail. Mast connects to your Sail control plane over SSH and gives you the spec board, agent rooms, live agent logs, a terminal into any project container, and a file workbench.
macOS only today. The build is universal, so it runs on Apple Silicon and Intel.
Download Mast_<version>_universal.dmg from the
latest release, open it, and drag
Mast to your Applications folder.
The app is signed with a Developer ID certificate and notarized by Apple, so it opens on first launch without a Gatekeeper warning.
Mast updates itself. It checks a few seconds after launch, and you can check on demand from the user menu, which also shows the version you are running.
Mast is a client, so it needs a Sail control plane to talk to. It reads the same
configuration the sail CLI writes:
~/.sail/config.yamlgives it the host and the control-plane address. Without that file Mast reportsno ~/.sail/config.yamlat startup. Runsail host configfirst.~/.ssh/configgives it the route. Mast dials the host and follows everyProxyJumpin the chain to reach project containers.- Authentication tries your ssh-agent first, then key files:
IdentityFile, thekey:in~/.sail/config.yaml, then the default~/.ssh/id_*. Runssh-addif your agent is empty.
Signing in to the control plane is a passkey ceremony. Mast forwards 127.0.0.1:7070 to the
devbox, opens your browser at that origin, and captures the session token the login page
hands back.
You need Bun 1.3.14, a stable Rust toolchain (edition 2021, 1.77+), and macOS to run or build the app. Typecheck and tests run anywhere Bun does.
bun install
bun run dev # tauri dev, rebuilding the web bundle first
bun test # webview DOM + core, happy-dom preload
bun run typecheck # tsc --noEmit
bun run build # tauri buildCI runs typecheck, bun test, and cargo test on macos-15 for every pull request. Pushing
a mast-v* tag builds, signs, notarizes, and cuts a release.
src-tauri/ Rust core
src/ssh.rs connection, ProxyJump chain, sftp, terminal channels, SSE streams
src/login.rs passkey ceremony over a temporary local forward
src/lib.rs the commands the webview can call
src/
mainview/ React 19 UI: board, rooms, terminal, file workbench, updater
mainview/tauri/ the Tauri transport, invoke plus events
shared/ Sail API models and RPC types
docs/decisions/ ADR-per-fix records
The Rust core exposes about two dozen commands to the webview: sail_request for the
control-plane REST API, stream_open for SSE tails, fs_* for the workbench over sftp, and
terminal_* for interactive shells. Terminal rendering is
ghostty-web.
MIT. See LICENSE.