Capability brief · second look · as of 2026-08-18

klimadao.finance and app.klimadao.finance, read the way a browser, a crawler, and an agent each actually read them.

Three findings, credit-first. Method: normal page loads with a headless browser (desktop 1366×900 and mobile 390×844, both @2x, console and network captured), plain DNS lookups, plain TLS handshakes, and plain HTTP GET/HEAD with a standard browser user agent, at most one request per second, nothing sent beyond what any visitor's browser sends automatically. No login attempted anywhere. Every claim below has a repro command.

Read this first. Independent recon by EcoWealth Corporation. Not requested by, produced with, reviewed by, or endorsed by Klima Protocol or KlimaDAO. Passive only, no probing, no scanning, no state-changing calls. Staged locally, noindex, not sent anywhere without explicit review.

The bottom line, in plain English

No jargon, just what each fix is worth. Technical detail is below this box.

  1. Someone's old bookmark or a saved link from a partner's docs to base.klimadao.finance now lands them on a gambling site instead of Klima. That's a trust hit for anyone it happens to and a brand-safety problem waiting to be screenshotted, and it costs nothing to close: one DNS record.
  2. The app your own holders still visit to migrate looks broken while they're deciding whether to trust the new one. It shows real errors in the browser console right when someone is judging whether Klima 2.0 is worth moving to.
  3. When someone shares proof they retired carbon, the link preview shows a generic homepage card instead of their actual receipt. That's a free marketing moment left unclaimed every time someone posts a retirement, and it's the same reason no AI agent can confirm a retirement from the link alone.

Strengths credited, first

Real, and worth saying plainly before anything else.

The migration is careful, not lazy.

Every path we tried on www.klimadao.finance, including deep links like /llms.txt and a specific resources guide URL pulled straight from the in-app banner, 308-redirects to the matching path on klimaprotocol.com, not just the homepage. Rebrand redirects that preserve the full path are the exception, not the rule, industry-wide.

The old app tells people the truth.

app.klimadao.finance banners "The Klima 2.0 fair launch period has begun" with a working link to app.klimaprotocol.com and a step-by-step guide. That is respectful, in-product migration UX, not an abandoned page.

Real structured data, real robots.txt.

A genuine schema.org/Organization JSON-LD block on the homepage, and a hand-authored robots.txt with a deliberate Disallow: /concepts/ rule, not a boilerplate default.

Already one of the best-documented protocols we've reviewed.

Covered in full in our July 16 note: two real llms.txt files, GitBook markdown exports, an 84 KB OpenAPI spec, and a published Claude-Code skill plugin. Not repeated here; still true.

The three findings

1

base.klimadao.finance now redirects to an online gambling site

A five-minute fix

Klima's Base-chain carbon-retirement bridge used to live at this address (search engines still index a "Retire carbon on BASE" result pointing here). Today, loading it in a normal browser returns a 301 redirect to rajakencang.com, an Indonesian online-gambling ("Toto Slot") site. This is not a guess: DNS, TLS, and the HTTP response line up into one clear picture.

Screenshot of base.klimadao.finance rendering an online gambling site, desktop, captured 2026-08-18

base.klimadao.finance, desktop 1366×900 @2x, captured 2026-08-18. A mobile capture (390×844 @2x) shows the same thing.

What's happening, mechanically: your DNS record for this subdomain is still a CNAME into Vercel's shared edge. Vercel routes an incoming request by which of its customers currently claims that exact hostname as a custom domain, not by who owns the DNS record. At some point the Vercel project that used to serve Klima's Base bridge here was deleted or the domain detached, which released the claim. Someone else has since added base.klimadao.finance as a custom domain on their own Vercel account and completed domain validation for it, TLS certificate included. The CNAME still points at Vercel, so Vercel serves their site under your name.

