All modules:
2D conformal geometric algebra for the plane: points, lines, circles, and dipoles, plus the segments, polygons, and polylines composed from them, and the versors (Motor, Flector) that move them — immutable Kotlin types joined by infix operators (join, meet, dot, on, intersects, distanceTo, angleTo, collide, escape, gap, coerceOut, coerceIn, coerceOn), the containment operator in/!in, the orientation flip -, and the transform action *.
The Compose canvas renderer: Kanvas, a composable drawing a scene graph onto a transparent Compose canvas — every shape in CGA model space, uniformly fit-scaled and clipped to the scene's bounds — plus the pure conversion boundary between model space and canvas px, the Compose bridge for the shared paint vocabulary, and a draw-call tracing entry validating draw output without pixel rasterization.
The game engine and SDK umbrella: games depend on game-engine alone and reach every library type — the CGA algebra (cga), the scene graph (scene-graph), the Compose renderer (compose), the SVG persistence layer (svg) — through it. One entry composable, Game, owns the machinery every game would otherwise hand-roll: a semi-fixed-timestep loop, input sampled in CGA units, and the asset-load boundary. The game supplies a byte reader and a world recipe building its World — the immediate-mode state frame that owns its entities as plain properties, advances through its per-step update hook, and projects itself into the scene drawn every frame.
The renderer-neutral scene graph: a tree of GroupNode sub-trees and shape-node leaves — each leaf is its CGA shape, subclassing it and carrying the concrete ShapeStyle it renders with — plus the SceneBounds viewport rectangle and the shared paint vocabulary (ShapeColor, ShapeStrokeCap, DipoleChrome) every renderer reads identically.
The SVG persistence layer: parseSvg and serializeSvg between SVG text and the scene graph, in the /v1 format — every CGA shape rides a plain SVG element any viewer renders, and the k: sidecar namespace carries the CGA semantics SVG can't express. Files store values at full Double precision; canonical equality is rebuilt on load through the shapes' rounded identity.