Loom Setup Guide¶
Everything you need to get Loom running and create your first project.
Prerequisites¶
- Docker (20.10+)
- Docker Compose (1.29+)
- Go 1.25+ (for local development only)
Running Loom¶
Loom always runs in Docker. The stack includes: - Loom application server (port 8080) - PostgreSQL database
# Start everything
make start
# Verify
docker compose ps
# View loom logs
make logs
# Stop
make stop
# Rebuild and restart (after code changes)
make restart
Connecting to the UI¶
- Loom Web UI: http://localhost:8080
Configuration¶
Structural configuration is managed via config.yaml (server, agents, projects). Secrets like API keys are never stored in config.yaml -- see Registering Providers below.
server:
http_port: 8081 # Internal container port (Docker maps 8080 -> 8081)
enable_http: true
agents:
max_concurrent: 6
default_persona_path: ./personas
heartbeat_interval: 30s
Environment variables in config.yaml are expanded automatically -- ${MY_VAR} is replaced with the value of MY_VAR from the environment.
Registering Providers¶
Providers (LLM backends) are registered via the Loom API, not in config.yaml. This keeps API keys out of version control.
Register a Provider¶
# Local vLLM server (no API key)
curl -X POST http://localhost:8080/api/v1/providers \
-H 'Content-Type: application/json' \
-d '{
"id": "my-gpu",
"name": "My GPU",
"type": "openai",
"endpoint": "http://gpu-host:8000/v1",
"model": "Qwen/Qwen2.5-Coder-32B-Instruct"
}'
# Cloud provider (with API key)
curl -X POST http://localhost:8080/api/v1/providers \
-H 'Content-Type: application/json' \
-d '{
"id": "cloud-llm",
"name": "Cloud LLM",
"type": "openai",
"endpoint": "https://api.example.com/v1",
"model": "model-name",
"api_key": "your-key-here"
}'
API keys are encrypted and stored in Loom's key manager. They persist across restarts.
Using bootstrap.local¶
For repeatable setup, create a bootstrap.local script (gitignored):
cp bootstrap.local.example bootstrap.local
chmod +x bootstrap.local
# Edit with your providers and API keys
LOOM_URL=http://localhost:8080 ./bootstrap.local
Run bootstrap.local once after a fresh deployment or database wipe. Providers persist in the database.
Bootstrapping Your First Project¶
Projects can be registered via config.yaml or the UI.
Via config.yaml¶
projects:
- id: myapp
name: My App
git_repo: git@github.com:user/myapp.git
branch: main
beads_path: .beads
is_perpetual: true
context:
build_command: "make build"
test_command: "make test"
Via the UI¶
Navigate to Projects > Add Project and fill in the repository details.
Deploy Key Setup¶
Loom generates a unique SSH keypair for each project. After adding a project, retrieve its public key:
Add this as a deploy key with write access in your git hosting service (GitHub: Settings > Deploy keys). Loom will clone the repository on the next dispatch cycle.
Development¶
Building Locally¶
make build # Build Go binary
make test # Run tests
make test-docker # Run tests in Docker
make lint # Run all linters
make coverage # Tests with coverage report
Full Command Reference¶
Monitoring¶
Event Stream¶
Logs¶
Troubleshooting¶
Providers Show "failed"¶
# Check heartbeat error
curl -s http://localhost:8080/api/v1/providers | jq '.[].last_heartbeat_error'
Common causes: unreachable endpoint, wrong type (use "openai" for vLLM), missing API key.
Agents Stay Idle¶
- Check providers are
"healthy":curl -s http://localhost:8080/api/v1/providers | jq '.[].status' - Check beads exist: dispatcher needs open beads to assign work
- Check logs:
make logs