Skip to content

Installation

Nova Code ships as a Vue dashboard, Fastify API, and PostgreSQL data store. The quickest path on a machine with Docker is the install.sh helper; you can also run Compose from a git clone or install manually.

  • Docker + Docker Compose (recommended), or Node.js 24 and PostgreSQL 17 for a manual install
  • Cursor Agent and/or Claude Code CLI on the host (or in the container image), authenticated via Settings → Agent Auth after install
  • Optional Mistral Vibe — install the vibe CLI on PATH, set the API key in Settings, and ensure ~/.vibe/logs/session is writable (see Sessions)
  • Workspace directories must be reachable by the server process (see bind mounts below)

The easiest way to get started. The script installs (or updates) Nova Code under ~/.novacode, generates secrets, pulls the Docker image, and starts Compose.

Prerequisites: Docker with Compose (docker compose or docker-compose) and openssl for first installs.

Terminal window
curl -fsSL https://raw.githubusercontent.com/JonahFintzDev/novacode/main/scripts/install.sh | bash

On first install you may be prompted to add host directory mounts for workspaces (mapped under /data-root/... in the container). After it finishes, open http://localhost:3030 and complete first-run setup in the browser.

Re-run the same command anytime to update to the latest version.

VariablePurpose
NOVACODE_DIRInstall root (default: ~/.novacode)
NOVACODE_INSTALL_BASE_URLRaw GitHub URL for fetching compose and env files (for forks)
NOVACODE_IMAGEContainer image (default: novacode/novacode:latest)
Terminal window
git clone https://github.com/JonahFintzDev/novacode.git
cd novacode
cp .env.example .env
# Set POSTGRES_PASSWORD, JWT_SECRET, and UID/GID as documented below.
export UID=$(id -u) GID=$(id -g)
docker compose up --build -d

Open http://localhost:3030 (or whatever you set PORT to) and complete first-run setup to create the admin account.

VariableRequiredDescription
POSTGRES_PASSWORDYesPassword for the PostgreSQL user
JWT_SECRETYesLong random string for signing JWTs — generate with openssl rand -hex 32
PORTNoHTTP port (default: 3030)
UID / GIDNoHost user/group for container file ownership (default: 1000)
VIBE_COMMANDNoOverride the Mistral Vibe executable name (default: vibe)
AGENT_ENV_*NoAny variable prefixed with AGENT_ENV_ is forwarded to spawned agents with the prefix stripped

Keep JWT_SECRET stable across restarts and upgrades. Changing it invalidates all browser sessions.

  1. Install PostgreSQL 17 and create a database.
  2. Set DATABASE_URL or the individual POSTGRES_* variables (POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, and optional host/port).
  3. In the API directory: install dependencies, run Prisma migrations, build, and start.
  4. Build the dashboard and serve its dist folder via the API (production) or proxy separately (development).
  5. Set VITE_API_URL so the dashboard can reach the API.

See the application README for exact commands and package.json scripts.

  • First-run setup: The app shows a setup screen on first launch — create your admin account there.
  • Agent authentication: Go to Settings → Agent Auth and log in to Cursor and/or Claude using the embedded terminal. For Mistral Vibe, set the API key in Settings → Mistral Vibe.
  • Git over SSH: The server creates an ed25519 keypair on first start. Copy the public key from Settings → Git into your Git provider to enable git push over SSH.
  • Health check: GET /api/health returns server status without authentication — use it for Docker HEALTHCHECK or uptime monitors.
  • Volume mounts: The stock compose maps ~/.novacode/data to /data-root (your project files) and ~/.novacode/config to /config (app state and agent credentials). Add more bind mounts if your repos live elsewhere.
  • FAQ — common self-hosting questions
  • Privacy — data boundaries and providers