Icon composition

Shapes

The four DTPR shape primitives.

Shapes

A category's shape field picks one of four bundled primitives. Shapes are not version-pinned — they live in the worker code.

The primitives

The compositor bundles four shape paths, all in a 36×36 viewBox with stroke-width="2":

Shaped outlineWhere it's used
circleCircle of radius 16 centered at (18, 18).Decorative / balanced categories.
hexagonPointed-top regular hexagon inscribed in the 36×36 box.Default category shape.
octagonRegular octagon.Warning / attention categories.
rounded-square30×30 square with 3-px corner radius, inset by 3 from each edge.Utility / grid categories.

The exact d values live in api/src/icons/shapes.ts.

How a category picks a shape

Every category in a schema declares a shape field on its manifest:

{
  "id": "purpose",
  "shape": "hexagon",
  "context": { "values": [ { "id": "commercial", "color": "#0052CC" } ] }
}

You can read a category's shape via list_categories or GET /schemas/:version/categories. Invalid shape names are rejected at schema build time.

Serving shapes directly

GET /api/v2/shapes/:shape.svg

Returns a bare 36×36 SVG with the shape fragment (stroke #000, no fill). See REST icon routes.

See also

Copyright © 2026