gainforest-bumicerts · dev-polish-upload-cart-fix
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.
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.
/organizations route/bumicert/create, /upload/sites (unauthenticated gates)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.




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.


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.


/organizations). Header illustration renders; card grid is loading. Note: /explore/organizations → 404 (Finding 2).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).


.gainforest.id.

satyam-test, domain switched to .climateai.org. Preview text "Signing in as satyam-test.climateai.org" appears below the field.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.

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).




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.


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.
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).
/explore/organizations returns 404 routingNavigating 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.
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").
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.
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.
development (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 dev → http://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)