Skip to content

feat(landing): homepage rebuild — persona manifesto, card beat high, /lp/card retired - #2694

Open
0xkkonrad wants to merge 3 commits into
mainfrom
lp-refresh-main
Open

feat(landing): homepage rebuild — persona manifesto, card beat high, /lp/card retired#2694
0xkkonrad wants to merge 3 commits into
mainfrom
lp-refresh-main

Conversation

@0xkkonrad

Copy link
Copy Markdown
Contributor

Main-based port of #2690 (dev is 75 commits ahead of main, so the dev-based PR cannot retarget). Rain marketing review: APPROVED per Konrad 2026-08-14. Remaining pre-merge question: es/pt localization of the new ProblemFold keys + 3 machine-drafted support sentences — Konrad to rule EN-first vs hold.


Continues #2686 — same commits, branch renamed feat/lp-refreshlp-refresh per Konrad (org ruleset blocks in-place renames, so this is a successor PR; all QA history lives on #2686).

Summary

Rebuild of the peanut.me homepage per mockup v3.1 (mono projects/lp-refresh/mockups/mockup.html, Konrad-approved 2026-08-13). Doctrine: reuse the live page heavily — the homepage is the live sections reordered, plus two new folds. The earlier v1 implementation on this branch was rejected as too busy and is fully unwound (additive commits, no force-push).

New fold order (bg): live hero (pink) → ShhhhhFold (black, NEW) → ProblemFold (cream, NEW) → NoFees (blue) → yourMoney (yellow) → TweetCarousel (pink) → RegulatedRails (cream) → Manteca (blue ← was cream) → securityBuiltIn (pink) → sendInSeconds (yellow) → FAQs → footer. Yellow marquee strips between every fold as on live; the strip after ShhhhhFold carries the /shhhhh words (IYKYK · WORD TRAVELS · …).

  • ShhhhhFold — distills /shhhhh §1 onto black: wordmark, tagline, body with shared ScarcityCounter (51→50), TRY THE DOOR + waitlist link, blurred PixelatedCardFace at −12°. Every click routes to /shhhhh — no inline join logic. Copy comes from the existing shhhhh.* next-intl catalog (already localized, 4 locales). Pink drop shadows on this fold only (black shadows vanish on black).
  • ProblemFold — "You already know the problem." + three named cards (Living across borders / Sending money home / Paid from abroad) with inline line icons. Landing i18n keys added EN-first in all catalogs.
  • Restored verbatim from dev (v1 had deleted/edited them): TweetCarousel + tweets.consts, hero, noFees, StickyMobileCTA, ExchangeRateWidget, landingStrings/types/content, all src/i18n catalogs. sendInSeconds keeps the full scroll-freeze grow-button machinery.
  • Kept from v1: /lp/card retired (redirect → /shhhhh in redirects.json, route deleted, sitemap + robots cleaned), shared ScarcityCounter, 20→50/week admission copy across /shhhhh + metadata per product/card.md ruling 2026-08-12.
  • Deleted v1 beats: CardBeat, Manifesto, ProblemProse, WorksToday, NotForYou, Sparkle. CardPioneers + PioneerCard3D stay deleted (no longer rendered anywhere).
  • Kill switch: disableLandingCardFold (default off) hides ShhhhhFold + its marquee strip in one flip, mirroring the old disableCardPioneers gating.
  • Manteca background is now a prop (default cream) — only the homepage passes blue; /quests unchanged.

Design source: mockup v3.1 + decisions in mono projects/lp-refresh/README.md.

Task

TASK-21424 — https://app.notion.com/p/3ba83811757981dd8b7cd252044265e5

Risks / notes for review

  • ⚠️ Rain marketing compliance: the homepage card fold is a public card surface → needs Rain pre-publication review (14 days) before PROD merge. Preview/staging is fine.
  • ProblemFold copy ships EN-first in all landing catalogs; es-419 / es-AR / pt-BR translations are a follow-up before prod merge (PT-BR framing rules apply). ShhhhhFold needs no new translation (reuses the shhhhh catalog).
  • ShhhhhFold copy is app-locale (next-intl), not landing-locale: SSR renders EN, client swaps to the user's locale — same behavior as /shhhhh itself.
  • Pre-existing dev bug left in place (restored file): noFees "See the markup on" links point at /compare/wise|paypal|western-union, which 404 (only peanut-vs-* slugs are generated). Worth a separate one-line PR.
  • npm run build could not run locally (sandbox OOM, environmental); typecheck + 231 suites / 2939 tests green locally — CI + Vercel preview are the build verification.

