Category icons & exchange cards

27 Aug 2026 · what to draw, what to re-point, and why the hero cards read thin

The short version

The exchange cards are thin because tier 1 is empty. registry/assets/events/ has no files in it. Both live events name a single library object as their hero — illus-sofa and illus-jacket — so a card that the mockup fills with a composed scene gets one piece of furniture.

The mockup's Labor Day card is a lamp, an armchair and a trunk. Back to School is a notebook and a backpack. That is three objects doing the work of one.

And yes — the line weights are light. The drawing spec calls for a 10pt stroke on a 512pt artboard. Every file I could measure comes in between 4.9 and 7.1. Details below.

Measured stroke weights

Pulled from the PDF content streams. Normalised to what the stroke would be if the object were drawn on the spec's 512pt artboard, so these are directly comparable to the 10pt target.

ObjectPage boxStroke in fileEquivalent at 512ptvs spec
illus-button-down237 × 2523.5 7.1
illus-sofa — the AAFES hero 326 × 1784.0 6.3
illus-cosmetics310 × 2443.0 4.9
spec target512 × 51210.0 10.0

The sofa is sitting exactly on the line the spec warns about

registry/assets/README.md says: "4pt renders at roughly 0.8pt on a standard card and disappears." illus-sofa is stroked at 4.0pt, and it is the hero of the AAFES card in the screenshot. That is the single clearest reason the card reads faint.

Caveat on the measurement. I recovered an explicit stroke width from three of the nine files I probed. The rest either outline their strokes into filled paths or set the width inside a nested form, and my probe does not follow those. Three of three came in under spec, and they agree with what the screenshot looks like, so I am confident in the direction. I am not claiming all 108 are light.

Category assignments

Eight categories in registry/categories.yaml. Four of the seven that ship differ from what the mockup draws — and three of those four already have the right object sitting in the library, so they are a one-line registry edit rather than a drawing job.

CategorySF SymbolIllustration now Mockup drawsAction
Footwearshoe.fillillus-sneaker a low shoematches
Runningfigure.runillus-running-shoe a running shoematches
Appareltshirt.fillillus-t-shirt a t-shirtmatches
Outdoortent.fillillus-tent a pine tree draw it
no tree in the library
Workwearhammer.fillillus-work-boot a button-down re-point
illus-button-down
Accessorieseyeglassesillus-sunglasses a backpack re-point
illus-backpack
Travelairplaneillus-airplane a roller suitcase re-point
illus-suitcase
Beautysparklesillus-cosmetics not in the mockup not in the app
see below

Nothing to draw for three of them

illus-button-down, illus-backpack and illus-suitcase are all already in registry/assets/illustrations/. Change the illustration: line in categories.yaml, run larchpipe assets sync, and the category row matches the mockup.

One genuinely needs drawing

The mockup's Outdoor icon is a pine tree and the library has no tree. Nearest neighbours are illus-tent, illus-camp-lantern, illus-sleeping-bag, illus-kayak. If the tent is fine, this is zero work.

Beauty is in the registry but not in the app

categories.yaml carries eight categories. app/Larch/Resources/dataset.json carries seven — no beauty. The app bundles a hand-authored snapshot that larchpipe publish has never been copied into, so your NARS and A'del brands will not appear on screen no matter how good the artwork is until that copy happens. Worth wiring as a build step.

What would actually fix the exchange cards

Two routes, and the second is the one the design already promised.

Draw campaign compositions

Put a composed scene in registry/assets/events/<hero>.pdf and point events.yaml at it. This is what the README anticipates and it gives you full control of the composition. It is also a new drawing per campaign, forever.

Let the card compose stock objects

The README already states the intent: "Objects compose: a lamp plus a chair plus a trunk makes a home-goods sale, a backpack plus a notebook makes back-to-school." That is exactly the mockup. The code does not do it — CardVisual.campaign renders one file.

Every object the mockup's three cards need is already in the library:

Making hero accept a list and having the hero layout arrange two or three objects on the accent shape turns 108 stock objects into an open-ended supply of campaign art, with no new drawing per sale. It is the larger code change of the two and the smaller ongoing cost.

If you are drawing anyway

Sources: registry/categories.yaml, registry/assets/README.md, app/Larch/Resources/dataset.json, and stroke widths probed from the PDFs in registry/assets/illustrations/. Mockup targets read from the 27 Aug A/B comparison. Companion to 2026-08-27-illustration-naming-sheet.html, which covers naming across all 108.