Services
Every service in the platform, with its local docker-compose definition. The backing services below all live in one file — infra/docker-compose.yml; the systems run from their own repos (see the Developer guide).
Ports at a glance
Every host port a full local stack uses — check here first when a port is already taken. Databases are mapped off the container's 5432 so several Postgres instances coexist.
| Port | Service | Group |
|---|---|---|
| 5173 | Shell UI — the launchpad you open | Shell |
| 3000 | Shell API — apps register against this | Shell |
| 15433 | shell-db (Postgres) | Shell |
| 16379 | Redis — cache + event bus | Shared |
| 19000 / 19001 | MinIO — S3 API / console | Shared |
| 18080 | Keycloak — SSO, off by default | Shared |
| 3011 / 3010 | Veni builder UI / API — scaffolder + veni CLI | Tooling |
| 4175 | HRM UI — its remoteEntry.js | HRM |
| 3012 | HRM API | HRM |
| 15434 | hrm-db (Postgres) | HRM |
| 16380 | hrm-redis — HRM's own cache + RBAC | HRM |
| 4176 | Drive UI | Drive |
| 3013 | Drive API | Drive |
| 15435 | drive-db (Postgres) | Drive |
Shared infrastructure
Owned by no system — everything runs against these.
Redis — event bus (Redis Streams) + cache.
redis:
image: redis:7-alpine
ports: ["16379:6379"]MinIO — S3-compatible object storage (only object-storage apps like Drive use it).
minio:
image: minio/minio
command: server /data --console-address ":9001"
ports: ["19000:9000", "19001:9001"]
environment:
MINIO_ROOT_USER: minioadmin
MINIO_ROOT_PASSWORD: minioadminKeycloak — the identity provider (production SSO). Not started by default: local dev signs in with seeded accounts, so dev-up.sh leaves it out. Add it to the compose only if you want to test SSO (it needs the veni-ai realm imported).
keycloak:
image: quay.io/keycloak/keycloak:26.0
command: start-dev --import-realm
ports: ["18080:8080"]
environment:
KC_BOOTSTRAP_ADMIN_USERNAME: admin
KC_BOOTSTRAP_ADMIN_PASSWORD: admin
volumes: ["./realm:/opt/keycloak/data/import"] # the veni-ai realm exportSystem databases
Each system owns its own Postgres (the SCS split) — same image, one host port each. Ports and credentials match each repo's committed api/.env.example.
shell-db — the Shell's database.
shell-db:
image: pgvector/pgvector:pg15
ports: ["15433:5432"]
environment: { POSTGRES_DB: shell_db, POSTGRES_USER: shell, POSTGRES_PASSWORD: shell }hrm-db — HRM's database.
hrm-db:
image: pgvector/pgvector:pg15
ports: ["15434:5432"]
environment: { POSTGRES_DB: hrm_db, POSTGRES_USER: hrm, POSTGRES_PASSWORD: hrm }drive-db — Drive's database.
drive-db:
image: pgvector/pgvector:pg15
ports: ["15435:5432"]
environment: { POSTGRES_DB: drive_db, POSTGRES_USER: drive, POSTGRES_PASSWORD: drive }Systems
The applications themselves are separate repos run in dev mode (make dev / bun run dev) against the services above — not from this compose. Each also ships its own docker-compose.yml for containerized runs.
| System | Role | API | UI | Database | Repo |
|---|---|---|---|---|---|
| Shell | Host app — auth, routing, app registry, the launchpad | 3000 | 5173 | shell_db :15433 | veni-shell |
| Veni builder | Dev tooling — app scaffolder, component library, serves the veni CLI | 3010 | 3011 | — | veni-builder |
| HRM | Human resources | 3012 | 4175 | hrm_db :15434 | hrm |
| Drive | File storage & sharing | 3013 | 4176 | drive_db :15435 | drive |
How they connect
- UI — each remote app is mounted into the Shell via Module Federation (
./ShellEntry). - Sync calls — server-to-server over Connect RPC (see Cross-system integration).
- Async — identity and domain changes flow over the Redis Streams event bus; each system keeps its own read-model copy.
See Platform architecture for the full model, or the Developer guide to run any of these locally.