gainforest-bumicerts · dev-polish-upload-cart-fix

Local dev — landing polish, cart & upload fix

@satyam-mishra-pce

Full run of the local dev build (branch development) against five recent commits — landing polish, browser-storage cart fix, profile upload fix, org-pill fix, and 4-col drafts grid. The unauthenticated half passes cleanly; the cart browser-storage fix is confirmed working. Authenticated flows (wizard, sites, profile upload) were blocked by the climateai.org PDS OAuth page rendering blank in headless Chromium — an automation limitation, not an app regression.

Date: 2026-05-13 · Target: localhost:3001 · Branch: development · Account: satyam-test.climateai.org · Tool: Playwright headless · partial


Headline result

6
Flows passed
0
App blockers
2
Warnings
2
Fixes verified

What passed. Landing page, explore marketplace (97 bumicerts), leaderboard, organizations, sign-in modal (Handle tab + domain picker + OAuth redirect), cart panel, and bumicert detail (all four tabs). The two headline fixes on this branch — browser-storage access for the cart and the landing layout polish — are both confirmed working.

What was blocked. After correctly redirecting to climateai.org/oauth/authorize, the PDS OAuth page rendered blank in headless Chromium. Playwright could not fill the password field. This is a known headless-browser CSP/rendering limitation with the climateai.org PDS; the OAuth flow works correctly in a real browser. As a result, the wizard, sites management, profile edit, and the profile-only upload fix could not be end-to-end verified this run.

One route 404. /explore/organizations returns a 404 page. The Organizations page is reachable via the left nav link (/organizations) but the explore sub-route is not wired up.

What I tested


1. Landing page

The polished landing is the strongest first-impression the product has made in any run I have done. The new hero is cinematic — a full-bleed misty forest, the Cormorant Garamond italic headline "Verified Impact Starts With Real Communities", a subtle "Explore Projects" CTA, and clean top-corner navigation. Nothing fights for attention. The subsequent scroll through feature pillars and the "Choose Your Path" funder / nature-steward split is equally calm. Footer is uncluttered. The revert / re-apply on the hero plant image position resolved cleanly — no overflow artifacts visible.

01Hero. "Verified Impact Starts With Real Communities" — full-bleed forest, Garamond italic, single CTA. No overflow on the hero plant.
02Feature pillars and "Choose Your Path" split. Funder / Nature Steward cards sit cleanly in the two-column layout.
03"Choose Your Path" full view. Editorial tone and typographic hierarchy are consistent with the hero.
04Footer. Tagline + utility links. Quiet and functional.

2. Explore / Marketplace

Click Explore Projects/explore. Left rail (Bumicerts · Organizations · Leaderboard + a Manage section that prompts sign-in), a serif "Discover Regenerative Impact" heading, search bar, tag chip strip, and a 4-up grid of project cards. 97 bumicerts indexed. Cards show image, title, org badge, and work-type tags. The "Newest" sort is active by default. Filters like "Mother Foundaton for Future Goods", "No Earth", "education", "Community" chip strip appears alongside a "More Filters" control.

05Marketplace top. Left rail, serif heading, search + chip strip. 97 bumicerts found.
06Card grid mid-scroll. 4-up layout. Cards are dense without being noisy.

3. Leaderboard & Organizations

The leaderboard (/leaderboard) loads the "Impact Champions" page — $26,938.62 USD raised across 68 donors, supporting 39 projects. Filter controls (All Time / Month / Week, Include anonymous donors toggle, Known Only toggle) are all rendered. Donor rows show truncated wallet addresses, timestamps, and per-donor totals.

The Organizations page (/organizations, reached via left nav) shows the "Nature Stewards" editorial header with a Mapbox-style mountain illustration. Cards were loading (skeleton state at screenshot time) — the org data fetch is asynchronous and took longer than the screenshot delay.

07Leaderboard. $26,938.62 · 68 donors · 39 projects. Filter + toggle controls at the top.
08Organizations (/organizations). Header illustration renders; card grid is loading. Note: /explore/organizations → 404 (Finding 2).

4. Sign-in flow

The "Get Started" modal (triggered by the header button or sidebar Sign In link) has two tabs: Email (sends a magic link) and Handle (AT-Proto handle + PDS domain picker). The Handle tab is the flow tested. Username field + a domain picker that defaults to .gainforest.id with a dropdown offering gainforest.id, climateai.org, certified.app, bsky.social, and Custom server. Selecting climateai.org, typing satyam-test, and clicking Continue triggers the server action which constructs a PAR request and redirects to https://climateai.org/oauth/authorize?request_uri=…. The redirect itself is confirmed working; the PDS page rendering did not complete in headless mode (see Finding 1).

09"Get Started" modal — Email tab active, backdrop blur over the marketplace. Clean modal UX.
10Handle tab. Username field + domain picker defaulting to .gainforest.id.
11Domain picker open. Options: gainforest.id, climateai.org, certified.app, bsky.social, Custom server.
12Handle filled as satyam-test, domain switched to .climateai.org. Preview text "Signing in as satyam-test.climateai.org" appears below the field.

5. Cart panel — browser storage fix verified