DNS (dig)base.klimadao.finance CNAME 0bc72fd56da9d439.vercel-dns-016.com, still a live Vercel edge target
HTTP responseHTTP/2 301, location: https://rajakencang.com/, server: Vercel
TLS certificateCN=base.klimadao.finance, issued by Let's Encrypt, notBefore=2026-07-19, notAfter=2026-10-17: someone completed ACME validation for this exact hostname three and a half weeks before this review
dig +short base.klimadao.finance CNAME
# 0bc72fd56da9d439.vercel-dns-016.com.

curl -sI https://base.klimadao.finance/
# HTTP/2 301
# location: https://rajakencang.com/
# server: Vercel

echo | openssl s_client -connect base.klimadao.finance:443 -servername base.klimadao.finance 2>/dev/null \
  | openssl x509 -noout -subject -issuer -dates
# subject=CN=base.klimadao.finance
# issuer=C=US, O=Let's Encrypt, CN=YR1
# notBefore=Jul 19 19:08:03 2026 GMT
# notAfter=Oct 17 19:08:02 2026 GMT
The give: remove the base.klimadao.finance DNS record (or repoint it somewhere you control), or reclaim the hostname inside your own Vercel dashboard if the project still exists under a different name. Either is a DNS-panel change, not a code change, and doesn't touch the Retirement Aggregator or anything else that's actually retiring carbon today. Worth a quick tidy since it's live and public, and answering under your name right now, and worth a scan of any other subdomain (blog., staging., app-old., anything you've retired from active use) for the same pattern, since this is exactly the shape a scan would catch before a screenshot does.
Honest counter-case: this doesn't touch retirement, doesn't touch KLIMA the token, and doesn't touch either live app. It's a stale corner of the DNS zone, not a breach of anything we tested. We flag it at this priority because it's public, embarrassing if screenshotted by someone less friendly, and a five-minute fix.
2

The legacy app's own RPC dependency is unreachable, so it errors in full view

app.klimadao.finance does the right thing first: it banners "The Klima 2.0 fair launch period has begun" and links to app.klimaprotocol.com and a fair-launch guide (credited above). But the page underneath still boots its old Polygon Web3 stack, which tries to open a connection to polygon.drpc.org. That connection fails completely at the TLS layer, not a timeout, not a rate limit, an actual protocol-level failure, which cascades into a visible React error and an ethers.js "could not detect network" error in the browser console.

Screenshot of app.klimadao.finance, desktop, captured 2026-08-18, page renders but throws console errors

app.klimadao.finance, desktop 1366×900 @2x, captured 2026-08-18. The banner and page render visually; the errors are in DevTools, which is exactly why they're easy to miss and easy for a visiting developer to find.

We ruled out our own network before writing this down: the same sandbox reaches other TLS-1.3 hosts (including drpc.org's own root domain) with no issue, and independently reproduced the exact failure with curl and openssl against polygon.drpc.org specifically, both returning a TLS record-layer error, not a DNS or routing problem.

Console (16 msgs)repeated net::ERR_SSL_PROTOCOL_ERROR on requests to polygon.drpc.org
Page errors (13)Minified React error #418 (hydration mismatch, ×11), #423, #425
App-level errorError: could not detect network (event="noNetwork", code=NETWORK_ERROR, version=providers/5.7.2), ethers.js, from the app's own bundle
Independent confirmationcurl and openssl s_client against polygon.drpc.org:443 both fail with a TLS record-header error at TLS 1.2 and TLS 1.3; drpc.org root and other modern hosts succeed from the same machine at the same time
curl -sI --max-time 10 https://polygon.drpc.org/
# curl: (35) SSL routines:ST_CONNECT:tlsv1 alert protocol version

echo | openssl s_client -connect polygon.drpc.org:443 -servername polygon.drpc.org -tls1_3
# error:...:SSL routines:tls_validate_record_header:wrong version number

# control, same machine, same minute:
curl -sI https://drpc.org/ -o /dev/null -w "%{http_code}\n"   # 200
curl -sI https://cloudflare-eth.com/ -o /dev/null -w "%{http_code}\n"  # 301
The give: the app has no visible fallback RPC. Point the legacy app's Polygon provider at a second endpoint (or Klima's own infra, if it runs one) so a single third-party RPC outage doesn't make the migration banner sit on top of a visibly broken page. Since this app is explicitly legacy and pointing people onward already, the cheapest version of this fix might just be to catch the provider error and hide the now-unnecessary wallet-connect UI entirely, since the banner already tells people where to go.
Honest counter-case: this could be a transient outage on drpc.org's side rather than anything Klima controls, and the app is explicitly legacy, actively pointing people to the replacement. We're noting it because it's reproducible right now, not because it looks like a code defect on your side; a third-party RPC provider failing this completely is itself worth knowing before it happens to something load-bearing.
3

