Skip to content

chore: back-merge main → dev (2026-08-20 release + #2760) - #2772

Merged
Hugo0 merged 13 commits into
devfrom
chore/backmerge-main-into-dev-20260820-2
Aug 20, 2026
Merged

chore: back-merge main → dev (2026-08-20 release + #2760)#2772
Hugo0 merged 13 commits into
devfrom
chore/backmerge-main-into-dev-20260820-2

Conversation

@Hugo0

@Hugo0 Hugo0 commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Brings dev level with main after today's prod release (#2770) and Konrad's homepage rebuild (#2760, merged to main). Merged via the GitHub merge API, no conflicts. Merge with a merge commit, never squash.

0xkkonrad and others added 13 commits August 20, 2026 09:16
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.
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).
… fade

Three findings from the review of this PR, all inside its own diff:

- The "24/7" marquee word pointed at `/support`, which is not a route — only a
  permanent redirect to `/en/help`. Every neighbouring word resolves per locale,
  so es/pt readers were the only ones dropped into English. Point it at
  `/{locale}/help` instead.
- `PartnerLockup` carried `group` and `group-hover:opacity-90` on the same
  element. Tailwind compiles that to a descendant selector, so the element can
  never match itself and the fade was dead. `hover:opacity-90` is what was meant.
- `/lp/card` left the hand-maintained static-route lists in `verify-content` and
  `generate-valid-links`, but its successor `/shhhhh` was never added — only
  `ping-indexnow` got it. `/shhhhh` is now the canonical card page in the
  sitemap, so the first content link to it would have failed verify-content's
  Pass 1.
…ls FAQ body

Two of the follow-ups this PR had filed rather than done, both code in this repo.

The noFees "See the markup on" links pointed at /compare/wise|paypal|western-union.
`generateStaticParams` only builds `peanut-vs-<slug>`, so all three 404'd. They are
restored-from-dev lines, so the bug predates this branch, but it ships on the fold
this PR rebuilt.

`SupportedRailsFaqAnswer` hardcoded its five headings in English while its
plain-text SEO twin was translated in all four catalogs, so a pt-BR reader opening
the FAQ got a Portuguese question and an English body. The copy now comes from the
landing catalog like every other FAQ body, and the non-EVM chain list joins on the
existing `listJoinAnd` instead of a hardcoded "and". The es/pt values are lifted
from the already-shipped `landingSupportedRailsFaqAnswer` sentence in each catalog,
not drafted fresh.

`t()` moves to `src/i18n/interpolate.ts` so a client component can interpolate
without importing `@/i18n`, which would pull all four catalogs into the bundle.
`@/i18n` re-exports it, so every existing caller is unchanged.

Rail region names (`United States`, `36 countries`, …) stay English — they come
from FIAT_RAILS and the plain-text answer already interpolates them the same way.
Localizing that table is its own change.
…orts

The hero artwork was sized purely by viewport width (50vw, no height cap), and
the stack under it (mt-18 + tagline + mt-12 + button) is 344px of fixed height.
On 16:9/16:10 laptops the SIGN UP button ends up at or below the fold:
1366x657 and 1280x689 -> below fold, 1440x789 (MacBook Air 13") -> clipped,
1536x753 -> below fold. Even 1920x969 fits with 2px to spare.

Cap the artwork at 100svh minus the fixed stack (+3rem slack) and tighten the
two desktop gaps (h2 mt-18 -> md:mt-12, CTA md:mt-12 -> mt-8). The button is now
inside the fold at every measured viewport; tall screens are near-unchanged.

Reported by Slava (Discord), Notion TASK-21626.
With the artwork now capped by viewport height, a 40vh mascot on a 1366x657
laptop was almost as tall as the artwork and hid "LOCAL FEEL". Cap it at
100svh-28rem too (md+ only) so it keeps the ~0.7x artwork proportion of the
1440x789 layout; viewports >= 789px tall are unchanged.
…e lines

The first-fold fix sized the artwork against a 23rem stack below it, but that
stack is not fixed — it assumes a two-line headline. pt-BR's "TOQUE. ESCANEIE.
EM QUALQUER LUGAR." takes three lines, and four below 360px, where en and es
take two. The surplus outran what the artwork cap bought back, so pt-BR stayed
under the fold on short phones: -48px at 320x568, -42 at 360x600, -20 at
375x553 and 414x600, -2 at 360x640, -1 at 430x650.

Measured on the preview, not reasoned about: shortening the headline does NOT
fix it (still -10 at 320x568, -4 at 360x600, because it keeps wrapping to three
lines on narrow screens), and taking the space from the artwork instead would
shrink the hero for every locale on every short viewport to serve one.

So take it from the gap above the headline, and only where the problem exists.
Scoped to max-height 660px AND max-width 767px: without the width bound this
would fire on 1366x657 laptops, which already clear the fold by 64px and do not
need their spacing changed. Above those bounds nothing moves.

All eight measured viewports now pass in pt-BR, worst case +8px; en gains
slack it did not need and loses nothing elsewhere.
The fold shipped EN-first in all four catalogs, so /es-419, /es-ar and /pt-br
rendered "You already know the problem." in English inside an otherwise
localized page. Translating it was a recorded pre-merge gate, not a nice-to-have.

Written against the glossary test rather than translated loosely: es-419 stays
tuteo ("Ya conoces", "cruzas", "gastas") because voseo is banned there, es-ar
takes the voseo overrides ("conocés", "cruzás", "Ganás", "gastás") because
tú-forms are banned there, and pt-BR avoids the banned register. es-ar also
uses "plata" where es-419 says "dinero".
"WHAT'S THE $10? — A welcome reward. Complete verification + first $100 in card
spend -> $10 unlocked to your balance..." promised money that no seeded perk
backs. Removed outright rather than reworded or hedged, in all four catalogs
plus the es-AR delta.

q4 is dropped from faqKeys and the remaining keys keep their names. Renumbering
q5-q8 across four catalogs to close the gap would risk pairing a question with
another answer, for no user-visible gain, so the gap is documented in place.

NOT covered here: home.carousel.card.description still says "$10 unlocks on your
first $100 spend" on the in-app home carousel. Same unbacked claim, different
surface and different owners, so it wants its own change rather than riding a
landing-page PR.
Follow-through on 9063114, which took the same claim off /shhhhh. The home
carousel still read "Closed beta. Badges skip the line. $10 unlocks on your
first $100 spend." — the third sentence promises money no seeded perk backs,
so it goes; the first two are true and stay.

The es-AR override existed only to voseo the deleted verb ("Desbloqueá" vs
es-419's "Desbloquea"), so it is removed rather than left duplicating es-419.
The voseo title override stays.

No "$10" string remains in any app catalog.
Prod release 2026-08-20: card CTA after deposit · QR-scanner + Pix fixes · es-AR · journey v2 · 1.0.53
feat(landing): homepage rebuild — persona manifesto, card beat high, /lp/card retired
@vercel

vercel Bot commented Aug 20, 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 20, 2026 5:23pm

Request Review

@coderabbitai

coderabbitai Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d428c44f-61c6-4f58-88af-a339a16fae1a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

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

@github-actions

Copy link
Copy Markdown
Contributor

Code-analysis diff

Painscore total: 7298.77 → 7305.49 (+6.72)
Findings: -12 net (+76 new, -88 resolved)

🆕 New findings (76)

  • critical complexity — src/components/LandingPage/LandingPageClient.tsx — CC 54, MI 55.86, SLOC 216
  • high complexity — src/app/shhhhh/ShhhhhLandingPage.tsx — CC 48, MI 55.82, SLOC 313
  • high hotspot — src/components/LandingPage/hero.tsx — 36 commits, +274/-175 lines since 6 months ago
  • high hotspot — src/app/shhhhh/ShhhhhLandingPage.tsx — 33 commits, +1129/-486 lines since 6 months ago
  • medium react-long-component — src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage is 470 lines — split it
  • medium high-mdd — src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage: MDD 183.6 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/hero.tsx:116 — Hero: MDD 94.3 (uses across many lines from declarations)
  • medium high-mdd — src/components/LandingPage/LandingPageClient.tsx:50 — LandingPageClient: MDD 67.7 (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 high-dlt — src/app/shhhhh/ShhhhhLandingPage.tsx:140 — ShhhhhLandingPage: DLT 32 (calls 32 distinct functions — high context load)
  • medium high-dlt — src/components/LandingPage/LandingPageClient.tsx:50 — LandingPageClient: DLT 30 (calls 30 distinct functions — high context load)
  • medium complexity — src/components/Card/share-asset/PixelatedCardFace.tsx — CC 29, MI 58.49, SLOC 146
  • medium structural-dup — app/shhhhh/ShhhhhLandingPage.tsx:99 — 28 duplicate lines / 159 tokens with components/LandingPage/StickyMobileCTA.tsx:30
  • 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/landingStrings.ts:47 — landingStrings: MDD 24.6 (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 method-complexity — src/components/LandingPage/LandingPageClient.tsx:175 — CC 17 SLOC 39
  • medium complexity — src/components/Global/FAQs/index.tsx — CC 13, MI 62.66, SLOC 29

…and 56 more.

✅ Resolved (88)

  • src/app/shhhhh/ShhhhhLandingPage.tsx — CC 52, MI 56.57, SLOC 331
  • src/components/LandingPage/LandingPageClient.tsx — CC 48, MI 55.61, SLOC 173
  • src/components/LandingPage/hero.tsx — 33 commits, +264/-170 lines since 6 months ago
  • src/app/shhhhh/ShhhhhLandingPage.tsx — 31 commits, +1120/-466 lines since 6 months ago
  • 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:153 — ShhhhhLandingPage is 468 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:153 — ShhhhhLandingPage: MDD 182.8 (uses across many lines from declarations)
  • src/components/LandingPage/hero.tsx:116 — Hero: MDD 89.3 (uses across many lines from declarations)
  • src/components/LandingPage/LandingPageClient.tsx:48 — LandingPageClient: MDD 48.5 (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/app/shhhhh/ShhhhhLandingPage.tsx:153 — ShhhhhLandingPage: DLT 32 (calls 32 distinct functions — high context load)
  • src/components/Card/share-asset/PixelatedCardFace.tsx — CC 29, MI 58.5, SLOC 146
  • app/shhhhh/ShhhhhLandingPage.tsx:112 — 28 duplicate lines / 159 tokens with components/LandingPage/StickyMobileCTA.tsx:30
  • 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:151 — CC 17 SLOC 39
  • src/components/Global/FAQs/index.tsx — CC 12, MI 63.28, SLOC 28

…and 68 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/i18n/interpolate.ts 0.0 2.7 +2.7
src/components/LandingPage/PartnerLockup.tsx 0.0 2.3 +2.3
src/components/LandingPage/landingStrings.ts 7.4 8.9 +1.5
src/components/LandingPage/yourMoney.tsx 5.4 6.2 +0.7
src/components/LandingPage/SupportedRailsFaqAnswer.tsx 4.6 5.2 +0.7
src/components/LandingPage/RegulatedRails.tsx 7.5 8.1 +0.6
src/components/LandingPage/LandingPageContent.tsx 5.1 5.7 +0.6
src/app/lp/card/page.tsx 2.7 0.0 -2.7
src/components/LandingPage/PioneerCard3D.tsx 6.5 0.0 -6.5
src/components/LandingPage/CardPioneers.tsx 6.5 0.0 -6.5
src/app/lp/card/CardLandingPage.tsx 11.8 0.0 -11.8

@github-actions

Copy link
Copy Markdown
Contributor

🧪 UI test report — ✅ all green

Suites

  • unit: 3376 ran, 0 failed, 0 skipped, 59.6s

📊 Coverage (unit)

metric %
statements 68.3%
branches 53.4%
functions 59.3%
lines 69.2%
⏱ 10 slowest test cases
time test
4.4s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › never places two stickers in heavy overlap (broad seed sweep)
1.0s src/hooks/query/__tests__/user.test.tsx › does NOT clear a token that rotated mid-request (stale 401 racing a fresh login)
0.8s src/utils/__tests__/demo-api.test.ts › isDemoMode() is false when not running under Capacitor
0.7s src/utils/__tests__/crisp.test.ts › settles, and hands back a usable plugin, against a real-shaped plugin proxy
0.5s src/utils/__tests__/sentry.utils.test.ts › defaults to the client budget under a browser global
0.5s src/utils/__tests__/crisp.test.ts › resets the native session on logout once support has been opened
0.4s src/utils/__tests__/crisp.test.ts › configures once across repeated support opens
0.4s src/app/actions/__tests__/api-headers.test.ts › should include Content-Type in validateInviteCode
0.4s src/utils/__tests__/crisp.test.ts › retries configuration on the next open after a failure
0.3s src/components/Card/share-asset/__tests__/shareAssetLayout.test.ts › every sticker stays within canvas at any count
📍 Inline annotations are in the **Unit test report** check above. Coverage artifact: `coverage-unit`. Generated by `.github/workflows/tests.yml`.

@Hugo0
Hugo0 merged commit c242eaa into dev Aug 20, 2026
20 checks passed
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