The whole timeline
Four projects, sixteen-ish months of focused work, dozens of dated moments — every contract address and transaction below links to Etherscan, every collection links to OpenSea, and every reconstructed timestamp is in UTC. Built from on-chain history and the development archive.
2021-08-28 · 11:37 AM PST · ETH block 13112212The literal start: a YouTube tutorial on a Saturday morning
A net-new MacBook, a fresh Python install, and an open browser tab on the NFTBirds walkthrough video. Setup notes from the morning record the dependency-install path: Python 3, then PIL via pip, then NumPy via pip, each fixed by working through the error messages. The seed for the random-trait chain followed the bitbirds convention — use the most-recent ETH block at script run time: block 13112212.
The same evening, the first cat-pixel layouts land in the development archive — angry-cat, sad-cat, neutral-cat as separate face traits. By late evening UTC the first color-mixed test images exist. The framing is small at this stage: a learn-the-ropes project, target collection size of 1,000 cats, hand-drawn pixel art, layered Python script.
Late Aug — early Sep 2021The bitbirds pattern, copied verbatim
The architecture inherited directly from github.com/nft-fun/generate-bitbirds (MIT licensed):
- 24×24 pixel grid per token, two-letter pixel variables (
bgbackground,oloutline,hdhead,ththroat,bkbeak), arranged so the matrix visually resembles the bird/cat when zoomed out in the source. - Deterministic pseudo-random seed = base ETH block + iteration index. Same seed → same exact 1,000 cats, every run. Re-runnable, auditable, no on-chain randomness needed.
- Rarity ladder via
random.randint(0, 1000)thresholds. KarmaCats inherited the NFTBirds bucket shape exactly: 75% / 15% / 6% / 4.99% / 0.5%. - Crazy eyes trigger if random ≤ 47 (4.7%); pupil color hard-coded to
(154, 0, 0); eye-white randomized per token. - Beak color via threshold:
>500gray (most common),48–500gold,8–47red (rare),0–7black (very rare). - Pillow upscale at the end — generate at 24×24, paint each pixel via
image.putpixel, then resize 20× nearest-neighbor to 480×480 PNG. - OpenSea shared storefront, lazy-mint — no contract deploy, each cat created on first sale via 0x495f947…cb7b5e (OpenSea's
OPENSTORE).
One detail KarmaCats kept and Substandard later borrowed: the rarest type was a tribute. NFTBirds' rarest bird was the Cockatoo at 0.5%; KarmaCats' rarest was the CockaCat, a nod to the NFTBird namesake (part Cockatiel, part Cat).
Sept 2021 · 103 cats minted, 0.24 ETH lifetime volumeManual upload, lazy mint, modest sale
Each generated cat PNG was uploaded one at a time through OpenSea's "Create" UI. Final tally: 103 unique cats, 5 unique owners, 0.24 ETH lifetime volume. Deliberately small — this was practice. Proceeds went to art supplies for the artist. All 103 are still up at opensea.io/collection/karmacats.
The architectural lessons went directly into the next project. Three days after the first cat sketches, we were already scoping the next collection.
2021-08-31 — 2021-09-02Working title, architectural decisions
In the last days of August a working title gets attached — internally cappArt early on, Substandard publicly later. The framing is committed: the value of this work is the reusable architecture; the art is the vehicle. A domain (badnft.wtf) is already owned.
September 2 lands the first real architectural call: decouple create-and-upload steps. Image generation is split from on-chain and Arweave operations, so layer art and pipeline iteration can evolve independently. This is what makes a 10,000-token mint debuggable.
2021-09-02Arweave chosen over IPFS
The first hard storage call: where to keep the images. IPFS was the default in 2021 NFT-land; Arweave was the deliberate move. The reasoning that ends up in the public FAQ: IPFS without pinning is essentially a BitTorrent that needs constant seeders, while Arweave's economic model pays for permanence up-front. The team commits the AR budget early. Small numbers in dollars, large numbers of test transactions.
2021-09-15 — 2021-10-04Three weeks of mechanism brainstorming
A separate brainstorm channel opens September 15 to chase the question of project number two. Substandard hadn't minted yet, but the architecture-as-reusable model meant the next collection was already in scope. Ideas surfaced and dated, in their order:
- Sept 15 — narrative-flipbook NFTs (each token a frame in a comic), card-game / poker mechanics.
- Sept 19 — Roblox-character layering, after that ecosystem came up.
- Sept 20 — physical-puzzle NFTs ("an actual jigsaw puzzle of NFTs"), Hashmasks-inspired: scattered symbols across the collection that combine into something.
- Sept 27 — bounty-NFTs (mint and hit a zodiac to claim more). Quickly flagged for legal exposure (referencing a similar project's experience) and dropped.
- Sept 29 — generative music: layered audio stems composed at random, identifying that
pydubis the audio equivalent of Pillow. This is the genesis of rrrad.io, in a brief same-day exchange about format (12-bar blues, since the form admits arbitrary stem combinations). - Oct 4 — explicit decision to stay within already-understood architecture and ship fast, on the assumption the NFT market window was time-bounded.
2021-09-16 — 2021-10-18The art pipeline scales up — Pixlr, layer categories, dedup
Hand-drawn art begins September 16, exported from Pixlr (browser-based, easier to share iterations than Procreate). The first export reveals a transparency bug — backgrounds aren't masked correctly — fixed same day. The naming-convention argument resolves the same week: rarity weights live in a metadata file outside the script, so art and weights move independently.
Layer categories, in the order they were added:
- Sept 16 — bases, heads (color-tinted face shapes).
- Sept 17 — eyes, noses, mouths.
- Sept 19 — submarines (low-rarity overlay; randomly applied to a slice of mints).
- Sept 23 — countries (a small flag positioned on the face; only on a fraction of mints).
- Sept-Oct — eyebrows, hats, easter eggs.
The Pixlr undo-button incident (mid-September). An ill-timed undo dumps roughly 45 minutes of layer-art work. From that day forward, periodic backup-zips of the working file get uploaded to the development archive on a regular cadence; those backups are still in the archive.
Dedup stress test (October 18). With the trait combination space increased by countries and submarines, generation runs against an artificially-small layer set to force collisions: 100,000+ duplicate rolls are produced before unique completion. Pipeline confirmed durable for the real 10,000-token run.
2021-09-17Site stood up on GoDaddy WordPress
Site purchased September 17. HTTPS and HTTP-redirect configured the same day. Body font: Times New Roman, on purpose — anti-design as a design choice. The FAQ language is written September 23–28; the personality runs throughout: "we are plumbers, not painters", "IPFS is like paying rent for a BitTorrent", "no roadmap, these were free to mint." The site went down in 2024 when GoDaddy retired its WordPress hosting product. The FAQ survives in the recovered archive and on this museum's about page.
2021-09-25 → 2021-09-26 · two contract deploysThe redo
Etherscan record of the deployer wallet shows the actual sequence:
setProvenanceHash() — image-set hash committed on-chain
reserveNFTs() ×4 — 100 reserved tokens minted
flipSaleState() — public mint opens
Both contracts compile under the name Substandard; v1 sits inert and was never minted from. A bug or design issue between the two — fixed in v2 and deployed roughly 20 hours later. Lesson confirmed: deploy twice. Pilgrims would later deploy three times.
2021-09-26 · 04:53:09 UTC → 2021-09-28 · 08:57:00 UTCThe full mint window: 52 hours open, 30 minutes of sellout
First public mintNFT() at 04:58:50 UTC on September 26 (5 minutes 41 seconds after
sale-flip). Last one, token #9999, at 08:57:00 UTC on September 28. The sale was open
for 52 hours and nearly all of it happened in the last half hour. The shape, counted from the
contract's 10,000 mint events:
- Sept 26: quiet. 100 reserved, then 42 public mints. Marketing was Twitter only, no influencer-spend. Day-one expectations were deliberately low while the Arweave upload pipeline was still finalizing in the background.
- Sept 27: quieter. 15 mints, the last at 09:25:58 UTC. That made 157 tokens in the first 28 hours, followed by 17 hours with none at all.
- Sept 28: sellout. A community retweet flipped demand. A trickle of 42 mints from 02:35 UTC, token 500 at 08:27:27, token 10,000 at 08:57:00. That is 9,500 tokens in under 30 minutes, 5,517 of them in the busiest ten, peaking at 765 in a single minute (08:44 UTC). 807 wallets minted that day across 1,268 transactions.
Correction, 2026-10-10: this entry used to end the mint at 09:25:58 UTC on September 27 and call it a 28-hour window. That timestamp is token 157, the last mint before the lull; the sellout came a day later. The original FAQ's "200 on day 1, then 8,000 in the first ten minutes of day 2" was written from memory that week and is kept as written on the about page.
Reveal offset hashed out to 3988. Mint copy stripped from the
FAQ within 24 hours. Discord invite added September 28. Done.
Verify on chain:
contract ·
last mint ·
OpenSea collection
2021-09-28 · 08:27 → 08:57 UTC · measured 2026-10-10What free cost: the half hour, priced
The mint price was a constant zero in the contract, so the sale itself raised nothing. Five years on we went back to the chain to see what that half hour was worth to the people in it.
Gas per token and the resale price an hour later land on the same number, about 0.023 ETH. Minters bid gas up until the all-in cost matched what a token was worth, and that money went to miners. A mint price of 0.015 to 0.02 ETH on the 9,513 tokens of the rush would have come out of that same 0.023: 143 to 190 ETH, roughly $415,000 to $550,000 on the night.
What we cannot test: whether the rush happens at all with a price on it. The stampede was for a free mint, and over half of it was bulk wallets. The gas figure is extrapolated from a random sample of 150 of the 1,188 rush transactions; everything else is counted from the contract's transfer events and the marketplace sale events in the same transactions. Peer prices are read from each collection's verified contract.
Contracts & on-chain admin
Every Substandard deploy and admin call captured from the chain — generated from the project's chronicle, kept in sync with on-chain reality.
2021-10-17 · 07:10 — 07:43 UTCThree Pilgrim contracts deployed in 33 minutes
Substandard sold out three weeks ago. The follow-up project — the deeper, paid drop with art at 1024×1024 — gets contract-deployed in a single morning session. Etherscan record:
reserveNFTs() — first founder reserves on the v3 contract
flipSaleState() — public mint opens (32 minutes after v3 deploy)
mintNFT() — 17 min after sale-flip
Three deploys in 33 minutes implies a bug in v1 was patched into v2, that produced a different bug patched into v3. The wallet pays gas for all three deploys — the cost of doing this work for real. v3 is the only contract that ever had its sale flag flipped on.
Late Sep — early Oct 2021Art and lore rebuilt at higher fidelity
Pilgrims kept Substandard's Python composition pipeline almost unchanged — same Pillow alpha-paste logic, same deterministic seeding, same dedup loop. Three things changed:
- Art rebuilt from scratch. 14 trait categories (vs Substandard's 7), hand-painted oil/watercolor at 1024×1024. Bases, heads, eyes, eyebrows, noses, mouths, hats, hair, accessories, submarines, planets, countries, easter eggs.
- 26 country flags + 20 procedural planets. Country and planet were treated as semantic anchors — every Pilgrim came from somewhere.
- Fiction archive of 14 short pieces drafted alongside the visual layers. Origin stories, travelogues, philosophical fragments, each tied to a country or trait combination.
Pricing was the other change: 0.077 ETH per token, payable via
mintNFT(uint256) on the v3 contract. Substandard had been free; Pilgrims was the paid
drop we'd been planning since mid-September, when the explicit "free first to vet, then paid at
~0.08 ETH" sequencing got sketched.
2021-10-17 → 2021-11-14 · 54 of 10,000 mintedPublic mint window, then the freeze
First public mint 2021-10-17 · 08:32:27 UTC. Last public mint 2021-11-14 · 17:42:05 UTC. Roughly 28 days of active mint window. Final tally: 54 of 10,000 minted — the founders' batch and a handful of early supporters.
Then the bear market arrived. NFT mint volume on Ethereum dropped sharply through Q4 2021 and into Q1 2022. The team didn't push another marketing cycle. The contract never went hostile, never got renounced, never got revoked — the sale flag is just toggled off. Supply remains wide open. Pilgrims is the only one of the four projects still mid-flight.
Contracts & on-chain admin
Every Pilgrim deploy and admin call captured from the chain — generated from the project's chronicle.
2021-09-29 (idea) → never (mint)The one we never put on chain
The genesis is a brief same-day exchange in late September: layered audio stems composed at random
could work the same way layered PNG layers work, with pydub as the audio equivalent of
Pillow. The format choice — 12-bar blues — followed quickly: the form admits arbitrary
stem combinations, so any drum / bass / lead / pad / fx pulled from a tempo-and-key-keyed library
can be stitched into a coherent track.
The idea sat. The engine code (jam_scratch.py) got written. Roughly
1.6 GB of hand-recorded audio stems got organized — drums, bass, lead, pads, fx,
keyed by tempo and musical key. A site framework went up on a Linode VPS. Plans included a
shuffle-radio-style audio player on the site that could chain one generated track into the next.
Then the bear market arrived. The audience for "you mint a randomly-composed track" went to zero, and we couldn't settle on whether each generation should be one-of-one or owner-replayable. No contract. No mint. The code, the stems, and the vibe survived — first on the Linode that got shut down in 2024, then in the local archive that backed it up just in time.
2022-03-18 → 2023-02-25 · Crecodiles (creco.xyz)The Creco partnership / deep-dive era
Pilgrims paused in late 2021. By early 2022 a different project caught the eye: Crecodiles (creco.xyz) — an NFT collection with the most architecturally interesting system on the market at the time, an on-chain DNA encoding: each token's traits packed into a single binary string that could be unpacked deterministically by anyone with the bitfield mask. The right answer to "what makes an NFT collection that lasts" turned out to be on-chain semantic data, not just hosted images.
April 2022 onward, three Creco-focused channels ran in parallel:
- 2022-04-29 onward — DNA reverse-engineering. Pulling apart the binary-DNA → trait extraction system, working out the bitfield masks for each trait class (eyes, mouth, etc), reconciling rare combos.
- 2022-04-30 onward — token watcher. A monitoring channel for Creco mints, sales, and rare-trait spotting. The ancestor of every "cron+slack-bot" pattern that runs across the projects today.
- 2022-05-05 onward — puzzle-hunt analysis. Creco ran their own treasure hunt across the collection; this channel is reverse-engineered clues, rarity-sniper queries, snipe-window analysis.
The Creco era ran roughly ten months. As late as 2023-02-25 the dev archive still had operational SQL queries for Creco unclaimed-dust analysis. Nothing was minted; the role was analyst / power user / partnership prospect. The architectural lessons (on-chain DNA, bot-driven monitoring, rarity infrastructure) compounded into everything that came after.
2022-05-21 → 2022-07-06 · Sepolia miningTwo rigs, 47 days, mined until the merge
May 2022: the dev archive shifts again, this time into Sepolia testnet mining. The channel opens 2022-05-21 with geth.yml config wars, node setup and t-rex CLI tuning. Two physical rigs did the work: an Alienware desktop and a Dell G3 3590 with a GTX 1650. A slack-bot in the archive auto-posts mining stats from each rig, and that bot pattern is the ancestor of the cron-plus-bot habit every later project kept.
The Sepolia mining Python (bot, orchestrator, config glue) is still in the archive, and the channel kept talking until February 2023. The testnet tooling later took the name pilgrim.games, the address this museum lives at now. What started as "report mining stats from a desktop at home" grew into later work that is not part of this museum.
Measured 2026-10-10 from the Sepolia chain. An earlier version of this entry said the rigs ran for about nine months and that one had 251 blocks by day two. The chain shows 47 days of block production, with 62 blocks by the end of day two and 262 by the end of day four.
2024The hosting goes dark, the on-chain stuff doesn't
Two infrastructure events in 2024 erased the original off-chain surface of all four projects:
- GoDaddy retired its WordPress hosting product. The Substandard site went down.
- The Linode VPS hosting the rrrad.io site and supporting tools was shut down.
None of the on-chain or Arweave content was at risk. Arweave keeps the layer art, Etherscan keeps the contracts, OpenSea keeps the token metadata. That's the half of the architecture that was meant to outlast everything else, and did.
2026The museum
A single Flask app at pilgrim.games stands in for all four
project surfaces. Trait playgrounds run the same compositing logic the original mint pipelines ran.
Galleries pull real on-chain tokens with their real Arweave URLs. Contracts link out to Etherscan
and OpenSea. The wind-down content is together for the first time. Substandard is sold
out; Aether Pilgrims can still be minted from its contract, which was never switched off. The half-finished merch sketches, abandoned roadmap variants, credentials, and
post-mint operational tooling stay in the gitignored archive.
Per-project museum surfaces
Verified on-chain events (31)
Single chronological list of every public on-chain event tied to the museum projects. Auto-generated from the project's internal chronicle. Each row links to its block-explorer page.