QA

  • Local gate: prettier ✅ · typecheck ✅ · jest 231 suites / 2939 tests ✅ · eslint ✅.
  • Visual QA vs mockup v3.1 AND vs live peanut.me (reused folds must match live) runs against the Vercel preview — results in a follow-up comment.

🤖 Generated with Claude Code

#qr-pay lockups (cb10001 — revised ruling, partly reverts #2692)

Per mono projects/lp-refresh/handoff-qrpay-lockups.md: original wavy flag artwork restored (flag-only viewBox crop), pink tile + white card removed, black marks straight on the ground (9:1 on blue, 19:1 on cream), scale L. Two consequences stated deliberately, not to be "fixed":

  1. PIX and MercadoPago now present two ways on one page — pink tile in #regulated-rails, plain in #qr-pay, one scroll apart. Konrad accepted this inconsistency in exchange for a calmer fold.
  2. The Argentine flag has no black stroke in its original artwork — at 1.37:1 its light blue loses its edges against the homepage blue. Property of the artwork, predates the tile, survives it. An AR-only outline is a small separate change awaiting Konrad's say-so; do not bundle.

Ports the whole LP change set onto main so it can ship to production. dev is
75 commits ahead of main, so #2690 cannot simply retarget; this is the same
diff rebuilt on main's tree.

Of the 51 files in the change set, 35 are byte-identical between main and dev
and carried over whole. The other 16 also move on dev, so each was three-way
merged with dev as the base — main's version plus the LP delta and nothing
else. That keeps dev's unrelated work out: main's catalogs gain the seven
ProblemFold keys, lose landingPayLocalSettles, and take the reworded support
and footer strings, but none of dev's other new keys come along.

src/content stays on main's pointer. Production content moves on its own
pipeline and must not be dragged backwards or forwards by a code PR.
@coderabbitai

coderabbitai Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

@0xkkonrad, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 4 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 4ce76f46-04ea-4b5d-9f9c-615bed8bc211

📥 Commits

Reviewing files that changed from the base of the PR and between 539e73a and 51ae783.

⛔ Files ignored due to path filters (4)
  • src/assets/icons/pix-logo.svg is excluded by !**/*.svg, !**/*.svg
  • src/assets/illustrations/flag-ar.svg is excluded by !**/*.svg, !**/*.svg
  • src/assets/illustrations/flag-br.svg is excluded by !**/*.svg, !**/*.svg
  • src/assets/illustrations/stack-coin.svg is excluded by !**/*.svg, !**/*.svg
📒 Files selected for processing (46)
  • redirects.json
  • scripts/generate-valid-links.ts
  • scripts/ping-indexnow.ts
  • scripts/verify-content.ts
  • src/app/lp/card/CardLandingPage.tsx
  • src/app/lp/card/page.tsx
  • src/app/robots.ts
  • src/app/shhhhh/ShhhhhLandingPage.tsx
  • src/app/shhhhh/page.tsx
  • src/app/sitemap.ts
  • src/assets/logos/index.ts
  • src/components/Card/doorTally.utils.ts
  • src/components/Card/share-asset/PixelatedCardFace.tsx
  • src/components/Global/FAQs/index.tsx
  • src/components/Global/MarqueeWrapper/index.tsx
  • src/components/Global/MarqueeWrapper/marquee.types.ts
  • src/components/LandingPage/CardPioneers.tsx
  • src/components/LandingPage/LandingPageClient.tsx
  • src/components/LandingPage/LandingPageContent.tsx
  • src/components/LandingPage/Manteca.tsx
  • src/components/LandingPage/PartnerLockup.tsx
  • src/components/LandingPage/PioneerCard3D.tsx
  • src/components/LandingPage/ProblemFold.tsx
  • src/components/LandingPage/RegulatedRails.tsx
  • src/components/LandingPage/ScarcityCounter.tsx
  • src/components/LandingPage/ShhhhhFold.tsx
  • src/components/LandingPage/__tests__/landingLinks.utils.test.ts
  • src/components/LandingPage/faq.tsx
  • src/components/LandingPage/index.ts
  • src/components/LandingPage/landing.types.ts
  • src/components/LandingPage/landingLinks.utils.ts
  • src/components/LandingPage/landingStrings.ts
  • src/components/LandingPage/marquee.tsx
  • src/components/LandingPage/securityBuiltIn.tsx
  • src/components/LandingPage/yourMoney.tsx
  • src/config/underMaintenance.config.ts
  • src/i18n/app/__tests__/shhhhh-catalog.test.ts
  • src/i18n/app/messages/en.json
  • src/i18n/app/messages/es-419.json
  • src/i18n/app/messages/es-AR.json
  • src/i18n/app/messages/pt-BR.json
  • src/i18n/en.json
  • src/i18n/es-419.json
  • src/i18n/es-ar.json
  • src/i18n/pt-br.json
  • src/i18n/types.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 7118.07 → 7120.08 (+2.01)
