Pamphlet library β€” handover log
Pamphlet-preview Β· biz/pamphlet-preview/HANDOVER.md

Pamphlet library β€” handover log

Newest block on top. Remote is the private GitHub dan-slater/pamphlet-preview (added 2026-07-24 18:22 β€” the older blocks below still say "local-only", which is now stale); ~/dan-hub itself is not a repo.


βœ… ALIGN Q1 IS CLOSED β€” the printed email is daniel@leachie.com (2026-08-04)

Every block below that lists the printed address as still open ("hello@leachie.com with no MX", "inbox not set up", "needs a code comment that the email needs setting up") is stale β€” those were true when written and are not now.

The inbox went live 2026-07-31 (Cloudflare Email Routing, inbound-only, forwarding to a verified Gmail). On 2026-08-04 Daniel settled on two addresses β€” "we should have two emails.. daniel@leachie.com and accounts@leachie.com" β€” so:

  • Both pamphlet contact rows in data.mjs print daniel@leachie.com, matching the site.
  • accounts@ is billing-only (invoices, Paystack) and deliberately stays off a handout.
  • hello@ is retired and its routing rule deleted. Catch-all is disabled, so only those two literal addresses receive.

Rebuilt with build.mjs; the 23 replacements across p/ were the only diff and render-check.mjs still reports every page fitting at 1123px. Committed bcf7c36 on review/leachie-vs-main and pushed. The palette question in the blocks below is untouched and still open.

βœ… OPTION C IS IN β€” both front pages now lead with the three promises (2026-07-28) β€” READ THIS FIRST

Daniel picked C Β· Three promises (Built for you Β· Looked after Β· Grown) and then, separately, chose to mirror it onto the 2-page sheet. Both are folded in, both render, the gate is clean on OVERFLOW and CLIPPED across all 12 variants, and the PDFs are re-rendered. Nothing is committed β€” the working tree carries the whole change and is waiting on a node history.mjs round "…".

What shipped into the two front pages:

  • 8-page cover (therapists p1) β€” took FRONT_C's whole composition, not just its vp: block: the two-line headline at size:40, the short set-up line ("Three things, and then you can stop thinking about your website."), motif:'mini', and B.vpThree. Fits at 0px slack.
  • Print sheet (therapists-print p1) β€” rebuilt to the same structure: hero β†’ vpThree β†’ offer card β†’ chips β†’ contact row. Fits at 0px slack, 14px of mt-a.

⚠️ TWO THINGS THE PREVIOUS HANDOVER GOT WRONG β€” they cost real work, so read them before trusting a similar claim again:

  1. "coverCard already takes vp, so it's data-only for BOTH pages" β€” false for the sheet. Print P1 was never built on coverCard; it is hand-assembled (hero + .offerbox.card-pop + note + terms + contact row). It has no vp slot and had 0px spare, so folding C in was a content decision, not a paste. Presented as a switcher and decided by Daniel (below).
  2. The four option previews fit only because of CSS that existed nowhere else. They rendered as pam-frontpage-* and carried four private tightening rules β€” and they never picked up the 40 rules the bold pass scoped to [class^="pam-therapists"] (h1 weight 700, thicker kicker rules). So what Daniel clicked was a shade lighter than the real page, and the cover came out 13px over the instant C was folded in. Fixed by re-scoping that tightening to [class^="pam-therapists"] .pg-the-promotion, which is exactly the two real front pages. No type was shrunk to make it fit. β†’ Lesson for the next option round: give preview variants the same wrapper scope as the page they are previewing, or they are not previewing it.

What Daniel gave up on the sheet (his call, from the switcher): the "a good site pays for itself many times over" note (115px) and the long three-sentence sub (43px, replaced by C's short line). The note was one of the four still-unresolved new sentences from the lock, so this dropped a provisional line rather than a settled one. The sub's second half repeated the deal chips directly beneath it and its first half is now promises 01/03, so little was actually lost. The sheet has no sprout β€” 14px of slack left and the motif needs 62px; the contact row and footer rule close the page instead.

One copy tighten, four words, veto freely: C's promise 03 said "…more of them arrive without you lifting a finger", which fought its own clause ("keep growing it with you") and edged toward promising leads. Now "…more of them arrive on their own" β€” the same wording option A already used.

🎨 THE PALETTE-ERA QUESTION IS CLOSED, and in the opposite direction to what the last handover implied. It listed "which palette era ships" as the next real decision. It is not a decision: ALIGN.md records Daniel saying "yes we want to go back to our bold design" β€” ma was snapshotted to versions/ma/ and frozen, the live working build is the restored bold on 4322, and site-design's promise to "post a single hex list here if ma ever becomes the amendment" was never triggered. So the pamphlet's bold terracotta palette is current and correct, --rind still means ripe fruit, and there is no sweep to do. Don't re-open it without a posted hex list.

⚠️ The letters collide with the site's own fork β€” do not pick twice. site-design built the same value-prop exercise as ?vp=a|b|c|d on 4322, but the letters do not line up: site a=Leads, b=Peace of mind, c=vs Wix/WordPress, d=Safe+growing. Pamphlet C β‰  site c. What matches pamphlet C is the site's new under-hero band (Built properly Β· Looked after Β· Grown), which is already on every framing except c. Pick the argument, not the letter, or the campaign says two different things.

Flag status: flag 1 ("you pay a monthly anyway" cuts both ways vs Essential at R550/mo) never reaches print β€” C doesn't make that argument β€” but it is still unresolved anywhere Daniel does make it, the site's ?vp= fork especially. Flag 2 (don't promise leads for R550) is honoured: growth is worded as a direction on both pages, never bundled.

Retired and deleted this session: all four FRONT_* variants and p/frontpage-{a,b,c,d}.html, the now-dead vpTwo/vpClaim renderers, and the .vp2* / .vpclaim* / .vpc-* / [class^="pam-frontpage"] / .pam-frontpage-b .ba CSS. beforeAfter stays β€” berlein, mozguide, aerias and surfaris all use it. Recoverable from 3983516.

Artefacts (all regenerated): pdf/leachie-therapists-bold.pdf (8pp) Β· pdf/leachie-therapists-print-bold.pdf (2pp) β€” the calm pair beside them is deliberately untouched as the before-state Β· shots re-run into pamphlet-shots-bold/ Β· the sheet decision switcher is leachie-rebrand/sheet-options.html (keys 1/2, 0 = the new cover), and the sheet's pre-change render is preserved at frontpage-shots/print-p1-ASIS.png. Nothing sent to Discord.

Next: 1) commit the round (node history.mjs round "…") β€” awaiting Daniel's say-so; 2) flag 1 wherever the monthly argument is made, i.e. the site's ?vp= pick; 3) the older ALIGN Q1 β€” the pamphlet still prints hello@leachie.com with no MX, and it is now the only deliverable printing an email at all.

