Skip to content

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

Clone and bootstrap ​

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

mise install automatically installs the full toolchain: Rust 1.98.1, Node 24.21.0, and rust-analyzer. 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
crates/frona-model-catalog/Shared model and parameter catalogues, validation, and refresh
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 ​

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

nu
with-env { CONTAINER_RUNTIME: docker } { mise run container:dev }
# or
with-env { 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. Rootless Podman uses a keep-id user namespace. Missing Podman images and explicit rebuilds use parallel Dockerfile stages; CONTAINER_BUILD_JOBS overrides the job count.

Bacon watches Rust sources, resources, and Cargo manifests inside the container. Changes stop the old server, rebuild, and launch the new process. A failed build leaves the server stopped until compilation succeeds. The container installs a checksum-verified Bacon binary; no host watcher is required. Host dev, dev:backend, and dev:frontend tasks are no longer available.

Kache supplies persistent local and shared compiler caches. Use KACHE_LOCAL_DIR and KACHE_SHARED_DIR to select host cache directories. Frontend output stays in web/.next and web/target; mise run clean empties build directories while preserving their mount roots and retained data.

Use mise run container:dev:build to refresh an existing image. When foreground Podman development exits, the wrapper stops watchers and removes the stack's containers and network while retaining data and caches. For an explicit stop that preserves volumes, run:

nu
bash build/container.sh dev down

mise run container:dev:down also removes 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.