04 / Reference · Services

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.

PortServiceGroup
5173Shell UI — the launchpad you openShell
3000Shell API — apps register against thisShell
15433shell-db (Postgres)Shell
16379Redis — cache + event busShared
19000 / 19001MinIO — S3 API / consoleShared
18080Keycloak — SSO, off by defaultShared
3011 / 3010Veni builder UI / API — scaffolder + veni CLITooling
4175HRM UI — its remoteEntry.jsHRM
3012HRM APIHRM
15434hrm-db (Postgres)HRM
16380hrm-redis — HRM's own cache + RBACHRM
4176Drive UIDrive
3013Drive APIDrive
15435drive-db (Postgres)Drive

Shared infrastructure ​

Owned by no system — everything runs against these.

Redis — event bus (Redis Streams) + cache.

yaml
redis:
  image: redis:7-alpine
  ports: ["16379:6379"]

MinIO — S3-compatible object storage (only object-storage apps like Drive use it).

yaml
minio:
  image: minio/minio
  command: server /data --console-address ":9001"
  ports: ["19000:9000", "19001:9001"]
  environment:
    MINIO_ROOT_USER: minioadmin
    MINIO_ROOT_PASSWORD: minioadmin

Keycloak — 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).

yaml
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 export

System 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.

yaml
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.

yaml
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.

yaml
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.

SystemRoleAPIUIDatabaseRepo
ShellHost app — auth, routing, app registry, the launchpad30005173shell_db :15433veni-shell
Veni builderDev tooling — app scaffolder, component library, serves the veni CLI30103011—veni-builder
HRMHuman resources30124175hrm_db :15434hrm
DriveFile storage & sharing30134176drive_db :15435drive

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.