A retirement receipt page can't prove it's real without running its JavaScript

Retirement receipts live at klimaprotocol.com/retirements/<address>/<id>. We requested a receipt URL that search engines currently index (a real, or at least once-real, retirement) and a completely fabricated one (0xNONSENSE.../999) with a plain HTTP GET, the way a search crawler, a Slack/Discord/X unfurler, or a lightweight agent would. Both returned HTTP 200 with the exact same generic <title>, meta description, and schema.org/Organization JSON-LD, no retirement-specific data at all, and byte counts within 7 bytes of each other (85,963 vs. 85,956).

Real-looking ID/retirements/0x7e2213f4.../1 → HTTP 200, 85,963 bytes, title "Klima Protocol | Open Infrastructure for Carbon Markets"
Fabricated control/retirements/0xNONSENSE.../999 → HTTP 200, 85,956 bytes, identical generic title
JSON-LD, bothsite-wide Organization schema, no certification/amount/beneficiary/date fields
Not in the sitemapklimaprotocol.com/sitemap.xml lists 16 static marketing pages, zero retirement URLs
curl -sL -o /dev/null -w "%{http_code} %{size_download}\n" \
  "https://www.klimaprotocol.com/retirements/0x7e2213f499920c35346F3BF881D86748B12c23b4/1"
# 200 85963

curl -sL -o /dev/null -w "%{http_code} %{size_download}\n" \
  "https://www.klimaprotocol.com/retirements/0xNONSENSE0000000000000000000000000000000/999"
# 200 85956   (control, a made-up address, made-up id)

Two costs bundled in one gap. First, growth: when someone shares a retirement link to show they offset carbon, Discord, X, and Slack all read the same generic metadata and show a plain "Klima Protocol" card, not the achievement, which is a free viral moment left unclaimed on every share. Second, verification: neither a search crawler nor an agent that fetches HTML without executing JavaScript can tell a real retirement from a fabricated URL from the page itself; both look identical until a full browser runs the client app, which is the only place the true state (present, or "Page Not Found") ever appears.

The give: render (or at minimum, inject via a small edge function) retirement-specific <title>, og:title/og:description, and a schema.org DigitalDocument or a custom Certification-shaped JSON-LD block per retirement, tonnage, beneficiary, project, date, transaction hash, server-side, before any client JS runs. That single change both makes shared links show the real achievement and gives any agent a way to verify a retirement from the URL alone. A concept version of that JSON-LD block is in the Agent Kit.
Honest counter-case: we can't confirm the specific ID we tested is still a currently valid retirement after the backend migration, search engines may simply have an outdated URL cached. What's confirmed either way is that the server-side response doesn't distinguish a valid ID from a fabricated one, which is the actual finding regardless of that one ID's current status.
Overall, honestly: none of this is urgent in the sense of anything being down. The Retirement Aggregator on Base and the relay at v1.x402.klimalabs.com, the rails EcoWealth's own agent settles through, are untouched by all three findings, and the migration off klimadao.finance is careful everywhere we checked except the one orphaned subdomain. The one item worth same-week attention is finding 1, because it's a live redirect to someone else's site, answered under your domain, today. The other two are worth a look when convenient.