Findings: -12 net (+69 new, -81 resolved)

🆕 New findings (69)

  • critical complexity — src/components/LandingPage/LandingPageClient.tsx — CC 54, MI 55.94, SLOC 215
  • high complexity — src/app/shhhhh/ShhhhhLandingPage.tsx — CC 44, MI 55.87, SLOC 286
  • medium react-long-component — src/app/shhhhh/ShhhhhLandingPage.tsx:123 — ShhhhhLandingPage is 459 lines — split it
  • medium high-mdd — src/app/shhhhh/ShhhhhLandingPage.tsx:123 — ShhhhhLandingPage: MDD 176.6 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/LandingPageClient.tsx:50 — LandingPageClient: MDD 66.8 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/Manteca.tsx:26 — Manteca: MDD 46.1 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/ProblemFold.tsx:21 — ProblemFold: MDD 37.0 (uses across many lines from declarations)
  • medium hotspot — src/app/shhhhh/ShhhhhLandingPage.tsx — 29 commits, +1082/-467 lines since 6 months ago
  • medium complexity — src/components/Card/share-asset/PixelatedCardFace.tsx — CC 29, MI 58.49, SLOC 146
  • medium structural-dup — app/shhhhh/ShhhhhLandingPage.tsx:82 — 28 duplicate lines / 159 tokens with components/LandingPage/StickyMobileCTA.tsx:27
  • medium high-mdd — src/components/LandingPage/ShhhhhFold.tsx:27 — ShhhhhFold: MDD 25.8 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/securityBuiltIn.tsx:54 — SecurityBuiltIn: MDD 24.6 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/RegulatedRails.tsx:52 — RegulatedRails: MDD 22.2 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/landingStrings.ts:45 — landingStrings: MDD 20.9 (uses across many lines from declarations)
  • medium method-complexity — src/components/LandingPage/LandingPageClient.tsx:171 — CC 17 SLOC 39
  • medium complexity — src/components/Global/FAQs/index.tsx — CC 13, MI 62.66, SLOC 29
  • medium complexity — src/components/LandingPage/landingLinks.utils.ts — CC 7, MI 57.12, SLOC 35
  • medium complexity — src/components/LandingPage/RegulatedRails.tsx — CC 5, MI 55.44, SLOC 49
  • medium complexity — src/app/robots.ts — CC 4, MI 60.86, SLOC 30
  • medium complexity — src/components/LandingPage/Manteca.tsx — CC 3, MI 63.19, SLOC 26

…and 49 more.

