CelebritySignatures
Search the build
-
fbffb502026-09-13 gitignore: exclude campaign image-gen candidates + QA artifacts -
8272a622026-09-13 campaign: lead the homepage hero with the full seated Signature Edit -
d72fd542026-09-13 wear: fix "See on garment" not hiding the editorial worn shot + modernize gallery E2E -
a310a072026-09-09 wear: enable Dad Cap (29) + Trucker Cap (33) for sale, cost/placement verified (TK-10286, Steve-approved) -
52b0f482026-09-09 printify-cost-check: add dad-cap + trucker-cap candidates (cost/placement verified) -
1d530302026-09-09 wear: raise Bucket Hat 32 to 38 to restore margin floor (TK-10286, Steve-approved) -
15e74992026-09-09 wear: add Signature Edit lookbook promo banner (discoverability) -
7bce96c2026-09-09 signature-edit: expand The Signature Edit lookbook from 10 → 53 icons -
8322ca02026-09-09 wear: fix stale ink-color fallback in reconcile-wear-orders.mjs + its test -
71f53472026-09-09 wear: surface the Signature Edit — ✦ badge + 'Signature Edit first' sort -
cb3ba6f2026-09-09 wear: map Michelangelo Buonarroti → campaign-michelangelo.jpg (same-person dup record) -
ced4cca2026-09-09 wear: map worn-shot by EXACT signer name, not surname — kills wrong-celebrity collisions -
a0253a82026-09-09 wear: 43 worn editorial campaign shots for top-signer roster (TK-10286) -
22b0eba2026-09-09 wear: accent-fold worn-shot slug candidates (Velázquez→velazquez, Molière→moliere) -
d8381ce2026-09-09 wear: auto-detect campaign-<slug>.jpg for the 'worn' shot instead of a hardcoded map -
523cb042026-09-09 wear: 'See it worn' — feature each celebrity's seated editorial shot on their product page -
ba964562026-09-09 printify-cost-check: support bucket-hat + crew-socks + --yes non-interactive flag -
7489d972026-09-09 signatures: serve the full-resolution original (vector SVG / native raster), not a downsampled thumb -
6adf1042026-09-09 wear: raise crew-socks price $22 → $28 to clear cost/markup floor (TK-10286) -
18cca452026-09-09 signatures: show TRUE source colors, crisp — drop the invented per-signer recoloring -
68dd99d2026-09-09 wear: full Signature Edit campaign hero — Lincoln seated in hat+tee+socks -
47a63632026-09-09 wear: make Bucket Hat ($32) + Crew Socks ($22) sellable — Lincoln campaign look (TK-10286) -
ec820c72026-09-09 5x sweep 1: record M3 false-negative (ink control is modal-gated; verified working) -
08f35292026-09-09 wear: buyer-adjustable signature ink + Node-ported color for the printed art -
b5ebc162026-09-09 signature-size: make the mobile grid slider actually resize signatures -
5acdc482026-09-09 wear: on-shirt signature uses the signer's color on light cloth, white on dark -
a272fad2026-09-09 wear: Lincoln-in-exact-tee campaign hero (kontext-fit, real product preserved) -
3a772dc2026-09-09 signatures: render each signer in a distinct, WCAG-legible color on clean white -
6a759ce2026-09-09 game/murals/wear: render cleaned colored-ink signatures via shared preview -
54991312026-09-09 signatures: permanently exclude Q352 (brand safety) from every surface -
abc8f512026-09-09 signature-viewer: fix ink-collision crash + add user-adjustable signature size -
6140aaa2026-09-09 auto-data-snapshot: 2026-09-09T13:56:45 (1 data files) — verification/signature-viewer-decision.md -
d2c95732026-09-09 signature-edit: click any icon opens a lightbox of the full in-outfit look -
936d27e2026-09-09 signature-edit: regenerate the 9 figures with distinct poses + backdrops -
3d9677d2026-09-09 Fix Lincoln shop links and launch custom signature wallpaper studio -
19dfb152026-09-09 signature-edit: new SEO lookbook page — 10 icons in the Signature Edit -
1b058a32026-09-09 auto-data-snapshot: 2026-09-09T12:49:50 (3 data files) — public/assets/campaign-lincoln-products-v2.png verification/e2e-proof.json verification/wallpaper-release.json -
bc4838a2026-09-09 auto-data-snapshot: 2026-09-09T12:16:55 (2 data files) — verification/wallpaper-decision.md verification/wallpaper-release.json -
dc24bda2026-09-09 campaign: regenerate Lincoln image — natural eyes/expression (was distorted) -
01e407c2026-09-09 wear: fix Lincoln sock signature — flat/horizontal at the cuff, not rotated up the shin -
03559072026-09-09 campaign: overlay text on the photo's open area + signature on all products -
f7578612026-09-09 front page: flip sections — campaign (seated Lincoln) leads, hero follows -
62fab0c2026-09-09 front page: stack the campaign section — image on top, text below -
1e946e32026-09-09 auto-data-snapshot: 2026-09-09T11:09:48 (1 data files) — verification/lincoln-campaign-prompts.json -
2a4de6d2026-09-09 wear: put Abraham Lincoln's signature on the ACTUAL product images (Signature Edit) -
f4f87452026-09-09 front page: Gucci-style Signature Edit hero — No. 001 Abraham Lincoln -
3693ec32026-09-09 wear: add all-over-print signature shirts (camp button-up + long-sleeve) — TK-10286 -
a70566c2026-09-09 wear: add typeahead search across the top of the signature picker -
6ccdfb92026-09-09 Clear the bucket hat eyelets and update verified preview handoff -
c4e67522026-09-09 Match the bucket hat preview selection to the supported Bone variant -
ac773c52026-09-09 wear: front-facing hats + centered signature; remove YOUR DESIGN placeholder (TK-10286) -
703013b2026-09-09 auto-data-snapshot: 2026-09-09T10:04:38 (1 data files) — data/wear-templates.json -
178086a2026-09-09 wear: curve-warp hat signature overlays + fix dad-cap/bucket-hat placement (TK-10286) -
a15a0cd2026-09-09 wear: re-center trucker-cap signature overlay (TK-10286) -
76489912026-09-09 wear: hover-to-zoom 3x lens on the signature only (TK-10286) -
e546ddf2026-09-09 Center the product preview text and options -
f44f65b2026-09-09 Add three hat previews and socks with guarded purchase and fulfillment paths -
f19730e2026-09-09 homepage: tighten gallery card UI + wire real mural/clothing purchase links (TK-10286) -
2dd7c662026-09-09 wear: persist sort selection to localStorage, matching density (TK-10286) -
c90a83c2026-09-09 Verify recolored wear artwork through both fulfillment draft paths -
c9d72f32026-09-09 wear: fix recolored signature URL being relative, not absolute (TK-10286) -
c2a79ec2026-09-09 wear: independent Stripe live switch — allows one test order before real money (TK-10286) -
f2976c02026-09-09 wear: use 'convert' not 'magick' — prod box only has ImageMagick 6 (TK-10286) -
452cc4c2026-09-08 wear: update stale KNOWN ISSUE notes now that the black-print fix landed (TK-10286) -
9f1ba522026-09-08 wear: fix the black-garment print contrast bug for real (TK-10286) -
bda72962026-09-08 wear: real rotatable 3D viewer for the classic tee (Three.js) — TK-10286 -
8b345a42026-09-08 auto-data-snapshot: 2026-09-08T15:35:04 (1 data files) — public/assets/models/shirt_baked.glb -
108381c2026-09-08 wear: drop the cap, real Printify product photos instead of flat SVG (TK-10286) -
4173af92026-09-08 wear: real multi-item shopping cart (own cart, not Shopify's) — TK-10286 -
adf13132026-09-08 wear: polo left_chest placeholder, add cap garment, collar fabric tag (TK-10286) -
06e1b9d2026-09-08 wear: dial print size back down to standard small left-chest logo (TK-10286) -
e8875062026-09-08 wear: bigger/higher placement, add pocket-tee, fix preview left/right mismatch (TK-10286) -
dcec53c2026-09-08 auto-data-snapshot: 2026-09-08T10:58:37 (1 data files) — data/wear-templates.json -
97b050d2026-09-08 wear: verify + fix left-chest print position against real Printify mockups (TK-10286) -
2e8f61b2026-09-08 wear: extend printify-cost-check.mjs to also verify left-chest placement (TK-10286) -
ba30f902026-09-08 wear: fix dark-garment preview + map Printify blueprints/variants (TK-10286) -
f197cfc2026-09-08 wear/POD: fix 4 correctness bugs from codex's 2026-09-04 review (TK-10286) -
919eed12026-09-04 Celebrity Signatures: correct a FALSE 'Data Not Collected' privacy instruction (TK-10387) -
47947972026-09-03 add gated Printify fulfillment path for wear -
4f0db6e2026-09-03 document TK-10286 wear end-to-end proof -
a8488902026-08-31 chore: v1.0.3 -> v1.0.4 (session close — /wear Stripe live-key fix + 2XL upcharge, TK-10286) -
b152beb2026-08-31 wear: +$4 2XL size upcharge (tee $38 / polo $48) — TK-10286 -
8b5b7ca2026-08-31 wear: charge apparel through live-capable Stripe resolver, not test-only key (TK-10286) -
19ad3e62026-08-31 Add AI-readable site guide -
93f75782026-08-25 CelebritySignatures mobile: early-game respects Difficulty + persist personal best (TK-10398) -
0770f002026-08-10 chore: lint, refactor, session-close fixes, v1.0.2 → v1.0.3 (TK-10286) -
0fa8dbf2026-08-10 wear/POD: wire Printful sender + go-live path (gated OFF) — TK-10286 -
5ed1ce72026-08-10 wear v1 soft-launch: browsable catalog live, sales gated behind WEAR_SALES_LIVE (coming-soon/notify-me buy button; no test-checkout exposed to real visitors) -
96c795b2026-08-10 wear v1 (TK-10286, Steve GO): ship public-domain historical signatures, USPTO auto-screen deferred -
a858b812026-08-10 chore: lint (node --check ✓, no linter configured) + v1.0.1 → v1.0.2 (session close, TK-10286) -
d3943772026-08-10 wear/TM: partial-register completeness guard + fix retired-host runbook (TK-10286) -
15b76e12026-08-10 ios: fastlane push_listing = screenshots-only (skip_metadata) — avoids blanking required App Review contact fields; metadata already published on the draft (TK-10262) -
986ff072026-08-10 ios: fresh App Store screenshots (iPhone 6.9" 1320x2868 + iPad 13" 2048x2732) from live site — replaces stale broken set (TK-10262) -
a613dfa2026-08-09 mobile: iPhone-only (supportsTablet:false) — drops iPad so ASC stops requiring iPad screenshots (TK-10258, Steve-approved iPhone-only) -
43d50a82026-08-08 screenrecord: track murals debug + verify harnesses (TK-10193 reproducibility) -
57895fb2026-08-08 game: harden — hide #prep before showRound() (Cody gate, TK-10192) -
dc1565d2026-08-08 game: fix TK-10192 BUG 1 — build failure no longer fires a modal alert() that froze the page -
589b8d12026-08-08 auto-data-snapshot: 2026-08-08T10:37:54 (77 data files) — screenrecord/debug-log.jsonl screenrecord/rec/game-run0/page@d3c036c80501f7033d077d5f6df76847.mp4 screenrecord/rec/game-run0/page@d3c036c80501f7033d077d5f6df76847.webm screenrecord/rec/game-run1/page@6e5156e1f617020d464184dbf6f78a28.mp4 screenrecord/rec/game-run1/page@6e5156e1f617020d464184dbf6f78a28.webm -
e0115ae2026-08-08 murals: fix TK-10193 BUG 1 — quote-submit no longer wipes name+email, so a follow-up Pay & order isn't blocked -
8f9337b2026-08-08 auto-data-snapshot: 2026-08-08T10:07:09 (1 data files) — screenrecord/verify2-out.txt -
ea8763a2026-08-08 auto-data-snapshot: 2026-08-08T09:36:16 (1 data files) — screenrecord/verify2-out.txt -
6b43f502026-08-08 auto-data-snapshot: 2026-08-08T09:04:57 (14 data files) — screenrecord/DEBUG-REPORT-murals.md screenrecord/debug-log-murals.jsonl screenrecord/debug-log.jsonl screenrecord/rec-murals/run0/page@f5767eef11026eca613976f1e51c40d4.webm screenrecord/rec-murals/run1/page@28e5339b4fca63b10de68d86e54f6561.webm -
05236a42026-08-08 TK-10191: screenrecord front-page UI debug (5-pass) — report + log -
cb846f42026-08-07 celeb web: add Sign in with Apple button to the account.js login modal (web parity — full-page /auth/apple/login redirect, shown only when /api/auth-config reports apple:true) -
7f435c22026-08-07 celeb: allow /.well-known/ through the sensitive-path guard (Apple domain-association file for Sign in with Apple) — dotfiles otherwise still blocked -
5c6df612026-08-07 celeb mobile: add Sign in with Apple button to AccountScreen — appleSignIn() runs ASWebAuthenticationSession (expo-web-browser) then replays /auth/handoff so cs_sess lands in the native cookie jar; button hidden until /api/auth-config reports apple:true (v1.1, staged — not submitted) -
ee2b3552026-08-07 celeb: add Sign in with Apple backend (web OAuth + WebView handoff bridge) — /auth/apple/login+callback verify Apple, upsert user by appleSub, cs_sess session; /auth/handoff one-time cookie bridge; /api/auth-config gates the button. Dormant until Services ID/key configured (v1.1) -
6a34cf32026-08-06 chore: lint, refactor, v1.0.1 (session close) -
49861212026-08-06 Add WEAR-READY-FOR-KEY finish note (paste key -> full-register screen -> /wear populates) -
9a722d32026-08-06 Repoint TM register fetcher to USPTO Open Data Portal (trtdxfap); document WAF + ID.me-key reality, add --file/--odp/--url ingest modes -
a1b47a62026-08-06 Add /wear: left-chest signature apparel with USPTO trademark clearance gate -
56c46cb2026-08-06 auto-save: 2026-08-06T09:20:28 (13 files) — .gitignore server.js WEAR-LEGAL-NOTE.md data/tm-clearance.json data/tm-index-seed.json -
9492cb52026-08-06 murals: add precise wall-size number inputs synced with the sliders -
16ef8092026-08-06 auto-save: 2026-08-06T08:19:59 (1 files) — apps/mobile/package-lock.json -
7884b612026-08-06 murals: fix selected mural not appearing (SVG thumbnails 400'd) -
c1485852026-08-06 chore: bump mobile v1.0.0 → v1.1.0 (6-game suite, session close) -
dd93fc72026-08-06 mobile: add game-engine validation harness (6/6 games ALL PASS vs live data) -
7c16c4c2026-08-06 auto-save: 2026-08-06T04:48:33 (8 files) — screenrecord/debug-log.jsonl screenrecord/game-debug.mjs screenrecord/rec/game-run0/ screenrecord/rec/game-run1/ screenrecord/rec/game-run2/ -
4e9ff2c2026-08-05 auto-save: 2026-08-05T20:45:35 (3 files) — apps/mobile/fastlane/README.md apps/mobile/fastlane/report.xml apps/mobile/fastlane/screenshots/ -
f3381c62026-08-05 iOS: fastlane deliver config + metadata — uploaded listing to ASC draft -
d805e542026-08-05 auto-save: 2026-08-05T18:14:36 (1 files) — apps/mobile/store-assets/listing.md -
ab0c89f2026-08-05 auto-save: 2026-08-05T17:44:25 (1 files) — apps/mobile/store-assets/ -
e2d7d1c2026-08-05 web: clicking a signature opens its details popup; Books section (Open Library) for non-artist hands -
91f1e572026-08-05 iOS app: white gallery theme + all images render + tap-signature works/books (Steve email 8/5) -
701c0092026-08-05 mobile: harden games port per adversarial review -
3d578562026-08-05 mobile: port all 6 desktop games into GameScreen (was whose-only) -
4b6b29e2026-08-05 iOS: complete App Store screenshot set — all 4 tabs (Gallery/Game/Murals/Account) -
792482d2026-08-05 iOS: capture Gallery App Store screenshot (6.9", release sim build) + submit PTY helper -
81f3b932026-08-05 auto-save: 2026-08-05T16:43:55 (2 files) — apps/mobile/scripts/eas-submit-pty.exp apps/mobile/store-screenshots/ -
de439612026-08-05 iOS: wire ASC app id 6798448971 into eas.json submit (app record + App ID already exist under team 3VAV3KMNZK) -
7beb5042026-08-05 iOS: EAS project link + headless first-build tooling + App Store listing draft -
523098f2026-08-05 auto-save: 2026-08-05T16:13:44 (2 files) — apps/mobile/app.json apps/mobile/scripts/eas-build-pty.exp -
a36745c2026-08-05 iOS: wire eas.json submit to the team-wide ASC API key (reused from C&E) -
0fd2d482026-08-05 iOS app: address contrarian FIX-FIRST gate -
caf36ad2026-08-05 iOS: add on-brand app icon + splash + adaptive icon, wire into app.json -
fc653002026-08-05 iOS: wire the 3.1.1 WebView guard + fix evolution-load side effect -
73d91372026-08-05 iOS app: native Expo/EAS scaffold over celebsignatures.com APIs -
77c88792026-08-05 backend: add POST /api/auth/delete (Apple 5.1.1(v) account deletion) -
4bbb6282026-08-05 AdSense onboarding: add /privacy policy page + site-wide footer link (celebsignatures.com) -
7cd0f6a2026-08-04 chore: fix game tagline (Five→Six ways), add version 1.0.0 (session close — live-payments milestone); lint clean, refactor review report-only on live payment code -
b4ed90d2026-08-04 auto-save: 2026-08-04T13:33:48 (1 files) — public/assets/ads.js -
cc240022026-08-04 Pre-built reserved AdSense ad zones (gallery/article/game) — hidden until per-zone slot ids are set via env (ADSENSE_SLOT_GALLERY/ARTICLE/GAME), so zero visual impact pre-approval + zero CLS once live (reserved min-height). assets/ads.js activator + server config injection. Post-approval = paste 3 slot ids into prod .env, done (TK-10181) -
87f0e4a2026-08-04 Accept rk_live_ restricted keys for the live Stripe key (least-privilege restricted key path for the murals go-live) (TK-10181) -
6db34b02026-08-04 AdSense Auto-ads integration (Steve request 2026-08-04): loader injected into every HTML response + /ads.txt route, both driven by ONE env var ADSENSE_PUB_ID (pub-XXXX, ca- prefix tolerated). No-ops safely when unset (0 loaders, ads.txt 404). Auto ads = no per-slot IDs; Google places units. Ready the instant a publisher id is set — needs an AdSense account + site approval (Steve-gated) (TK-10181) -
ea2f10b2026-08-04 Live switch is now MURAL-ONLY (Steve go-live 2026-08-04): per-flow keys — murals use live key when STRIPE_LIVE_ENABLED=1, downloads PINNED to test key until a celebrity-payout mechanism exists. Flipping the live switch can never accidentally charge a real card for a download whose owner we cannot pay. mode stamped from STRIPE_MODE (TK-10181) -
cc656ee2026-08-04 Live-mode switch (prep for go-live, defaults OFF): STRIPE_LIVE used ONLY when STRIPE_LIVE_ENABLED=1 AND sk_live_ present — else test. Real cards never charged unless Steve explicitly flips both. Generalized cs_(test|live)_ session-id checks. Boot logs the active mode (TK-10181) -
d8cfb502026-08-04 SECURITY (HOLE 5, blocks live money): paid download link no longer permanent — a Stripe session stays paid forever, so a shared ?sid= URL was infinite free re-download. Now gated to a 1-HOUR window from purchase + max 3 serves/session (persisted download-sids.json), then 410 → contact support. Allows legit retry, kills permanent sharing. Prereq for the live-key flip (TK-10181) -
f2fc2ab2026-08-04 payments(TEST): Cody gate fixes — atomic USED_SIDS guard (closes concurrent double-credit race) + gate on status===complete (Stripe fulfillment best-practice) -
08810332026-08-04 payments(TEST): gate signature downloads behind Stripe checkout — /api/signature-checkout + paid-session verification on /api/signature-file (idempotent by sid, inert without test key, live key never read) -
faf97c92026-08-04 GA4 game_start: guard category param — only log when #catOpts visible (Cody gate fix, prevents junk dimension for 4/6 modes) -
e44e3a82026-08-04 GA4 events: add game_start (mode/difficulty/category) + game_mode_select on game.html -
3b155de2026-08-04 GA4 events: wire named conversion/engagement events (mural_order_click, signature_upload, view_signature, cta_click) via delegated ga-events.js on all pages (DTD-B verdict) -
fc549c42026-08-04 Stripe Checkout for mural orders (Steve APPROVED, TEST-mode): zero-dep /api/mural-checkout creates a Stripe Checkout Session via REST (price = custom sqft × $10), /order-success verifies payment + marks the order paid + confirms; murals form gets 'Pay & order →' (with 'Request a quote' fallback). Reads STRIPE_TEST_SECRET_KEY ONLY — live key deliberately never touched (go-live = separate gate). Degrades gracefully w/o key (503). NOT deployed until a real test checkout verifies (TK-10181) -
5d6a79e2026-08-04 yoloforever PIVOT (Cody unanimous KILL-the-museum-loop): stop bolting museums, build SEO surface area — the 7,211 signatures lived in ONE JS-rendered page Google couldn't crawl. Now: server-rendered crawlable /a/<QID> page per signature (JSON-LD Person schema + canonical + OG), /sitemap.xml (7,197 URLs), /robots.txt; grid card links point at /a/<QID> (JS still opens the popup, href is the SEO/no-JS fallback). Factored mergedSignatures() helper w/ 60s cache. Verified: /a/ 200 + renders server-side, sitemap 7197 locs, popup still works (TK-10181) -
248c7da2026-08-04 World-collections expansion: +12 major museums (Hermitage, British Museum, Kunsthistorisches Vienna, Pompidou, Reina Sofía, Musée Rodin, V&A, Gemäldegalerie Berlin, NPG London, Alte Pinakothek, Städel, Tokyo National) via the dense P6379 path → +53 net Artists (1368→1421), site 7168→7211, 78 artists gained a new-museum tag. Honest: per-museum P6379 coverage is uneven (marquee retags sparse) — the win is +53 new signature-artists (TK-10181) -
da686f02026-08-04 auto-save: 2026-08-04T07:00:57 (2 files) — data/artists-raw.json scripts/fetch-artists.mjs -
db2d9d92026-08-03 auto-save: 2026-08-03T21:27:28 (4 files) — output/collage-artists-named.png output/collage-artists.png output/collage-authors-named.png output/collage-authors.png -
681aafe2026-08-03 Cody-gate fix (verified, proportionate): server art-occupation gate now excludes fashion/costume/game/sound/web 'designer' matches (Christian Dior no longer sits in Artists next to Van Gogh). Kept genuinely art-occupied figures famous for other things (Pasteur=portrait painter, Andersen=papercut artist, Mercator=engraver) — defensible. VERIFIED Cody overstated '33 non-artists live': the server gate already excludes Darwin/Tolstoy/Galileo; only 4 designer/adjacent leaked, Dior the sole indefensible one. Artists 1372→1368 (TK-10181) -
b3945992026-08-03 auto-save: 2026-08-03T20:57:17 (5 files) — output/collage-declaration-of-independence-named.png output/collage-declaration-of-independence.png output/collage-politics-named.png output/collage-politics.png scripts/fetch-artists.mjs -
4e316532026-08-03 Amsterdam haul via P6379: +110 net Artists (1262→1372), site 7076→7168. P6379 (has-works-in-collection, person→museum) is DENSE where P195 (artwork→collection) was a dead end — pulled the Dutch masters & tagged Van Gogh/Rembrandt/Vermeer/Mondrian to the Rijksmuseum. Densifies museum coverage for all 30 museums (TK-10181) -
e4eec832026-08-03 harvest infra: fix WDQS 504 timeout on the 25-museum query — now batched (3 museums/query) with retry+backoff, robust for every future harvest; register 5 Amsterdam/Dutch museums (Van Gogh Museum, Stedelijk, Rembrandt House, Amsterdam Museum, Mauritshuis) for when their Wikidata P195 coverage improves. NOTE: P195 itemization for these is currently sparse (+6 net artists, no marquee retags) — a real Amsterdam haul needs a Rijksmuseum-roster source (TK-10181) -
36e1cbe2026-08-03 yoloforever C3 fast-follow (Cody SHIP-IT verified real): canonical + meta description + apple-touch-icon on all 4 pages (the two tags Google actually uses); softened upload share-card from '$10 per download' to 'a commission' (payments still Stripe-gated — no promise the product can't yet keep) (TK-10181) -
d017b3d2026-08-03 yoloforever C3: social-share polish — OG + Twitter summary_large_image meta on all 4 pages (per-page title/desc, og:image = signature-wall share card built in Photoshop/PIL from the artists collage + wordmark) so shared score links unfurl richly; favicon (signature-ink glyph) + /favicon.ico route → kills the last console 404 fleet-wide. Verified: favicon 200, OG on all pages, 0 console errors (TK-10181) -
cb358f72026-08-03 yoloforever C2 hardening (Cody FIX-FIRST, all verified real): leaderboard endpoint locked down — game/diff whitelist (no arbitrary-key disk-fill), score capped 250 (blocks client-asserted 9999), per-IP rate limit 10/min (429), submission-id for deterministic rank + id stripped from public list. Verified: cheat→250, junk key→400, 11 posts→429 (TK-10181) -
79cdb512026-08-03 yoloforever C2: games social layer — server /api/leaderboard (top-20 per game+diff, JSON-backed, no-auth, sanitized) + results-screen leaderboard w/ your-rank highlight + 'Copy result' & X-share intent; addresses Cody's zero-retention/no-social-loop risk. Verified: API ranks correctly, UI posts+renders, 0 new console errors (.deploy.conf leaderboard-exclude applied locally, gitignored) (TK-10181) -
e4183c52026-08-03 yoloforever C1: scope-aware empty-search state (honest 'archive of history's hands, living people not here yet' — addresses Cody's brand-vs-content churn risk); UI debug pass verified all 3 pages 0 console errors, 2 findings phantom-dropped (TK-10181) -
9913d832026-08-03 Portraits for non-artists: fetch-portraits.mjs pulls Wikidata P18 -> Commons (CC/PD) for all 7055 people (6437 found); politicians/astronauts/authors/founders now show their PORTRAIT in the popup instead of an empty Works section (artists keep Works); portrait face-thumbnail added to every card's details chip + a circle beside the signature in the popup. Plus: client-side upload file-size guard (screenrecord finding) (TK-10181) -
b10be7b2026-08-03 Celeb Signatures: slow 16s ease-in-out float on hero logo (premium/calm, reduced-motion guarded) -
4562ef62026-08-03 auto-save: 2026-08-03T14:24:54 (6 files) — data/portraits.json screenrecord/ scripts/fetch-portraits.mjs scripts/screenrecord-game.mjs scripts/screenrecord-murals.mjs -
92e20cb2026-08-03 ⚡ Lightning Round (6th game): a real museum painting flashes up, 5-SECOND timer to name the ARTIST then the TITLE (auto-fails on timeout, no time to look it up), both-right bonus per painting (+5), fame-adjacent distractors from the same painting pool; timer bar drains green->red (TK-10181) -
17621232026-08-03 auto-save: 2026-08-03T13:54:39 (1 files) — public/game.html -
647ee5c2026-08-03 celebsignatures.com LIVE: elegant front page (Photoshop Snell-script logo hero + corner hamburger + Amazon-style left drawer), GA4 G-2HEVP6TD0J injected on all 4 pages, mobile pass, go-live runbook aligned to fleet ACME-webroot + IP-bound 443 pattern (TK-10181) -
934e1112026-08-03 celebsignatures.com go-live runbook (nginx vhost IP-bound per fleet rule + LE cert + smoke) — awaits domain purchase + DNS -
aeefcc52026-08-03 Elegant front page: Photoshop Snell-Roundhand script logo (topbar + hero, mix-blend multiply), full-bleed hero over faint museum-collage backdrop with 3 CTAs, corner hamburger opening Amazon-style left drawer holding ALL browse controls (tabs/categories/use/sort/density/views + links), The Collection section head, /assets route (TK-10181) -
0faa6c22026-08-03 mobile pass: responsive masthead (wrap + scrollable nav), 2-col grid on phones (layout-aware: ledger 1 / wall 4 / vitrine 1), full-width search, popup 96vw + 2-col works + full-width CTA, game stage + choices sized for phones, murals header/ctrls compact (verified at 390x844) -
133e8ee2026-08-03 The Signature Games: 5-game arcade at /game — Whose Hand? (sig->name), Who Signed This? (real AIC museum artwork->artist, Steve's ask), Match the Hand (sig->pick their artwork of 4), Early or Late? (two dated sigs from one person's evolution timeline), Date the Hand (sig->century); shared engine, streak scoring, per-game best scores, artwork gallery prefetch with progress (TK-10181) -
dbeb1052026-08-03 pre-deploy: strip temp Figma capture scripts; Authors collage built (top-200, 10x20) -> murals catalog 34 -
14e70712026-08-03 popup: center name/life/badges under the signature; FIX broken works images (AIC IIIF hotlink-blocks Referer -> referrerpolicy=no-referrer, verified 6/6 render for Munch incl. The Scream) + broken tiles self-remove; gallery card names centered -
21c7dea2026-08-03 Gallery layout: names always visible below the details chip (chip stays hover-revealed above) -
d1e72832026-08-03 6 switchable shopping layouts (View chips), all info-on-hover: Gallery (refined default), Float (chromeless ink on cream), Plaque (dark plate slides over on hover), Ledger (auction-catalog rows), Vitrine (large tiles, glass caption fade), Wall (dense signature texture, hover lifts + floating name plate); persisted per visitor, touch devices keep info visible (TK-10181) -
5a072752026-08-03 'Whose Hand?' signature-ID game at /game: 10 rounds, 4 fame-adjacent same-category distractors, streak scoring, 4 difficulty tiers (Icons top-100 -> Deep Cuts all 7,076), category filters, per-mode best score, every reveal links to the artist's page; nav wired (TK-10181) -
b9facd32026-08-03 auto-save: 2026-08-03T12:23:59 (5 files) — public/index.html public/murals.html public/upload-signature.html output/collage-authors-named.png output/collage-authors.png -
7084e362026-08-03 typography unification: Playfair Display headings across murals + upload pages (brand consistency with the grid masthead) -
5d386312026-08-03 collage builder: merge authors.json into the data view (Authors collage was silently empty) -
4b5b4212026-08-03 Authors category LIVE: 5,686 deceased authors with verified Commons signatures (Shakespeare #1; writer/novelist/poet/playwright/essayist occupations, dead>50yr, famous-first) — site now 7,076 signatures; Authors collage capped at top-200 (logged, full set in grid) (TK-10181) -
9aa908e2026-08-03 Mural pricing: $10/sq ft (Steve directive) — 24x12 flagship now $2,880, custom sizes scale linearly -
46fd5bd2026-08-03 Custom mural sizing: user enters mural width/height (ft) and signature chips re-arrange live at true print scale (~1.9x0.85ft/sig) — bigger walls pull the next famous-first set in (verified: Politics 8x4ft=16 sigs, 24x12ft=54 sigs, live sqft price); order payload carries custom dims + count. Plus: Authors category scaffolding (fetch-authors.mjs literary-occupation harvest, server merge, UI chips, /k/w collage QR) (TK-10181) -
03c2beb2026-08-03 Five-Horsemen UX pass (ui-ux + graphic-designer panel verdicts applied): global nav masthead + Playfair wordmark, name SEARCH on the grid, value-prop hero line, category chip counts, consumer language (Free to use / Permission needed), document-style cards + hover-reveal details chip, popup recomposition (full-width signature, Playfair name, sticky Order-a-mural CTA), dialog a11y (role/aria-modal/focus return), upload page $10 stat callout (TK-10181) -
b5a94582026-08-03 Celebrity signature upload + commission system: account-owned uploads (private storage, never statically served), tracked download endpoint with append-only commission ledger (50% of $20/download), identity-review admin gate, upload page + earnings dashboard at /upload; CLOSED pre-existing hole: data/{users,sessions}.json were directly fetchable -> 403 guard (TK-10181) -
b6b478a2026-08-03 Museum expansion final: 1262 artists (Cleveland 219, MFA Boston 202, LACMA/Broad/MOCA/Getty tags merged), collage rebuilt 911 sigs 10x92 (TK-10181) -
248d9d22026-08-03 works source 4: Wikidata P170+P18 by QID (keyless CORS WDQS -> Commons thumbs) — covers Rijksmuseum/Uffizi/Prado holdings; art-build audit: MET+AIC already integrated, Rijks key was placeholder + old API 410-retired (TK-10181) -
73182732026-08-03 Artists mega-collage (895 verified signatures, 10x90 wall + QR /k/a) + 3 museum murals built (Masters of the MET / National Gallery Masters / Smithsonian Masters) -> 33 mural products (TK-10181) -
a7c40c42026-08-03 Museum expansion wiring: +10 museums in P195 harvest (LACMA, The Broad, MOCA, Getty, SFMOMA, Whitney, Guggenheim, Cleveland, MFA Boston, Philadelphia; QIDs verified), union-not-overwrite artists-raw writes; popup works loader now multi-source (Met -> AIC -> Cleveland, all keyless CORS) with per-tile museum label (TK-10181) -
faaabcc2026-08-03 Minimal cards (signature + name only) + artist details popup: badges/museums/license/links, signature-evolution strip, and the artist's WORKS live-loaded from the Met Open Access API; URL-addressable ?artist=QID deep links (TK-10181) -
cddb9382026-08-03 signature-evolution data live: 162 people with multiple signatures, 58 datable timelines (Delacroix 1835-1863, Lincoln 28 sigs, Rodin, van Eyck); adopt authoritative artists.json server filter (TK-10181) -
0a2db072026-08-03 Adopt two-source architecture (curated file + generated artists.json, server-side merge): artists-post.mjs ports CC salvage (Rembrandt/Kahlo) + museums re-join + rerank onto artists.json; evolution + collage builders read the merged view; retire merge-artists bake-in (TK-10181) -
c07a0412026-08-03 CC-license salvage: +162 artists whose signature SVG carries a CC BY(-SA) claim (Rembrandt, Kahlo) — admitted per site's existing attribution model; Artists=1237, catalog=1365 rows (TK-10181) -
e6a90052026-08-03 Artists category LIVE in catalog: 1075 verified dead artists (MET/NGA/Smithsonian + major-museum rosters), all PD-signature Commons-verified, visual-arts occupation gated; catalog 128->1203 rows (TK-10181) -
396705f2026-08-03 3 museum mural themes: Masters of the MET / National Gallery Masters / Smithsonian Masters (curated 14-name rosters from artists-raw, gemma3 local blurbs) (TK-10181) -
757e39d2026-08-03 Signature evolution: multi-P109 + Commons 'Signatures of X' timeline fetcher, inline card strip (details/summary, no modal); wire Artists into collage builder + /k/a QR short code (TK-10181) -
e3ae2652026-08-03 auto-save: 2026-08-03T10:23:02 (3 files) — data/artists-raw.json data/artists.json tmp_artists.png -
3c90e382026-08-03 Artists category: Wikidata P195 museum-artist harvest + PD-signature verify + dedupe-safe /api/signatures merge -
4d73f502026-08-03 Artists groundwork: shared wikidata-common lib (extracted from fetch-wikidata), roster gap-fill harvester (NGA/MET-CSV/SI -> P109), idempotent celebrity_signatures merger, museum tags on grid cards (TK-10181) -
31e56bf2026-08-03 fix: add package.json (type:module) so the ESM server.js can actually run — app was never startable without it (TK-10123) -
fb921292026-08-01 CelebritySignatures: href-drill — category + usability are filter-links (URL-addressable) -
b3b13552026-07-03 chore: macstudio3 migration — reconcile from mac2 + repoint paths (stevestudio2→macstudio3, node/npm/npx→/opt/homebrew) -
5af58db2026-06-19 add 27 themed signature murals (Wikidata P109 sigs + Met PD art) → 30 murals on /murals; catalog-roster drawer -
3a77cd82026-06-19 wire Oldest Signatures into storefront: grid category + mural product + roster (Met PD art) -
57c16d52026-06-19 add 'Oldest Signatures in History' research dataset, spreadsheet + Met-art mural -
f4efd0f2026-06-19 narrow catalog to historical figures (Declaration + Politics) dead >50yr; drop movie/tv/sports; rebuild CSV from JSON; regen art -
55282342026-06-19 fix card name + category-tag clipping (wrap long surnames instead of overflow-hidden) -
a60c49a2026-06-19 deploy: ship deceased-only catalog to celebrity.designerwallcoverings.com; add .deploy.conf -
2c1af562026-06-19 regenerate collages + portrait murals from deceased-only dataset -
8def5d92026-06-19 remove all living celebrities; keep only deceased (publicity-rights safe) -
3c6f4922026-06-19 snapshot before removing alive celebrities -
11d1aad2026-06-18 Accounts + save-your-placement: zero-dep email/password auth + per-account saved mural placements; injected account.js UI -
a27e4a92026-06-18 data: recategorize FDR Sports→Politics + rebuild affected collages -
4ad180e2026-06-18 Portrait murals: portrait+signature per cell (PD/CC-gated portraits) for all 6 categories + generator -
86bfd8c2026-06-18 murals: add 5 consensus components (graphic-designer ∩ four-horsemen) -
91111122026-06-18 Murals storefront: /murals sales page + wall-placement studio + order endpoint + 150dpi 24x12ft TIF print-master generator (verified) -
84da4402026-06-18 Mural QR: B+C — functional-size centre QR + short /k/<code> route -
ac66a5d2026-06-18 QR points at public Kamatera host via short /k/<cat> route; verified all 6 decode -
a8e8de12026-06-18 Murals: QR is now a signature-sized centre cell (drop panel/caption/shadow) -
b04a4a92026-06-18 Murals: hide names + centre QR to the named key -
3a492fb2026-06-18 All 3: Collages tab in viewer + deceased-only Movies(Classic) category (97 usable) + signature-likeness filter (drops color-photo/document scans, keeps sparse sigs). Dataset now 656 rows, 6 collages -
933e9442026-06-18 Build per-category collages (usable-only): Declaration(56), Politics(75), Sports(42), Hollywood(100), TV(22); Movies skipped (0 usable). 429-throttled Wikimedia raster fetch -
44a7d342026-06-18 Add zero-dep grid viewer (server.js + public/index.html): sort + density slider, risk/usability badges, uniform card sizing -
7d02e4f2026-06-18 Populate 556 verified signatures (500 celebrity + 56 DoI); sitelink-title backfill, CSV newline sanitize, WDQS outage backoff -
0829e6e2026-06-18 CelebritySignatures: scaffold + verified Declaration of Independence set (56 signers, all PD) + WDQS celebrity engine
Authors
- Steve211
- auto-commit-fleet11
- steve7
Agents used
Skills used
- /claude39
- /code39
- /wear27
- /mobile11
- /assets10
- /wear-success8
- /rec7
- /murals6
- /page6
- /index5
- /auth5
- /game5
- /wear-templates4
- /wear-checkout4
- /scale4
- /signatures4
- /socks3
- /reconcile-wear-orders3
- /polo3
- /black3
- /size3
- /debug-log3
- /game-run03
- /game-run13
- /mural-checkout3
- /auth-config3
- /fastlane3
- /ads3
- /fetch-artists3
- /trucker2
Creative ideas + design notes
fbffb50 · 2026-09-13 · gitignore: exclude campaign image-gen candidates + QA artifacts
Rejected Lincoln generation variants and verification screenshots from the Sep-9 campaign session — regenerable, not referenced by any tracked code. The chosen hero (campaign-lincoln-seated.jpg) stays tracked. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8272a62 · 2026-09-13 · campaign: lead the homepage hero with the full seated Signature Edit
Swap the campaign hero from the tee-only shot to campaign-lincoln-seated.jpg (Lincoln seated in the full Signature Edit — bucket hat, tee, socks) and reword the copy + rendering disclaimer to match. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VAzDMrVAjLD4umvnMMStjD
d72fd54 · 2026-09-13 · wear: fix "See on garment" not hiding the editorial worn shot + modernize gallery E2E
- wear.html: #lifestyleShot had display:block with no [hidden] guard, so
setLifeView("garment") (.hidden=true) never actually hid the seated
Signature Edit portrait — for all 50+ mapped signers, "See on garment"
left the worn shot covering the garment mockup/3D view. Add
#lifestyleShot[hidden]{display:none}.
- gallery-shopping.e2e.cjs: port the retired murals journey to the shipped
/wallpaper studio (commit 3d9677d), expect all 9 garments, correct the
sale state (dad/trucker/bucket/socks are for sale; the two AOP shirts are
the coming-soon holds), cover the worn-shot -> garment toggle, screenshot
the always-visible .preview instead of the now-hidden #stage.
- 5x/ink-gate.mjs: supplementary CDP E2E for the modal ink control (PASS).
Both viewports PASS, zero page errors.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VAzDMrVAjLD4umvnMMStjD
15e7499 · 2026-09-09 · wear: add Signature Edit lookbook promo banner (discoverability)
Slim green-accented callout below the header linking /wear → /signature-edit, so shoppers find the 53-icon worn-shot lookbook. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7bce96c · 2026-09-09 · signature-edit: expand The Signature Edit lookbook from 10 → 53 icons
All top-50 famous signers now have their seated editorial 'worn' card in the SEO lookbook (was just the original 10). Generated from the ranked list + live feed data (name, qid, death year, signature, license), matched to the campaign slugs. Each card + lightbox links to its /wear product page. Headline/meta updated. Verified 53 cards render, 0 JS errors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
8322ca0 · 2026-09-09 · wear: fix stale ink-color fallback in reconcile-wear-orders.mjs + its test
test/wear-artwork-flow.test.mjs (committed 07:58 today) asserted the old fixed #f5f3ee recolor tint. Commit 18cca456 (16:13 today) deliberately changed server.js's dark-cloth fallback to #ffffff to match the on-shirt preview's inkHexFor() exactly — but the test was never updated, so it was failing on HEAD (verified via git blame: the two commits are unrelated, the test simply predates the ink-choice feature). Root-caused by reading both implementations rather than guessing: server.js's #ffffff is correct/intentional (matches public/wear.html's inkHexFor, "dark cloth, no pick → white"); the old #f5f3ee was pre-feature scaffolding. So the fix is NOT touching server.js — it's: 1. scripts/reconcile-wear-orders.mjs: renamed recolorSignatureToLight() -> recolorSignatureInk(imageUrl, hex) and added safeInkHex(), mirroring server.js's current signature/cache-key/fallback exactly (was still on the pre-buyer-choice, fixed-#f5f3ee version — the two producers had drifted out of parity since the ink-color feature landed). 2. test/wear-artwork-flow.test.mjs: updated the two stale pixel assertions from #F5F3EE(FF/00) to #FFFFFF(FF/00) to match current intended behavior. Verified: both producer subtests (success + reconciler) now pass; node --check clean. Did not touch server.js, public/index.html, or the unrelated wear-accessories.test.mjs failures (separate, pre-existing, in another session's active hat/accessory work). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
71f5347 · 2026-09-09 · wear: surface the Signature Edit — ✦ badge + 'Signature Edit first' sort
The 52 signers with a seated editorial 'worn' shot were buried among 2,955 in the grid. Now a subtle ✦ star + green outline marks them, and a new sort option brings them to the top so shoppers can find the premium lookbook content. Keyed off the same exact worn-shot map (no false badges). 0 errors, verified. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
cb3ba6f · 2026-09-09 · wear: map Michelangelo Buonarroti → campaign-michelangelo.jpg (same-person dup record)
The catalog has two Michelangelo records ('Michelangelo' + 'Michelangelo
Buonarroti'); both are the same artist so both should show the worn shot. Added
the name variant. (Napoleon III / Rembrandt Peale / Dumas fils / the George
Washington-named people are DIFFERENT people and stay correctly excluded.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ced4cca · 2026-09-09 · wear: map worn-shot by EXACT signer name, not surname — kills wrong-celebrity collisions
Surname auto-detect would show campaign-adams.jpg (John Quincy Adams) on all 10 other Adams pages (John/Samuel/Abigail...), Napoleon's shot on Napoleon III, Hugo's on Hugo Grotius, Louis XIV's on France Prešeren, etc. — the WRONG person's editorial photo. Replaced with an exact full-name→slug map of the definitive top-50 (+ existing); anyone not listed shows the normal garment mockup. Still probes the file (may not be generated yet) and self-surfaces as shots land. Verified: Darwin/Napoleon show, Abigail Adams/Napoleon III show nothing, 0 errors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a0253a8 · 2026-09-09 · wear: 43 worn editorial campaign shots for top-signer roster (TK-10286)
Each historical signer seated editorial in our white bucket hat + tee + crew socks, garments carrying a cursive signature — matches the Einstein bar. flux-kontext text-to-image with front-loaded per-figure features. Assets only; wear.html auto-detects campaign-<slug>.jpg. Likeness approximate for non-iconic figures (text-to-image ceiling). Cost $1.72 (43 imgs).
22b0eba · 2026-09-09 · wear: accent-fold worn-shot slug candidates (Velázquez→velazquez, Molière→moliere)
The auto-detect stripped accents to nothing (velázquez→velzquez), so accented-name shots would never surface. Normalize NFD + strip diacritics first, matching the pipeline's transliterated campaign-<slug>.jpg filenames. Verified across the accented top-50 names. Display-only, reversible. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
d8381ce · 2026-09-09 · wear: auto-detect campaign-<slug>.jpg for the 'worn' shot instead of a hardcoded map
Per peer coordination (celebritysignatures-e9 owns generation + naming): derive slug candidates from the signer's name (surname / joined last-two / full / first, + overrides for vangogh & frida) and probe which campaign-<slug>.jpg exists, so every shot the pipeline generates (Shakespeare, da Vinci, Goethe, … the top 50) surfaces on its product page automatically with no code change. Fixes Lincoln to use campaign-lincoln.jpg (was pointing at -seated). Verified Darwin/Lincoln worn, Shakespeare no-shot, 0 errors. Local only, not deployed. Reverse: git revert HEAD. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
523cb04 · 2026-09-09 · wear: 'See it worn' — feature each celebrity's seated editorial shot on their product page
For signers who have an AI 'seated in the full Signature Edit' campaign photo (currently Darwin, Franklin, Lincoln, Michelangelo, Napoleon, Van Gogh among the wear-eligible), the /wear product modal now leads with that editorial 'worn' shot (the person in the signed hat + tee + socks) with a 'See on garment' toggle back to the interactive mockup. Signers without a shot are unchanged (flat mockup, no toggle) — verified both paths, 0 console errors. Display-only, reversible; NOT deployed (overnight gate). Reverse: git revert this commit. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7489d97 · 2026-09-09 · signatures: serve the full-resolution original (vector SVG / native raster), not a downsampled thumb
Steve: 'high res'. resolveSource returned Wikimedia's 1200px PNG thumbnail — which also rasterizes SVGs, throwing away vector sharpness. Now prefer info.url (the original file): SVGs render as VECTOR (crisp at any size), rasters at full native resolution. Signature files are small so full-res is cheap; thumb stays a fallback. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6adf104 · 2026-09-09 · wear: raise crew-socks price $22 → $28 to clear cost/markup floor (TK-10286)
Crew Socks was priced $22, which at reference blank cost ~$11-16 fell below Steve's cost/0.65/0.85 markup floor (only ~1.4-1.7x). $28 clears it comfortably. Bucket Hat left at $32 (healthy ~2x vs ~$13-17 reference cost). Exact Printify cost unverified — Printify does not expose blank cost read-only; run scripts/printify-cost-check.mjs for precision. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
18cca45 · 2026-09-09 · signatures: show TRUE source colors, crisp — drop the invented per-signer recoloring
Steve: 'make all signatures original colors, not all diff colors on index page' (+ a green box on the shirt, + blurry). Root causes & fixes: - Gallery/detail (signature-preview): render the ORIGINAL resolved image directly instead of the canvas-normalized copy. SVGs stay vector (crisp at any size) and every signature keeps its true source colors — no more raster blur, no rainbow. - Shirt (wear canvas): DEFAULT is now the original art (multiply drops the white ground, shows true colors) — no recolor. The green box was recolorInk's source-in fill painting every opaque pixel of a white-bg source; recolorInk now thresholds (ink→color, background→transparent) so a buyer's chosen color / white-on-dark colors only the strokes. 3D decal uses a matching knockoutWhite for the original. - Print (server): recolor only when the buyer picked a color or the cloth is dark; otherwise keep the original art. - Ink control default is now 'Original' (the signature's own colors); presets + Custom remain for buyers who want a specific color. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
68dd99d · 2026-09-09 · wear: full Signature Edit campaign hero — Lincoln seated in hat+tee+socks
Replaced the bust campaign hero with the full-edit seated shot: real O-77 portrait face composited in Photoshop onto a generated seated body (kontext, $0.12 total this thread), craggy AI face removed; our exact 1862 signature composited onto the bucket hat, tee chest, and both socks; garbled AI text blurred out. Campaign copy updated to 'the full Signature Edit'. (index.html swap on disk; ships on deploy.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
47a6363 · 2026-09-09 · wear: make Bucket Hat ($32) + Crew Socks ($22) sellable — Lincoln campaign look (TK-10286)
Bucket Hat (bp1698/provider99, Bone/One size 116655) and Crew Socks (bp2941/provider29, White/One size 155679) were Printify-mapped but held (saleEnabled:false, priceUsd:null). Set saleEnabled:true + priceUsd. Socks printPositions (left_leg/right_leg) were already set by codex-run-10286; hat printPosition (front) already set. Prices are category defaults — NOT cost-verified (Printify exposes blank cost only on a created product, which is gated). Classic/Pocket/Polo + Dad/Trucker caps + AOP shirts untouched. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
08f3529 · 2026-09-09 · wear: buyer-adjustable signature ink + Node-ported color for the printed art
UI: a SIGNATURE INK control on the /wear product — Auto (the signer's own color, white on dark cloth) + 7 curated inks + a Custom… full picker. The pick drives the live shirt preview (inkHexFor honors the override) and rides the cart → checkout → order item (validated server-side). Print: ported inkColorForHue to server.js (identical FNV+HSL+WCAG-3:1 output, verified against the client), generalized recolorSignatureToLight → recolorSignatureInk(url, hex), and the POD draft now bakes the resolved ink into the printed art — buyer's pick, else white on dark / signer color on light — matching the preview. Client ink is strictly validated (#rrggbb) before it can reach ImageMagick -fill. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
b5ebc16 · 2026-09-09 · signature-size: make the mobile grid slider actually resize signatures
The mobile @media block hardcoded .sig height:96px, overriding the --sig-h var, so the "Signature size" slider (reachable via the ☰ drawer on phones) saved the pref but never changed tile size. Use var(--sig-h,96px) so mobile matches desktop. Verified headless: mobile grid 96px -> 172px. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5acdc48 · 2026-09-09 · wear: on-shirt signature uses the signer's color on light cloth, white on dark
Extend the distinct per-signer color to the garment mockup (2D canvas, AOP tile, and 3D decal): recolor the ink to the signer's own color on light colorways (composited via multiply so fabric shading still reads), and to pure white on dark colorways (source-over) where a dark color would be invisible. Generalizes recolorToLight(img) -> recolorInk(img,hex); a small module bridge exposes the shared inkColorFor() to the classic canvas script so shirt and swatch match. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
a272fad · 2026-09-09 · wear: Lincoln-in-exact-tee campaign hero (kontext-fit, real product preserved)
Photoshop-placed our real Signature Tee on Lincoln's public-domain O-77 portrait, content-aware-filled the suit remnants, then one flux-kontext image-EDIT ($0.04, logged) added his neck/shoulders so he genuinely wears it — his face + our exact tee + chest signature preserved (edit, not recreate). Campaign section now points at /assets/campaign-lincoln-tee.jpg with an honest 'digitally composed, not a photograph' line. (index.html campaign swap is on disk; ships on deploy.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3a772dc · 2026-09-09 · signatures: render each signer in a distinct, WCAG-legible color on clean white
Route every signature swatch (gallery, /wear, murals rosters, games, detail + evolution panels) through the shared signature-preview component so the ink is painted in a stable per-signer color on a clean white ground instead of black ink on cream. Color keyed on qid (unique per signer) with a name fallback. normalizeInk() takes an optional ink triple; inkColorForHue() guarantees every hue clears WCAG 3:1 non-text contrast on white by darkening lightness only as much as needed (fixes the ~10% olive/yellow dead zone). Fallback path (CORS- denied source, ~0.06% of the feed) instrumented via window.signatureRenderStats. Tests: 360-hue WCAG sweep + color-path assertions (7/7). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
6a759ce · 2026-09-09 · game/murals/wear: render cleaned colored-ink signatures via shared preview
Wire the signature-preview.css + signature-preview.js component into the game, murals, and wear pages so their signatures get the same white-ground / colored- ink cleanup as the gallery. Depends on the signature-ink.js crash fix. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ikfY9DhpMDXkpNRpb5ufG
5499131 · 2026-09-09 · signatures: permanently exclude Q352 (brand safety) from every surface
Filters the QID from mergedSignatures() so it never appears in feed, grid, wear, or sitemap. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ikfY9DhpMDXkpNRpb5ufG
abc8f51 · 2026-09-09 · signature-viewer: fix ink-collision crash + add user-adjustable signature size
- signature-ink.js: rename the pixel counter (was `let ink` shadowing the `ink` color param) → hard SyntaxError that broke the whole preview module. The broken build had shipped to prod; unit test now 5/5, module chain parses. - New size controls (both surfaces): a "Signature size" slider resizes gallery tile signatures (--sig-h); a −/+/Reset stepper resizes the popup preview (--ap-sig-h). Both persist in localStorage prefs; null keeps the responsive default. Verified headless on desktop + mobile. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ikfY9DhpMDXkpNRpb5ufG
d2c9573 · 2026-09-09 · signature-edit: click any icon opens a lightbox of the full in-outfit look
Clicking a card image or name opens a modal showing the full campaign image (person in the signature outfit) + their real signature + shop/source links. Keeps the crawlable /a/Q link for SEO (JS intercepts the click). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
936d27e · 2026-09-09 · signature-edit: regenerate the 9 figures with distinct poses + backdrops
Each icon now has a unique pose (leaning, standing, arms-crossed, contemplative, etc.) and a different studio backdrop shade, so the lookbook no longer reads as one shot repeated. Products + real signatures + likeness unchanged. Lincoln kept as-is (its composition drives the home-page text overlay). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
19dfb15 · 2026-09-09 · signature-edit: new SEO lookbook page — 10 icons in the Signature Edit
New /signature-edit page (route + sitemap in server.js): 10 famous public-domain figures (Lincoln, Einstein, Van Gogh, Picasso, Frida Kahlo, Napoleon, Franklin, Twain, Darwin, Michelangelo) each seated in the signature products, with their REAL Wikimedia signature + attribution + /a/Q link. Person ItemList JSON-LD, canonical, OG. Front-page 'Shop the Lincoln edit' now links here. Only deceased/public-domain figures used (likeness + never-invent rules). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
dc24bda · 2026-09-09 · campaign: regenerate Lincoln image — natural eyes/expression (was distorted)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
01e407c · 2026-09-09 · wear: fix Lincoln sock signature — flat/horizontal at the cuff, not rotated up the shin
Steve flagged the live front-page "Signature Socks" card: the signature was rotated ~90° and ran vertically up the shin. Recomposited from the clean base (crew-socks-white.jpg) with the signature flat and horizontal, small, at the sock's cuff/ankle — matching how it sits on the tee's chest. Same source asset (Wikimedia 1862 signature), no re-generation, $0 local. Reversible. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Scv6ymMnvxhwETzTMdobqJ
0355907 · 2026-09-09 · campaign: overlay text on the photo's open area + signature on all products
- Text (Signed, Mr. Lincoln + copy) now overlays the left negative space of the image with a soft ivory scrim (dark ink); mobile falls back to a dark band. - Regenerated campaign-lincoln.jpg so the hat, tee, and socks all carry the signature (were blank). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
f757861 · 2026-09-09 · front page: flip sections — campaign (seated Lincoln) leads, hero follows
Per Steve: swap section order so the full-width seated-Lincoln campaign image is the first thing under the masthead, with the 'Wear a piece of history' editorial hero below it. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
62fab0c · 2026-09-09 · front page: stack the campaign section — image on top, text below
Per Steve: campaign band goes from side-by-side (image left/text right) to stacked full-width image on top of the dark text band. Local build; deploying. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
2a4de6d · 2026-09-09 · wear: put Abraham Lincoln's signature on the ACTUAL product images (Signature Edit)
The front-page Signature Edit trio showed blank products while the copy said the autograph 'runs through every thread'. Composited Lincoln's real 1862 signature (public-domain, Wikimedia) onto the actual product photos — tee/polo/pocket at the chest, dad/trucker/bucket caps centered front, socks up the leg, and the two AOP shirts all-over — producing real signed product images (<garment>-lincoln.jpg). Swapped the front-page edit-trio (tee/hat/socks) to the signed versions. $0 local compositing, no image-gen spend. Reversible. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
f4f8745 · 2026-09-09 · front page: Gucci-style Signature Edit hero — No. 001 Abraham Lincoln
Redesign public/index.html hero into an editorial 'Signature Edit': real public-domain Lincoln signature (Wikimedia, attributed, links to /a/Q91) + the 3 real wear blanks (tee/hat/socks) + softened hero-bg. Adds a clearly labeled AI 'campaign' accent (Lincoln dressed in the products; not a photo). Preserves all existing hooks (burger/drawer/grid/sort/artistPop/api fetch). Honors the project's never-invent-a-signature rule. Local only; not deployed. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U2uvgXWs4FjLd6eDBDNUxP
3693ec3 · 2026-09-09 · wear: add all-over-print signature shirts (camp button-up + long-sleeve) — TK-10286
Steve's reference was a button-up covered edge-to-edge in tone-on-tone signature script; add it as product options. POD reality: Printify AOP cut-and-sew, sublimation (printed tone-on-tone, not woven jacquard). Two blueprints: - Signature Camp Shirt = #1533 (MWW On Demand), short-sleeve button-up - Signature Long-Sleeve = #1261 (Miami Sublimation), pullover New AOP render path in wear.html (paintAllover): tiles the selected signature edge-to-edge, staggered + tone-on-tone, clipped to the garment silhouette via a background-keyed mask (threshold 80 + 3px erode = no off-fabric bleed). Bases are the official blank flat-lay front mockups. saleEnabled:false / priceUsd:null until Printify config + go-live (TK-10286 Steve gate); real variant IDs recorded. Verified live in-browser (verification/live-aop-*.jpg), zero console errors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
a70566c · 2026-09-09 · wear: add typeahead search across the top of the signature picker
Full-width search bar above the grid that (a) live-filters the 2,955-signature grid as you type (name + category) with the count + empty-state updating, and (b) drops an autocomplete list of the top ranked matches (word-start > substring, match highlighted, thumbnail + category) that you can click or arrow-key +Enter to jump straight to the product. Escape/blur closes it; × clears. Pure client-side addition to wear.html, no server change. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
ac773c5 · 2026-09-09 · wear: front-facing hats + centered signature; remove YOUR DESIGN placeholder (TK-10286)
Dad Cap / Trucker Cap / Bucket Hat previews were rendering on ANGLED on-model lifestyle photos, so a centered front decal was geometrically impossible (the earlier curve/rotation overlay hacks were compensating for that). Rebased each hat on a true front-facing Printify view; inpainted the 'YOUR DESIGN(/HERE)' placeholder off the dad+trucker front panels; used the clean blank front bucket. Reset overlayBox to a centered front print box (center x=1024=image center) and removed curve+rotation. Bucket colorway Army->White to match the only front-facing asset (preview-only; saleEnabled stays false). Proofs in verification/. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013oMdD46CVyPsuM6JUoiea7
178086a · 2026-09-09 · wear: curve-warp hat signature overlays + fix dad-cap/bucket-hat placement (TK-10286)
Per /dtd (4/4 unanimous B): graphic-designer review flagged flat rectangle overlays on curved cap crowns read as pasted stickers rather than real DTF/embroidery prints. paintSignatures() now optionally slices the signature into thin vertical strips and bends each along a parabola (ob.curve, px) when a garment box declares one — cheap, canvas-only, no 3D pipeline. Applied per-hat (trucker:6, dad-cap:14, bucket-hat:18, matched to each crown's actual curvature). Also fixed the two placement issues the same review caught: dad-cap overlayBox was too close to the bill seam (y:705->640, h:150->130); bucket-hat's right edge landed on the crown's ventilation grommet (x:860->780). Verified via Playwright screenshots against local pm2 — all three hats now centered, curved, and clear of seams/hardware. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
a15a0cd · 2026-09-09 · wear: re-center trucker-cap signature overlay (TK-10286)
Steve flagged live that the signature sat low, overlapping the mesh side seam instead of centered on the solid front panel. Pixel-verified against the actual on-model photo (overlaid a debug rectangle, compared before/after) rather than guessing: x:765,y:560,w:570,h:160 -> x:955,y:500,w:450,h:140. Checked dad-cap and bucket-hat the same way — both already reasonably centered, left unchanged. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
7648991 · 2026-09-09 · wear: hover-to-zoom 3x lens on the signature only (TK-10286)
Only activates over the printed signature (not the whole garment), and repaints fresh from the source photo + signature images at the zoomed resolution instead of CSS-scaling the already-rendered canvas (which just stretched existing pixels and looked blurry). Zoom level adapts per garment box so wide signatures never clip out of the lens. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
f19730e · 2026-09-09 · homepage: tighten gallery card UI + wire real mural/clothing purchase links (TK-10286)
Two coordinated changes landed together (claude-run-10286 + codex-run-10286, same session, real-time a2a via the ticket system after a genuine file-write race on public/index.html — reconciled rather than reverted): 1. Card UI tightening (Steve's direct ask, screenshot-driven): grid gap 18px->10px, .sig image area 120px->88px, .meta padding 11px/13px->6px/8px, .name forced single-line (white-space:nowrap + ellipsis, was wrapping to 2 lines for longer names like "Mustafa Kemal Atatürk"). Verified via a real Playwright screenshot at /?cat=Politics — names fit one row, padding visibly tighter. 2. Real mural/clothing purchase links, wired end-to-end (Steve separately steered codex-run-10286: the Politics homepage had no visible /wear links and mural CTAs were buried in a modal): new signatureShopLinks() helper generates qid-carrying links to /murals?qid=...#finder and /wear?qid=..., rendered as a .shop-actions button pair on every card, in the artist detail popup (.ap-shop), the masthead nav, hero CTAs, and the drawer. public/wear.html and public/murals.html got matching boot-time hooks that read ?qid=/?name= and either open that signature's configurator directly (wear: only if it passes the same wearEligible() gate server.js enforces — shows a graceful "not available on clothing" notice otherwise) or preselect it in the mural finder/roster. An earlier icon-based approach (🖼️/👕 badges + a client-side wearEligibleClient() mirror) was built independently by claude-run-10286 for the same "signal what's purchasable" goal, then removed once signatureShopLinks()'s real deep-linking buttons landed — redundant with, and less functional than, working links. Verified: all 3 files' inline script blocks parse clean. codex-run-10286 ran desktop+mobile Playwright E2E (verification/gallery-shopping.e2e.cjs, verification/e2e-proof.json) covering the full click-through journey. claude-run-10286 verified the card tightening visually via a fresh screenshot. Not deployed — held for explicit Steve go per the standing deploy gate. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
2dd7c66 · 2026-09-09 · wear: persist sort selection to localStorage, matching density (TK-10286)
Caught by codex-run-10286 (a2a, also active on this ticket) — density already persisted (wear_cols) but sort never did, missing the standing sort+density rule's persistence requirement. Added wear_sort localStorage key, saved on change, restored on boot alongside the existing density restore. Verified via Playwright: select a sort, reload, value persists. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
c9d72f3 · 2026-09-09 · wear: fix recolored signature URL being relative, not absolute (TK-10286)
Real bug caught via a2a by codex-run-10286 (also actively on this ticket) — recolorSignatureToLight() returned a RELATIVE path (/assets/recolored-signatures/<hash>.png), set directly as draft.design_image_url. That flows straight into submit-pod-draft-printify.mjs's buildPayload() as images[0].src, which Printify fetches from the public internet — a relative path would have failed there (or worse, resolved against whatever base the fetcher assumes). Both the cache-hit AND cache-miss return paths had the bug. Fixed in both places that build this URL (server.js, and the duplicate in reconcile-wear-orders.mjs — same reasoning already applied to extraPrintAreas' imageUrl in submit-pod-draft-printify.mjs, which already prefixes with the site origin): added WEAR_SITE_ORIGIN and prefixed both return points. Verified the function now returns a proper https://celebsignatures.com/... URL. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
c2a79ec · 2026-09-09 · wear: independent Stripe live switch — allows one test order before real money (TK-10286)
Steve wants a real test order through /wear before it charges real cards.
Critical finding that made this necessary: Kamatera's .env already has
STRIPE_LIVE_ENABLED=1 set (murals/downloads use it) with a real live key
present. /wear's checkout previously shared STRIPE_MURAL_KEY, so the moment
WEAR_SALES_LIVE=1 landed, it would have charged REAL cards immediately —
zero chance to place a test order first.
Added WEAR_STRIPE_LIVE_ENABLED as wear's own independent live switch,
completely separate from STRIPE_LIVE_ENABLED. New WEAR_STRIPE_KEY /
WEAR_STRIPE_MODE resolvers (same shape as the existing STRIPE_MURAL_KEY /
STRIPE_DOWNLOAD_KEY per-flow pattern already in this file for exactly this
kind of reason — downloads stay pinned to test until a payout mechanism
exists). Swapped both /api/wear-checkout and /wear-success off
STRIPE_MURAL_KEY/STRIPE_MODE onto the new wear-specific ones. Applied the
same fix to reconcile-wear-orders.mjs's resolveStripeKey().
This means Steve can now set WEAR_SALES_LIVE=1 + WEAR_POD_PROVIDER=printify +
PRINTIFY_SHOP_ID + PRINTIFY_MANUAL_APPROVAL_CONFIRMED=1 — making checkout,
Printify, and the cart fully functional — while WEAR_STRIPE_LIVE_ENABLED
stays unset, so it still charges the TEST key. Place one real test order
end-to-end, then flip WEAR_STRIPE_LIVE_ENABLED=1 as the final, deliberate
step to real money.
Verified by faking the exact production condition locally (STRIPE_LIVE_
ENABLED=1 + WEAR_SALES_LIVE=1, WEAR_STRIPE_LIVE_ENABLED unset): checkout
correctly returned a cs_test_ session despite the shared flag being live,
with the startup log clearly showing the split ("STRIPE LIVE MODE — murals
charge REAL cards" vs "Wear apparel: Stripe test mode, independent of the
murals live flag"). Also verified WEAR_STRIPE_LIVE_ENABLED=1 correctly flips
wear to live mode on its own. Test order cleaned from the gitignored
wear-orders.json afterward. Real (unfaked) local environment re-confirmed
still fully gated off.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
f2976c0 · 2026-09-09 · wear: use 'convert' not 'magick' — prod box only has ImageMagick 6 (TK-10286)
Caught right after deploying 9f1ba52: SSH'd into Kamatera to verify the black-print recolor fix would actually work there, and 'which magick' came back empty — only 'convert' (ImageMagick 6) is installed. My local dev machine has IMv7's 'magick' unified CLI, which made the gap invisible until checked. Would have failed open (the try/catch falls back to the original unrecolored image) rather than crash anything, but the actual fix wouldn't have worked in production — worth catching before it needed a real dark- garment order to surface. Switched both call sites (server.js, reconcile-wear-orders.mjs) to spawn 'convert' instead — verified present and working with identical output on both this Mac and Kamatera (same recolor command, same result, 'convert' is just deprecated-but-functional under IMv7 too, only a stderr warning). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
452cc4c · 2026-09-08 · wear: update stale KNOWN ISSUE notes now that the black-print fix landed (TK-10286)
Documentation-only follow-up to 9f1ba52. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
9f1ba52 · 2026-09-08 · wear: fix the black-garment print contrast bug for real (TK-10286)
Resumes the standing KNOWN ISSUE noted in wear-templates.json since the 2026-09-08 verification session: Printify prints a design's own pixel colors as-is (no auto-recolor for dark garments), so the black polo's dark-ink signature printed as low-contrast dark-gray-on-black on the REAL product — confirmed visually earlier this session, never fixed until now. Added recolorSignatureToLight() in server.js (and the same logic duplicated in scripts/reconcile-wear-orders.mjs, which has its own independent draft- creation path) — shells out to ImageMagick (already on this box) via stdin/ stdout piping, no temp files: `magick -background none - -channel RGB -fill #f5f3ee -colorize 100% png:-`. This recolors every opaque pixel to a light ink while preserving the alpha channel exactly (mirrors the client-side canvas recolorToLight() used in the on-site preview and the 3D decal). Handles both PNG and SVG signature sources (needed -background none — without it, ImageMagick's default SVG rasterization fills a white background instead of preserving transparency, verified by testing both formats). Cached by a hash of the source URL under public/assets/recolored-signatures/ (gitignored — regenerable, not something to track) so a re-ordered signature isn't reprocessed. Fails open: any error (magick missing, fetch failure, an 8s timeout) falls back to the original image rather than blocking order/draft creation — a low-contrast print is a quality issue, not a reason to lose the customer's order record. Wired into both draft-creation paths (/wear-success and reconcile-wear-orders.mjs): for each cart line item, look up its garment+ color's hex from wear-templates.json, and if luminance < 0.4 (dark), recolor before setting design_image_url on the draft. Verified the actual fix, not just the mechanism: recolored a real signature, uploaded it to Printify, and rendered a real throwaway draft product on the black polo — the signature is now clearly legible (light ink) instead of the low-contrast dark-gray from the original verification. Deleted immediately after. Also verified the recolor pipeline handles SVG-sourced signatures correctly (transparency preserved) and that reconcile-wear-orders.mjs still runs clean against the existing test order. Local E2E re-confirmed sales still fully gated off (comingSoon:true) afterward. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
bda7296 · 2026-09-08 · wear: real rotatable 3D viewer for the classic tee (Three.js) — TK-10286
Steve: "show each shirt with blender and three.js". Blender isn't installed and there's no from-scratch 3D garment model — building one with correct cloth draping + UV-mapped print area is genuine 3D-artist work, not a script. Used the practical path instead: a free, MIT-licensed, pre-made crew-neck tee model (Starklord17/threejs-t-shirt on GitHub — itself the well-known "JS Mastery 3D T-shirt customizer" tutorial asset by Anderson Mancini + Paul Henschel), loaded in Three.js with real rotation, live garment-color swap, and the signature applied as a DecalGeometry projected onto the mesh at the model's own standard chest-decal placement. Scoped to classic-tee ONLY — it's a generic crew-neck shape, wrong for the polo (no collar) and pocket-tee (no pocket), and no matching free model was found for those. Showing the wrong silhouette would be worse than no 3D view, so the "View in 3D" toggle only appears for classic-tee; switching to another garment while in 3D mode falls back to the real photo automatically. Hit and fixed 2 real integration bugs during verification: 1. The addon modules (GLTFLoader/OrbitControls/DecalGeometry) do bare `import ... from 'three'` internally, which a plain dynamic import() of a CDN URL can't resolve — added an <script type="importmap"> mapping "three" and "three/addons/" to the CDN, verified via Playwright that this is what actually made the modules load (the error before the fix was caught, not silent). 2. Drawing the (cross-origin, Wikimedia-hosted) signature image onto the decal's offscreen canvas tainted it, throwing a WebGL SecurityError on texSubImage2D — verified Wikimedia serves permissive CORS (access-control-allow-origin: *) and set sigImg.crossOrigin='anonymous' to fix it. Only affects the new 3D path; the existing 2D canvas never reads pixels back so it needed no CORS handling. Verified end-to-end via Playwright: 3D toggle appears for classic-tee, loads and renders the real 3D model with the signature decal visible on the chest, drag-to-rotate works, switching colors while in 3D mode updates the garment color live, and switching to polo correctly hides the toggle and falls back to the 2D photo — 0 console errors throughout (after both fixes). Checkout re-verified still fully gated off (comingSoon:true) afterward. The shirt_baked.glb model itself (1.0MB, MIT-licensed) was already captured by this repo's auto-data-snapshot automation before this commit. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AmxcNKtFg77wP47uZq5Zsm
File tree
- .gitignore
- 5x/ink-gate.mjs
- 5x/sweep-1.md
- README.md
- SOURCES.md
- WEAR-LEGAL-NOTE.md
- WEAR-READY-FOR-KEY.md
- apps/mobile/.gitignore
- apps/mobile/APP-STORE-LISTING.md
- apps/mobile/App.tsx
- apps/mobile/api.ts
- apps/mobile/app.json
- apps/mobile/assets/adaptive-icon.png
- apps/mobile/assets/icon.png
- apps/mobile/assets/splash.png
- apps/mobile/eas.json
- apps/mobile/fastlane/Appfile
- apps/mobile/fastlane/Deliverfile
- apps/mobile/fastlane/Fastfile
- apps/mobile/fastlane/README.md
- apps/mobile/fastlane/metadata/en-US/description.txt
- apps/mobile/fastlane/metadata/en-US/keywords.txt
- apps/mobile/fastlane/metadata/en-US/marketing_url.txt
- apps/mobile/fastlane/metadata/en-US/name.txt
- apps/mobile/fastlane/metadata/en-US/privacy_url.txt
- apps/mobile/fastlane/metadata/en-US/promotional_text.txt
- apps/mobile/fastlane/metadata/en-US/release_notes.txt
- apps/mobile/fastlane/metadata/en-US/subtitle.txt
- apps/mobile/fastlane/metadata/en-US/support_url.txt
- apps/mobile/fastlane/metadata/review_information/notes.txt
- apps/mobile/fastlane/report.xml
- apps/mobile/fastlane/screenshots/en-US/01-gallery.png
- apps/mobile/fastlane/screenshots/en-US/02-game.png
- apps/mobile/fastlane/screenshots/en-US/03-murals.png
- apps/mobile/fastlane/screenshots/en-US/ipad-01-gallery.png
- apps/mobile/fastlane/screenshots/en-US/ipad-02-game.png
- apps/mobile/fastlane/screenshots/en-US/ipad-03-murals.png
- apps/mobile/index.ts
- apps/mobile/package-lock.json
- apps/mobile/package.json
- apps/mobile/screens/AccountScreen.tsx
- apps/mobile/screens/GalleryScreen.tsx
- apps/mobile/screens/GameScreen.tsx
- apps/mobile/screens/MuralsScreen.tsx
- apps/mobile/screens/SignatureDetail.tsx
- apps/mobile/scripts/eas-build-pty.exp
- apps/mobile/scripts/eas-submit-pty.exp
- apps/mobile/scripts/game-engine-harness.mjs
- apps/mobile/scripts/make-icon.py
- apps/mobile/store-assets/listing.md
- apps/mobile/store-assets/privacy-label.md
- apps/mobile/store-screenshots/01-gallery.png
- apps/mobile/store-screenshots/02-game.png
- apps/mobile/store-screenshots/03-murals.png
- apps/mobile/store-screenshots/04-account.png
- apps/mobile/tsconfig.json
- apps/mobile/ui/glass.tsx
- apps/mobile/ui/no-track.ts
- data/artists-raw.json
- data/artists.json
- data/authors.json
- data/celebrity_signatures.csv
- data/celebrity_signatures.json
- data/declaration.json
- data/hollywood.json
- data/movies.json
- data/moviesclassic.json
- data/mural-themes.json
- data/murals-catalog.json
- data/oldest-signatures-enriched.json
- data/oldest-signatures.csv
- data/oldest-signatures.json
- data/politics.json
- data/portraits.json
- data/signature-evolution.json
- data/sports.json
- data/tm-clearance.json
- data/tm-index-seed.json
- data/tm-index.json
- data/tv.json
- data/wear-templates.json
- output/collage-abolitionists-named.png
- output/collage-abolitionists.png
- output/collage-american-authors-named.png
- output/collage-american-authors.png
- output/collage-american-presidents-named.png
- output/collage-american-presidents.png
- output/collage-artists-named.png
- output/collage-artists.png
- output/collage-astronomers-named.png
- output/collage-astronomers.png
- output/collage-authors-named.png
- output/collage-authors.png
- output/collage-aviation-pioneers-named.png
- output/collage-aviation-pioneers.png
- output/collage-composers-named.png
- output/collage-composers.png
- output/collage-declaration-of-independence-named.png
- output/collage-declaration-of-independence.png
- output/collage-economists-named.png
- output/collage-economists.png
- output/collage-european-statesmen-named.png
- output/collage-european-statesmen.png
- output/collage-explorers-navigators-named.png
- output/collage-explorers-navigators.png
- output/collage-founding-fathers-named.png
- output/collage-founding-fathers.png
- output/collage-generals-commanders-named.png
- output/collage-generals-commanders.png
- output/collage-industrialists-named.png
- output/collage-industrialists.png
- output/collage-masters-of-the-met-named.png
- output/collage-masters-of-the-met.png
- output/collage-mathematicians-named.png
- output/collage-mathematicians.png
- output/collage-medicine-named.png
- output/collage-medicine.png
- output/collage-monarchs-named.png
- output/collage-monarchs.png
- output/collage-national-gallery-masters-named.png
- output/collage-national-gallery-masters.png
- output/collage-naturalists-named.png
- output/collage-naturalists.png
- output/collage-nobel-laureates-named.png
- output/collage-nobel-laureates.png
- output/collage-oldest-signatures-named.png
- output/collage-oldest-signatures.png
- output/collage-painters-artists-named.png
- output/collage-painters-artists.png
- output/collage-philosophers-named.png
- output/collage-philosophers.png
- output/collage-physicists-named.png
- output/collage-physicists.png
- output/collage-playwrights-named.png
- output/collage-playwrights.png
- output/collage-poets-named.png
- output/collage-poets.png
- output/collage-politics-named.png
- output/collage-politics.png
- output/collage-renaissance-masters-named.png
- output/collage-renaissance-masters.png
- output/collage-revolutionaries-named.png
- output/collage-revolutionaries.png
- output/collage-scientists-inventors-named.png
- output/collage-scientists-inventors.png
- output/collage-smithsonian-masters-named.png
- output/collage-smithsonian-masters.png
- output/collage-suffragists-named.png
- output/collage-suffragists.png
- output/collage-writers-novelists-named.png
- output/collage-writers-novelists.png
- output/mural-oldest-signatures-named.png
- output/mural-oldest-signatures.png
- output/portrait-declaration-of-independence-named.png
- output/portrait-declaration-of-independence.png
- output/portrait-politics-named.png
- output/portrait-politics.png
- package-lock.json
- package.json
- public/account.js
- public/assets/ads.js
- public/assets/campaign-adams.jpg
- public/assets/campaign-andersen.jpg
- public/assets/campaign-bacon.jpg
- public/assets/campaign-balzac.jpg
- public/assets/campaign-baudelaire.jpg
- public/assets/campaign-blake.jpg
- public/assets/campaign-byron.jpg
- public/assets/campaign-cervantes.jpg
- public/assets/campaign-chaucer.jpg
- public/assets/campaign-darwin.jpg
- public/assets/campaign-davinci.jpg
- public/assets/campaign-descartes.jpg
- public/assets/campaign-dickens.jpg
- public/assets/campaign-dostoyevsky.jpg
- public/assets/campaign-dumas.jpg
- public/assets/campaign-durer.jpg
- public/assets/campaign-einstein.jpg
- public/assets/campaign-flaubert.jpg
- public/assets/campaign-france.jpg
- public/assets/campaign-franklin.jpg
- public/assets/campaign-frida.jpg
- public/assets/campaign-galilei.jpg
- public/assets/campaign-goethe.jpg
- public/assets/campaign-goya.jpg
- public/assets/campaign-hegel.jpg
- public/assets/campaign-heine.jpg
- public/assets/campaign-hokusai.jpg
- public/assets/campaign-hugo.jpg
- public/assets/campaign-lincoln-products-v2.png
- public/assets/campaign-lincoln-seated.jpg
- public/assets/campaign-lincoln-tee.jpg
- public/assets/campaign-lincoln.jpg
- public/assets/campaign-luther.jpg
- public/assets/campaign-michelangelo.jpg
- public/assets/campaign-moliere.jpg
- public/assets/campaign-montesquieu.jpg
- public/assets/campaign-napoleon.jpg
- public/assets/campaign-nietzsche.jpg
- public/assets/campaign-nobel.jpg
- public/assets/campaign-pasteur.jpg
- public/assets/campaign-picasso.jpg
- public/assets/campaign-poe.jpg
- public/assets/campaign-pushkin.jpg
- public/assets/campaign-raphael.jpg
- public/assets/campaign-rembrandt.jpg
- public/assets/campaign-rubens.jpg
- public/assets/campaign-schiller.jpg
- public/assets/campaign-shakespeare.jpg
- public/assets/campaign-swift.jpg
- public/assets/campaign-twain.jpg
- public/assets/campaign-vangogh.jpg
- public/assets/campaign-velazquez.jpg
- public/assets/campaign-voltaire.jpg
- public/assets/campaign-wagner.jpg
- public/assets/campaign-washington.jpg
- public/assets/campaign-wilde.jpg
- public/assets/favicon-32.png
- public/assets/favicon.png
- public/assets/ga-events.js
- public/assets/garments/aop-camp-shirt-lincoln.jpg
- public/assets/garments/aop-camp-white.jpg
- public/assets/garments/aop-longsleeve-shirt-lincoln.jpg
- public/assets/garments/aop-longsleeve-white.jpg
- public/assets/garments/bucket-hat-army.jpg
- public/assets/garments/bucket-hat-lincoln.jpg
- public/assets/garments/bucket-hat-white.jpg
- public/assets/garments/classic-tee-heather.jpg
- public/assets/garments/classic-tee-lincoln.jpg
- public/assets/garments/classic-tee-sand.jpg
- public/assets/garments/classic-tee-sky.jpg
- public/assets/garments/classic-tee-white.jpg
- public/assets/garments/crew-socks-lincoln.jpg
- public/assets/garments/crew-socks-white.jpg
- public/assets/garments/dad-cap-lincoln.jpg
- public/assets/garments/dad-cap-white.jpg
- public/assets/garments/pocket-tee-lincoln.jpg
- public/assets/garments/pocket-tee-white.jpg
- public/assets/garments/polo-black.jpg
- public/assets/garments/polo-lincoln.jpg
- public/assets/garments/polo-white.jpg
- public/assets/garments/trucker-cap-lincoln.jpg
- public/assets/garments/trucker-cap-white.jpg
- public/assets/logo-celebsig.png
- public/assets/models/shirt_baked.glb
- public/assets/og-share.jpg
- public/assets/signature-ink.js
- public/assets/signature-preview.css
- public/assets/signature-preview.js
- public/assets/wallpaper-pattern.js
- public/assets/wallpaper.css
- public/assets/wallpaper.js
- public/assets/wear-tag-celebrity-signatures.png
- public/game.html
- public/index.html
- public/murals.html
- public/privacy.html
- public/signature-edit.html
- public/upload-signature.html
- public/wallpaper.html
- public/wear.html
- screenrecord/DEBUG-REPORT-TK10191-frontpage.md
- screenrecord/DEBUG-REPORT-game.md
- screenrecord/DEBUG-REPORT-murals.md
- screenrecord/DEBUG-REPORT.md
- screenrecord/debug-log-murals.jsonl
- screenrecord/debug-log.jsonl
- screenrecord/game-debug.mjs
- screenrecord/murals-debug.mjs
- screenrecord/rec-murals/run0/page@f5767eef11026eca613976f1e51c40d4.webm
- screenrecord/rec-murals/run1/page@28e5339b4fca63b10de68d86e54f6561.webm
- screenrecord/rec-murals/run2/page@b2d5bd379b9da4c626270bf6bb05dac3.webm
- screenrecord/rec-murals/run3/page@47869e2ce41271f09fd13dcf20293cb0.webm
- screenrecord/rec-murals/run4/page@7bc7359118a2478262dbfa13caf06804.webm
- screenrecord/rec/game-run0/page@d01ec82fac0b821368b7301ce7eef551.mp4
- screenrecord/rec/game-run0/page@d01ec82fac0b821368b7301ce7eef551.webm
- screenrecord/rec/game-run0/page@d3c036c80501f7033d077d5f6df76847.mp4
- screenrecord/rec/game-run0/page@d3c036c80501f7033d077d5f6df76847.webm
- screenrecord/rec/game-run1/page@55a0e6dc71aa4e76e7831ac80604d000.mp4
- screenrecord/rec/game-run1/page@55a0e6dc71aa4e76e7831ac80604d000.webm
- screenrecord/rec/game-run1/page@6e5156e1f617020d464184dbf6f78a28.mp4
- screenrecord/rec/game-run1/page@6e5156e1f617020d464184dbf6f78a28.webm
- screenrecord/rec/game-run2/page@53d2a289fd6b78a8af93c3355bb69c5e.mp4
- screenrecord/rec/game-run2/page@53d2a289fd6b78a8af93c3355bb69c5e.webm
- screenrecord/rec/game-run2/page@d029fe7d5d85bb464f8a47ae1307f87e.mp4
- screenrecord/rec/game-run2/page@d029fe7d5d85bb464f8a47ae1307f87e.webm
- screenrecord/rec/game-run3/page@683d03ff86a102e268ffe5b56fa7a265.mp4
- screenrecord/rec/game-run3/page@683d03ff86a102e268ffe5b56fa7a265.webm
- screenrecord/rec/game-run3/page@9ace0b06e0de45225da2287bb8872b69.mp4
- screenrecord/rec/game-run3/page@9ace0b06e0de45225da2287bb8872b69.webm
- screenrecord/rec/game-run4/page@006b04fec44cb6fb4fc183a3c09cc431.mp4
- screenrecord/rec/game-run4/page@006b04fec44cb6fb4fc183a3c09cc431.webm
- screenrecord/rec/game-run4/page@025bd1c85d7cdf7783b3ec61ab492b87.mp4
- screenrecord/rec/game-run4/page@025bd1c85d7cdf7783b3ec61ab492b87.webm
- screenrecord/rec/run0/page@0647016d982221a1fe900c1840e6137c.mp4
- screenrecord/rec/run0/page@132bd296b39d3b1aa89f178e875872b8.mp4
- screenrecord/rec/run0/page@18cc0bfa6319b00b95683470f76d7e1c.webm
- screenrecord/rec/run0/page@389e0070fb0f53072a02e201a1d39b94.mp4
- screenrecord/rec/run0/page@3cd1340a9f795dfa77fee107dd42b186.mp4
- screenrecord/rec/run0/page@672ecf6b0ba2e0c8477e0729ffa95655.mp4
- screenrecord/rec/run0/page@95748996b98a04424eb89029ed59900d.mp4
- screenrecord/rec/run0/page@d53150f4fc5f7157ff9b327bcc85a6f7.mp4
- screenrecord/rec/run0/page@ece429832621fdc53eb7bdbe5ffe9935.mp4
- screenrecord/rec/run1/page@09e5454e881013074dead68e52820662.mp4
- screenrecord/rec/run1/page@2e16f317b77a99fd179e90b70d6dc6c0.mp4
- screenrecord/rec/run1/page@4a7ce857bca83b517734da3cf22964d9.webm
- screenrecord/rec/run1/page@5acccd111aa180017e3c3d3abe87cef4.mp4
- screenrecord/rec/run1/page@b814d48e2e10052ebaca97130a7789bd.mp4
- screenrecord/rec/run1/page@bc094f397b8c213a7a61c8feaf3eb43b.mp4
- screenrecord/rec/run2/page@0e1b81dcf8e068dd5e0431e85fe8f2c7.mp4
- screenrecord/rec/run2/page@2c794c461b3fbbe49ec39c825c35cc9d.webm
- screenrecord/rec/run2/page@7a161f93a291136330d8f7621fe3a4ed.mp4
- screenrecord/rec/run2/page@7af0dbbbe7c306dc710790e56f508c9e.mp4
- screenrecord/rec/run2/page@e1bc67e02815f554ce57ace028f8ea11.mp4
- screenrecord/rec/run3/page@1642a63e4146ff4e0795b1c9e6dfeb96.webm
- screenrecord/rec/run3/page@3b44d8ba298d928946343af1a2d4e46c.mp4
- screenrecord/rec/run3/page@4adcd3d9e98a0707841a95dd82a044f7.mp4
- screenrecord/rec/run3/page@5eea223bc7ae9bf0ac39ccf7495221c2.mp4
- screenrecord/rec/run3/page@cf3d061226f40c22fc8bf3fbd48fe003.mp4
- screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.mp4
- screenrecord/rec/run4/page@5191324244d1c7f49ce143eb293ca185.webm
- screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.mp4
- screenrecord/rec/run4/page@bb2982ab6024853b100f11aefb3da07b.webm
- screenrecord/rec/run4/page@c1c05c8d559cf45ecf4556c300bd232a.webm
- screenrecord/rec/run4/page@e40ee13d1a3b575716a3f84a9bbd6a22.webm
- screenrecord/run-debug.mjs
- screenrecord/screenshots/run0-art-before-begin.png
- screenrecord/screenshots/run0-art-final.png
- screenrecord/screenshots/run0-art-round1-after.png
- screenrecord/screenshots/run0-art-round1.png
- screenrecord/screenshots/run0-art-round3-after.png
- screenrecord/screenshots/run0-century-before-begin.png
- screenrecord/screenshots/run0-century-final.png
- screenrecord/screenshots/run0-century-round1-after.png
- screenrecord/screenshots/run0-century-round1.png
- screenrecord/screenshots/run0-century-round3-after.png
- screenrecord/screenshots/run0-early-before-begin.png
- screenrecord/screenshots/run0-early-final.png
- screenrecord/screenshots/run0-early-round1-after.png
- screenrecord/screenshots/run0-early-round1.png
- screenrecord/screenshots/run0-early-round3-after.png
- screenrecord/screenshots/run0-game-hub.png
- screenrecord/screenshots/run0-lightning-before-begin.png
- screenrecord/screenshots/run0-lightning-final.png
- screenrecord/screenshots/run0-lightning-round1-after.png
- screenrecord/screenshots/run0-lightning-round1.png
- screenrecord/screenshots/run0-lightning-round5-after.png
- screenrecord/screenshots/run0-match-before-begin.png
- screenrecord/screenshots/run0-match-final.png
- screenrecord/screenshots/run0-match-round1-after.png
- screenrecord/screenshots/run0-match-round1.png
- screenrecord/screenshots/run0-match-round3-after.png
- screenrecord/screenshots/run0-whose-before-begin.png
- screenrecord/screenshots/run0-whose-final.png
- screenrecord/screenshots/run0-whose-round1-after.png
- screenrecord/screenshots/run0-whose-round1.png
- screenrecord/screenshots/run0-whose-round3-after.png
- screenrecord/screenshots/run1-century-before-begin.png
- screenrecord/screenshots/run1-game-hub.png
- screenrecord/screenshots/run1-lightning-before-begin.png
- screenrecord/screenshots/run1-lightning-final.png
- screenrecord/screenshots/run1-lightning-round1-after.png
- screenrecord/screenshots/run1-lightning-round1.png
- screenrecord/screenshots/run1-lightning-round5-after.png
- screenrecord/screenshots/run2-art-before-begin.png
- screenrecord/screenshots/run2-art-final.png
- screenrecord/screenshots/run2-art-round1-after.png
- screenrecord/screenshots/run2-art-round1.png
- screenrecord/screenshots/run2-art-round3-after.png
- screenrecord/screenshots/run2-century-before-begin.png
- screenrecord/screenshots/run2-century-final.png
- screenrecord/screenshots/run2-century-round1-after.png
- screenrecord/screenshots/run2-century-round1.png
- screenrecord/screenshots/run2-century-round3-after.png
- screenrecord/screenshots/run2-early-before-begin.png
- screenrecord/screenshots/run2-early-final.png
- screenrecord/screenshots/run2-early-round1-after.png
- screenrecord/screenshots/run2-early-round1.png
- screenrecord/screenshots/run2-early-round3-after.png
- screenrecord/screenshots/run2-game-hub.png
- screenrecord/screenshots/run2-lightning-before-begin.png
- screenrecord/screenshots/run2-lightning-final.png
- screenrecord/screenshots/run2-lightning-round1-after.png
- screenrecord/screenshots/run2-lightning-round1.png
- screenrecord/screenshots/run2-lightning-round5-after.png
- screenrecord/screenshots/run2-match-before-begin.png
- screenrecord/screenshots/run2-match-final.png
- screenrecord/screenshots/run2-match-round1-after.png
- screenrecord/screenshots/run2-match-round1.png
- screenrecord/screenshots/run2-match-round3-after.png
- screenrecord/screenshots/run2-whose-before-begin.png
- screenrecord/screenshots/run2-whose-final.png
- screenrecord/screenshots/run2-whose-round1-after.png
- screenrecord/screenshots/run2-whose-round1.png
- screenrecord/screenshots/run2-whose-round3-after.png
- screenrecord/screenshots/run3-art-before-begin.png
- screenrecord/screenshots/run3-art-final.png
- screenrecord/screenshots/run3-art-round1-after.png
- screenrecord/screenshots/run3-art-round1.png
- screenrecord/screenshots/run3-art-round3-after.png
- screenrecord/screenshots/run3-century-before-begin.png
- screenrecord/screenshots/run3-early-before-begin.png
- screenrecord/screenshots/run3-early-final.png
- screenrecord/screenshots/run3-early-round1-after.png
- screenrecord/screenshots/run3-early-round1.png
- screenrecord/screenshots/run3-early-round3-after.png
- screenrecord/screenshots/run3-game-hub.png
- screenrecord/screenshots/run4-art-before-begin.png
- screenrecord/screenshots/run4-art-final.png
- screenrecord/screenshots/run4-art-round1-after.png
- screenrecord/screenshots/run4-art-round1.png
- screenrecord/screenshots/run4-art-round3-after.png
- screenrecord/screenshots/run4-century-before-begin.png
- screenrecord/screenshots/run4-early-before-begin.png
- screenrecord/screenshots/run4-early-final.png
- screenrecord/screenshots/run4-early-round1-after.png
- screenrecord/screenshots/run4-early-round1.png
- screenrecord/screenshots/run4-early-round3-after.png
- screenrecord/screenshots/run4-game-hub.png
- screenrecord/screenshots/run4-lightning-before-begin.png
- screenrecord/screenshots/run4-lightning-final.png
- screenrecord/screenshots/run4-lightning-round1-after.png
- screenrecord/screenshots/run4-lightning-round1.png
- screenrecord/screenshots/run4-lightning-round5-after.png
- screenrecord/screenshots/run4-match-before-begin.png
- screenrecord/screenshots/run4-match-final.png
- screenrecord/screenshots/run4-match-round1-after.png
- screenrecord/screenshots/run4-match-round1.png
- screenrecord/screenshots/run4-match-round3-after.png
- screenrecord/screenshots/run4-whose-before-begin.png
- screenrecord/screenshots/run4-whose-final.png
- screenrecord/screenshots/run4-whose-round1-after.png
- screenrecord/screenshots/run4-whose-round1.png
- screenrecord/screenshots/run4-whose-round3-after.png
- screenrecord/verify-murals.mjs
- screenrecord/verify2-murals.mjs
- screenrecord/verify2-out.txt
- scripts/artists-post.mjs
- scripts/build-artists.mjs
- scripts/build-collages.py
- scripts/build-oldest-signatures.py
- scripts/build-portrait-murals.py
- scripts/build-theme-murals.py
- scripts/build-tifs.py
- scripts/build-tm-clearance.mjs
- scripts/build-tm-index.mjs
- scripts/fetch-artists-rosters.mjs
- scripts/fetch-artists.mjs
- scripts/fetch-authors.mjs
- scripts/fetch-declaration.mjs
- scripts/fetch-portraits.mjs
- scripts/fetch-printful-catalog.mjs
- scripts/fetch-printify-catalog.mjs
- scripts/fetch-signature-evolution.mjs
- scripts/fetch-tm-register.mjs
- scripts/fetch-wikidata.mjs
- scripts/filter-artists.mjs
- scripts/golive-celebsignatures.sh
- scripts/lib/wikidata-common.mjs
- scripts/printify-cost-check.mjs
- scripts/reconcile-wear-orders.mjs
- scripts/screenrecord-game.mjs
- scripts/screenrecord-murals.mjs
- scripts/screenrecord-tk10191.mjs
- scripts/screenrecord.mjs
- scripts/submit-pod-draft-printify.mjs
- scripts/submit-pod-draft.mjs
- scripts/tm-normalize.mjs
- server.js
- test/printify-pod.test.mjs
- test/signature-ink.test.mjs
- test/wallpaper-pattern.test.mjs
- test/wear-accessories.test.mjs
- test/wear-artwork-flow.test.mjs
- verification/campaign-lincoln-tee.png
- verification/campaign-seated-check.png
- verification/clean-sheet.jpg
- verification/e2e-proof-printify.json
- verification/e2e-proof.json
- verification/frontpage-edit.png
- verification/gallery-shopping.e2e.cjs
- verification/hat-sock-catalog.json
- verification/hat-sock-draft-plan.json
- verification/hats-socks-approval.md
- verification/hats-socks-decision.md
- verification/lincoln-campaign-prompts.json
- verification/lincoln-campaign.e2e.cjs
- verification/lincoln-products-sheet.jpg
- verification/live-aop-camp-shirt.jpg
- verification/live-aop-longsleeve-shirt.jpg
- verification/live-aop-sheet.jpg
- verification/proof-aop-camp.jpg
- verification/proof-aop-long.jpg
- verification/proof-aop-sheet.jpg
- verification/proof-bucket-hat.jpg
- verification/proof-dad-cap.jpg
- verification/proof-sheet.jpg
- verification/proof-trucker-cap.jpg
- verification/search-typeahead.png
- verification/signature-viewer-decision.md