Prerequisites
You need the following tools installed before you can run the stack. A Unix-like shell is required (Linux or macOS; WSL2 on Windows).| Tool | Minimum version | Purpose |
|---|---|---|
| Docker | ≥ 24.0 | Container runtime for all services |
| Docker Compose | ≥ 2.20 (v2 plugin) | Multi-container orchestration (docker compose, not docker-compose) |
| Node.js | ≥ 22.0 | JavaScript runtime for the web app and docs site |
| pnpm | ≥ 9.0 | Fast, disk-efficient JS package manager (monorepo workspaces) |
| Python | ≥ 3.11 | Required for the bridge service and test suite |
| uv | ≥ 0.4 | Fast Python package manager (replaces pip/venv) |
| just | ≥ 1.25 | Task runner (replaces make) |
Ubuntu / Debian
macOS (Homebrew)
Arch Linux
Verify your toolchain
Run these commands to confirm everything is installed at the right version:Monorepo layout
The repository is a pnpm workspace with Docker Compose orchestration. Each directory underapps/ is a self-contained service or application:
How services interconnect
UnrealIRCd is the core IRC daemon. Atheme connects to it over a server-to-server link (port 6901) to provide nickname registration, channel management, and other services. The Lounge and ObsidianIRC connect as IRC clients via WebSocket (port 8000). The WebPanel talks to UnrealIRCd’s JSON-RPC API (port 8600) for administration. Prosody runs the XMPP side, handling federated messaging with BOSH/WebSocket endpoints for web clients. The Bridge service relays messages between Discord, IRC, and XMPP channels, connecting to all three protocols simultaneously. The Web app (Next.js) is the public-facing site. The Docs site (this one) is built with Fumadocs and deployed separately to Cloudflare Workers. All services are orchestrated via Docker Compose, sharing a common Docker network. Configuration is templated from.env variables using envsubst during just init.
Verification checklist
After runningjust dev (covered in the Local Development guide), verify each service is running:
running state and HTTP 200 responses from The Lounge and WebPanel.
Common first-run issues
1. CLOUDFLARE_DNS_API_TOKEN warning from Docker Compose
just init generates self-signed certificates instead.
2. pnpm build scripts warning (esbuild/sharp/workerd)
pnpm install because esbuild, sharp, and workerd have native build scripts that pnpm blocks by default. These packages include pre-built fallback binaries, so the warning is non-blocking. Your install will complete successfully.
3. core.hooksPath conflict with pre-commit
If pre-commit install fails or hooks do not run, your Git config may have a core.hooksPath set by another tool. Fix it with:
4. Integration tests timing out
Tests intests/integration/ and tests/e2e/ build fresh Docker images and can time out in constrained environments (CI runners, VMs with limited resources). For quick validation, run unit tests instead:
5. apps/web lint failure (biome .gitignore issue)
Running ultracite check in apps/web/ currently fails because the Biome config expects a .gitignore file in that directory. This is a known pre-existing issue. The Next.js build (pnpm run build) works fine — the lint failure does not affect functionality.
6. Docker daemon not running
Ifdocker compose commands fail with “Cannot connect to the Docker daemon”, start the daemon:
7. Port conflicts with existing services
If a service fails to start with “address already in use”, another process is occupying that port. Check what is listening:.env file.
Next steps
- Follow the Local Development guide to clone, configure, and bring up the full stack.
- Read the Architecture Overview to understand how services communicate.
- See the Environment Variables Reference for the complete list of configuration options.