A gate note worth keeping: render-check.mjs walks p/ from disk, not the export list. Deleting a variant from data.mjs leaves its stale HTML behind and the gate will keep checking it β€” and it did fail on two orphans until they were git rm'd. Delete the page files too.


πŸ—³οΈ FOUR FRONT-PAGE OPTIONS AWAITING DANIEL'S PICK β€” RESOLVED, see the block above (2026-07-26)

Goal: Daniel asked for the front page to state the value proposition far more clearly, in his words: the DIY platforms (Wix/WordPress) are dated technology, you pay a subscription anyway and still do all the work yourself, they're vulnerable β€” especially through add-ons β€” and if you don't know what you're doing you end up with a security problem. What we give is peace of mind (security kept current, attack monitoring across every site we run, regular check-ups) and, above all, what clients actually want: leads β€” we grow the site over time so organic traffic finds them. He asked for options, not a single answer.

Nothing is uncommitted. Working tree clean, branch review/leachie-vs-main at 3983516, in sync with origin (private remote dan-slater/pamphlet-preview). Everything below is committed and pushed.

⚠️ The unversioned risk is ~/dan-hub/leachie-rebrand/ β€” it is NOT a git repo. This session's review artefacts live only there: frontpage-options.html, pamphlet-bold-review.html, frontpage-shots/ (4), pamphlet-shots-bold/ (10), pdf/leachie-therapists{-bold,-print-bold,-cover-b}.pdf, and the appended ALIGN.md entries. All are regenerable from this repo except the ALIGN prose. Don't clean that directory.

What's waiting for Daniel: four front-page value-prop options, live as option-group variants frontpage-a|b|c|d and side-by-side in ~/dan-hub/leachie-rebrand/frontpage-options.html (keys 1–4, 0 = the current front page). Same locked layout, same offer card, same numbers β€” only the block under the headline changes.

  • A Β· Two things β€” Peace of mind / More of the right clients. Warmest, names no competitor. Softest: never makes the "you already pay a monthly" point.
  • B Β· Versus β€” the DIY route vs us, side by side, naming Wix and WordPress. Most persuasive (the client-data/POPIA angle lands hardest) but combative, and the only one with no room for the growth motif.
  • C Β· Three promises β€” Built for you Β· Looked after Β· Grown. Maps one-to-one onto build β†’ care plan β†’ growth, so the rest of the pamphlet becomes the expansion of the cover. Densest to read.
  • D Β· One argument β€” "You are already paying a monthly. The difference is what it buys." Fastest read, meets the price objection head-on, but raises price on the front page and says nothing to someone with no site yet.

On the pick: fold the winner's vp: block into coverCard for both the 8-page cover and print P1, delete the other three variants, re-render shots + PDFs. coverCard already takes vp (the value block) and motif: 'full'|'mini'|'none', so folding in is a data-only change.

⚠️ Two substantive flags β€” both RESOLVED by the pricing locked 2026-07-29 (Host R450 / Maintain R850 / Grow R2 500, work at R1 000/hr β€” see ../PRICING.md πŸ”’ box):

  1. "You pay a monthly anyway" cuts both ways β€” this is now answerable. Maintain R850 includes an hour of real work every month ("your changes first, otherwise the hour goes into your SEO"), which is the thing Wix cannot say. Still don't argue on price: Host R450 sits in the ZA WaaS band, Maintain deliberately sits above it. Move the argument to what the monthly buys.
  2. Don't promise leads. Still true, but the boundary moved: the monthly Google/performance check IS in Maintain (R850) β€” the pamphlets now say so β€” while Visibility (from R2 500) and the ~2 hrs/mo of active growth work (Grow, R2 500/mo) are not. So: a check-up is included, growth work is a tier up. All variants word growth as a direction, never bundled.

Also this session: the cover was locked to the print-P1 style (block below β€” still current and still the truth about the layout), and history.mjs's replay was made resilient to retired renderers.

Next actions: 1) get the A/B/C/D pick β†’ fold in, delete the rest, re-render, commit a round; 2) settle the two flags above; 3) then the palette-era question (below) β€” the pamphlet is on the bold terracotta palette while the site has moved to the MA/washi repalette, where --rind is a brown, not a terracotta. The pamphlet uses --rind to mean ripe fruit, so that sweep is a decision, not a find-and-replace.

Pointers: ~/dan-hub/leachie-rebrand/frontpage-options.html (the pick) Β· pamphlet-bold-review.html (calm↔bold per page) Β· ALIGN.md πŸ”’ SETTLED block then Status β†’ pamphlet-bold Β· biz/PRICING.md Β§5b for what's actually in each tier Β· the block below for the locked layout.


πŸ”’ STYLE LOCKED β€” the campaign front page (2026-07-26)

Daniel: "print 1 bold after is the style that I want .. lets lock it" β€” i.e. the 2-page sheet's page 1, bold side. So that composition is now the campaign front page and the cover fork is closed.

