Web UI¶
Compose Farm includes a web interface for managing stacks from your browser. Start it with:
Then open http://localhost:8000.
Features¶
Full Workflow¶
Console terminal, config editor, stack navigation, actions (up, logs, update), dashboard overview, and theme switching - all in one flow.
Stack Actions¶
Navigate to any stack and use the command palette to trigger actions like restart, pull, update, or view logs. Output streams in real-time via WebSocket.
Theme Switching¶
35 themes available via the command palette. Type theme: to filter, then use arrow keys to preview themes live before selecting.
Command Palette¶
Press Ctrl+K (or Cmd+K on macOS) to open the command palette. Use fuzzy search to quickly navigate, trigger actions, or change themes.
Pages¶
Dashboard (/)¶
- Stack overview with status indicators
- Host statistics (CPU, memory, disk, load via Glances)
- Pending operations (migrations, orphaned stacks)
- Quick actions via command palette
Live Stats (/live-stats)¶
Real-time container monitoring across all hosts, powered by Glances.
- Live metrics: CPU, memory, network I/O for every container
- Auto-refresh: Updates every 3 seconds (pauses when dropdown menus are open)
- Filtering: Type to filter containers by name, stack, host, or image
- Sorting: Click column headers to sort by any metric
- Update detection: Shows when container images have updates available
Requirements¶
Live Stats requires Glances to be deployed on all hosts:
- Add
glances_stack: glancesto yourcompose-farm.yaml - Deploy a Glances stack that runs on all hosts (see example)
- Glances must expose its REST API on port 61208
Stack Detail (/stack/{name})¶
- Compose file editor (Monaco)
- Environment file editor
- Action buttons: Up, Down, Restart, Update, Pull, Logs
- Container shell access (exec into running containers)
- Terminal output for running commands
Files are automatically backed up before saving to ~/.config/compose-farm/backups/.
Console (/console)¶
- Full shell access to any host
- File editor for remote files
- Monaco editor with syntax highlighting
Container Shell¶
Click the Shell button on any running container to exec into it directly from the browser.
Keyboard Shortcuts¶
| Shortcut | Action |
|---|---|
Ctrl+K / Cmd+K |
Open command palette |
Ctrl+S / Cmd+S |
Save editors |
Escape |
Close command palette |
Arrow keys |
Navigate command list |
Enter |
Execute selected command |
Starting the Server¶
# Default: http://127.0.0.1:8000
cf web
# Custom port
cf web --port 3000
# Development mode with auto-reload
cf web --reload
# Bind to specific interface
cf web --host 127.0.0.1
Authentication¶
The web UI can open shells on your hosts. Passwordless access is limited to requests
whose network peer and Host header are both loopback, which also prevents DNS
rebinding from turning a local browser into a remote control channel. To serve it
remotely, set a password (HTTP Basic auth,
username from CF_WEB_USERNAME, default admin):
Use HTTPS (e.g. via Traefik) when accessing it remotely, since Basic auth sends the password with every request.
Regardless of this setting, cross-origin state-changing requests and WebSocket connections are rejected, which stops ordinary websites you visit from controlling the web UI through your browser.
If authentication is provided by a trusted reverse proxy, explicitly opt out of
the built-in login with CF_WEB_NO_AUTH=1. A reverse proxy counts as remote
access: use this setting only when the Compose Farm port is reachable solely
through an authenticating proxy that routes an exact Host. Otherwise DNS
rebinding or a direct connection can bypass the proxy's access controls.
Requirements¶
The web UI requires additional dependencies:
# If installed via pip
pip install compose-farm[web]
# If installed via uv
uv tool install 'compose-farm[web]'
Architecture¶
The web UI uses:
- FastAPI - Backend API and WebSocket handling
- HTMX - Dynamic page updates without full reloads
- DaisyUI + Tailwind - Theming and styling
- Monaco Editor - Code editing for compose/env files
- xterm.js - Terminal emulation for logs and shell access