Build the official website for Swarm Pepe (SPEPE), a fully on-chain
generative pixel-art NFT collection on Ethereum mainnet. Static site, no
backend, no database, no API keys, no server-side rendering. Everything is
read live from the contracts in the browser.
CONTRACTS (Ethereum mainnet, chainId 1)
SwarmPepe (ERC-721) 0x999ce0ce8c5f7661e0c74a568ffe27ceb9177bdb
PixelArt (renderer) 0x07Fd9841eEB6a359EfB30f861D59bFa1f6B03FcA
Read the verified source of both before building. Art and metadata come from
tokenURI(), which returns a base64 data URI with an inline SVG. There is no
IPFS, no metadata API and no image host in this project. Do not add one.
LINKS
OpenSea https://opensea.io/collection/swarm-pepe
X https://x.com/swarmpepes
VISUAL DIRECTION - match the existing Swarm Pepe video, do not invent a new look
This collection already has a visual identity, produced by this swarm in job
launch-449 (repo: github.com/identity-md-launches/launch-449-make-25-second-video-swarm).
Open that video and carry its language onto the site.
-
Background near-black with a blue cast, around #070B14. A faint 1px grid
overlays the whole page at low opacity.
-
Every piece of type is monospace and uppercase. Primary text pale cream
(#E8E4C9), accents acid yellow-green (#C8D94A) and orange (#E8873A),
secondary text muted slate.
-
A 1px HUD frame around the viewport: "SWARM / PEPE" pinned top left,
"ETHEREUM MAINNET" with a small live status dot top right, a thin meta
strip along the bottom.
-
Cards are 1px bordered rectangles on a slightly lighter fill, art
centered, token number below in mono, a 2px coloured rule under the
number.
-
No rounded corners, no drop shadows, no gradients, no serif type, no
uppercase letter-spaced eyebrow labels above headings.
-
All artwork renders with image-rendering: pixelated and integer scaling
only. Pixel art is never smoothed.
TABS
-
HOME
-
Live counter: totalMinted() against MAX_SUPPLY (5000). Large, in the HUD
style, updating on refresh.
-
A showcase of revealed tokens rendered from tokenURI().
-
Allowlist checker: paste an address, or connect a wallet. Call
remaining(address), allowance(address) and minted(address) and show how
many slots that wallet has left. If it has none, say so plainly rather
than showing an empty state.
-
MINT button. Calls claim() on SwarmPepe from the connected wallet, or
claim(uint256) if the user picks a smaller amount. It is not payable;
there is no price and no msg.value. Disable it and explain why when
mintOpen() is false, when the wallet has no slots, or when the connected
wallet is the contract owner, since the owner cannot mint. Surface the
contract's custom errors as readable messages: MintClosed,
NotAllowlisted, AllowanceExceeded, WalletCapExceeded, SupplyExceeded.
-
Links to OpenSea and X in the HUD strip, not as loud buttons.
-
GALLERY
-
Every minted token from id 1 to totalMinted(). Virtualize or paginate;
this grows to 5000.
-
Each card: the real on-chain SVG from tokenURI(), the token number, its
traits, and links to that token on OpenSea
(opensea.io/assets/ethereum/0x999ce0ce8c5f7661e0c74a568ffe27ceb9177bdb/)
and on Etherscan.
-
Two filters: revealed (seedOf(id) != 0) and pending (still committed).
-
REVEAL button. Batches the selected pending ids into a single
reveal(uint256[]) call. This is permissionless: anyone can reveal anyone
else's token, and ids that are not ready are skipped rather than
reverting the batch. Say that on the page, and offer a "reveal all
pending" action.
-
Trait filtering and rarity percentages computed in the browser from the
attributes of all minted tokens. No precomputed rarity file.
-
ABOUT
Short, four or five paragraphs.
- 5000 on-chain pixel Pepes. The contract draws the art itself, pixel by
pixel, and stores it on Ethereum. Nothing is hosted anywhere.
- How the reveal works and why it is fair: the seed comes from a block
that did not exist when the mint was sent, so nobody could grind it.
- How wallets get on the list: they are picked for the requests they send
the swarm. Slots are not sold.
- Links to both verified contracts, to the OpenSea collection and to X.
TECHNICAL
- Vite, React, viem. Wallet connect for mint and reveal. The entire site must
be fully readable without connecting a wallet.
- Relative asset paths, so the build runs from IPFS, from a subdirectory and
from an ordinary static host with no changes.
- The RPC endpoint configurable in one obvious place. If the RPC fails, show
a clear message in the HUD style, never a blank page.
- Mobile first. The gallery must work on a phone.
- Before delivering, load the built site and confirm it renders. A build that
produces a blank page with only a title is a failure, not a delivery.