Open .eth websites like any other, verified locally.
A Chromium extension that resolves ENS names directly against Ethereum state via a Helios light client, and serves the content from your own local Kubo IPFS node. No public gateway, no hijackable DNS, no TLS middleman. Nothing to trust in the middle.
Built as a trust-minimized replacement for
eth.limo.
- You type
vitalik.ethin the address bar. - The extension intercepts the navigation before the browser does DNS.
- Helios (running in an offscreen document) verifies an
eth_callagainst the ENS resolver, reads thecontenthash, and decodes it to a CIDv1 or IPNS key. - The tab redirects to
http://<cid>.ipfs.localhost:8080/, and your own Kubo node serves the content. Each site gets its own browser origin (cookies, storage, service-worker scope). - A content-script banner keeps the original ENS name visible and shows the live Helios verification status.
address bar service worker offscreen doc local Kubo
┌──────────┐ ┌────────────────┐ ┌──────────────┐ ┌────────────┐
│vitalik.eth│─intercept→│ resolve ENS │──RPC──→│ Helios │ │ │
└──────────┘ │ via viem │ │ light client │ │ │
│ │←─proof─│ (verifies) │ │ │
│ redirect tab │────────┴──────────────┘──────→│ <cid>.ipfs │
└──────────────┘ │ .localhost │
└────────────┘
For the deep end (why modulePreload: false is load-bearing, why the resolver runs in the SW but Helios doesn't, and every landmine we've hit), see IMPLEMENTATION.md. For scope, non-goals, and milestones, see PRD.md.
| Onboarding | Interstitial while Helios syncs |
|---|---|
![]() |
![]() |
| Resolved ENS page with Helios-verified banner | Options: RPC, Helios, and gateway interception |
|---|---|
![]() |
![]() |
Bookmarks view (dapp3.eth internal page):
- Chromium 116+ (Chrome, Brave, Arc, Edge).
- IPFS Desktop (or any Kubo node) running locally, with the subdomain gateway at
http://localhost:8080and the RPC athttp://127.0.0.1:5001. - Node 20+ and pnpm (only if you're building from source).
Grab the packaged build from the Chrome Web Store, or load an unpacked build yourself (see below).
Extension code lives under extension/. All pnpm commands run from there.
cd extension
pnpm install
pnpm build # tsc --noEmit + vite build → extension/dist/Then in chrome://extensions:
- Enable Developer mode.
- Load unpacked → select
extension/dist/.
For iterative development:
pnpm dev # HMR for options / popup / content pages
pnpm typecheck # tsc --noEmit onlyService-worker changes don't hot-reload. Reload the extension from
chrome://extensionsafter editing anything undersrc/background/.
- Chromium MV3 only.
- Ethereum mainnet only.
.ethnames only (no CCIP-read in v1).- No public IPFS fallback by default: the whole point is local-first.
- ENS names without an IPFS contenthash fall back to ERC-4804 (
resolveMode = "5219"/"manual"): the onchain HTML is fetched via Helios-verifiedeth_call, pinned to local Kubo, and served at<cid>.ipfs.localhost:8080. One-time Kubo CORS setup required; the extension prompts inline. SeePRD_ERC4804.md. - Optional IPFS auto-pinning can be enabled in Options. It asks Kubo to recursively pin resolved IPFS contenthash CIDs in the background, and uses the same one-time Kubo API CORS setup as ERC-4804.
See PRD.md § Non-Goals for the full list.
extension/ Chrome MV3 extension (the actual product)
website/ Landing page (dapp3.eth)
PRD.md Scope, architecture, progress log
PRD_ERC4804.md ERC-4804 fallback PRD
IMPLEMENTATION.md Runtime model, Helios gotchas, landmines
PRIVACY_POLICY.md
PUBLISHING.md Chrome Web Store release flow





