Most tool documentation shows one box and one arrow. TDK CLI is bigger than that. A single tdk up passes through TypeScript commands, Starlark discovery and generators, a generated Tiltfile, Docker containers, a Traefik proxy, and a set of checks that run before anything starts.
This article draws the whole system in one Mermaid diagram, then walks through it. The diagram follows the repository's own maintainer guide (docs/TOPOLOGY.md) and the folders I read in the source. Some labels are summaries, so check the names against the repo before you rely on a single one.
The diagram
flowchart TD
%% ---------- People and clients ----------
DEV["Developer at a terminal"]
AGENT["AI agent: Codex or Claude Code"]
IDE["IDE and editor"]
%% ---------- Inputs you own ----------
subgraph INPUTS["Inputs you own"]
PROJ[".tdk/project.json"]
SVC["service.json per service"]
SRC["Application source code"]
TILTF["Project Tiltfile"]
ENVF["Environment files and secrets"]
end
%% ---------- CLI in TypeScript ----------
subgraph CLI["CLI in TypeScript: cli/src"]
direction TB
CMDS["commands: project, resource, up, down, status, logs, ui, doctor, config, mcp"]
CFG["config and types"]
GEN["generator: Handlebars project files"]
FEPROV["frontend-frameworks: react, vue, svelte, solid, preact, lit, qwik, vanilla, tanstack-router"]
BEPROV["backend-languages: bun, go, python, rust"]
BFW["backend-frameworks: hono, express, elysia, fastify, nestjs, koa, h3, mcp"]
MCPSRV["mcp server over stdio: doctor, up, down, status, logs, resource_list"]
UI["ui: terminal dashboard"]
UTIL["utils and components"]
end
%% ---------- CLI templates ----------
subgraph TPL["CLI templates: cli/templates"]
TPLT["Tiltfile.hbs"]
TPLS["spec.master.hbs"]
TPLSTACK["TILT_TECH_STACK.star.hbs"]
TPLDEF["TILT_RESOURCE_DEFAULTS.star.hbs"]
end
%% ---------- Discovery in Starlark ----------
subgraph DISC["Discovery in Starlark: discovery/"]
DORCH["discovery_orchestrator.star"]
DREG["registry.star"]
DMAN["manifest scan and validation"]
DSNAP["snapshots"]
end
%% ---------- Engine in Starlark ----------
subgraph ENG["Engine in Starlark: engine/topologies"]
direction TB
subgraph GENS["tilt/generators"]
GIDX["index.star"]
GVITE["Vite and TypeScript configs"]
GNPM["npm and bunfig config"]
GPRISMA["Prisma config"]
GENV["environment files and API helpers"]
GAGENTS["AGENTS.md notice"]
end
subgraph RES["tilt/resources"]
RDECL["resource declaration"]
RORCH["orchestrator and generators"]
RDEP["startup order and dependsOn"]
RTRIG["triggers and live update"]
end
subgraph MAN["tilt/manifest"]
MLOAD["manifest loader"]
MSCHEMA["schema and constants"]
end
subgraph PLAT["platform"]
PDOCK["docker: language and frontend Dockerfiles"]
PNET["networking and Traefik"]
PINFRA["Postgres and optional infra"]
end
end
%% ---------- Generated runtime files ----------
subgraph GENOUT["Generated per service: .autogenerated"]
DFILE["Dockerfile.app.autogenerated"]
NGINX["nginx.autogenerated.conf"]
VCONF["vite and tsconfig files"]
APIC["api-client.ts and env.ts"]
SNAP[".tdk-contract snapshots"]
SYAML["service.yaml projection"]
end
%% ---------- Checks ----------
subgraph CHECKS["Checks"]
DOCTOR["tdk doctor: host and canUp"]
DRIFT["drift check: generated files vs snapshots"]
DRYRUN["tdk up --dry-run: plan only"]
MIGWARN["doctor warning: migration in start script"]
READY["readiness: status and up JSON"]
end
%% ---------- Runtime ----------
subgraph RUNTIME["Runtime on your machine"]
TILT["Tilt: builds, watches, live-updates"]
DOCKER["Docker engine"]
TRAEFIK["Traefik proxy"]
PG["PostgreSQL"]
SVCS["Service containers: frontends, APIs, workers, MCP servers"]
NATS["NATS messaging when enabled"]
end
%% ---------- Outside the local loop ----------
subgraph PROD["Outside TDK: production"]
HELM["Helm"]
ARGO["Argo CD"]
KUST["Kustomize"]
end
%% ---------- Flows ----------
DEV --> CMDS
IDE --> SRC
AGENT --> MCPSRV
MCPSRV --> CMDS
CMDS --> GEN
GEN --> TPL
CMDS --> FEPROV
CMDS --> BEPROV
CMDS --> BFW
CMDS --> UI
CMDS --> CFG
CFG --> UTIL
PROJ --> DORCH
SVC --> DORCH
DORCH --> DREG
DORCH --> DMAN
DMAN --> MLOAD
DREG --> DSNAP
TILTF --> DORCH
TILTF --> RDECL
RDECL --> RORCH
RORCH --> GIDX
GIDX --> GVITE
GIDX --> GNPM
GIDX --> GPRISMA
GIDX --> GENV
GIDX --> GAGENTS
RORCH --> RDEP
RDEP --> RTRIG
MLOAD --> MSCHEMA
RORCH --> PDOCK
RORCH --> PNET
RORCH --> PINFRA
GENS --> GENOUT
PDOCK --> DFILE
PNET --> NGINX
GVITE --> VCONF
GENV --> APIC
GENOUT --> SNAP
GENOUT --> SYAML
CMDS --> DOCTOR
SNAP --> DRIFT
DRIFT --> TILT
CMDS --> DRYRUN
RORCH --> MIGWARN
TILT --> READY
SRC --> TILT
ENVF --> TILT
TILT --> DOCKER
DOCKER --> TRAEFIK
DOCKER --> PG
DOCKER --> SVCS
DOCKER --> NATS
TRAEFIK --> SVCS
SVCS --> PG
SVCS --> NATS
HELM --> ARGO
KUST --> ARGO
%% ---------- Styling ----------
classDef cli fill:#e8f1ff,stroke:#1d4ed8,color:#0f172a
classDef engine fill:#fff4e5,stroke:#c2410c,color:#0f172a
classDef runtime fill:#e8fbef,stroke:#15803d,color:#0f172a
classDef check fill:#fdecec,stroke:#b91c1c,color:#0f172a
classDef prod fill:#f3f4f6,stroke:#6b7280,color:#0f172a
class CMDS,CFG,GEN,FEPROV,BEPROV,BFW,MCPSRV,UI,UTIL cli
class DORCH,DREG,DMAN,DSNAP,GIDX,RDECL,RORCH,RDEP,RTRIG,MLOAD,MSCHEMA,PDOCK,PNET,PINFRA engine
class TILT,DOCKER,TRAEFIK,PG,SVCS,NATS runtime
class DOCTOR,DRIFT,DRYRUN,MIGWARN,READY check
class HELM,ARGO,KUST prod
How to read it
Start at the top left. A developer, or an agent over MCP, enters the CLI. The CLI has three jobs: scaffolding files through templates and providers, reading the project's commands, and starting the stack.
The middle of the diagram is the two-stage generation the maintainer guide describes. The CLI writes starter files in TypeScript. At Tilt time, Starlark discovery reads each service.json, and the engine's generators write the runtime files under .autogenerated/. Those files are what Docker and Tilt run.
The right side shows the checks. doctor answers whether the machine can run the stack. The drift check compares generated files with their snapshots before startup. The dry run prints the plan. The readiness output tells you, or an agent, when a service is ready.
The bottom shows the runtime: Tilt drives Docker, Docker runs the Traefik proxy, Postgres, the service containers, and NATS when it is enabled. Production sits outside the loop. The diagram ends with Helm, Argo CD, and Kustomize, because TDK does not generate cluster manifests by default.
Things the diagram leaves out
It does not show every module or every generator. The .tdk-contract snapshots, the optional observability stacks, and the golden image layer are simplified or omitted. Use the repo's topology guide when you need the full list.
Summary
TDK CLI is a loop: TypeScript commands write project files, Starlark generators turn service.json into runtime files, checks confirm the result, and Docker and Tilt run it. Keep the inputs in your hands, treat the generated files as output, and let the checks tell you when something has drifted.
Top comments (0)