Start from layout.ts
Read the 60-line orchestrator first, then follow every call with a map of the input and output type at each boundary.
flowchart LR Program["Semantic program<br/>meaning only"] --> Plugin["typed family<br/>schema + lowering"] Plugin --> Measure["measure<br/>real content"] Measure --> Place["place<br/>coordinates"] Place --> Route["route + labels<br/>traceable lines"] Route --> NGD["NGD<br/>resolved scene graph"] NGD --> Render["faithful renderer<br/>SVG + PNG"]
Start from layout.ts
Read the 60-line orchestrator first, then follow every call with a map of the input and output type at each boundary.
See the real architecture
Explore function-level diagrams for plugins, placement strategies, routing ownership, materialization, NGD, and the verification loop.
Change code safely
Use symptom-driven debugging routes and understand exactly which snapshots, metrics, and invariants guard each subsystem.
New hereCodebase tour → pipeline → contracts
Bad layoutDebugging → placement & routing
New notationFamily plugins → add a family
Geometry changeVerification → inspect → bless