Preview — invented data. No real customer, reseller or figure appears anywhere on this site. Every screen is rendered from the shipped components at commit 8a42f16c1a (working tree had uncommitted changes). The app shell — sidebar, sign-out, mobile top bar — is not rendered. Alexandria is the real face, inlined from 8f2ca9bed5019488-s.p.1rne3a59172go.woff2 in the local next build.
← all screens

Make a post — the shareable poster

Every canvas below is drawn by lib/share/flex-card.ts, the same module the app runs, transpiled straight into this page. This is not a picture of the poster — it is the poster, at its real 1080 × 1350 and scaled down by CSS. Right-click and save one; that file is byte-for-byte what Download the image produces.

Checking which typeface the canvas resolved…

The four grounds, and the two edges

Ink — the default. The licensed neon spent as light rather than as a line, in the half of the frame the type leaves open.

Noir — the plainest ground. Nothing but a slight lift top to bottom, so the type does all of the work.

Clay — the brand’s own terracotta deepened until it is a ground rather than an accent.

Slate — a hairline grid, so the open half has a texture at thumbnail size instead of reading as a void.

The widest figure and the longest name — $104,182.60 is the number the in-page card’s type was measured against, and the name is the full 22-character cap. Both are shrunk to fit; neither wraps.

Story, 1080 × 1920 — the same stack, 12% larger type, and a much bigger window. On a story that space is not dead: a story IS an image with a caption at the foot, and this is the shape that idiom has.

Wide, 1600 × 900 — the founder’s Terminal reference, and what embeds in an X post. Type scales down to 0.72 because 900px of height is the binding constraint; the 1376px column is why the widest figure is the one figure here that never has to shrink.

Zero, and no name — reachable only for a reseller every commission of whose a dispute reversed. No plus sign: +$0.00 would claim a gain that did not happen. The name line is absent rather than a placeholder, and the money does not move, because the layout is anchored to the foot.

Why this one is dark when the in-page card is paper

The in-page share card is warm paper with a #00853a figure. This is near-black with #2bff88. That is one design in two skins, not two designs: the same hue at 146°, at whichever lightness its ground can carry. #2bff88 measures 1.33:1 on white and 14.17:1 on #111, so on paper the neon the founder licensed is not dim, it is invisible — and this poster is the surface that can finally spend it.

The larger reason is the background. The poster sits on a picture the reseller chose and nobody at Kudaro looks at, so legibility cannot be a property of the picture — it has to be a property of the generator. Two scrim alphas do that: over a pure white upload, the worst case there is, the type still lands on #202020 — 12.2:1 for the neon and 15.4:1 for the warm white. Both numbers are recomputed from the module's own constants in __tests__/reseller.flex-card.test.ts, so the comment and the code cannot drift apart.

The ratio

1080 × 1350, 4:5. The tallest frame a feed shows uncropped. A 9:16 poster is centre-cropped to 4:5 in an Instagram feed, and the two things a centre crop eats here are the wordmark at the top and the stats row at the bottom — the brand and the proof. The reverse does not happen: a 4:5 image dropped into a story is letterboxed, not cropped. 4:5 survives both destinations; 9:16 survives one.

What is not rendered

The controls. In the app the poster is wrapped by a name field, the four-swatch background strip, an upload slot and Download / Copy buttons — React, and not what is under review here. The uploaded-image case is also absent for an honest reason: there is no file to upload in a static page, and inventing a stock photograph to stand in for the reseller's meme would be showing a composition nobody will ever post.