Wallet identity
One local secp256k1 key, signing deploys and encrypting messages.
EVM Address
ECIES Public Key
Choose how you want to continue.
No external wallet required.
Signing happens locally in your browser before deployment.
Signature pending
▶ Next: Upload your website folder to stage files.
Everything is bundled in browser memory. Nothing is uploaded to a server.
Drop a folder with your static site files. We bundle it in browser memory, then sign and deploy.
Your local identity signs the payload; the signed torrent is what goes live.
Optional. Uploads a copy of this signed deployment to GoFile. WebTorrent remains the primary transport, and your deployment succeeds either way.
WEB25 gateway
Open any peer-hosted site by its hash, mirror locator or full WEB25 link.
P2P is always tried first. A mirror is only ever a fallback.
Searches only what this browser has already loaded. Nothing leaves your device.
Your own node joins the swarm and pulls the bundle from whoever is seeding it.
The signed .torrentchain manifest is checked against the publisher identity.
If no peer answers, a temporary GoFile locator in the link can serve the same bytes.
Add &debug=true to any URL for detailed progress logs:
https://WEB25.cloud?orc=ABC123DEF456...&debug=true
Sign a static site with a key that never leaves your browser, seed it to the swarm, and message anyone by their Nostr address — no backend, no signalling server, no mandatory wallet extension.
Built on
Your folder is bundled in memory (gzip by default) and signed with your
local EVM identity. A .torrentchain manifest carries the
publisher identity and integrity metadata.
WebTorrent seeds the signed bundle straight from this tab. An optional GoFile mirror can stand in as temporary fallback transport.
Anyone who opens your WEB25 link resolves it peer-first, verifies the signature, and renders the site in a sandboxed, opaque-origin frame.
Three pieces carry the whole thing: who you are, how a site ships, and how two browsers talk.
A single local secp256k1 key signs your deploys, encrypts your messages and publishes your handle — no second seed anywhere.
0x… signs deploys04… encrypts messagesnpub1… is how people reach youYour folder is bundled in memory, signed, and seeded straight from the tab. The signature travels with the bytes.
.torrentchain manifestType someone's Nostr address and the encrypted invitation is delivered for you — no magnet links, no key pasting.
“Cryptographic validity is not consent.”
A valid invitation proves who sent it — never that you want to answer. Anything from someone you do not already trust simply waits, and declining sends nothing back at all.
The identity model is local-first and is inspired by mylofi/local-data-lock: key material stays in-browser and WebAuthn passkeys gate unlock/signing sessions. A single secp256k1 key backs all three identities shown on the Account page — there is no second seed and no second private key.
0x…04…npub1…The passkey does more than gate the unlock — it is what the key is wrapped with. Web25 requires the WebAuthn PRF extension, and the secret the authenticator returns during a user-verified assertion is stretched through HKDF-SHA256 into a non-extractable AES-GCM key that wraps the vault. That secret never leaves the call stack and is never written to storage, so nothing persisted on the device is enough on its own to derive the wallet. A browser or security key without PRF is refused rather than quietly handed a weaker path.
The Account page shows all three side by side, each with its own copy button.
The Nostr address can be added or removed there: removing it takes you off the
relays and hides the address, and adding it back restores the same
npub — because it was never a separate key to begin with.
Static-site deploys run through a bundle pipeline (default: gzip), then attach a signed .torrentchain
manifest carrying publisher identity and integrity metadata.
Messaging UX started from michal-wrzosek/p2p-chat and replaced its manual offer/answer step entirely. You enter someone's Nostr address, and the encrypted WebRTC invitation is delivered for you through public Nostr relays — no magnet links or key pasting.
npub, then request a chatstun:stun.l.google.com:19302WebRTC stays the preferred transport. If a direct connection cannot be established, messages fall back to the relays — still signed and ECIES-encrypted exactly as before, with NIP-44 on top. The chat header says which path is in use: Connected · WebRTC or Connected · Nostr — one indicator, green either way.
Verifying an invitation proves the sender is who they claim. It does not
mean you want to talk to them — and anyone who knows your npub can
produce a perfectly valid offer. Answering one is not free: it reveals your full
ECIES public key, your EVM address, and, through ICE gathering, your machine's
network addresses.
So an invitation from anyone who is not already a trusted contact simply waits. No answer is created, no ICE is gathered, and nothing is sent back until you press Accept. Declining discards it silently — the sender is not told, because telling them would confirm the address is live — and their retries are dropped, so a refusal cannot be worn down by repetition.
Trust is authorization layered on top of authentication — it replaces none of the
existing checks. A trusted friend's invitation is still verified end to end, and
its identity tuple (Nostr key, ECIES key, EVM address) must both validate and match
what was stored, so taking over an npub does not inherit the trust
attached to it. Removing a contact is a local change only: they become unknown
again, and no key is deleted or rotated on either side.
The app talks straight to one public relay over a WebSocket. There is no Web25 relay, no proxy and no signalling server — just a rendezvous both sides agree on.
Two browsers can only meet on a relay they both use. Spreading over several relays looks sturdier and behaves worse: a message accepted by one relay and a subscription healthy on another never meet, and the invitation is lost while every relay involved reports success. One relay makes finding each other predictable, at an honest cost: while that relay is down, the messenger is down with it.
wss://nos.lolWEB25.cloud validates signed publisher metadata and sanitizes rendered HTML with DOMPurify at load time. The sanitizer is intentionally configured in a compatibility-oriented profile (more permissive than strict defaults) to support richer static websites.
npub, with encrypted Nostr signallingCreate a local wallet, drop a folder, sign it, and share the link. It runs entirely in this tab.