Skip to content

Make sure you've completed the prerequisites for your platform first: macOS or Linux.

Clone and bootstrap

bash
git clone https://github.com/fronalabs/frona.git
cd frona
mise trust
mise install

mise 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:

PathContents
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

bash
mise run container:dev

This 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:

bash
CONTAINER_RUNTIME=docker mise run container:dev
# or
CONTAINER_RUNTIME=podman mise run container:dev

The 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.