What that style is: cream ground Β· benefit-led headline (Your practice's website should be *bringing you clients.*) Β· the offer held in a hard-edged card with a coral offset (.offerbox.card-pop β€” the website's own offer card) Β· amber pill kicker Β· the three founding figures as a bordered 3-cell price row (B.offerGrid) Β· green-ticked deal chips Β· the growth motif Β· a rind WhatsApp band beside the doc title. No flooded dark ground anywhere on the front page.

Applied: the 8-page cover was rebuilt in it. B.coverBold and B.coverMast are gone, replaced by one renderer β€” B.coverCard β€” so the 8-page cover and print page 1 are near-identical by construction: one campaign, one front page, two formats. The cover keeps the growth motif because without it the page is ~200px short of the fold, which is the exact "empty bottom third" flaw this pass existed to fix.

Retired: the therapists-cover-b variant (masthead fork), p/therapists-cover-b.html, .offerband/.ofb-top/.ofb-h, all .mast*, and .ofg.on-dark (nothing sits on a dark ground on the front page now). pdf/leachie-therapists-cover-b.pdf is left on disk as a historical artefact, not a live option.

Committed as rounds (branch review/leachie-vs-main, still unpushed):

  • bold pass β€” cover forks A/B, growth motif, offer grid, palette amendment, Cradle mark β€” deliberately committed before the retirement, so both rejected covers are recoverable with git show.
  • the lock itself (this block).

Note history.mjs's COAUTHOR constant said Opus 4.8; corrected to Opus 5.

Live artefacts: pdf/leachie-therapists-bold.pdf (8pp) + …-print-bold.pdf (2pp), re-rendered on the locked cover Β· shots in pamphlet-shots-bold/ Β· switcher leachie-rebrand/pamphlet-bold-review.html (cover fork closed; the calm↔bold flip still works for every page).

Still open: the four new sentences (Decision 2 in the switcher) Β· ALIGN Q1, the printed hello@leachie.com with no MX β€” the agency site now prints no email at all, and the pamphlet is the last place it appears Β· whether the pamphlet should follow the site's 2026-07-25 MA repalette, which turned --rind into a brown; the pamphlet is still on the bold terracotta palette and currently matches the bold site, not the MA one. That is the next real decision β€” this lock is about composition, not about which palette era the campaign ships on.


πŸ”₯ BOLD PASS on the therapist campaign (2026-07-24 ~21:20) β€” READ THIS FIRST

Mission: bring the therapists pair into the πŸ”΄ brand pivot (bold Β· growing Β· organic Β· vibrant Β· partnership-led β€” "we help you grow, and grow with you"). Content was frozen by ALIGN.md, so this was purely the visual register + the three flags logged at 17:57. Branch review/leachie-vs-main, still uncommitted (now ~24 files) β€” edit forward, node history.mjs round "…" only once Daniel approves.

Review instrument (this is the deliverable to look at): ~/dan-hub/leachie-rebrand/pamphlet-bold-review.html β€” a click-through switcher on the real renders: flip every page calm ↔ bold (space bar), page rail, side-by-side mode, click to zoom, plus the cover fork A vs B shown together. Opens as a plain file; for the phone, serve ~/dan-hub/leachie-rebrand over the LAN. Calm shots (17:42) stayed in pamphlet-shots/; new ones are in pamphlet-shots-bold/.

PDFs (nothing sent): leachie-rebrand/pdf/leachie-therapists-bold.pdf (8pp) Β· …-print-bold.pdf (2pp) Β· …-cover-b.pdf (1pp). The calm PDFs are untouched beside them β€” deliberately, so the before-state survives. Discord send is Daniel's call (the calm pair already went at 17:45).

Adopted from ALIGN mid-session (both logged there by other agents while this pass was running):

  • 🎨 the palette amendment (site-design 21:38, reconciled by logo 22:20) β€” swept through the pamphlet :root and every hardcoded hex/rgba in build.mjs and the gallery shell: --rind #c74a3bβ†’#c9422b Β· --rind-deep #a83a2bβ†’#a5301c Β· --amber #e0a45cβ†’#eda23f Β· --paper β†’#fdf5e8 Β· --paper-2 β†’#f4e3c8 Β· --ink β†’#2a150c Β· and --ink-deep now takes the new --seed-deep #3a1a0d flooded dark ground, so every dark band got deeper. --coral/--seed/--white-water unchanged. Derived gradients (value bars, funnel, browser chrome, the masthead) were re-derived on the new values, not left stranded.
  • 🌱 the growth greens --leaf #4e6b2a / --leaf-lit #8fbf4a (proposed, cheap to veto) β€” used for FORM only, exactly as logged: the sprout's stem and leaves, and the tick discs on the deal chips. So the motif now ripens green β†’ amber β†’ rind β†’ fruit, which is the whole point of it.
  • The website's offer-card grammar, so the two deliverables read as one campaign. I opened the site agent's leachie-rebrand/bold/ shots: its hero is "Your website should be making you money" with a green-ruled "We build it. Then we grow it with you" β€” which is the same construction this cover and the p2 band arrived at independently, so the copy needed no reconciling. Its offer card did: amber pill badge, a 3-cell bordered price row (Refresh / New site / Care plan, struck figure above the big one), and a hard-edge card with a coral offset. All three are now shared: B.offerGrid() renders that row on both grounds and is used by cover A (dark), cover B and print P1 (cream, via .card-pop), with the site's cell labels verbatim. The cover therefore now shows all three founding figures, not two.

