---
title: "One-line installer, MCP servers, devcontainers, and new CLI commands"
date: "2026-03-10"
---

## One-line installer and guided setup wizard

Getting Fabro installed and configured previously required multiple manual steps — downloading binaries, setting API keys, and configuring GitHub integration individually. Now, a single command installs Fabro and walks you through everything:

```bash
curl -fsSL https://raw.githubusercontent.com/fabro-sh/fabro/main/install.sh | bash
fabro install
```

The installer detects your platform, installs to `~/.fabro/bin`, and auto-configures your shell PATH. The `fabro install` wizard then guides you through LLM provider setup with immediate API key validation, OpenAI OAuth for Codex compatibility, and GitHub App creation via manifest flow — all with styled terminal output showing progress at each step.

## MCP servers in workflows

Agents running inside sandboxes can now access MCP tools during workflow runs. A new `sandbox` transport type starts an MCP server inside the Daytona sandbox, waits for it to listen, and connects automatically — no host-side setup required. This means agents can use tools like Playwright for browser automation, or any other MCP server, directly from within their sandbox environment.

```toml title="workflow.toml"
[mcp_servers.playwright]
type = "sandbox"
command = ["npx", "@playwright/mcp@latest", "--port", "3100", "--headless"]
port = 3100
```

## Devcontainer support in sandboxes

Workflows can now use your project's `devcontainer.json` to configure sandbox environments. When `devcontainer = true` is set in the sandbox config, Fabro resolves the devcontainer from the repo, uses its Dockerfile for the Daytona snapshot, runs lifecycle hooks (`onCreateCommand`, `postCreateCommand`, `postStartCommand`), and merges devcontainer environment variables into the sandbox. Unsupported `COPY`/`ADD` instructions in base Dockerfiles are detected and reported.

```toml title="workflow.toml"
[sandbox]
devcontainer = true
```

<Warning>
**Historical note.** This release temporarily standardized on `~/.fabro/.env`, but later releases removed automatic dotenv loading in favor of server-owned secrets plus explicit process environment variables.
</Warning>

## Manage PRs with fabro pr

`fabro pr list`, `fabro pr view`, `fabro pr merge`, and `fabro pr close` let you manage pull requests created by workflow runs without leaving the CLI. Pair with `fabro pr create` (introduced Mar 9) for the full lifecycle.

```bash
fabro pr list               # list PRs from workflow runs
fabro pr view <run-id>      # view PR details
fabro pr merge <run-id>     # merge a workflow PR
```

## Scaffold projects with fabro init

`fabro init` generates a `fabro.toml` with sensible defaults for your project — workflow aliases, pull request config, and sandbox settings — so you can go from zero to `fabro run` in seconds.

```bash
fabro init
```

## View run diffs with fabro diff

`fabro diff` shows the code changes from any workflow run. It works on both completed and in-progress runs — for active runs, you get a live diff of the current state.

```bash
fabro diff <run-id>
```

## Preview sandbox URLs with fabro preview

`fabro preview` returns preview URLs for ports exposed by Daytona sandboxes, so you can open a running web app or service directly from the CLI.

```bash
fabro preview <run-id>
```

## More

<Accordion title="API">
- New signoff resource in the verification system — stamps of approval for (control, repository, commit SHA) tuples via `POST /verification/signoffs`
</Accordion>

<Accordion title="CLI">
- `fabro setup` renamed to `fabro install` for clarity
- Added `fabro ssh` command for direct SSH access to Daytona sandboxes
- `fabro doctor` now runs live service probes by default
- `fabro doctor` now validates GitHub App configuration and private key
- `fabro doctor` now hides unconfigured LLM providers for a cleaner output
- `fabro doctor` sections reordered: Config, LLM, GitHub App, Cloud sandbox, Brave Search
- `fabro run --preflight` now shows a Repository section, merged LLM check, and truncated output
- Added `[pull_request]` support to project config (`fabro.toml`) for project-level PR defaults
- Per-run data moved from `~/.fabro/logs/` to `~/.fabro/runs/`; daily CLI logs stay in `~/.fabro/logs/`
- Per-run tracing logs now written to `cli.log` inside each run directory
- Asset paths now display full `~/...` paths after workflow run output
- Hidden `fabro ps`, `llm`, `exec`, and `parse` from CLI help output
- PR body now includes Fabro Details section even when retro is skipped
- Bumped version to 0.2.0
</Accordion>

<Accordion title="Fixes">
- Fixed Daytona sandbox clone failing when the worktree branch hadn't been pushed to the remote
- Fixed "Git clean: false" showing incorrectly for remote sandboxes by checking both clean and pushed status
- Fixed LLM provider resolution to check the model catalog before falling back to the default provider
- Fixed `install.sh` prompt not showing when piped via stdin
- Fixed race condition in git checkpoint push operations
</Accordion>
