# Installing Maestro The repo is private, so grab `install.sh` while signed in to gitea, then run it: 1. Open , click **Raw**, save as `install.sh`. Or from any existing clone: ```sh git show origin/main:install.sh > install.sh ``` 2. Run it: ```sh chmod +x install.sh && ./install.sh ``` The bootstrap script builds `maestro-installer` into a temp directory, runs the wizard, and cleans up — only `maestrod` and `maestro` end up persisted in `~/.cargo/bin`. **Updating is the same command.** Re-running `./install.sh` detects an existing `[daemon]` section in `~/.config/maestro/config.toml` and an existing systemd unit, skips the configure prompt, refreshes the unit, and runs `systemctl --user restart maestrod` instead of `start`. No `--update` flag needed. Inside the script, `cargo install --git https://git.naps.pt/naps62/maestro …` uses your already-configured git credentials for this host (HTTPS helper or SSH agent). If only SSH is set up: ```sh MAESTRO_REPO_URL=ssh://git@git.naps.pt/naps62/maestro ./install.sh ``` Pass flags through to the wizard after `./install.sh`: ```sh ./install.sh --yes --no-systemd ``` The wizard: 1. Runs `cargo install` for `maestro-daemon` and `maestro-cli` (pinned to the committed `Cargo.lock` via `--locked`). 2. Optionally runs `maestrod configure` to populate `~/.config/maestro/config.toml` (one shared TOML for `maestrod`, `maestro-registry`, and the `maestro` CLI). 3. On systemd hosts, optionally writes a user unit at `~/.config/systemd/user/maestrod.service`, reloads systemd, and offers to enable + start it. Both binaries land in `~/.cargo/bin` — make sure that's on your `$PATH`. ## Flags | Flag | Purpose | |---|---| | `--git ` | Install from a different git repo (default: this one). | | `--branch ` | Pin a branch with `--git`. | | `--path ` | Install from a local workspace checkout (`--path` + `-p `). | | `--no-locked` | Drop `--locked` from `cargo install` (resolves a fresh dep tree). | | `--exec-start ` | Override the systemd unit's `ExecStart` (default `~/.cargo/bin/maestrod`). | | `--no-systemd` | Skip the systemd step even if detected. | | `--no-configure` | Skip the `maestrod configure` step. | | `-y`, `--yes` | Non-interactive: install binaries + drop systemd unit + reload + enable, but **don't** auto-run `configure` or auto-start the unit (those need real config). | ## What the systemd unit looks like The wizard writes a *user* unit (`systemctl --user`), since `maestrod` runs per-user and uses tmux sockets under `$XDG_RUNTIME_DIR`. Body: ```ini [Unit] Description=Maestro per-host daemon (maestrod) Documentation=https://git.naps.pt/naps62/maestro After=network-online.target [Service] Type=simple ExecStart=%h/.cargo/bin/maestrod Restart=on-failure RestartSec=5 [Install] WantedBy=default.target ``` Check status / logs: ```sh systemctl --user status maestrod journalctl --user -u maestrod -f ``` ## Running the wizard without the bootstrap script If you'd rather skip the script: ```sh cargo install --git https://git.naps.pt/naps62/maestro maestro-installer maestro-install ``` This leaves `maestro-installer` permanently in `~/.cargo/bin` — the bootstrap script avoids that by installing to a scratch dir. ## Fully manual install (no wizard) ```sh cargo install --git https://git.naps.pt/naps62/maestro --locked maestro-daemon cargo install --git https://git.naps.pt/naps62/maestro --locked maestro-cli maestrod configure maestrod # foreground; or wire your own service manager ``` ## Non-Linux hosts The wizard works on macOS for the `cargo install` + `maestrod configure` parts. The systemd step is automatically skipped (probe of `/run/systemd/system`). launchd integration is not yet supported — start `maestrod` from your shell or your own service manager.