Installation
The supported way to run Modulo is Docker Compose, on Docker Desktop or a Docker Engine on Linux. On Linux, a native install is also supported. See Platform support for the full matrix.
Platform support
Modulo v1 targets Linux server hosts. This is the supported platform matrix, mirroring the product’s system requirements. For the quick answer, see What infrastructure does Modulo need?.
Server host platforms
| Server host platform | v1 status |
|---|---|
| Linux | Supported (native install and container paths) |
| macOS | Not a supported v1 server host: no native installer, no macOS release artifact |
| Windows | Not a supported v1 server host: no native installer, no Windows release artifact |
Docker Desktop on macOS or Windows is a developer convenience: it runs the Linux containers inside a Linux virtual machine, so the deployed stack is still Linux. It is not a supported production host.
Docker Compose
The Docker Compose path is distribution-agnostic, apart from its Docker requirement: any Linux distribution that can run Docker 24+ (Docker Engine or Docker Desktop) and Docker Compose v2.20+ works, at any glibc version, because the PostgreSQL, Redis, API, frontend, and worker containers carry their own dependencies.
Native install: distributions
The native install is Linux-only. The bundle ships its own PostgreSQL 16, Redis 8, and Python runtime, so the host requirement is the bundled service binaries’ glibc floor:
| Distribution | glibc | Status |
|---|---|---|
| Debian 13+ | 2.41 | Supported |
| Ubuntu 26.04+ | 2.41+ | Supported |
| Ubuntu 24.04 and earlier | 2.39 and below | Not supported (below the bundled service-binary floor) |
| macOS | - | Out of scope for v1 |
| Windows | - | Out of scope for v1 |
The hard requirement is glibc 2.41 or newer. An Ubuntu 24.04 host (glibc 2.39) is below the floor and is not a supported native-install target.
Native install: architectures
| Architecture | Status |
|---|---|
| linux-amd64 (x86_64) | Supported |
| linux-arm64 | Planned (pins exist; no artifact published yet) |
| macOS / Windows | Out of scope for v1 |
The native bundle is currently built and published for linux-amd64 only. There is no linux-arm64 download yet.
Prerequisites
- Docker 24+ (Engine or Desktop) and Docker Compose v2.20+
- 4 GB RAM minimum (8 GB recommended)
Quick start
The default docker-compose.yml starts everything in one command: Postgres 16, Redis 8, the API, the frontend, and the queue workers. The first run builds the Docker images, which takes several minutes; subsequent starts are fast.
git clone https://github.com/farnalabs/modulo
cd modulo
docker compose up -d
Open http://localhost:5173 and log in with admin:admin. These are development credentials: change them before exposing the instance beyond local use. The backend runs database migrations automatically on first start.
Development setup
For local development with hot-reload, use the development Compose file and start the API and frontend separately:
Development prerequisites
- Python 3.12+ and uv (or pip)
- A GitHub account (for GitHub connector setup)
Steps
Start the database and queue services first:
git clone https://github.com/farnalabs/modulo
cd modulo
# Start Postgres 16, Redis 8, and the queue workers
docker compose -f docker-compose.local.yml up -d
Generate the two secret keys. SECRET_KEY must be at least 32 bytes (known placeholder values are rejected at startup), and FERNET_KEY must be a valid Fernet key, so do not invent values by hand:
python -c "import secrets; print(secrets.token_hex(32))" # SECRET_KEY
python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" # FERNET_KEY
Create a .env file in the backend/ directory and paste the generated outputs:
DATABASE_URL=postgresql+asyncpg://modulo:changeme@localhost:5434/modulo
# The development Compose file publishes Redis on port 6380
REDIS_URL=redis://localhost:6380/0
# Paste the SECRET_KEY output from the generator above
SECRET_KEY=paste-generated-key-here
# Paste the FERNET_KEY output from the generator above
FERNET_KEY=paste-generated-key-here
# Local development login only. Use a strong password outside local development.
MODULO_USERS=admin:admin
# CORS (Cross-Origin Resource Sharing): comma-separated allowed origins
CORS_ORIGINS=http://localhost:5173
Run migrations and start the API:
cd backend
uv run alembic upgrade heads
uv run uvicorn modulo.api.main:app --reload --port 8000
In another terminal, start the frontend:
cd frontend
npm run dev
Open http://localhost:5173 and log in with admin:admin.
Native install (Linux)
On Linux, Modulo can also be installed natively, without Docker:
curl -fsSL https://raw.githubusercontent.com/farnalabs/modulo/main/scripts/install.sh -o modulo-install.sh
bash modulo-install.sh
Download the script to a file and run it rather than piping it straight into a shell. The installer verifies every download’s sha256 before executing anything, and a streamed install skips that verification.
The installer:
- Downloads the release bundle for your architecture from GitHub Releases and verifies it
- Installs a bundled stack: PostgreSQL 16, Redis 8, and a bundled Python runtime (no Docker or system Python needed)
- Installs everything under your home directory and puts
moduloon your PATH
modulo start runs everything: PostgreSQL, Redis, the API, and the queue workers. On systemd hosts, an optional systemd user unit manages it.
Which install to pick:
| Install | Use for |
|---|---|
| Docker Compose | Servers and production deployments |
| Native install | Workstations and evaluation |
| Kubernetes (Helm) | Teams running Modulo on a cluster they control |
To run the whole stack on a Kubernetes cluster, use the Helm chart: see the Kubernetes guide for prerequisites, the values to set, and notes for Amazon Elastic Kubernetes Service (EKS), Azure Kubernetes Service (AKS), Google Kubernetes Engine (GKE), and any other conformant cluster.
The full native install, upgrade, and backup/restore documentation lives in the deployment docs.
Related
- Kubernetes: deploy the stack with Helm and run agent workspaces as pods
- Execution Environments: where agent code runs and runtime provider options
- Configuration: environment variables and backend setup
- Getting Started: run your first pipeline after install
- Troubleshooting: common setup issues and fixes
- Connectors: configure tool integrations