# Kayla Newkirk business cards — Staples upload guide Built to Staples' upload specs: trim 3.5 x 2 in, bleed canvas 3.75 x 2.25 in, 300 dpi, sRGB, JPG / PNG / PDF (all three of their accepted formats), no crop marks. ## Upload this one `out/KaylaNewkirkCardStaplesFullBleed375x225.pdf` (backup: the same-name `.jpg` or `.png` — 1125 x 675 px = 3.75 x 2.25 in @ 300 dpi) Card copy: Kayla Newkirk M.S.Ed., LMHC / Doctoral Candidate, in Counselor Education and Supervision / kayla.newkirk@student.waynesburg.edu / QR to kaylassafe.space. ## How the artwork is built One AI-generated illustration IS the whole card background: a soft WATERCOLOUR wash on textured paper with arches rising into the top corners, a sleeping cat in a lavender and daisy meadow along the bottom left, faint butterflies and gold speckles, and a deliberately calm pale middle. Everything on top (name, credentials, email, site line, QR tile, cat ears, divider brain) is composited in HTML/CSS. The paper-cut version of the same composition was the earlier design: its render is `out/KaylaNewkirkCardAltCutoutLook.png` and the source is in `alternates/`. - **The copy sits on a scrim.** Text over generative art is the risk this design accepts, so the copy block carries two cream washes at the art's own field colour: a radial over the bulk of the copy, plus a rise from the bottom edge because the last line (`kaylassafe.space`) sits low enough to catch the meadow. Invisible where the art is already pale, fading to nothing by the right-hand third so the meadow and the arches stay vivid. Without the scrim the generator's art does wander in: measured, the site line's field goes from 0% to 6.3% dark. - **The brain** where the divider breaks is a generated flat silhouette (side view, no interior detail), keyed off a chroma field and repainted in the card's exact rose, so the model supplies the outline and the palette stays ours. - **The cat ears** on the QR tile are CSS triangles positioned 0.015 in onto the tile's own box, not the wrapper's, so they stay pinned to the thing they decorate. ## Geometry: elements are measured in their own boxes `build.py` also renders a **probe**: the same layout with the art and copy hidden and each element painted a unique flat colour, then writes `out/geometry.json` with the brain icon, the QR tile and both ears in inches from the trim origin. `checks.py` measures each element inside its own box. This exists because the obvious alternative, masking ink by colour across the canvas, silently breaks whenever the design changes: the moment the background art carried rose flowers, "rose pixels in the copy column" was measuring petals instead of the divider icon. Element geometry is design-independent. WeasyPrint's box tree was tried first and rejected: it reports neither the inner boxes nor transform offsets, while the probe raster is post-transform truth by definition. `build.py` also writes `out/ArtOnly.png`: the card with the copy and decorations hidden and the art visible. That is the background reference for the legibility check, described below. ## Generator notes - Generator: `gpt-image-2.5-flare` (set in `~/.hermes/config.yaml` under `image_gen.model`). The earlier `gpt-image-2-medium` renders came back shaded, with drop shadows and layered paper depth, which fought the flat pastel look. Flare holds flat colour shapes and hard edges. - Generations live in `~/.hermes/cache/images/`. `make_assets.py` turns one into `assets/CardBackground.png`, keys the brain icon, and mattes the spare accents. - **Regenerate:** rerun `make_assets.py`, then `build.py`, then `checks.py`. If you generate a new background, update the `BG` path at the top of `make_assets.py`. - **Do not crop the generated frame to the card ratio.** Generators only emit 3:2 / 1:1 / 9:16, and they draw the border art into the outer few percent of the frame, so a centred crop to the card's 5:3 canvas deletes the border ornaments and clips the cat. `card_background()` scales the full frame instead: a ~10% vertical squash, invisible at card size, and the whole composition survives. If a future generation is composed with real margins, cropping becomes safe again. - **Alternates** from the same brief are kept in `alternates/`: `WatercolorArchesSource.png` (the shipped design), `CutoutArchesSleepingCatSource.png` (the flat paper-cut cut of the same composition), and two earlier candidates (a garland with a yarn-ball cat, a botanical border with a peeking cat; the border one puts its cat under the site line, so its scrim needs to grow first). To switch, point `BG` at one, rerun the three commands, and confirm the copy collar check is still clean. - **Copy is the name, credentials, doctoral line, email and the site, nothing else.** "let's talk" came off the bottom line at the user's request; the site line stands alone in the script face. (a garland-and-yarn-ball cat, and a botanical border with a peeking cat). To switch, point `BG` at one, rerun the three commands, and check that the copy scrim still clears the art in the copy zone. Staples -> Print & Marketing -> Business Cards -> Traditional -> Landscape, 14pt matte -> "Use your own design / Upload design" -> upload the file above -> in their builder drag so the artwork fills their full-bleed outline -> order. There is no vector frame to line up any more: the artwork is full-bleed to the cut on all four sides. Their safe-area line is 1/8 in. Everything that matters is inset 3/16 in or more from the trim, so it sits inside their line with room for the cutter to wander. **If you use Staples' own "proof" download:** it adds a grey PROOF watermark, and their earlier render showed our background sitting a quarter-inch off the preview (a real bug in the old bleed maths, since fixed). Compare any proof against `out/KaylaNewkirkCardTrim350x200.png`. ## Order settings that suit this artwork - Orientation: **Landscape** - Sides: **Front only** (there is no back design) - Material: **Standard 14pt** (fine) or **Premium 16pt** (nicer feel, still matte) - Finishing: **Matte**. The pastels and the QR both read better uncoated, and gloss fights a busy background. Skip the 38pt ultra-thick: unnecessary for a QR card. - The delicate bits (the arch edges, lavender tips, the cat's face) are the first things a cheap digital press smears, so ask for matte 14pt or better, not the plainest copy paper. - The QR is 29 modules at error-correction level **H** with a 3-module quiet zone on white, so it survives matte lamination, fingerprints, and a slightly soft print. ## Also in `out/` - `KaylaNewkirkCardLook.png` — 3x render of the trim file, for eyeballing on a phone. - `KaylaNewkirkCardTrim350x200.png / .jpg` — exact trim size, no bleed. Use if their builder asks for trim-size art instead of a bleed file. - `KaylaNewkirkCard10upLetterSheet.pdf` — 10 cards, 2 x 5 with hairline cut guides. Home printing or a test sheet on your own cardstock. - `KaylaNewkirkCard10upPreview.png` — what the printed sheet looks like. - `geometry.json` — element boxes from the probe render, consumed by `checks.py`. ## Rebuild / verify python3 make_assets.py # only if the generated art changes: background, accents, brain icon python3 build.py # every file in out/, plus the probe and geometry.json python3 checks.py # 45 assertions, all green `checks.py` covers: page boxes, 300 dpi metadata, embedded fonts, no fallback font, background ratio and print resolution, no edge left a dead flat margin, every copy string present (name, credentials, doctoral line, email and the site line), **copy legibility line by line**: line boxes come from the PDF text layer, and any pixel that differs between the real render and `ArtOnly.png` is a glyph, so the field behind each line is the art itself, measured. Each line must sit on a pale field (< 2% of it dark) with a contrast delta > 55, which is how a leaf behind the site line was caught after a pooled average hid it. The divider icon painting its rose ink **inside its own box** and holding a solid side-view silhouette at 300dpi, both QR ears painted, sized and **sitting on the tile top** per geometry, the two ears matching in size, **print-file == preview-file parity**, and the QR decoding from both print rasters. `build.py` holds the copy, palette, and layout. Edit the constants at the top (SITE / NAME / CREDS / DOCTORAL / PROGRAM / EMAIL), rerun, and the whole set regenerates. Fonts are Nunito (body), Lora (name), Caveat (the two handwritten accents), fetched from Google Fonts and stored locally under `fonts/` so the build works offline. ## Spare accents `assets/` also holds `CatYarn.png`, `Butterfly.png`, `Daisy.png`, `Sparkle.png`, `Heart.png` and `PawPrint.png`: same flat style, keyed to alpha, ready if you ever want a small illustration placed beside the text instead of baked into the background.