Make sure you've completed the prerequisites for your platform first: macOS or Linux.
Clone and bootstrap
git clone https://github.com/fronalabs/frona.git
cd frona
mise trust
mise installmise install automatically installs the full toolchain: Rust 1.97.1, Node 24.19.0, rust-analyzer, and cargo-watch. Everything is defined in mise.toml. No manual Rust or Node setup needed. The development container uses Python 3.12, matching the production image.
Repository layout
The repo is a Cargo workspace with the frontend alongside:
| Path | Contents |
|---|---|
crates/frona-server/ | Backend server (binary frona) |
crates/frona-cli-mcp/ | The mcpctl CLI used inside MCP sandboxes |
crates/frona-api-types/ | Shared API contract types |
crates/frona-derive/ | Procedural macros |
web/ | Next.js frontend |
resources/ | Prompt templates, policy schema, channel manifests, agent definitions |
data/ | Local runtime state (DB, config, workspaces); gitignored |
Run the dev environment
mise run container:devThis starts everything in a container runtime with hot-reload: Frona backend, frontend, Browserless, and SearXNG. Frona detects Podman first and then Docker. To choose explicitly, set CONTAINER_RUNTIME:
CONTAINER_RUNTIME=docker mise run container:dev
# or
CONTAINER_RUNTIME=podman mise run container:devThe wrapper maps the development container to your host UID and GID so bind-mounted files stay writable. It also creates persistent frontend, Cargo, and sccache caches. Use mise run container:dev:build after changing the development image, and mise run container:dev:down to stop the stack and remove its named development volumes.
Once running, open http://localhost:3000 to access the Frona UI. On first launch, the setup wizard walks you through configuring API keys, model groups, and optional integrations, all from the browser. Settings are saved to data/config.yaml.
You can also configure environment variables via mise.local.toml instead. See the Using mise guide for details and more commands.