-
-
Notifications
You must be signed in to change notification settings - Fork 0
0.1 quick start
From a fresh clone to a running 3F stack in a few commands. Everything happens inside containers — the only host requirements are Docker and (optionally) Ollama for local inference.
| Requirement | Purpose |
|---|---|
| Docker + Docker Compose v2 (with BuildKit) | All services run containerised |
| Ollama (optional) | Local model inference; skip when using Ollama Cloud only |
An Ollama model with vision support (e.g. qwen3-vl, llava) |
Image/chat intelligence, ollama pull <model>
|
SERPER_API_KEY (optional) |
Web/news/image/video search tools for the agent |
BRIGHT_DATA_API_KEY (optional) |
Alternative search provider (SERP + Web Unlocker) |
YOUTUBE_API_KEY (optional) |
YouTube Data API v3 video search for the agent |
cp server/.env.example server/.env
cp dashboard/.env.example dashboard/.envThe committed examples are ready for local development. See 0.2-docker for the full contract and 1-server for every variable. Important keys:
| Variable | Default (local) | Notes |
|---|---|---|
OLLAMA_HOST |
http://localhost:11434 |
Set to https://ollama.com + OLLAMA_API_KEY for Ollama Cloud |
SERPER_API_KEY |
— | Enables Serper tools (search, images, news, videos …) |
BRIGHT_DATA_API_KEY |
— | Enables Bright Data tools (alternative to Serper; SERP + Web Unlocker) |
YOUTUBE_API_KEY |
— | Enables the YouTube video search tool (Data API v3) |
POSTGRES_URL |
local DSN | Overridden by compose.yml for in-network resolution |
docker compose -f infra.compose.yml up -dBrings up PostgreSQL 16 (5432), MinIO (9000, console 9001), KeyDB (6379, configured by server/keydb.conf), and a playwright-mcp headless-chromium sidecar (loopback-only on 8931) that exposes browser_* automation tools to the harness (see 1.2). Ollama and SearXNG services are included but commented out — enable them if you want containerised inference or a local search frontend.
docker compose up -dThat's it. Compose builds one shared image (triplef-local) and starts three services:
-
deps(one-shot) — runspnpm install --frozen-lockfilefor the entire workspace from the repo root and exits. It is the only component allowed to touchnode_modules. -
server— waits fordepsto finish, then starts NestJS in watch mode athttp://localhost:3000(API under/api/v1, Swagger at/api-docs). -
dashboard— waits forserver, then starts Vite athttp://localhost:5173/dashboard/.
Both app services bind-mount the repository and hot-reload on save. No restarts or rebuilds are needed for source changes under server/ or dashboard/.
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:3000/api/v1/health/live # 200
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:5173/dashboard/ # 200
docker compose ps # server/dashboard Up, deps Exited (0)Open http://localhost:5173/dashboard/, pick a model, and start talking.
| Task | Command |
|---|---|
| Start everything | docker compose -f infra.compose.yml up -d && docker compose up -d |
| Follow server logs | docker compose logs -f server |
| Stop the app (keep infra) | docker compose down |
| Stop everything | docker compose down && docker compose -f infra.compose.yml down |
| Re-install deps (lockfile changed) | docker compose up deps && docker compose up -d --force-recreate |
| Run scripts inside containers |
docker compose exec server pnpm <cmd> · docker compose exec dashboard pnpm <cmd>
|
-
Install only at the repo root —
pnpm install,pnpm --filter server add <pkg>. Installing insideserver/ordashboard/against stale standalone state can flipnode_modulesback to a per-app layout (and per-app lockfiles). Thedepsservice guarantees containers stay on the shared workspace layout — see 0.2-docker for why. -
Never delete
node_modulesas a troubleshooting step. That was a workaround for the old dual-lockfile regime; the current setup makes it unnecessary and harmful. - If state did drift (e.g. after running standalone Dockerfiles), the deterministic reset is:
rm -rf server/node_modules dashboard/node_modules node_modules server/pnpm-lock.yaml dashboard/pnpm-lock.yaml && docker compose up -d --force-recreate.
pnpm -r test # Vitest in both workspaces
pnpm -r lint # ESLint + Prettier (flat configs)
pnpm -r depcruise # dependency-cruiser architecture rules
pnpm -r lint:unused # ts-unused-exportsCI runs the same gates on every branch (non-release.ci.yml); main additionally versions with changesets and regenerates badges (release.ci.yml, see 0.3-documentation).