Skip to content

Service map

Quick reference for every repo in the paper-board org: what port it listens on, which Postgres schema it owns, and which phase it shipped in.

flowchart LR
subgraph shipped["Shipped (Phases 1–3)"]
agents["agents\n:8080 HTTP\n:50051 gRPC\nschema: agents"]
identity["identity\n:8081 HTTP\n:50052 gRPC\nschema: identity"]
runtime["runtime\n:50053 gRPC\nno schema"]
compute["compute\n:50054 gRPC\nno schema"]
end
subgraph planned["Planned"]
platform["platform\n:8082 HTTP\n:50055 gRPC\nschema: platform\nPhase 4"]
billing["billing\n:8083 HTTP\n:50056 gRPC\nschema: billing\nPhase 5"]
gateway["gateway\n:443 HTTPS\nno schema\nPhase 7"]
end
classDef controlPlane fill:#10b981,stroke:#047857,color:#fff
classDef dataPlane fill:#3b82f6,stroke:#1d4ed8,color:#fff
classDef sandbox fill:#f97316,stroke:#c2410c,color:#fff
classDef external fill:#ef4444,stroke:#b91c1c,color:#fff
classDef persistence fill:#6b7280,stroke:#374151,color:#fff
class identity,platform,billing,gateway controlPlane
class agents,runtime dataPlane
class compute sandbox
RepoHTTP portgRPC portSchemaPhaseStatus
paper-board/agents808050051agents1.1
paper-board/identity808150052identity2
paper-board/runtime50053none3
paper-board/compute50054none3
paper-board/platform808250055platform4planned
paper-board/billing808350056billing5planned
paper-board/gateway443none7planned

Agent definitions and versions, sessions, budget reservations, memory collections, and artifact metadata. The product from the user’s perspective. Dispatches to the Anthropic API for LLM inference; relays the response as an SSE stream to the caller.

  • REST: POST /v1/agents, POST /v1/agents/{id}/messages (SSE), GET /v1/agents/{id}
  • gRPC: agents.v1.AgentsService (internal callers: runtime, compute)
  • DB user: agents_app
  • Advisory lock id: 3
  • GHCR images: ghcr.io/paper-board/agents-server, ghcr.io/paper-board/agents-migrator

Users, organizations, RBAC, JWT signing, MFA, API keys, refresh-token rotation, invitations, and idempotency cache. Every other service trusts identity’s JWT — no cross-service JWT re-verification.

  • REST: POST /v1/orgs, POST /v1/tokens, POST /v1/users, POST /v1/api-keys
  • gRPC: identity.v1.IdentityService, identity.v1.AuthService
  • DB user: identity_app
  • Advisory lock id: 1
  • GHCR images: ghcr.io/paper-board/identity-server, ghcr.io/paper-board/identity-migrator

Per-tenant data-plane pod. Stateless — no Postgres schema, no persistent state. Receives prompts from agents via gRPC stream, holds the agent definition in memory for the session, and dispatches code execution to compute.

  • gRPC: runtime.v1.RuntimeService (called by: agents)
  • DB user: none
  • GHCR images: ghcr.io/paper-board/runtime-server

gVisor sandbox host and exec-server. Receives ExecCommand calls from runtime, executes code inside an isolated gVisor pod, returns stdout/stderr, writes artifact metadata back to agents, and emits usage events.

  • gRPC: compute.v1.ComputeServiceCreateSandbox, ExecCommand, DestroySandbox
  • DB user: none
  • GHCR images: ghcr.io/paper-board/compute-server

Cross-cutting event hub. Will own audit log (hash-chained from Phase 5), incidents, notifications, webhooks, exports, and onboarding events. First consumer of usage events emitted by compute.

  • DB user: platform_app
  • Advisory lock id: 4
  • GHCR images: ghcr.io/paper-board/platform-server, ghcr.io/paper-board/platform-migrator

Subscriptions, pricing rates (3-level cascade), usage meter, bill rendering, marketplace listings and payouts, promo code redemption. Multi-provider payment abstraction from Day 1: Stripe, iyzico, PayTR, Param.

  • DB user: billing_app
  • Advisory lock id: 2
  • GHCR images: ghcr.io/paper-board/billing-server, ghcr.io/paper-board/billing-migrator

Public API entry point. Will centralize JWT verification (fetches JWKS from identity), rate limiting (Redis), idempotency middleware, and routing. Stateless; no Postgres schema. Phases 1–6 handle auth per-service; Phase 7 moves it here.

  • GHCR images: ghcr.io/paper-board/gateway-server
RepoPurposeLicense
paper-board/sdkShared Go library (log, obs, auth, migrator)MIT
paper-board/protogRPC .proto + OpenAPI source of truthMIT
paper-board/infraHelm umbrella + subcharts + TerraformProprietary
paper-board/frontendNext.js admin + customer dashboard + docsProprietary
paper-board/cliagentctl customer CLIMIT

Single Postgres cluster; each service owns exactly one schema. Cross-schema foreign keys are forbidden (ADR-0003) — services reference each other by UUID without FK constraints.

SchemaOwner serviceDB userAdvisory lock
agentsagentsagents_app3
identityidentityidentity_app1
billingbillingbilling_app2
platformplatformplatform_app4

Services with no schema (runtime, compute, gateway) have no DB user and no migrator.

Internal gRPC calls use Kubernetes Service DNS:

<service>.paper-board.svc.cluster.local:<grpc-port>

Examples:

  • identity.paper-board.svc.cluster.local:50052
  • agents.paper-board.svc.cluster.local:50051
  • compute.paper-board.svc.cluster.local:50054

Client-side load balancing replaces DNS-based discovery in Phase 6+.

ghcr.io/paper-board/<service>-<binary>:<semver-tag>

Every service ships two images: a server image and (for services with a schema) a migrator image. The migrator image runs as the Helm pre-install / pre-upgrade Job.