Skip to content
Closed
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
307 commits
Select commit Hold shift + click to select a range
a4a72a2
coderabbit: block LockCardModal dismissal mid-operation, hide dead cl…
kushagrasarathe Aug 18, 2026
5c1027d
coderabbit: forward disabled to ListItem for aria-disabled, keep lega…
kushagrasarathe Aug 18, 2026
29353b0
Merge pull request #2715 from peanutprotocol/ds/12-token-foundations
kushagrasarathe Aug 18, 2026
bb3d6f7
Merge remote-tracking branch 'origin/feat/design-system' into ds/06-p…
kushagrasarathe Aug 18, 2026
2398d13
Merge pull request #2716 from peanutprotocol/ds/06-primitives
kushagrasarathe Aug 18, 2026
8db7947
Merge pull request #2717 from peanutprotocol/ds/06-loaders
kushagrasarathe Aug 18, 2026
3890af8
Merge pull request #2718 from peanutprotocol/ds/06-inputs
kushagrasarathe Aug 18, 2026
57209bf
Merge pull request #2719 from peanutprotocol/ds/06-modals
kushagrasarathe Aug 18, 2026
2dbd932
Merge pull request #2720 from peanutprotocol/ds/06-cards
kushagrasarathe Aug 18, 2026
b29714a
Merge remote-tracking branch 'origin/feat/design-system' into ds/06-p…
kushagrasarathe Aug 18, 2026
3d1bed8
Merge pull request #2723 from peanutprotocol/ds/06-primitives
kushagrasarathe Aug 18, 2026
53aeb46
ds 07: rebuild home page into src/features/home per figma board 17830…
kushagrasarathe Aug 18, 2026
4af9c72
ds 07: bordered user-icon avatar fallback for usernameless users
kushagrasarathe Aug 18, 2026
40aa790
ds 07: test the balance-visibility external store
kushagrasarathe Aug 18, 2026
6c7a924
ds 07: address CodeRabbit round 1
kushagrasarathe Aug 18, 2026
5696b29
ds 07: address /code-review findings
kushagrasarathe Aug 18, 2026
25ca7c4
ds 07: avatar fallback matches the figma avatar treatment
kushagrasarathe Aug 18, 2026
1e95576
ds 13: one AppShell, figma bottom nav, desktop sidebar removed
kushagrasarathe Aug 18, 2026
17a24a4
feat(ds): DS 19-22 — notification, link button, accordion + slider re…
kushagrasarathe Aug 18, 2026
d4a032e
ds 09: receipts rebuilt on the list-row recipe + semantic tokens
kushagrasarathe Aug 18, 2026
0fa28da
fix(ds): use next/link for the inline-link demo (eslint no-html-link-…
kushagrasarathe Aug 18, 2026
5d0a5e9
fix(ds): CodeRabbit r1 — thumb aria-label, CTA wrap, decorative flag …
kushagrasarathe Aug 18, 2026
fc7b538
fix(ds): code-review r1 — twMerge font-size strip, dead slider focus …
kushagrasarathe Aug 18, 2026
90015d2
ds 13: semantic bg-background-page in the shell (legacy bg-background)
kushagrasarathe Aug 18, 2026
1ccf8c1
ds 09: address CodeRabbit — keyboard semantics on ReceiptRow, keep to…
kushagrasarathe Aug 18, 2026
89a60ed
ci: make the eslint job blocking now that errors are at zero (TASK-21…
jjramirezn Aug 18, 2026
a19f8e7
ci: list eslint in the ci-success failure diagnostics
jjramirezn Aug 18, 2026
6071dd0
ci: update stale comment — eslint job is blocking now (CodeRabbit)
jjramirezn Aug 18, 2026
428b893
Merge pull request #2742 from peanutprotocol/ds/10-eslint-zero
jjramirezn Aug 18, 2026
f2ed06b
ci: run the ds-lint debt ratchet on every PR (TASK-21450)
jjramirezn Aug 18, 2026
5b1882c
ci: ban useSearchParams + hand-built query-string pushes (DS 10 ratch…
jjramirezn Aug 18, 2026
1378824
ci: don't persist checkout credentials in the ds-lint job (CodeRabbit)
jjramirezn Aug 18, 2026
d8c6bbb
refactor: route all peanut-api calls through apiFetch (TASK-21450)
jjramirezn Aug 18, 2026
f38a2a5
ci: plain checkout for ds-lint — no submodules, no token (code review)
jjramirezn Aug 18, 2026
6a4ffda
chore(lint): scope PublicProfile's exemption to its two justified sel…
jjramirezn Aug 18, 2026
f3eb227
fix: demo-aware card auth headers + harden the apiFetch gate (CodeRab…
jjramirezn Aug 18, 2026
581f7c8
fix: demo-route correctness after apiFetch migration + widen the gate…
jjramirezn Aug 18, 2026
226b20f
fix: demo-api edge behavior + whitespace-tolerant gate matcher (TASK-…
jjramirezn Aug 18, 2026
89e28f4
Merge pull request #2744 from peanutprotocol/ds/10-counts-ratchet
jjramirezn Aug 18, 2026
836474c
Merge pull request #2745 from peanutprotocol/ds/10-nuqs-rule
jjramirezn Aug 18, 2026
e98a78c
Merge pull request #2746 from peanutprotocol/ds/10-apifetch-migration
jjramirezn Aug 18, 2026
1c14258
ds 09: receipt views redone to the TX Details board composition
kushagrasarathe Aug 19, 2026
b6c2c2f
ds 09: keyboard semantics on the clickable receipt-head avatar (CodeR…
kushagrasarathe Aug 19, 2026
7dc39c1
ds 14: activity surfaces — states board rules, list restyle, ?tx= dra…
kushagrasarathe Aug 19, 2026
7aec3d0
ds 14: drop orphaned test mock var (lint)
kushagrasarathe Aug 19, 2026
7d7bdea
ds 14: address code-review — failed-refund strike carve-out, shared s…
kushagrasarathe Aug 19, 2026
e7d86c8
ds 14: write the drawer-mount ref in an effect, not during render (Co…
kushagrasarathe Aug 19, 2026
e79d7d0
Merge pull request #2727 from peanutprotocol/ds/07-home-rebuild
kushagrasarathe Aug 19, 2026
92ce286
Merge pull request #2748 from peanutprotocol/ds/14-activity-surfaces
kushagrasarathe Aug 19, 2026
8f5b75e
Merge pull request #2733 from peanutprotocol/ds/19-remaining-components
kushagrasarathe Aug 19, 2026
1b71ed7
Merge origin/dev into feat/design-system
kushagrasarathe Aug 19, 2026
5dc0240
chore: regen ds tokens after safe-area spacing tokens landed in @theme
kushagrasarathe Aug 19, 2026
9c35e30
fix: post-merge alignment — one fetch path, capacitor mocks, prettier
kushagrasarathe Aug 19, 2026
6587178
fix: eslint merge intersections — catalog aria-label, allowlist dev's…
kushagrasarathe Aug 19, 2026
06976e0
fix: /code-review findings on the merge resolution
kushagrasarathe Aug 19, 2026
3d611a3
Merge pull request #2751 from peanutprotocol/merge/dev-into-design-sy…
Hugo0 Aug 19, 2026
9dafa4d
ds apply: add-money + add/withdraw shared views on semantic tokens
kushagrasarathe Aug 20, 2026
94894e8
ds apply: withdraw, profile, settings, notifications on semantic tokens
kushagrasarathe Aug 20, 2026
e62ef65
ds apply: rewards, invites, points, card surfaces on semantic tokens
kushagrasarathe Aug 20, 2026
516a6a4
ds apply: limits, claim, request, qr-claim, recover-funds on semantic…
kushagrasarathe Aug 20, 2026
8cefc63
ds apply: shared flow components on semantic tokens
kushagrasarathe Aug 20, 2026
3213d9e
ds apply: setup views class-level token pass
kushagrasarathe Aug 20, 2026
9e1ae04
ds apply: last stock-palette stragglers in qr claim + semantic reques…
kushagrasarathe Aug 20, 2026
11c0e9a
ds ratchet: lower the lint baseline to the post-apply counts
kushagrasarathe Aug 20, 2026
b96393a
ds apply: keep AmountInput digits on the repo's 3rem text-6xl
kushagrasarathe Aug 20, 2026
a6204a3
ds ratchet: baseline includes the deliberate text-6xl keep in AmountI…
kushagrasarathe Aug 20, 2026
7dcc562
ds apply: review fixes — keep DS text tokens out of twMerge
kushagrasarathe Aug 20, 2026
b54f12d
ds apply: drop twMerge imports orphaned by the review fixes
kushagrasarathe Aug 20, 2026
e251d40
ds apply: settings page shell, recover-funds blank fix, ExchangeRateW…
kushagrasarathe Aug 20, 2026
e866228
ds apply: settings root needs w-full — AppShell inner centers flex items
kushagrasarathe Aug 20, 2026
b356819
ds decisions: ErrorAlert -> Notification (38 files, component deleted…
kushagrasarathe Aug 20, 2026
c8799e1
ds decisions: InfoCard -> Notification (component deleted)
kushagrasarathe Aug 20, 2026
c8c1c5e
ds decisions: one SlideToConfirm (board 17785:11764, both old impls d…
kushagrasarathe Aug 20, 2026
df3e57f
ds decisions: marquee banners out of the app shell — maintenance/conn…
kushagrasarathe Aug 20, 2026
93e3a03
ds decisions: PaymentInfoRow kept as the label/value/copy wrapper, to…
kushagrasarathe Aug 20, 2026
61bfacd
ds decisions: ActionListCard deleted - consumers render ListItem dire…
kushagrasarathe Aug 20, 2026
c4118c2
ds decisions: standalone app links render LinkButton
kushagrasarathe Aug 20, 2026
ebe5285
ds decisions: orphan sweep — beta banner i18n keys removed, SearchInp…
kushagrasarathe Aug 20, 2026
161c344
ds fix: /dev/ds/patterns/amount-input crashed (react 130) - only patt…
kushagrasarathe Aug 20, 2026
c993030
setup: invite step - Next becomes the full-width primary cta under th…
kushagrasarathe Aug 20, 2026
c299364
dev: /dev/devices viewport harness, reachable on preview builds
kushagrasarathe Aug 21, 2026
dda130b
qa: delete dead RouteExpiryTimer, one ProgressBar primitive (0_Bruddl…
kushagrasarathe Aug 21, 2026
78439bd
qa: SegmentedControl primitive, board pressed states, sliding bottom-…
kushagrasarathe Aug 21, 2026
45301c8
qa: filled-icon knockout fix, icon-size sweep, pill logout buttons, b…
kushagrasarathe Aug 21, 2026
b314776
qa: per-page maintenance banner targeting, badge/kyc drawer heads on …
kushagrasarathe Aug 21, 2026
aac0709
home IA: add/send bottom drawers + destination page alignment (figma …
kushagrasarathe Aug 21, 2026
827b69e
qa: spacing sweep to board 17291:2772 anatomy
kushagrasarathe Aug 21, 2026
6a7bf69
Merge remote-tracking branch 'origin/ds/apply-remaining-pages' into d…
kushagrasarathe Aug 21, 2026
4b3fb2b
lint: Mercado Pago brand title via const (copy-props-from-catalog wan…
kushagrasarathe Aug 21, 2026
ad7e134
review: coderabbit round 1
kushagrasarathe Aug 21, 2026
8848583
review: /code-review round — geo-race gate, claim-flow isolation, dra…
kushagrasarathe Aug 21, 2026
7d66de0
review: single navigation on the send-link cta (coderabbit out-of-dif…
kushagrasarathe Aug 21, 2026
3222e62
fix: submenu pressed state uses action-primary (button board 17308:13…
kushagrasarathe Aug 21, 2026
2625444
qa: home top-left avatar one size down (48 -> 32) per Vlad follow-up;…
kushagrasarathe Aug 21, 2026
a448b65
Merge pull request #2758 from peanutprotocol/ds/apply-remaining-pages
kushagrasarathe Aug 21, 2026
3694056
Merge pull request #2780 from peanutprotocol/ds/home-ia-add-send
kushagrasarathe Aug 21, 2026
a67c04a
Merge origin/dev into feat/design-system
kushagrasarathe Aug 21, 2026
6869205
prettier: DS-branch tailwind class order on merged dev files
kushagrasarathe Aug 21, 2026
deecb3b
ds-lint: rebase baseline after dev back-merge
kushagrasarathe Aug 21, 2026
d8f14a5
home IA: add drawer is bank transfer + crypto only (product ruling)
kushagrasarathe Aug 21, 2026
abc5bd4
bottom nav: drag the active pill along the bar to switch tabs
kushagrasarathe Aug 21, 2026
b256dae
Merge remote-tracking branch 'origin/feat/design-system' into merge/d…
kushagrasarathe Aug 21, 2026
f336997
Merge pull request #2781 from peanutprotocol/merge/dev-into-design-sy…
kushagrasarathe Aug 21, 2026
97da923
fix: block account deletion while the wallet still holds funds
innolope-dev Aug 22, 2026
b3958ed
test: cover the balance refusal in the requestDeletion service test
innolope-dev Aug 22, 2026
41407fc
refactor: drive the delete modal from one descriptor per step
innolope-dev Aug 22, 2026
96b3178
fix(ds-qa): notification list layout, profile-edit form rhythm, icon …
kushagrasarathe Aug 24, 2026
8976309
fix(ds-qa): bank-form labels, language flags, unified profile chips, …
kushagrasarathe Aug 24, 2026
caf8b88
fix(ds-qa): bottom-nav slide starts from rest; exchange-rate contrast…
kushagrasarathe Aug 24, 2026
7e9188f
fix(ds-qa): Notification items actually renders
kushagrasarathe Aug 24, 2026
d15b66b
fix(ds-qa): Save sticks to the viewport; region locales get the globe
kushagrasarathe Aug 24, 2026
5213f4b
chore(ds-qa): drop Icon imports orphaned by the Notification items mi…
kushagrasarathe Aug 24, 2026
c4746e4
fix(ds-qa): restore accessible names, stop empty banners, keep /shhhh…
kushagrasarathe Aug 24, 2026
c1c6af4
fix(ds-qa): don't wipe typed input on auth hydration; items=[] suppre…
kushagrasarathe Aug 24, 2026
a28f658
fix(ds-qa): checklist notifications drop the (i) and go back to prod …
kushagrasarathe Aug 24, 2026
37cef2c
fix(ds-qa): the nav pill knows where it is going before it starts
kushagrasarathe Aug 24, 2026
405836a
fix(ds-qa): swap the send drawer person icons
kushagrasarathe Aug 24, 2026
1c561f2
fix(ds-qa): the es-419 row flies the Spain flag
kushagrasarathe Aug 24, 2026
cc96b4a
fix(ds-qa): profile Save goes back inline, under the last field
kushagrasarathe Aug 24, 2026
04978e0
fix(ds-qa): the /shhhhh back button overlays the pink fold
kushagrasarathe Aug 24, 2026
f3834f9
fix(ds-qa): the profile row is called "Regions and verification"
kushagrasarathe Aug 24, 2026
8037d6f
docs(ds-qa): the nav block comment stops claiming a repro it never had
kushagrasarathe Aug 24, 2026
20a34fa
fix(ds-qa): the profile dirty check compares against what the form lo…
kushagrasarathe Aug 24, 2026
355932e
fix(ds): twMerge was deleting the DS type tokens it did not recognise
kushagrasarathe Aug 24, 2026
9278729
fix(send): stop over-promising account-less claims and surface the $5…
innolope-dev Aug 25, 2026
0574c9b
review: say crypto wallet, not wallet, in the link-card claim caveat
innolope-dev Aug 25, 2026
fad1c17
fix(ds): anatomy divergences the class list could not show
kushagrasarathe Aug 25, 2026
97b40c0
fix(ds): NavHeader title reads Heading/S from the token, not by coinc…
kushagrasarathe Aug 25, 2026
173979f
fix(ds): Avatar initials take their type from the board, not from stock
kushagrasarathe Aug 25, 2026
60ed3a9
fix(ds): a bare font-weight class cannot lose to a caller's type token
kushagrasarathe Aug 25, 2026
c5c2644
fix(ds): DrawerTitle stopped overriding the heading its callers ask for
kushagrasarathe Aug 25, 2026
cb9aefb
chore: drop the scratch anatomy spec notes that should never have bee…
kushagrasarathe Aug 25, 2026
1adb59b
Merge pull request #2799 from peanutprotocol/ds/qa-round-3-fixes
kushagrasarathe Aug 25, 2026
039f320
fix(tw): camelCase type tokens and extraBlack weight escaped the twMe…
kushagrasarathe Aug 25, 2026
3b70b31
fix(ds): safe-area vars, 44px touch targets, localized dismiss label
kushagrasarathe Aug 25, 2026
c968e73
Merge origin/dev into feat/design-system (release PR #2813 conflict r…
kushagrasarathe Aug 25, 2026
a9cf038
fix(ds): ListItem disabled tokens, NavHeader title overrides, carouse…
kushagrasarathe Aug 25, 2026
62f5592
fix(tw): register the remaining custom-token families in twMerge
kushagrasarathe Aug 25, 2026
7ae1380
fix(ds): NavHeader long titles stop colliding with the side buttons
kushagrasarathe Aug 25, 2026
eb2cc7f
fix(ds): recover-funds shows the ds empty state when nothing is recov…
kushagrasarathe Aug 25, 2026
9519e6c
fix(ds): bottom-nav strip goes transparent — pill and qr button float
kushagrasarathe Aug 25, 2026
48cf4d4
ds 04: regenerate the audit inventory against today's branch
kushagrasarathe Aug 25, 2026
c495665
ds(phase-2): add the missing composition recipes — PageStack, Section…
kushagrasarathe Aug 25, 2026
bb46926
ds(phase-2): tier-2 legacy color-class sweep — semantic tokens in, de…
kushagrasarathe Aug 25, 2026
851b8d3
ds(phase-2): ratchet the phase-2 finish lines — legacyColorClasses + …
kushagrasarathe Aug 25, 2026
2ebbc84
ds(phase-2): tier-3 batch 1 — card triple, settings, backup, qr succe…
kushagrasarathe Aug 25, 2026
d3ea438
ds(phase-2): tier-3 batch 2 — page shells and list positions compose …
kushagrasarathe Aug 25, 2026
943226c
ds(phase-2): comment hygiene on the migrated pages — narration out, c…
kushagrasarathe Aug 25, 2026
4d9b5f3
ds(phase-2): tier-3 batch 3 — centered-content blocks compose PageSta…
kushagrasarathe Aug 25, 2026
6010426
ds(phase-2): legacy metric excludes the shadow-primary/secondary offs…
kushagrasarathe Aug 25, 2026
b6d38f0
ds(phase-2): smell pass — CardEligibilityCheckScreen adopts PageStack…
kushagrasarathe Aug 25, 2026
e309987
ds(phase-2): /code-review fixes — alert-modal icon bubbles, ratchet h…
kushagrasarathe Aug 25, 2026
d6bf44a
ds(phase-2): legacy kill complete — figma primitive ramp in, colors +…
kushagrasarathe Aug 25, 2026
f859685
ds(phase-2): second /code-review round — repair the sweep's collatera…
kushagrasarathe Aug 25, 2026
37faf6f
ds(phase-2): the last app-surface stock-text stragglers move to the t…
kushagrasarathe Aug 25, 2026
24f8c58
review: drop bank from the no-account promise, and single-source the …
innolope-dev Aug 25, 2026
843df91
Merge pull request #2818 from peanutprotocol/ds/phase-2-styling-cleanup
kushagrasarathe Aug 25, 2026
2dcdb2d
Merge remote-tracking branch 'origin/feat/design-system' into ds/04-a…
kushagrasarathe Aug 25, 2026
a9a56b3
ds 04: carry the audit counts across the phase-2 base
kushagrasarathe Aug 25, 2026
00081d4
fix(ds): settings pinned footer, invites empty states, limits retry t…
kushagrasarathe Aug 25, 2026
537c2a4
chore: delete the /notifications page
kushagrasarathe Aug 25, 2026
09d46d5
fix(ds): restore desktop headers, stop history-wide re-renders, recei…
kushagrasarathe Aug 25, 2026
8af1978
Merge pull request #2814 from peanutprotocol/ds/04-audit-data-refresh
kushagrasarathe Aug 25, 2026
7fcbea9
audit-data: drop deleted notifications page path from ad-hoc text-lin…
kushagrasarathe Aug 25, 2026
bc084ae
chore: delete the orphaned /settings root page
kushagrasarathe Aug 25, 2026
b89d4b6
dev: named app states behind ?__fixture=, so any screen renders with …
kushagrasarathe Aug 25, 2026
befe67b
qa: capture every fixture at four phone widths, and diff two captures
kushagrasarathe Aug 25, 2026
128f6ba
dev: fixtures now show what they claim, or they are gone
kushagrasarathe Aug 25, 2026
1375a9c
ci: drop the e2e job that tested nothing, add an advisory visual diff
kushagrasarathe Aug 25, 2026
f29dd40
qa: keep the four specs that assert something, delete the 14 that did…
kushagrasarathe Aug 25, 2026
86fdf20
dev: drop the three fixtures whose routes the design system deleted
kushagrasarathe Aug 26, 2026
1d245c8
proxy: /dev tooling answers 404 on peanut.me, not 200
kushagrasarathe Aug 25, 2026
921bbbd
layout: a backend outage keeps the error screen, instead of sending u…
kushagrasarathe Aug 25, 2026
63488ba
rewards: a failed points fetch shows an error, instead of a spinner f…
kushagrasarathe Aug 26, 2026
8d8e438
bottom nav: links not draggable so native link-drag doesn't fight the…
kushagrasarathe Aug 26, 2026
d7839a7
Merge branch 'feat/design-system' of https://github.com/peanutprotoco…
kushagrasarathe Aug 26, 2026
c4d0313
setup: skip button reads foreground-over-color-secondary (sits on col…
kushagrasarathe Aug 26, 2026
4a8f150
Merge remote-tracking branch 'origin/dev' into ds-final-2813
kushagrasarathe Aug 26, 2026
3336068
Merge origin/dev into feat/design-system (status page)
kushagrasarathe Aug 26, 2026
b70943f
qa: apply review — guard the real session cookie, run the kept specs …
kushagrasarathe Aug 26, 2026
213588f
fix: close the native gate gap on src/app/dev, apply the rest of review
kushagrasarathe Aug 26, 2026
b0657f2
ci: resolve release versions as <major>.<build>.<ota> instead of typi…
innolope-dev Aug 26, 2026
2487dce
ci: hold one mutex across a production release
innolope-dev Aug 26, 2026
0566de6
fix(kyc): launch Manteca RFIs via start-action instead of the generic…
innolope-dev Aug 22, 2026
2ace3fc
fix(kyc): pass nextActions to deriveProviderRejection so legacy respo…
innolope-dev Aug 22, 2026
7a087cd
fix(kyc): refresh an RFI token through start-action, not POST /users/…
innolope-dev Aug 24, 2026
46e0a2f
review(coderabbit): shallow-clone detection, idempotent uploads, doc …
innolope-dev Aug 26, 2026
d96b6d2
feat(native): make the deferred-link match rate measurable
innolope-dev Jul 29, 2026
c400222
perf(capgo): stop logging transient update failures at error level
innolope-dev Aug 18, 2026
1b6326a
review: reattach the one-shot restore doc to its function
innolope-dev Aug 26, 2026
4e3c927
review: escalate persistent OTA failures after 3 consecutive launches
innolope-dev Aug 26, 2026
edd3aef
Merge pull request #2812 from peanutprotocol/fix/task-21724-send-copy…
innolope-dev Aug 26, 2026
e4867a0
feat(native): count hand-off creation at the store bounce, giving the…
innolope-dev Aug 26, 2026
1c9f298
fix(native): route every link entry and exit through a path the app c…
innolope-dev Aug 26, 2026
86043c6
chore(types): drop the deleted /manteca/initiate-onboarding route fro…
innolope-dev Aug 26, 2026
d41834e
ci: stop re-judging authorship of commits already merged to main/dev
innolope-dev Aug 26, 2026
34fb99e
review: close-then-navigate with a bounded wait, RootRedirect dedupe,…
innolope-dev Aug 26, 2026
404bc6a
Merge remote-tracking branch 'origin/feat/design-system' into qa/visu…
kushagrasarathe Aug 27, 2026
a417f70
fix(slide-to-confirm): money control commits only at 100%, resets aft…
kushagrasarathe Aug 27, 2026
64bd8db
qa: apply jjramirezn's review — make ds-shots reachable from the DS t…
kushagrasarathe Aug 27, 2026
70239db
fix(ds): restore styling the token sweep silently deleted
kushagrasarathe Aug 27, 2026
998a9a5
fix(input): component-owned states per the input board — black rest b…
kushagrasarathe Aug 27, 2026
09e6da5
fix(ds): figma-1:1 pass on board components — radii, modal close, gly…
kushagrasarathe Aug 27, 2026
b483e5d
fix(ds): token graveyard cleared + the machinery that keeps it clear
kushagrasarathe Aug 27, 2026
5efe010
qa: unbreak the first real CI run — ratchet allowlist, spec resilienc…
kushagrasarathe Aug 27, 2026
8e7c090
fix(ds): consistency round — one network list, home drawer parity, AP…
kushagrasarathe Aug 27, 2026
eaf18c5
test(ds): the checks that guard behavior instead of green paint
kushagrasarathe Aug 27, 2026
50788f0
qa: CI 404s every /dev page — set NEXT_PUBLIC_BASE_URL on the build
kushagrasarathe Aug 27, 2026
a1061fd
Merge remote-tracking branch 'origin/feat/design-system' into qa/visu…
kushagrasarathe Aug 27, 2026
433d450
qa: adopt the DS showcase sweep into the regression net
kushagrasarathe Aug 27, 2026
93d21c1
dev/ds: root section counts derive from nav-config — the third hand l…
kushagrasarathe Aug 27, 2026
140e4e2
Merge origin/dev into feat/design-system
kushagrasarathe Aug 27, 2026
db90efd
feat(ds): inline field errors per the form-field board (ruling 19)
kushagrasarathe Aug 27, 2026
8e85811
fix(ds): restore the AmountInput bordered container (ruling 20)
kushagrasarathe Aug 27, 2026
57f007d
feat(ds): bottom nav full-width gutter + backdrop-blur experiment (ru…
kushagrasarathe Aug 27, 2026
60a6bee
feat(ds): full DS conformance for /dev/ds chrome (ruling 16)
kushagrasarathe Aug 27, 2026
4577563
refactor(ds): F-12 inline-style taxonomy — 167 -> 50 sites
kushagrasarathe Aug 27, 2026
9bbcd8d
dev/ds: FieldError showcase page + nav entry — the new component foll…
kushagrasarathe Aug 27, 2026
98aa55d
dev/ds: FieldError nav entry — the previous commit's config edit sile…
kushagrasarathe Aug 27, 2026
93abcbf
feat(ds): bottom nav 'content dissolves' — transparent bar, scroll co…
kushagrasarathe Aug 27, 2026
074d493
Merge pull request #2839 from peanutprotocol/ci/human-authors-landed-…
Hugo0 Aug 27, 2026
699f54a
Revert "feat(ds): bottom nav 'content dissolves' — transparent bar, s…
kushagrasarathe Aug 27, 2026
8f6f322
feat(ds): bottom nav — solid bar with soft elevation shadow (replaces…
kushagrasarathe Aug 27, 2026
e7ea9bb
feat(ds): bottom nav sits on a background-page fade — content dissolv…
kushagrasarathe Aug 27, 2026
d862e0c
fix(native): stamp the launch url before the already-navigated check
innolope-dev Aug 27, 2026
2790915
fix(ds): receipts word the direction; open requests drop the pending …
kushagrasarathe Aug 27, 2026
84d851c
fix(ds): drop Mercado Pago from the send-to-friends method list
kushagrasarathe Aug 27, 2026
06d5eaa
Merge pull request #2838 from peanutprotocol/fix/native-links-routing
innolope-dev Aug 27, 2026
bea76dc
feat(ds): bottom nav — back to the soft elevation shadow, gradient dr…
kushagrasarathe Aug 27, 2026
d23f878
fix(ds): receipt titles match the TX Details board copy — 'Paid to' i…
kushagrasarathe Aug 27, 2026
4af4da4
refactor(ds): /dev/ds chrome dogfoods the DS components it documents
kushagrasarathe Aug 27, 2026
9393040
fix(fx): stop the add-money and withdraw screens freezing on a rate f…
innolope-dev Aug 27, 2026
630a3a6
fix(i18n): regenerate the marketing catalogs for the moved rateUnavai…
innolope-dev Aug 27, 2026
49b50a2
fix(ds): ContributorsDrawer link zeroes both press translates — the h…
kushagrasarathe Aug 27, 2026
233fbd5
fix(fx): keep the rate retry reachable in every blocked state
innolope-dev Aug 27, 2026
8185b9d
perf(ds): build-time gate strips /dev/ds/audit data from prod bundles
kushagrasarathe Aug 27, 2026
ed261ba
fix(ds): badge-unlock drawer drops 32px of extra head padding
kushagrasarathe Aug 27, 2026
779b598
Merge pull request #2831 from peanutprotocol/feat/deferred-link-telem…
innolope-dev Aug 27, 2026
5c04c5e
Merge pull request #2825 from peanutprotocol/ci/version-scheme
innolope-dev Aug 27, 2026
9177c38
Merge pull request #2794 from peanutprotocol/fix/block-delete-with-ba…
innolope-dev Aug 27, 2026
6659763
Merge pull request #2843 from peanutprotocol/fix/fx-rate-failure-free…
innolope-dev Aug 27, 2026
6902e35
Merge pull request #2832 from peanutprotocol/perf/capgo-transient-log…
innolope-dev Aug 27, 2026
cefb535
Merge pull request #2827 from peanutprotocol/fix/kyc-additional-docs-…
innolope-dev Aug 27, 2026
c69a707
Merge origin/dev into feat/design-system (FX rate-freeze, KYC docs lo…
kushagrasarathe Aug 27, 2026
86cc458
Merge pull request #2819 from peanutprotocol/qa/visual-shots
kushagrasarathe Aug 27, 2026
3559638
Merge pull request #2820 from peanutprotocol/qa/prod-bugs
kushagrasarathe Aug 27, 2026
a1ec394
fix(ds): receipt titles survive raw-address counterparties; self-desc…
kushagrasarathe Aug 27, 2026
96996b3
Merge remote-tracking branch 'origin/feat/design-system' into demo/ds…
kushagrasarathe Aug 27, 2026
0937f67
style(address-book): migrate saved-addresses view to the design system
kushagrasarathe Aug 27, 2026
390c45f
dev(fixtures): withdraw-address-book fixture — one saved address per …
kushagrasarathe Aug 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
50 changes: 39 additions & 11 deletions .github/workflows/android-release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,22 @@ name: Android Release (Play)
# Plus the production NEXT_PUBLIC_* the static export bakes in (see the env step).

on:
workflow_call:
inputs:
versionName:
description: 'Resolved <major>.<build>.0 version to ship'
required: true
type: string
track:
description: 'Play track'
required: false
default: 'internal'
type: string
pushDebug:
description: 'Enable OneSignal verbose logging in this build'
required: false
default: false
type: boolean
push:
tags: ['v*']
workflow_dispatch:
Expand All @@ -29,7 +45,7 @@ on:
type: choice
options: [internal, alpha, beta, production]
versionName:
description: 'versionName override (optional; defaults to package.json)'
description: 'Break-glass <major>.<build>.0 version (required; there is no package.json fallback)'
required: false
type: string
pushDebug:
Expand All @@ -42,7 +58,16 @@ permissions:
contents: read

concurrency:
group: android-release-${{ github.ref }}
# A break-glass `v*` tag push runs outside release-native.yml's mutex, so it joins
# `production-release` here (which serialises iOS and Android for that path only —
# the price of not racing a concurrent OTA). When release-native.yml calls this
# workflow the parent already holds the mutex, and github.event_name is the
# caller's `workflow_dispatch`, so the called run keeps its own group instead of
# deadlocking against its parent. A direct dispatch of this workflow is
# indistinguishable from that, so it sits outside the mutex — deepest break-glass.
group: >-
${{ github.event_name == 'push' && 'production-release'
|| format('android-release-{0}', github.ref) }}
cancel-in-progress: false

jobs:
Expand Down Expand Up @@ -109,27 +134,30 @@ jobs:
NEXT_PUBLIC_SAFARI_WEB_ID=${{ vars.NEXT_PUBLIC_SAFARI_WEB_ID }}
NEXT_PUBLIC_ONESIGNAL_WEBHOOK=${{ vars.NEXT_PUBLIC_ONESIGNAL_WEBHOOK }}
EOF
if [ "${{ github.event.inputs.pushDebug }}" = "true" ]; then
if [ "${{ inputs.pushDebug }}" = "true" ]; then
echo "NEXT_PUBLIC_ONESIGNAL_DEBUG=true" >> .env.production.local
fi

- name: Resolve release versionName
id: version
env:
INPUT_VERSION: ${{ github.event.inputs.versionName || '' }}
INPUT_VERSION: ${{ inputs.versionName || '' }}
run: |
# versionName: manual dispatch input wins; else the tag name minus
# its leading 'v' (v1.0.10 -> 1.0.10); else package.json (the same
# fallback build.gradle uses). Resolved once, up front, so the OTA
# floor check and the bundle publish below see the exact version
# the binary ships with. Keep in lockstep with ios-release.yml.
# release-native.yml resolves the version and passes it here, so the
# input wins; a break-glass tag push falls back to the tag name minus
# its leading 'v' (v1.1.0 -> 1.1.0). Either way it is validated against
# the release scheme before the build starts. Resolved once, up front,
# so the OTA floor check and the bundle publish below see the exact
# version the binary ships with. Keep in lockstep with ios-release.yml.
VERSION_NAME="$INPUT_VERSION"
if [ -z "$VERSION_NAME" ] && [ "$GITHUB_REF_TYPE" = "tag" ]; then
VERSION_NAME="${GITHUB_REF_NAME#v}"
fi
if [ -z "$VERSION_NAME" ]; then
VERSION_NAME="$(node -p "require('./package.json').version")"
echo "::error::no versionName — call this from release-native.yml, or push a vX.Y.0 tag" >&2
exit 1
fi
node scripts/release-version.mjs validate "$VERSION_NAME" --kind native
echo "name=$VERSION_NAME" >> "$GITHUB_OUTPUT"
echo "Release versionName: $VERSION_NAME"

Expand Down Expand Up @@ -180,7 +208,7 @@ jobs:
serviceAccountJsonPlainText: ${{ secrets.PLAY_SERVICE_ACCOUNT_JSON }}
packageName: me.peanut.wallet
releaseFiles: android/app/build/outputs/bundle/release/app-release.aab
tracks: ${{ github.event.inputs.track || 'internal' }}
tracks: ${{ inputs.track || 'internal' }}
status: completed
# Staged production rollout: set status: inProgress + userFraction: 0.1,
# then promote in Play Console once crash/error rates look clean.
Expand Down
118 changes: 68 additions & 50 deletions .github/workflows/capgo-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,38 @@ name: Deploy OTA Update (Capgo)

on:
# Production OTA reaches every shipped iOS and Android install, so it is opt-in
# per release and never a side effect of pushing code: it fires on an `ota-*`
# tag and nothing else. Pushing to mobile-release builds and lands code; tagging
# is the separate, deliberate act that says "ship this JS to everyone", and the
# tag is a permanent record of exactly which commit went out.
# per release and never a side effect of pushing code. Normally this workflow is
# called by release-ota.yml, which resolves the bundle version and tags the
# commit afterwards; `dev` still auto-ships to staging, which reaches no
# production device.
#
# One deliberate exception to "tags only": a NATIVE release whose versionName
# is ahead of the newest production bundle auto-publishes a matching bundle
# from its own commit (see android-release.yml / ios-release.yml). Without
# that, Capgo's disable_auto_update_under_native rule makes every device on
# the new binary refuse all existing bundles — OTA silently dead for the
# fleet while CI stays green (TASK-21793).
# One deliberate exception: a NATIVE release whose versionName is ahead of the
# newest production bundle auto-publishes a matching bundle from its own commit
# (see android-release.yml / ios-release.yml). Without that, Capgo's
# disable_auto_update_under_native rule makes every device on the new binary
# refuse all existing bundles — OTA silently dead for the fleet while CI stays
# green (TASK-21793).
#
# git tag ota-1.0.48 && git push origin ota-1.0.48
# An `ota-*` tag push stays as a break-glass path, naming its own bundle
# (ota-1.1.4 -> 1.1.4) and validated against the release scheme. Deliberately
# NOT `v*`: ios-release.yml and android-release.yml claim that prefix for native
# store builds, and a JS-only OTA must not be able to trigger those.
#
# The bundle version is taken from the tag (ota-1.0.48 -> 1.0.48), so each
# shipped bundle is named by the tag that shipped it and two OTAs can never
# collide on one version. `ota-1.0.48-hotfix1` is a valid follow-up on the same
# native build.
#
# Deliberately NOT `v*`: ios-release.yml and android-release.yml already claim
# that prefix for native store builds, and a JS-only OTA must not be able to
# trigger those or vice versa.
#
# `dev` still auto-ships to staging, which reaches no production device.
#
# NOTE: the tag is currently the only approval step. The job declares the
# Production environment below, but that environment has no protection rules
# (verified 2026-08-06 via `gh api repos/:owner/:repo/environments`), so it
# gates nothing yet — adding required reviewers there makes the tag push queue
# for a second human, with no change to this file.
# NOTE: running the workflow is currently the only approval step. The job
# declares the Production environment below, but that environment has no
# protection rules (verified 2026-08-06 via `gh api repos/:owner/:repo/environments`),
# so it gates nothing yet — adding required reviewers there makes a production
# deploy queue for a second human, with no change to this file.
workflow_call:
inputs:
channel:
description: 'Capgo channel to deploy to'
required: true
type: string
version:
description: 'Resolved bundle version to upload'
required: true
type: string
push:
branches: [dev]
tags: ['ota-*']
Expand All @@ -51,8 +53,17 @@ permissions:
contents: read

concurrency:
group: capgo-deploy-${{ github.ref }}
cancel-in-progress: true
# Two separate hazards, one expression. A routine merge to dev must never cancel a
# production write mid-flight, so the channel is part of the group and production
# never cancels. And a break-glass `ota-*` tag push runs outside release-ota.yml's
# mutex, so it joins `production-release` here — while a CALLED run must not, since
# release-ota.yml is already holding that mutex and would deadlock against its own
# child (github.event_name is the caller's `workflow_dispatch`, not `push`).
group: >-
${{ (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/ota-'))
&& 'production-release'
|| format('capgo-deploy-{0}-{1}', inputs.channel || 'staging', github.ref) }}
cancel-in-progress: ${{ inputs.channel != 'production' && !startsWith(github.ref, 'refs/tags/ota-') }}

jobs:
deploy:
Expand All @@ -68,7 +79,7 @@ jobs:
# Keep the two in sync — every branch that resolves to `production` needs to
# appear here, or its deploy would reach all users with no approval.
environment: >-
${{ ((github.event_name == 'workflow_dispatch' && github.event.inputs.channel == 'production')
${{ (inputs.channel == 'production'
|| startsWith(github.ref, 'refs/tags/ota-')) && 'Production' || '' }}
steps:
- uses: actions/checkout@v7
Expand Down Expand Up @@ -102,8 +113,8 @@ jobs:
# Keep in lockstep with the `environment:` expression above — a ref
# that resolves to production here but is missing there would ship to
# every device with nobody approving it.
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
echo "name=${{ github.event.inputs.channel }}" >> $GITHUB_OUTPUT
if [ -n "${{ inputs.channel }}" ]; then
echo "name=${{ inputs.channel }}" >> $GITHUB_OUTPUT
elif [ "$GITHUB_REF_TYPE" = "tag" ] && case "$GITHUB_REF_NAME" in ota-*) true;; *) false;; esac; then
echo "name=production" >> $GITHUB_OUTPUT
else
Expand All @@ -114,28 +125,35 @@ jobs:
id: version
env:
CHANNEL: ${{ steps.channel.outputs.name }}
INPUT_VERSION: ${{ inputs.version || '' }}
run: |
# Capgo defaults the bundle version to package.json's, which only
# moves on a native release, so a lane shipping on every merge
# collides the moment two merges share a version ("Version x already
# exists"). That silently killed dev -> staging: dev sat on 1.0.8 and
# every deploy after the first failed, which looks identical to no
# deploy at all.
#
# Production takes its version from the ota-* tag, so the bundle is
# named by the tag that shipped it and re-shipping the same JS on the
# same native build just needs a new tag (ota-1.0.48-hotfix1) rather
# than a package.json bump.
# release-ota.yml resolves the production version off the channel's
# current bundle and passes it here, so the input wins. A break-glass
# `ota-*` tag still names its own bundle, validated against the
# release scheme so an off-scheme tag cannot ship.
#
# Every other lane derives <major>.<minor>.<commit count>. A short-SHA
# suffix would look equivalent and is not: 1.0.8-abc1234 is a semver
# prerelease, sorts BELOW plain 1.0.8, and Capgo's
# disable_auto_update_under_native makes every device on the 1.0.8
# binary refuse it — uploaded, listed, never installed.
if [ "$CHANNEL" = "production" ] && [ "$GITHUB_REF_TYPE" = "tag" ]; then
# Every other lane derives <major>.<build>.<commit count>. The commit
# count is what keeps staging out of production's way: the two share
# one bundle namespace, production counts OTAs in single digits, and a
# version collision no-ops under --version-exists-ok — uploaded,
# listed, shipped to nobody. A short-SHA suffix would look equivalent
# and is not: 1.1.0-abc1234 is a semver prerelease, sorts BELOW plain
# 1.1.0, and Capgo's disable_auto_update_under_native makes every
# device on the 1.1.0 binary refuse it.
if [ -n "$INPUT_VERSION" ]; then
VERSION="$INPUT_VERSION"
elif [ "$GITHUB_REF_TYPE" = "tag" ]; then
VERSION="${GITHUB_REF_NAME#ota-}"
node scripts/release-version.mjs validate "$VERSION" --kind ota
elif [ "$CHANNEL" = "production" ]; then
# A bare dispatch to production would land a staging-shaped
# version on the production channel and drag its OTA counter into
# the commit-count band, where the next resolved version collides
# with a bundle that already exists.
echo "::error::a production deploy needs a resolved version — use the Release OTA workflow" >&2
exit 1
else
VERSION="$(node scripts/capgo-bundle-version.mjs)"
VERSION="$(node scripts/release-version.mjs staging)"
fi
echo "name=$VERSION" >> "$GITHUB_OUTPUT"
echo "Uploading as bundle version $VERSION"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/content-publish-automerge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ jobs:

# Key off the `ci-success` check run, NOT `workflow_run.conclusion`.
# `ci-success` is the single check the "Protect Prod" ruleset gates
# on; the run conclusion also folds in advisory jobs (e2e). Gate on
# on; the run conclusion also folds in advisory jobs (ds-shots). Gate on
# exactly what the ruleset gates on.
#
# `Tests` runs on `pull_request` (and `push` for dev/main), so a
Expand Down
Loading
Loading