10,000 smoking monkeys that react to the ledger, live.
Ciggie Puffs is a fully on-chain PFP collection on Radix. Every monkey's art and its generated speech live on-ledger and react in real time to live market data — DEX prices, network throughput, your wallet — with no oracle and no media server. One ~900 KB bundle; 10,000 unique, animated, ledger-reactive characters.
Meet the Puffs — live
Rendering in your browser, reacting to live mainnet data · auto-cycling the collection · click any to open its profile🎞 loom:anim
A tiny integer-deterministic animation codec. The whole collection is a function + a shared art alphabet + one seed per token — not 10,000 image files.
📈 Ledger-reactive
Eyes, smoke, coin-rain, necklaces and backgrounds swing with live $XRD / $CIGGIE / $EARLY / $OCI prices, network volume and your holdings.
🗣 Talking Loom
Each monkey speaks a unique, deterministic line from an on-ledger language model — and its mood reacts to the market too.
⛓ Fully on-chain
Art, text and behaviour live on Radix. Wallets show the live art via a content-addressed render service at ciggiepuffs.xrd.social.
What makes every monkey different
🧠 Mood is social
A monkey's sentiment isn't just the market — it's partly set by the other Ciggie Puffs in the same wallet. Each one has seeded likes and dislikes toward eight trait "cliques" (gold, zombie, crowns, officers, diamonds…). Hold a bag full of cliques it loves and its mood lifts; fill it with rivals and it sours. Your collection literally changes how each monkey feels.
🏷 Names & nicknames
Every monkey is named at mint — a fixed First · Type · Last ("Chunk Menace Marlborough") baked into its on-ledger data. The middle, its nickname, is reactive: an adjective + noun that shifts with its live mood and generated line, so "the Zen Sage" becomes "the Rekt Bagholder" when the market turns.
🗣 It talks
Each monkey speaks. A compact language model stored on-ledger (the "Talking Loom") deterministically writes a unique line for every token — ~96% unique across 10,000 — and the line reacts to the same mood that drives its eyes. It's closed-output (every word from a fixed dictionary), so it's fully moderatable and reproduces identically on any device.
How it works
The tech behind Ciggie Puffs — the codec, the reactive engine, the names, the text generator, and the on-ledger architecture.
loom:anim — the codec
Instead of storing 10,000 image files, Ciggie Puffs stores a function + a shared art "alphabet" + one seed per token. The whole collection — every trait layer, every background, the full animation — is a single ~900 KB bundle sealed on-ledger. loom:anim is a tiny, dependency-free, integer-deterministic animation codec: byte-identical output on every device, which is what lets the art be content-addressed and independently verified. Layers use an indexed cell-diff mode (chunky pixel art) or a true-colour "feather" mode (soft gradients); on-ledger the docs are LZMA-compressed.
The reactive engine
Every monkey's look is a pure function of (its seed, the live ledger, time). Eleven live inputs are read straight from the Radix Gateway — no oracle, no server:
- Token prices & 24h moves for $XRD, $CIGGIE, $EARLY, $OCI — from on-ledger DEX pool state (reserve ratios /
price_sqrt²), anchored to USD via an on-ledger XRD/hUSDC pool. - Network throughput — 24h transaction volume from the ledger's
state_versiondelta. - Your wallet — account activity and how many Ciggie Puffs you hold.
Each token is seeded to react to its own mix of these signals (its eyes might track $CIGGIE while its background tracks network volume), each with its own direction and sensitivity. That's why no two monkeys move alike.
Mood, cliques & the wallet social vibe
A monkey's sentiment blends the market with a social signal from its wallet-mates. Each monkey has a seeded affinity (−1…+1) toward eight trait cliques — gold, zombie, albino, female, crowns, officers, hypersuits, diamonds. The more of a liked clique it's surrounded by in an account, the better its mood; rivals drag it down. Mood then drives its eye colour, its nickname, and its speech together.
Names & nicknames
Each token gets a fixed First · Type · Last name computed at mint and stored on-ledger (so the wallet's name matches the rendered name exactly). The reactive nickname — an adjective + noun in the middle — is derived live from the monkey's blended mood and its generated line, shifting from "the Mooning Prophet" to "the Liquidated Doomer" as the market swings.
Talking Loom — the text generator
Speech is generated, not written. A compact n-gram language model (~625 KB) is stored on-ledger alongside the art. A deterministic decoder walks it from the token's seed to a unique line (~96% unique across the collection) that also reacts to the live quote. It's closed-output — every token comes from the stored dictionary — so the whole vocabulary can be audited and moderated offline, and the same seed always yields the same line on any device.
On-ledger architecture
A Scrypto component holds the sealed bundle and the collection NFT resource. Per-token data is tiny: a fixed name, a mint timestamp, and a mutable key_image_url. Because wallets and marketplaces display a static image, a content-addressed render service at ciggiepuffs.xrd.social turns each token's current ledger-reactive state into an animated GIF — refreshed about hourly (the wallet image-proxy's cache window), re-rendering only the monkeys whose reactive state actually changed.
Why loom:anim, and why Radix
Fully on-chain art that's also animated and reactive is supposed to be impossible — too big to store, too static to react. Here's how loom:anim on Radix makes all three true at once, and what it would cost anywhere else.
Why loom:anim
A 10,000-piece animated PFP collection is gigabytes of image files. Nobody puts that on a blockchain — so "NFT art" almost always lives on IPFS or a company's servers behind a pointer. Links rot, pinning bills come due, and "on-chain" turns out to be mostly a promise.
loom:anim flips it: instead of files, store a function + a shared art alphabet + one seed per token. The entire collection's art, text and behaviour is a single ~900 KB bundle, sealed on-ledger once. Each token is just its number — the seed. Because the codec is integer-deterministic, every device reproduces byte-identical frames, so the art can be content-addressed, independently verified, and — the part that matters most — made reactive: the render is a pure function of (seed, live ledger, time).
Net: ~900 KB for the whole collection versus multiple gigabytes of rendered files — roughly a 3,000× reduction — and it's genuinely on-chain and alive, not a JPEG behind a link.
Why Radix
- Assets are native. On Radix an NFT is a first-class resource the ledger understands — not hand-rolled bookkeeping inside a contract. Minting, ownership and transfers are safer, simpler and cheaper, with fewer ways to get it wrong.
- Keyless reads via the Gateway. Anyone can read live ledger state — DEX pool prices, network throughput, an account's holdings — with no API key, no node, no oracle. That's what lets each monkey react to the real market with zero backend.
- Owner-controlled, mutable metadata. The on-ledger
key_image_urlis mutable, so the collection can point each token at its live render without re-minting. - Scrypto + predictable fees. Publishing the ~900 KB bundle is a one-time, predictable cost; reads are free; and the asset-oriented model keeps the component tiny and auditable.
What it would cost elsewhere
| Approach | Where the art lives | Truly on-chain? | Reactive? | Storing 10k |
|---|---|---|---|---|
| ETH + IPFS (typical PFP) | IPFS / a server | ❌ pointer only | ❌ | ongoing pinning / hosting; link-rot risk |
| ETH fully on-chain (SVG) | contract storage | ✅ | ❌ | ~tens of thousands of $ for <1 MB of storage — only tiny art is feasible |
| Solana + Arweave | Arweave | ❌ off-chain | ❌ | pay-once, permanent — but static files |
| loom:anim on Radix | on-ledger bundle | ✅ | ✅ | one ~900 KB bundle, published once |
Cost figures are illustrative — gas-based prices swing with network conditions. The point isn't the exact dollar amount; it's the shape: everywhere else, "fully on-chain + animated + reactive" is either impossibly expensive or simply not offered. loom:anim on Radix makes all three true at the price of a single ~900 KB publish.
The reactive part no one else has
Even projects that put static art fully on-chain can't make it move with the market, because that needs live state at render time with no trusted server. Ciggie Puffs reads the ledger directly, so a monkey's eyes, smoke, coins and mood track real prices and your real wallet — refreshed about hourly through the wallet's image proxy, re-rendering only the tokens whose state actually changed. That's the combination loom:anim + Radix unlocks, and why the collection is built this way.
The airdrop — 10,000 monkeys, three thirds
Ciggie Puffs isn't a pay-to-mint. The entire 10,000-piece collection is given away in three equal thirds — to the people who held $CIGGIE, to those hurt by the August hack, and to the DAO.
To $CIGGIE holders
3,333 airdropped to the 89 accounts that held $CIGGIE at the on-chain snapshot. Allotment: half split evenly across every holder, half weighted by how much $CIGGIE each held.
3,315 delivered to 88 wallets; 18 held back for one account with restrictive deposit settings.
To August-hack victims
3,333 reserved for those affected by the August hack. Allotment structure is TBD — we'll publish it here before distribution.
To the DAO
3,333 to be donated to the DAO, pending DAO acceptance (TBC).
Every monkey is equal — fully on-chain, animated, ledger-reactive. Want to watch them move? Browse the collection.
The collection
Every monkey here is live — rendered in your browser and reacting to real Radix mainnet market data right now (prices, 24h moves, network volume). Filter by trait, or sort by richest, most social, recently transferred, or biggest mood swing. Click any monkey for its full profile; scrub the time machine to replay any past ledger state. Want to drive the signals yourself? See the Demo.
Concept, one monkey at a time
Every Ciggie Puff reacts to only the market signals its traits are wired to — that's what makes each one unique. Below, a handful of monkeys each with its own controls: move a monkey's sliders to see exactly what drives it, and nothing else.
Find a monkey
By token number (#1234), by name (Chad Marlborough), or by wallet address (account_…, stokenet holdings).
Connect your wallet
Connect the Radix Wallet to see the Ciggie Puffs in your account. It's read-only — we only read which monkeys you hold; we never ask to move anything.