27 Aug 2026 · what to draw, what to re-point, and why the hero cards read thin
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.
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.
| Object | Page box | Stroke in file | Equivalent at 512pt | vs spec |
|---|---|---|---|---|
| illus-button-down | 237 × 252 | 3.5 | 7.1 | |
| illus-sofa — the AAFES hero | 326 × 178 | 4.0 | 6.3 | |
| illus-cosmetics | 310 × 244 | 3.0 | 4.9 | |
| spec target | 512 × 512 | 10.0 | 10.0 |
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.
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.
| Category | SF Symbol | Illustration now | Mockup draws | Action |
|---|---|---|---|---|
| Footwear | shoe.fill | illus-sneaker |
a low shoe | matches |
| Running | figure.run | illus-running-shoe |
a running shoe | matches |
| Apparel | tshirt.fill | illus-t-shirt |
a t-shirt | matches |
| Outdoor | tent.fill | illus-tent |
a pine tree | draw it no tree in the library |
| Workwear | hammer.fill | illus-work-boot |
a button-down | re-pointillus-button-down |
| Accessories | eyeglasses | illus-sunglasses |
a backpack | re-pointillus-backpack |
| Travel | airplane | illus-airplane |
a roller suitcase | re-pointillus-suitcase |
| Beauty | sparkles | illus-cosmetics |
not in the mockup | not in the app see below |
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.
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.
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.
Two routes, and the second is the one the design already promised.
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.
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:
illus-lamp + illus-sofa + illus-storage-binillus-jacket on its own, as drawnillus-notebook + illus-backpackMaking 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.
illus-<object>.pdf — because
objects compose and one drawing serves several cards.
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.