What the bold pass itself is β€” new additive components in build.mjs plus lifts scoped to [class^="pam-therapists"]. The other ten pamphlets keep their layouts byte-for-byte (they do pick up the palette amendment, like everything Leachie, plus the closing-page mark fix below):

  • B.sprout() β€” the growth motif: a stem that climbs leftβ†’right, leafing and budding, ripening into a lychee (the mark's grammar: dimpled rind, cream flesh, umber seed). Palette hexes only, tone:'dark' for rind/umber grounds, mini:true for the page-foot rule. This replaces the retired ocean wave field as the brand's marque.
  • B.coverBold() (cover A) β€” big benefit-led headline, the motif, deal chips full width, and a full-bleed umber offer band across the foot carrying the amber pill, the 3-cell price row and the WhatsApp block (.covercta β€” the CSS that shipped unused is now in use, closing flag 1). Drops the "prepared for" doc block (the header meta already names the audience).
  • B.coverMast() (cover B, new option variant therapists-cover-b) β€” the headline on a full-bleed ripe-rind masthead with the contact block and the sprout sharing its foot, then the site's cream offer card below. Gradient deliberately deepened (now #bf3a22β†’#a5301cβ†’#85260f) so cream body copy clears WCAG AA (β‰₯4.7:1) at every stop; cream on plain --rind measures 4.03 and fails, which is why the masthead is not simply rind.
  • B.growBand() β€” the partnership beat (dark band, italic pull-quote + the motif + three we-build/we-keep/we-grow points). Closes p2, which had been 467px empty.
  • .footrule β€” the mini motif pinned above the footer (margin-top:auto + .footrule+.foot{margin-top:0} so the two autos don't split the gap). Closes p3/p4/p7 and print p2.
  • Weight/rule lifts that cost zero vertical height (h1/h2 β†’ 700, thicker kicker rules, rind italics, 2px feature rings) so even the dense pages (p5/p6) read bolder without moving.
  • Per-page void, before β†’ after: p1 147β†’0 Β· p2 467β†’0 Β· p3 253β†’0 Β· p4 246β†’0 Β· p7 179β†’0 Β· print p1 192β†’22 Β· print p2 95β†’0. p5/p6/p8 were already tight and stayed so.

Also fixed: the residual ocean hex #56cfd8 at old build.mjs:507 β†’ var(--crest) (flag 2) Β· the cover + print P1 "calm/quietly" wording (flag 3) Β· a silent flex-row bug where .offerband still laid its two stacked children side by side, squeezing the headline to 457px of wrapped text Β· and ctaDark's mark moved under the contact grid instead of under the copy, which reclaims ~34px on every closing page and un-broke surfaris p4, which had been overflowing by 14px since the rebrand added the sign-off.

⚠️ Tooling change worth knowing: render-check.mjs was blind to the worst failure mode. A flex item shrunk below its content height clips silently β€” the .page still measures as fitting, and scrollHeight can't see content pushed off the top edge. The first bold cover lost 187px of the offer band this way and the gate said "all pages fit". It now walks every overflow:hidden element and compares each child's box against its clipping parent's, reporting CLIPPED CONTENT inside .x (Npx cut). Treat a CLIPPED line as a failure exactly like OVERFLOW. All 13 pamphlets are clean on both.

Open decisions (all Daniel's):

  1. Cover A vs cover B β€” the switcher's front page. A stays the main therapists tab either way; B lives as the therapists-cover-b option variant until he picks.
  2. Four new sentences β€” the only new copy, listed in the switcher's "Decision 2" card: the cover headline (the settled positioning line with "quietly" dropped, per the pivot), the "…and grow it with you" clause, the p2 band lines, and print p1's "pays for itself many times over". Veto any of them and the numbers/structure are unaffected.
  3. The mark is IN β€” Cradle 01, bold cut. Daniel settled the direction at 22:55 ("the only one I like is the cradle"), so assets/leachie-mark{,-clean,-mono}.svg were replaced from brand-v2/marks/01-cradle/bold/ and a new assets/leachie-mark-on-dark.svg was added β€” the sign-off needs it, because the standard cut's seed is dark and vanishes on the umber CTA. Sizes were re-tuned for the new glyph (a wide arc in a square viewBox, so it sits smaller than the old full-bleed disc): header .wm img 24β†’28px, .signmark img 36β†’42px. The logo agent has ten Cradle variations up for his final pick β€” re-swapping is the same four-file copy + node build.mjs, and every variation's minimum size (16–20px) clears both of our uses.
  4. Still open from before: printed email hello@leachie.com (inbox not set up) and printed URL leachie.com (nothing deployed) β€” ALIGN Q1/Q2.

Why no red/green diff.mjs view for this pass: diff.mjs renders content blocks (both sides through the current renderers) against git HEAD / .history/baseline.json, both of which predate the whole Leachie rebrand. It would show the rebrand and the bold pass mixed together and would show none of the CSS, which is most of this pass. The before/after switcher on real renders is the honest instrument here.

Recipes (unchanged): node build.mjs β†’ node render-check.mjs [id] (0 overflow and 0 clipped) β†’ SHOTS=dir node render-check.mjs therapists for PNGs. PDFs: nohup node serve.mjs 5311 >/tmp/pam.log 2>&1 & disown, then Playwright from ~/dan-hub/aerias-demo/node_modules with emulateMedia({media:'print'}) + page.pdf({width:'794px',height:'1123px',printBackground:true,margin:0}).

Pointers: ~/dan-hub/leachie-rebrand/ALIGN.md (compacted 20:46 β€” the roster now names this strand pamphlet-bold; my status entry is under Status), LEACHIE-BRAND.md, pamphlet-bold-review.html, and the πŸ’βœ… block below for the content spec.


πŸ’βœ… Leachie rebrand DELIVERED + verified (2026-07-24 evening) β€” READ THIS FIRST

Goal (this session): resume the Leachie rebrand per the πŸ’ block below β€” but a second agent (delegated by the website session; see ~/dan-hub/leachie-rebrand/ALIGN.md Status) was already mid-flight in this repo. Daniel chose "stand by & verify": that agent finished the whole mission; this session verified it read-only and logged coordination in ALIGN.md. The "NOT DONE" list in the block below is now fully DONE β€” treat this block as the truth.

⚠️ UNCOMMITTED WIP (branch review/pamphlets, HEAD c3742b2, local-only) β€” do NOT commit/reset/stash/clean: the ENTIRE rebrand is uncommitted working tree (~824 insertions across build.mjs / data.mjs / pamphlet.css / all p/*.html, new assets/leachie-mark{,-clean,-mono}.svg, new p/therapists-print.html), sitting ON TOP of the earlier visual-polish WIP. Awaiting Daniel's review. Edit forward only.

What's delivered (by the in-flight agent; independently verified here):

  • therapists v3 β€” the new 8-page IA exactly per brief: cover w/ .offerbox (struck R2 500β†’R1 250 + R550β†’R275) Β· condensed why-it-matters (stats 3-up, no tall valueBars) Β· effort split w/ "Our part" + publications/articles port-across Β· see-it-before-you-pay timeline Β· pricing w/ found:{} struck lines + banded group (R6 500+R950 β†’ R7 500+R1 250 β†’ quote) + brand-tidy note (full pack from R4 500) Β· care plan + 3-item FAQ Β· Founding Practices offer page (reco big w/ badge "first 5 Β· held to 31 Aug 2026", deal-term points, Berlein+POPIA trust) Β· rebranded close w/ mark sign-off.
  • therapists-print v1 β€” exactly 2 pages (promotion-at-a-glance w/ all 3 struck prices + deal chips; how-it-works 3-up + .pricemini + group one-liner + dark CTA w/ mark). Both in the pamphlets export.
  • Shared blocks (CONTACT_INFO / WHY_COLS / CARE_PLAN / HOW_IT_WORKS / closingPage) all Leachie + we-voice; review shell rebranded (zero danielslater left in build.mjs/index.html).
  • Verified: all 10 pages 0-overflow (render-check re-run independently); every settled ALIGN number matches; trust anchors + Alexa's two notes present; layman we-voice, no stack-talk, the "software agents" para is gone. PDFs: ~/dan-hub/leachie-rebrand/pdf/leachie-therapists{,-print}.pdf (8pp + 2pp, fresh vs sources at 17:44, rasterize clean). Page shots: ~/dan-hub/leachie-rebrand/pamphlet-shots/.

Open flags (the next pass):

  1. Cover has NO contact route β€” the brief's .covercta WhatsApp band was dropped (its CSS shipped but is unused), and p1/p2 bottom thirds are conspicuously empty (p3/p4 milder). Easy win: put the covercta in the p1 void.
  2. Residual ocean hex #56cfd8 at build.mjs:507 (coverBand url kicker β€” only nadia-cover-b renders it).
  3. πŸ”΄ BRAND PIVOT landed AFTER the PDFs (ALIGN.md Status, 17:45): bold / growing / vibrant / partnership-led supersedes the calm-quiet register on energy + visuals; the logo is being completely redone (marks in leachie-rebrand/brand/marks/ will change). The pamphlet's "calm, professional" / "quietly" wording (cover + print p1) and the current mark need a revisit once the new marks + the referenced-but-still-missing Q3 land in ALIGN.md. Palette hexes, prices and promotion numbers stay binding.
  4. The in-flight agent never wrote its own completion note anywhere β€” this block is the only record it finished.

Open decisions awaiting Daniel: review the pamphlet (gallery: nohup node serve.mjs 5300 >/tmp/pamphlet-serve.log 2>&1 & disown, or just the PDFs); promotion numbers are still "proposed" in ALIGN; Q1 β€” pamphlet prints hello@leachie.com (inbox NOT set up yet); Q2 β€” pamphlet prints leachie.com (nothing deployed there); plus the older v2-era decisions in the blocks below (squash to master, other variants through the review loop).

Gotchas: Discord send is owned by the WEBSITE agent per ALIGN β€” pamphlet side never sends. Check ALIGN.md at the start of every chunk β€” it moves fast (the pivot landed mid-session). Multiple agents have shared this repo today: check stat -f '%Sm' data.mjs build.mjs for fresh writes before editing. Build/check/PDF recipes are in the πŸ’ block below and unchanged.

Pointers: ~/dan-hub/leachie-rebrand/ALIGN.md (coordination log incl. this session's verification entry + the brand pivot), LEACHIE-BRAND.md, the πŸ’ block below (full per-page spec + recipes).


πŸ’ Leachie rebrand + therapist campaign restructure β€” IN PROGRESS, handed over mid-task (2026-07-24)

Mission (from the launching brief): rebrand the whole pamphlet system from "Daniel Slater / danielslater.dev" to the Leachie agency (lychee identity), then restructure + redraft the therapists pamphlet into a new 8-page IA and add a 2-page printable therapists-print variant, render-check to 0 overflow, and produce two PDFs into /Users/ds/dan-hub/leachie-rebrand/pdf/. Do NOT commit, do NOT send to Discord (Daniel reviews first). Source of truth = /Users/ds/dan-hub/leachie-rebrand/LEACHIE-BRAND.md (palette Β§3, offer + "Founding Practices" promotion Β§6).

⚠️ Handed over BEFORE completion (Daniel /handover'd mid-task). Nothing committed; git history untouched; branch still review/pamphlets. Do NOT checkout/reset/stash/clean β€” the pre-existing visual-polish WIP is still live too. Edit forward only.

DONE so far (all in build.mjs β€” the shared visual layer):

  • Palette remap to Leachie in the pamphlet :root: kept the old ocean variable names, repointed values (per LEACHIE-BRAND.md Β§3 token contract). --warm=rind #c74a3b (CTA/kickers), --teal+--sea-deep=rind-deep #a83a2b (emphasis/em-*), --turquoise=rind (dots), --gold+--gold-deep=amber #e0a45c/rind-deep, --crest=coral #fd7570 (dark-ground pops), --white-water=flesh-lit #f6e8d2, --paper #fcf5ea, --paper-2 #f3e7d3, --panel #f0ddc2, --ink #2b1a12, --ink-deep #4a2a1a (dark umber ground), --slate #7a6653, --rule(-strong) warm-ink rgba. Body bg #e5dbc8.
  • Hunted down hardcoded ocean hexes in the CSS and warmed them: cta-dark/act/coverband/flownode/promise light-on-dark text (#c8d6daβ†’#e6d5bd, #7fa2abβ†’#d3a273, #e8f1f4β†’#f6e8d2, #9fb9c0β†’#c9ab8b), browser-frame chrome, before/after + reco + hs-me gradient tints, funnel + value-bar gradients (now amberβ†’rind / seedβ†’rind-deep), refs underline. Wave-field motif (wavesUri() + B.waves(), both arrays) recoloured coral/amber/rind/rind-deep/seed.
  • Header lockup: .wm is now <img src="../assets/leachie-mark-clean.svg"> + "Leachie" (flex, mark 24px) on EVERY page β†’ puts the mark on cover + close. Doc <title> β†’ "Leachie β€” …". FOOT_L β†’ "Leachie Β· Cape Town".
  • Review shell (index gallery): title + :root palette rebranded to lychee. STILL OCEAN in the shell (TODO): the header gradient #0b2229/#0d2b33/#0b3a45, .thumb gradient #0d2b33/#0b4586, and #bcd0d5/#cfe0e4/#04141a text bits; plus the .brand string still reads danielslater<span class="dot">.dev</span> in the shell <header> HTML β€” not yet changed.
  • New renderer support (unused until data.mjs is written): B.cards accepts c.found:{was,now,lab} β†’ renders a struck-through founding line (.cardfound). B.ctaDark accepts mark:true β†’ Leachie mark sign-off (.signmark). New CSS components added: .offerbox (founding-offer strip w/ struck prices), .covercta (rind cover CTA band), .pricemini/.pm-* (compact print price grid), .cardfound, .signmark.
  • Copied the marks into assets/: leachie-mark.svg (dimpled, for large/close), leachie-mark-clean.svg (smooth, header ≀40px), leachie-mark-mono.svg.

NOT DONE (the bulk of the mission remains):

  1. data.mjs is UNTOUCHED. Still has every danielslater.dev identity string. Must rebrand the shared blocks therapists uses: CONTACT_INFO (β†’ Leachie, hello@leachie.com β€” needs a code comment that the email needs setting up), WHY_COLS (β†’ agency first-person-plural "we/you deal with us"), CARE_PLAN ("I keep/make" β†’ "we"), and closingPage (hardcoded danielslater.dev/daniel@danielslater.dev/"me" β†’ leachie.com/hello@leachie.com/agency plural; pass mark:true to its ctaDark; kick "Working with me"β†’"Why Leachie"). (These are shared β†’ the reskin also touches LOW/MID/HIGH/clients, which is fine β€” agency is Leachie now. Do NOT rewrite every "I" in the non-therapist variants' body copy β€” out of scope.)
  2. Restructure the THERAPISTS block (data.mjs ~L485–601) to the new 8-page IA (full spec in the launching brief): (1) Cover = whole-campaign summary [use .offerbox for the Founding offer w/ struck R2 500β†’R1 250 + R550β†’R275, B.terms promise chips, .covercta WhatsApp CTA]; (2) ONE condensed biz page (first-impression β†’ CACβ‰ˆR600 vs valueβ‰ˆR10 000+ β‰ˆ10Γ— as ONE small graphic, e.g. B.stats 3-up, NOT the tall valueBars; found-but-chosen; built-for-you; tiny refs if they fit); (3) "You barely lift a finger" (B.howSplit, me.k:'Our part', + incl "already have content anywhere incl. publications/blog/articles β†’ point us at it"); (4) "You see it before you pay" (B.howTimeline 4 steps, "I"β†’"we"); (5) "What it costs" (2 cards Refresh R2 500 feature + New R3 500, each with found:{} struck founding line; group incl R6 500+R950 β†’ R7 500+R1 250 β†’ larger by quote; crisp brand-tidy note: light colour/type/logo included, full pack from R4 500; fixed price + you-own-everything note); (6) "Keeping it running" (CARE_PLAN cards + 3-item B.faq: what the monthly pays for / cancel = keep everything no lock-in / edit-yourself); (7) Founding Practices promo page (B.reco big, was R2 500 β†’ R1 250 + + R275/mo wasMo:'was R550/mo' offer badge "first 5 only"; B.points for the deal terms β€” first 5, held until 31 Aug 2026 or until slots fill, in return a testimonial/case study; B.incl trust: Berlein Psychology real Cape Town practice we rebuilt + POPIA-aware); (8) rebranded closingPage. Shrink graphics so pages breathe (Daniel's explicit ask); keep to ~8 pages. Bump version:'v3'(or similar), updated:'2026-07-24', and rewrite labelβ†’"Leachie Β· Therapists", metaRight, blurb.
  3. Add THERAPISTS_PRINT variant (id:'therapists-print', group 'vertical') β€” exactly 2 A4 pages: P1 = campaign summary + Founding offer + why-in-2-lines + preview-first; P2 = how-it-works (3–4 steps, B.howItWorks is compact) + pricing (.pricemini grid: Refresh/New + Essential/Managed one-liners + group one-liner) + contact CTA with the mark. Dense but legible, 0 overflow. Add both THERAPISTS(existing) and THERAPISTS_PRINT to the pamphlets export array at the bottom of data.mjs.
  4. Build + gate: cd /Users/ds/dan-hub/biz/pamphlet-preview && node build.mjs (regenerates pamphlet.css + all p/*.html from the CSS/renderers β€” this is expected; my build.mjs edits are the source). Then node render-check.mjs therapists and node render-check.mjs therapists-print β†’ iterate to 0 overflow on every page (pages are fixed 794Γ—1123, overflow:hidden β€” overflow = cut text = failure). Use SHOTS=/Users/ds/dan-hub/leachie-rebrand/pamphlet-shots node render-check.mjs therapists and actually read the PNGs to verify the rebrand reads well + graphics are small/polished + the mark renders.
  5. PDFs: start serve.mjs detached on a free port (e.g. nohup node serve.mjs 5311 …), Playwright β†’ http://localhost:5311/p/therapists.html with emulateMedia({media:'print'}) + page.pdf({width:'794px',height:'1123px',printBackground:true,margin:0}) β†’ save /Users/ds/dan-hub/leachie-rebrand/pdf/leachie-therapists.pdf and …/leachie-therapists-print.pdf. Final visual pass.

Verification tip for whoever resumes: grep -nE '#(0b|0d|17a3|56cf|caab|122a|4d6a)' build.mjs to catch any residual ocean hexes (shadows using rgba(13,43,51)/(18,42,51) are fine to leave). Playwright is imported by absolute path from /Users/ds/dan-hub/aerias-demo/node_modules and needs network (Google Fonts).

State: nothing committed, nothing sent, git history untouched. data.mjs unchanged. build.mjs has the rebrand edits above but node build.mjs has NOT been run yet β€” so pamphlet.css + p/*.html on disk still reflect the earlier polish WIP, not this rebrand.


🎯 Therapist v2 shipped + git-backed review history (2026-07-24) β€” READ THIS FIRST

Goal: run the therapist pamphlet through the review loop to done (v2), make the diff tooling multi-page-aware, replace the homegrown snapshot history with git, commit v2, PDF it to Discord, and hand a visual-polish pass to another agent.

⚠️ UNCOMMITTED WIP (branch review/pamphlets, HEAD c3742b2, local-only) β€” do NOT blow away:

  • build.mjs (~137 lines: CSS + renderers), pamphlet.css, and all p/*.html are modified β€” this is the visual-polish pass by another agent (I handed it a brief; it ran here). data.mjs is UNCHANGED (content was the fixed constraint βœ“). Not committed on purpose β€” awaiting Daniel's review. render-check.mjs therapists β†’ all 10 pages fit A4, 0 overflow (WIP is valid). I did not verify whether that agent actually sent the polished PDF to Discord β€” confirm with Daniel.

What shipped (committed on review/pamphlets):

  • 4e7978f v1 β€” round-1 12-page rewrite: multi-page value section (CAC/CLV + conversion funnel with real sourced references), 3 how-it-works options, reworked pricing/monthly.
  • c3742b2 v2 (final) β€” applied Daniel's review: how-it-works Option A (timeline) kept, B/C retired; the C split graphic moved to "Your part"; group pricing from PRICING.md Β§5b (banded: small R6 500+R950/mo β†’ standard R7 500+R1 250/mo β†’ larger by quote); therapists bumped version:'v2'. 10 pages.
  • Tooling rebuilt: diff.mjs β†’ one global block-level LCS (multi-page aware; renamed/inserted pages don't cascade; content-hash keys). Live review diff now compares working tree vs an advancing approved baseline (.history/baseline.json), NOT HEAD β€” approved-unchanged blocks drop out; only pending + changes-on-top show; opens in "needs-attention" view with a gold "show all" toggle. history.mjs β†’ git-backed: each apply round is a commit carrying data.mjs+reviews.json so any past baseline reconstructs from git; commands round "note" (commit + advance baseline + render), baseline [ref], render, list. Browse pages at .history/history.html (driven by git log). New build.mjs renderers: flow, valueBars(+ratio badge), funnel(+stage tags), howTimeline/howPromise/howSplit, faq, refs. reviews.json/comments.json now git-tracked; .history/, .review-archive/, p/*-diff.html gitignored.
  • Sent the v2 PDF to Daniel's Discord (10-page A4, via the orchestrator bot on the hub β€” HTTP 200 confirmed).

Blockers / definition-of-done: therapists v2 content is settled + committed. The visual polish is done but uncommitted β€” DoD = Daniel reviews it β†’ commit as a round (node history.mjs round "round 3 β€” visual polish") or revert.

Open decisions awaiting Daniel:

  1. The visual-polish WIP β€” accept (commit as a round) or discard.
  2. Squash review/pamphlets β†’ a clean master milestone? (offered; not done β€” master still at 4cb6b9e, untouched.)
  3. PRICING.md Β§5b still floats 3-band vs a flat R1 250 group tier (its own open Q's #5/#6) β€” the pamphlet uses the banded numbers; confirm.
  4. Only therapists has been through the review loop β€” low/mid/high + client variants haven't.
  5. Shared WHY_COLS closing columns still say "keep the lot" (a "yours to keep" variant) across all pamphlets β€” earlier flagged, change globally or leave?

Gotchas:

  • Baseline β‰  HEAD. The live diff diffs against .history/baseline.json (approved blocks), rebuilt by node history.mjs baseline from a committed round + reviews.json. Any renderer change (e.g. this polish) changes rendered HTML β†’ block hashes change β†’ those blocks show as "changed" in the diff (harmless; re-approve).
  • Apply loop now: Daniel reviews live diff β†’ node history.mjs round "..." (commits reviewed draft + advances baseline) β†’ edit next round β†’ node build.mjs && node diff.mjs therapists && node build.mjs.
  • serve.mjs must run for the review UI (POSTs to its API). Up now (PID 41766); restart: cd ~/dan-hub/biz/pamphlet-preview && nohup node serve.mjs 5300 >/tmp/pamphlet-serve.log 2>&1 & disown.
  • Playwright imported by absolute path from ~/dan-hub/aerias-demo/node_modules; needs network (Google Fonts). node render-check.mjs [id] must be 0-overflow (pages fixed 794Γ—1123, overflow:hidden); SHOTS=dir node render-check.mjs therapists writes per-page PNGs.
  • PDF: Playwright on http://localhost:5300/p/therapists.html, emulateMedia({media:'print'}), page.pdf({width:'794px',height:'1123px',printBackground:true,margin:0}) β†’ 10 A4 pages.
  • Discord send: scp <pdf> hub:/tmp/x.pdf; ssh hub, read DISCORD_BOT_TOKEN+DISCORD_CHANNEL_ID from ~/code/claude-orchestrator/.env, curl -X POST https://discord.com/api/v10/channels/$CHAN/messages -H "Authorization: Bot $TOKEN" -F 'payload_json={"content":"…"}' -F "files[0]=@/tmp/x.pdf;type=application/pdf;filename=…"; verify HTTP 200; rm temp; never print the token.

Next actions (ordered): 1) get Daniel's call on the visual polish β†’ commit it as a round or revert; 2) squash to master if he wants the milestone; 3) optionally run other variants through the loop.

Pointers: build.mjs (CSS + B renderers = visual layer), data.mjs (THERAPISTS L485), diff.mjs, history.mjs, serve.mjs; `/dan-hub/biz/PRICING.md(Β§5b) +therapist-pricing-research.md; this block; memories pamphlet-preview, dsdev-brand-design-pack`.


🧾 Therapist pamphlet + diff/review system (2026-07-23)

Goal: add a therapist-vertical pamphlet, make the library reviewable on a phone (mobile gallery), and build a code-style red/green diff view with per-section approve/reject/comment β€” a lightweight review/version-control loop for iterating on pamphlet copy with Daniel.

⚠️ UNCOMMITTED WIP (branch master, HEAD 4cb6b9e, local-only) β€” do NOT blow away, do NOT commit as "final" yet:

  • data.mjs β€” the therapists variant is at v2 DRAFT, under active review (not approved). It carries Daniel's first two applied comments: cover lede ends "Custom made for you" (was "…yours to keep"); P2 reverted to the old paragraphs + an educational bullet list (CAC / funnel / LTV, self-reflective, no product pitch). version field still says v1 on purpose β€” only bump + commit once the review is signed off.
  • diff.mjs (NEW) β€” generates p/<id>-diff.html: renders committed HEAD data.mjs vs the working tree, block-by-block; old=red "was" above new=green "now"; per-section βœ“Approve / βœ—Reject / πŸ’¬Comment toolbar + live summary + "◐ pending only" filter. Compares against git HEAD as the baseline.
  • serve.mjs (NEW) β€” tiny Node static server for the library + a local comment/review API (/api/comment, /api/comments, /api/review, /api/reviews, /api/resolve) writing to comments.json + reviews.json (both gitignored, currently empty/clean). No cloud β€” chosen over the CF dsdev-comments Worker because the library is viewed locally.
  • build.mjs β€” mobile fix (pamphlet pages now <meta viewport width=794> so A4 scales to a phone; the earlier zoom:calc() attempt was invalid CSS); new points educational-list renderer; hero gained xs size + cover gained hsm/sub; renderShell rewritten into a mobile-first gallery (cover thumbnails, version/date, dynamic groups incl. vertical); exports B/icon/variantBlockHtml + guarded emit (isMain) so diff.mjs can import it; gallery cards show a "changes" link when a diff exists.
  • thumbs.mjs β€” cover-thumbnail generator (committed at 4cb6b9e? no β€” thumbs/ committed, thumbs.mjs was in the initial commit; thumbs/therapists.png is re-generated/modified).
  • Regenerated artifacts also modified: index.html, all p/*.html, pamphlet.css, .gitignore (added comments.json, reviews.json).
  • render-check.mjs: therapists passes (7/7 pages fit A4, 0 overflow).

What shipped (working, verified): the therapist pamphlet (7 pages), the mobile gallery, the diff view, and the full section-review UI (approve/reject/comment persist to disk; verified end-to-end via curl + headless screenshots). All live locally only.

Definition of done / the loop: Daniel reviews therapists-diff.html β†’ approve/reject/comment each of the 18 changed sections β†’ says "apply" β†’ I revert rejects (hand-edit data.mjs to restore old text), action comments (edit source), keep approves β†’ regenerate diff β†’ repeat until "0 to review" β†’ he says "commit" β†’ then bump therapists to v2 and git commit (that becomes the new diff baseline).

Open decisions awaiting Daniel:

  1. Work through the diff (all 18 sections currently pending β€” nothing approved/rejected yet).
  2. Confirm proposed prices: group tier R6 500 / R950/mo, new-site R3 500 (Refresh R2 500 + R550/mo is his).
  3. Whether to commit the WIP / push to a private remote (contains prospect names + pricing β†’ never public).
  4. Deferred: real brand design pack for danielslater.dev (memory dsdev-brand-design-pack); reconcile R550 vs the unlogged R250/mo pivot in biz/DECISIONS.md.

Gotchas:

  • serve.mjs must be running for the diff review (comment/approve buttons POST to it). Start detached: cd ~/dan-hub/biz/pamphlet-preview && nohup node serve.mjs 5300 >/tmp/pamphlet-serve.log 2>&1 & disown. Harness-tracked background tasks get reaped between turns β€” use nohup, not run_in_background.
  • View on phone (same Wi-Fi): http://<mac-LAN-ip>:5300/p/therapists-diff.html (get IP via ipconfig getifaddr en0). Pamphlet pages scale via viewport width=794; the gallery is responsive device-width.
  • diff.mjs/thumbs.mjs/render-check.mjs import Playwright by absolute path from ~/dan-hub/aerias-demo/node_modules; need network for Google Fonts.
  • Never wrap pamphlet blocks in marker divs in the normal build β€” flex layouts (mt-a, sec-gap) break. variantBlockHtml returns per-block HTML separately for the diff instead.
  • Regen order after a data/build change: node build.mjs && node diff.mjs <id> && node build.mjs && node thumbs.mjs <id> && node render-check.mjs <id>.

Next actions (ordered): 1) keep serve.mjs up; 2) wait for Daniel's diff review β†’ on "apply", sweep reviews.json + comments.json, edit data.mjs, regen diff; 3) loop to zero pending; 4) on "commit", bump version + git commit.

Pointers: data.mjs (THERAPISTS block), diff.mjs, serve.mjs, README.md, CHANGELOG.md; memories pamphlet-preview, dsdev-brand-design-pack, danielslater-dev-brand-strategy. Earlier this session: status-checked the 3 danielslater.dev threads (ocean landing / docs-site / agency dashboard) β€” all live; pricing pivot still unlogged in biz/DECISIONS.md.