dustopia

dustopia

your wallet, in motion.

A living portrait of an Ethereum address. Each Dustopia NFT renders the holder's wallet as a 3D sphere of 36 864 particles per token, swirling in real time. The artwork updates automatically as the collection changes hands.

Every wallet is a self-portrait.

Dustopia turns a decade of on-chain decisions into a living planet of dust — each NFT a swirling ribbon, each collection a flock with its own orbit. The sphere rearranges itself the moment a token enters or leaves the wallet. It is not a snapshot. It is an autobiography that keeps writing itself.

Five moving parts. Two of them are on-chain.

The contract holds your ownership. Everything visual is rendered live in the browser from your current wallet. There's no static image baked in at mint time.

01 / mint

Claim a token on OpenSea Drops

One ERC-721 per claim, capped supply. The contract is OpenSea's audited Drops contract. We don't deploy custom mint logic.

02 / metadata

Token URI points at your wallet

The metadata's animation_url resolves to a live view of the current owner's address, not a frozen render. Marketplace iframes load the same view.

03 / render

WebGL2 sphere of your NFTs

Each NFT in the wallet becomes 36 864 particles (192² grid). Up to 1 024 tokens per sphere. Custom GLSL shader handles depth, motion blur, flocking.

04 / configure

Pick which NFTs go in

Holders can curate the sphere: include all, or pick specific collections and individual tokens. Owner-gated, signed locally with EIP-191. Saved to R2, served to every viewer.

05 / transfer

The artwork follows the wallet

On every transfer the previous owner's selection is wiped automatically. The new holder sees their own collection by default, can configure their own.

Built on small parts that you can audit yourself.

WebGL2 + GLSL

Single-file, zero-build. Custom vertex/fragment shaders, hand-rolled atlas-grid sampling. No engine, no framework.

Cloudflare Worker

Single Worker fronts Alchemy NFT API + ENS resolver. Per-IP rate limiting, edge cache, R2-backed atlas cache.

R2 + Edge

Atlas binaries stored as WebP (q=0.9), about 10× smaller than raw RGB. Edge cache amortises R2 ops across visitors.

EIP-191 + viem

Configurator save flow uses personal_sign; Worker verifies signer matches the current on-chain owner before writing.

ERC-721

Standard ERC-721 on Ethereum mainnet. Token URI points at our worker; the artwork updates as the wallet changes hands.

Quick answers.

Does signing in the configurator cost anything?

No. personal_sign is an off-chain signature. No gas, no transaction. It only proves you own the address; the Worker verifies the signature matches the on-chain owner before saving.

What if my wallet has more than 512 NFTs?

The sphere caps at 512 tokens, picked round-robin across collections so a wallet dominated by one collection still shows its full range. Switch to Pick subset in the configurator to choose exactly which ones go in.

I bought new NFTs — does my sphere update on its own?

No. The sphere is a snapshot you commit by visiting the embed once; it lives in R2 forever from there. To pull a fresh wallet state into the artwork, open the configurator and hit Refresh sphere — the new render overwrites the old one.

How does the OpenSea grid preview work?

Marketplace grid tiles can't run our iframe; they fetch a single image. The first time any visitor opens the embed view, the renderer captures a short animated WebP loop of the live sphere and uploads it to R2. Subsequent fetches return that loop. After a transfer the new owner sees a placeholder until they open their token once and seed their own loop.