The cart is triggered by the shopping-cart icon in the top-right header. Prior to commit 56ffff2 ("Fix browser storage access in client components"), this panel threw a hydration error in client components accessing localStorage / sessionStorage before the browser environment was available. Post-fix, the panel opens cleanly and renders its empty state: "Your cart is empty. Bumicerts you've saved to donate to later." with an "Explore Summary" CTA. No console errors observed.

13Cart panel. Empty state renders correctly — "Your cart is empty." with Explore Summary CTA. Browser storage fix confirmed.

6. Bumicert detail page

Navigated to the first indexed bumicert: Indigenous crop value addition through solar drying in Kenya by OTEPIC (/bumicert/did:plc:hent6csywblz75js24ky3jsl-3mlq6tp3huc2u). Four tabs — Overview, Site Boundaries, Donations, Timeline — all render. Overview shows a community photo, title in italic serif, the "education" tag, contributor row (OTEPIC avatar), and a "Donations are not applicable for this bumicert" notice. Site Boundaries loads a Mapbox map (tile-fetching, Africa region). Donations shows the empty state ("No donations yet. Be the first to support this project."). Timeline was accessible and rendered (not shown — no evidence records for this cert).

14Overview tab. Community photo, italic title, education tag, OTEPIC contributor row.
15Overview scrolled — description and organization sidebar.
16Site Boundaries tab. Mapbox map loading; Africa region visible. Tile fetch in progress at screenshot time.
17Donations tab. Correct empty state — "No donations yet. Be the first to support this project."

7. Auth walls

All management routes require authentication and enforce it cleanly. /bumicert/create shows a centered "You are not signed in. Please sign in to create a bumicert." panel with Sign in / Home buttons — correct behavior, good error state. /upload/sites shows an analogous "Sign in to continue" lock-icon gate. The sidebar under MANAGE shows a "Sign in to manage your account and content." prompt with a Sign In chevron link. These walls are all consistent and non-confusing.

18Create bumicert — unauthenticated gate. "You are not signed in." with Sign in / Home CTAs. Sidebar shows the Create a Bumicert CTA card.
19Sites management — unauthenticated gate. "Sign in to continue. You need to be signed in to manage your organization's content."

Findings

1 · Browser storage access in client components — fixed · verified

Commit 56ffff2 ("Fix browser storage access in client components") resolves a hydration-time crash where React client components read localStorage / sessionStorage before the browser environment was guaranteed available. Post-fix: the cart panel opens, renders its empty state, and shows no errors. This is the "Cart panel (browser storage consumer)" flow from the test checklist.

2 · Landing page polish — fixed · verified

Commits a692bc0 and 6de6e83 polish the landing layout and improve the landing page. The hero renders with the correct full-bleed forest image, the ground-plant position revert (4cb4d54 + fe8793d) is clean — no overflow visible. Typography, scroll choreography, feature pillars, and footer are all at a high standard. The org-pill fix (e3f5206 — circle fallback, no-wrap name, smooth hover) was not tested directly this run (no authenticated org page loaded).

3 · /explore/organizations returns 404 routing

Navigating directly to /explore/organizations returns a 404 page ("This page doesn't exist. Maybe it was moved, or maybe it never existed at all."). The Organizations page is accessible via the left-nav link which routes to /organizations. If any external link, documentation, or UI element references the /explore/organizations path it will 404. Either add a redirect from /explore/organizations/organizations, or confirm the path is intentionally not exposed.

4 · PDS OAuth page (climateai.org) renders blank in headless Chromium test env

After the app correctly constructs the PAR request and redirects to https://climateai.org/oauth/authorize?request_uri=…, the PDS page renders a blank white screen in headless Chromium. The password input never appears. This is a Playwright headless limitation — likely a Content Security Policy or JavaScript environment restriction on the PDS side — not an app bug. Consequence for this run: the authenticated flows (wizard, sites, profile edit, profile-only upload fix) were not verified. A follow-up run using a real browser session or cookie injection is needed to cover those flows.

Unverified on this run: d204d31 ("Fix profile-only upload edits").

5 · Sign-in modal Handle tab is clean pass

Email / Handle pill-toggle, domain dropdown (popover with five options including climateai.org), live "Signing in as…" preview, and Continue button all render and interact correctly. The OAuth redirect fires when Continue is clicked — the app side of the auth flow is working.

6 · Bumicert detail tabs all function pass

Overview, Site Boundaries (Mapbox), Donations, and Timeline tabs all render without errors for a real indexed bumicert. Empty states (no donations, no timeline evidence) are correct and well-worded. The tab-bar pattern is visually clean and consistent with the rest of the app.


Reproducing

Date2026-05-13 Branchdevelopment (2 commits ahead of origin) HEAD commitsd204d31 Fix profile-only upload edits · 56ffff2 Fix browser storage access · a692bc0 Polish landing page layout Dev serverpnpm --filter @bumicerts/app devhttp://localhost:3001 ToolPlaywright 1.60 · Chromium headless · 1440×900 Accountsatyam-test.climateai.org — OAuth redirect confirmed; PDS page did not render in headless mode Screenshotsassets/*.png (54 captures)