Every flame is a fractal flame drawn live in your browser by one shared program on Bitcoin. Nobody picks a flame's shape, and nobody knows its colours or rarity until its block is mined. Here's how each piece works.
A flame inscription is tiny, about 215 bytes. It holds no picture and no seed, just one line that loads the renderer:
<script data-mint src="/content/<renderer inscription>"></script>
The renderer is a separate inscription, about 36 KB of JavaScript, inscribed once and shared by every flame. When anyone opens a flame, the renderer runs in their browser. It asks the ordinals server about the flame itself using recursive endpoints (/r/inscription, /r/blockinfo, /r/tx, /r/block), then draws it. Everything it uses is already on Bitcoin, so the flame needs no outside server to exist.
A flame's shape comes from its seed, and the seed is the flame's own inscription ID, such as 6d729aec…17c93i0. That ID is the ID of the reveal transaction that creates the inscription, plus i0. It doesn't exist until the mint transaction is made, so nobody, including the minter, can choose it ahead of time.
Not every ID makes a good flame. About 4 in 5 produce one that's too sparse, too crowded, or collapses into clumps partway through its loop. So when the site builds your reveal, it tries a few versions of that transaction until the ID passes a quality check:
The versions differ only in a field called the sequence number. It's part of the transaction ID, but it doesn't change the fee, the outputs or when the transaction can confirm. The site takes the first one that passes, usually within a handful of tries. You don't pick among them, and neither does anyone else.
The check runs once, when minting, and never again when viewing. Browsers do floating-point maths very slightly differently, and an ID near the borderline could pass in one browser and fail in another. Checking once at mint time means every viewer sees exactly the same flame.
These IDs are random stand-ins; a real mint's ID comes from its reveal transaction. "Confirm in a random block" places the flame in a made-up mainnet block, so you can see how its block sets the rest.
A fractal flame is the shape you get by moving a point over and over through a few randomly chosen functions and recording everywhere it lands. Scott Draves invented the technique for the flam3 program and the Electric Sheep screensaver.
On phones or browsers without WebGL2, a CPU version draws the same image more slowly. In marketplace grids, each small flame does less work so many can play at once.
Exports. Holders can export a flame or chain they own from its viewer in the gallery: a profile picture, a 4096 px 16-bit still, a GIF or a 60 fps video. Exports use the same drawing at far higher quality: hundreds of samples per pixel instead of a few, supersampling, motion blur between frames, and no screen dither. They render on your own device, so the largest take minutes.
The seed fixes the shape. Everything else, the colours, motion and rarity, comes from where the mint lands: the block it confirms in and its position there. Until it confirms, a flame plays in silver as Unrevealed.
| From the chain | What it sets |
|---|---|
| Block hash | The palette. Also half of the flame's luck: how far the hash came in under the block's difficulty target. The luckiest 1 in 32 blocks give a Lucky Hash and the luckiest 1 in 1,024 a Blessed Hash, both with a neon palette. |
| Position in the block | The other half of the luck: closeness to the block's sweet spot (below). Landing right on it is a Bullseye. Position also gives a name (Genesis, Vanguard, Early, Mid-block, Late, Rearguard, Last Light) and the tempo: earlier in the block means a slower loop. |
| Block height | The background tint, which changes every halving epoch. Special heights are named in the traits: a halving block gets the gold palette and a palindromic height a mirror. They don't change the tier, since anyone can time a mint into a chosen block. |
| The sat it's inscribed on | Rare sats add rotational symmetry (an uncommon sat 2-fold up to a mythic sat 6-fold), and palindrome sats a mirror. They don't change the tier, since rare sats can be bought. |
Miners roughly order a block by fee rate, so if rarity came from being first or last in a block, people could pay their way to it. Instead each block has a sweet spot, a position picked from the block's own hash. That hash doesn't exist until the block is mined, so no fee rate can aim for it. Distances wrap around the block's ends, so the first and last transactions are neighbours. That way every position has exactly the same odds.
Each half of the luck is a fair 0-to-1 chance: the share of the block at least as close to the sweet spot, and the hash's share of its target. A flame's luck is −ln(position share) − ln(hash share). The odds of any luck score are then known exactly, P(luck > x) = (1 + x)·e−x, so the tier cut-offs are set to give this split on mainnet:
| Tier | Share of mints | Look |
|---|---|---|
| Common | 60% | Base glow and density |
| Uncommon | 25% | More glow and denser sampling |
| Rare | 10% | Brighter still |
| Epic | 4% | Adds a fisheye "lens" transform |
| Legendary | 1% | Adds palette cycling |
A simulation of a million mints using real mainnet block sizes and difficulty gave 59.8 / 25.1 / 10.1 / 4.1 / 1.0, the same whether a mint landed first in its block, last, or anywhere between. Rare sats and special heights change the look, never these odds. Click a flame, or press i, to see its traits, including the odds of its placement ("1 in 340"). See every trait, its values and how it's granted →
Most wallets can send bitcoin but can't inscribe. So minting uses two transactions, commit and reveal, and your wallet only has to make an ordinary payment.
<script data-mint …> line, inside an "ord" envelope. Those two together give a Taproot address that can only be spent by revealing that exact inscription. The key is saved in your browser before any money moves.i0 is your flame's inscription ID, and its seed.The flame lives on the first sat of output 0, which lands in your wallet like any other inscription. If the page is closed between the commit and the reveal, the saved one-time key lets you finish from "In progress" on the minting page. Nobody else ever holds your keys or your bitcoin.
Bitcoin doesn't stop anyone inscribing the same one-line file with another tool. The renderer decides which flames are official, and it checks every flame when drawing it:
A flame that fails either check plays in silver as Unofficial, with no traits. A flame minted through another tool also skips the reveal search from section 2, so it's usually a weak flame too.
Chains have their own, much smaller creator fee (section 7).
A chain is a separate inscription that plays several flames one after another. Each flame spins through its loop, then morphs smoothly into the next, and the last morphs back into the first. Like a flame, a chain holds no images, only a list:
<script data-chain="<flame ID>,<flame ID>,<flame ID>" data-transition="6" src="/content/<renderer inscription>"></script>
data-chain lists flame inscription IDs in playing order, and data-transition is the length of each morph in seconds. Each extra flame adds about 67 bytes, so even a long loop costs little to inscribe.
Each time a chain is opened, the renderer:
A flame finishes its spin exactly where it started, so every morph begins from a resting shape and the whole loop has no visible seam. Click a playing chain, or press i, to see which flame is on screen, its traits, and how many of the chain's flames its holder owns. Every official chain is listed in the gallery under Chains.
The fractal flame algorithm was invented by Scott Draves, and developed with Erik Reckase in flam3, the program behind Electric Sheep. flame-btc's renderer is a new implementation of that algorithm for the browser. It follows flam3's variation numbering, its "log" interpolation for morphs and its way of developing the image. flame-btc is not affiliated with or endorsed by the flam3 or Electric Sheep projects.
| Part | License | What it lets you do |
|---|---|---|
| Software: the renderer, this site and its tools | GNU GPL v3.0 or later | Use, study, change and share it, as long as anything you distribute that's built from it stays under the GPL with its source available. flam3 itself is GPL v3 or later. |
| Artwork: the images and animations drawn for each flame and chain | CC BY-NC 4.0 | Share and adapt it for non-commercial purposes with credit ("flame-btc" and the flame's inscription ID) and a link to the license. Owning a flame lets you hold, display and transfer it; other commercial use needs the creator's permission. |
The inscribed renderer is a minified build of onchain/renderer.js; its first line names both licenses and this credit. The signing and inscription code bundled into the site (@scure/btc-signer, micro-ordinals, @scure/base) and the export encoders (gifenc, mp4-muxer, webm-muxer) are MIT-licensed.