✅ Resolved (81)

  • src/app/shhhhh/ShhhhhLandingPage.tsx — CC 48, MI 56.68, SLOC 304
  • src/components/LandingPage/LandingPageClient.tsx — CC 48, MI 55.67, SLOC 172
  • src/components/LandingPage/PioneerCard3D.tsx — CC 31, MI 62.84, SLOC 153
  • src/app/lp/card/CardLandingPage.tsx — CC 15, MI 45.15, SLOC 308
  • src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage is 457 lines — split it
  • src/app/lp/card/CardLandingPage.tsx:44 — CardLandingPage: MDD 318.2 (uses across many lines from declarations)
  • src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage: MDD 175.8 (uses across many lines from declarations)
  • src/components/LandingPage/LandingPageClient.tsx:48 — LandingPageClient: MDD 48.3 (uses across many lines from declarations)
  • src/components/LandingPage/Manteca.tsx:20 — Manteca: MDD 47.8 (uses across many lines from declarations)
  • src/components/LandingPage/PioneerCard3D.tsx:14 — PioneerCard3D: MDD 39.7 (uses across many lines from declarations)
  • src/components/Card/share-asset/PixelatedCardFace.tsx — CC 29, MI 58.5, SLOC 146
  • app/shhhhh/ShhhhhLandingPage.tsx:99 — 28 duplicate lines / 159 tokens with components/LandingPage/StickyMobileCTA.tsx:27
  • src/app/shhhhh/ShhhhhLandingPage.tsx — 28 commits, +1078/-448 lines since 6 months ago
  • src/components/LandingPage/RegulatedRails.tsx:37 — RegulatedRails: MDD 26.8 (uses across many lines from declarations)
  • src/components/LandingPage/securityBuiltIn.tsx:54 — SecurityBuiltIn: MDD 23.2 (uses across many lines from declarations)
  • src/components/LandingPage/LandingPageClient.tsx:149 — CC 17 SLOC 39
  • src/components/Global/FAQs/index.tsx — CC 12, MI 63.28, SLOC 28
  • src/components/LandingPage/CardPioneers.tsx — CC 8, MI 63.74, SLOC 58
  • src/app/robots.ts — CC 4, MI 60.85, SLOC 30
  • src/components/LandingPage/Manteca.tsx — CC 3, MI 62.94, SLOC 25

…and 61 more.

📈 Painscore deltas (top movers)

File Before After Δ
src/components/LandingPage/ProblemFold.tsx 0.0 6.2 +6.2
src/components/LandingPage/landingLinks.utils.ts 0.0 5.7 +5.7
src/components/LandingPage/ShhhhhFold.tsx 0.0 5.5 +5.5
src/components/LandingPage/ScarcityCounter.tsx 0.0 4.8 +4.8
src/components/LandingPage/PartnerLockup.tsx 0.0 2.1 +2.1
src/components/LandingPage/landingStrings.ts 7.4 8.3 +0.8
src/components/LandingPage/yourMoney.tsx 5.4 6.1 +0.7
src/components/LandingPage/RegulatedRails.tsx 7.6 8.2 +0.6
src/components/LandingPage/LandingPageContent.tsx 5.1 5.7 +0.6
src/app/lp/card/page.tsx 2.4 0.0 -2.4
src/components/LandingPage/CardPioneers.tsx 6.5 0.0 -6.5
src/components/LandingPage/PioneerCard3D.tsx 6.6 0.0 -6.6
src/app/lp/card/CardLandingPage.tsx 11.9 0.0 -11.9

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • unit: 2935 ran, 0 failed, 0 skipped, 50.0s

📊 Coverage (unit)

metric %
statements 66.2%
branches 51.2%
functions 56.3%
lines 66.9%
⏱ 10 slowest test cases
time test
3.6s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › never places two stickers in heavy overlap (broad seed sweep)
1.2s src/utils/__tests__/demo-api.test.ts › isDemoMode() is false when not running under Capacitor
0.4s src/app/actions/__tests__/api-headers.test.ts › should include Content-Type in validateInviteCode
0.4s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › every sticker stays within canvas at any count
0.3s src/utils/__tests__/sentry.utils.test.ts › defaults to the client budget under a browser global
0.3s src/app/(mobile-ui)/withdraw/__tests__/withdraw-states.test.tsx › Bank withdrawal keeps the $1 minimum for sub-$1 amounts
0.3s src/hooks/__tests__/useCrispTokenId.test.ts › retries then stays undefined when the endpoint keeps failing (no fallback token)
0.3s src/utils/__tests__/sentry.utils.test.ts › still lets a per-call timeoutMs win over the default
0.3s src/app/actions/__tests__/api-headers-extended.test.ts › should not include apiKey in validateInviteCode body
0.2s src/utils/__tests__/auth-token.test.ts › returns true when Preferences holds a token
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@vercel

vercel Bot commented Aug 14, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
peanut-wallet Ready Ready Preview Aug 14, 2026 10:44am

Request Review

…ploy and failed; alias serves the failure page)
Konrad hotfix: small light-grey line below the CTA — verification
required, no monthly/annual fees, cardholder terms, beta programme.
New shhhhh.hero.disclaimer key in all four app catalogs (es/pt
machine-drafted, flag at the localization gate).
@0xkkonrad
0xkkonrad marked this pull request as ready for review August 14, 2026 10:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants