Stained Unravel — Blockade (token 8)
Read 2026-10-15 from harm.work/nft/stained-unravel/8 and from the token's on-chain tokenURI. Wiki page: Stained Unravel.
Token
| Field | Value |
|---|---|
| Name | Blockade |
| Token ID | 8 |
| Contract | 0x16c58b6f006d26226be8c1857f1cf93b92a75b60 (Ethereum mainnet) |
| Created | 2026-05-15 |
| Partner | Nguyen Wahed × Interface Gallery |
| Image | ar://ELz7zq3YcWva-Z3qPF65WE8bJVEB94nXk_KfxAabHWI (Arweave); harm.work copy at https://harm.work/images/stained-unravel/Stained-Unravel--08.png, 1984 × 1984 px |
| Animation | on-chain HTML page; the program is a base64 string of gzip-compressed JavaScript, unpacked in the browser with DecompressionStream and selected by window.__TOKEN_ID__=8. Off-chain mirror: https://stained.harm.work/8 |
On-chain description (verbatim)
Stained Unravel by Harm van den Dorpel, 2026.
7 + 1 MP tokens
Seven, the series proper, released together — Spring, Game, Night, De Stijl, Stained, Markov's Dream, Mother of Pearl. The series premiered at Nguyen Wahed × Interface Gallery.
The eighth, Blockade, is marked apart as a Museum Proof (MP) — a commissioned work made in response to Herbert W. Franke's Move (Blockade) (1991–94). First shown inside Apple's European Chip Design Center, curated by Margit Rosen, Head of Collections, Archives & Research at ZKM Center for Art and Media Karlsruhe.
harm.work listing (verbatim)
AP in response to the work 'Move (Blockade)' by Herbert W. Franke (1991)
Fully on-chain, by Harm van den Dorpel, 2026
The harm.work listing calls the token an AP and dates Franke's work 1991; the on-chain description calls it a Museum Proof and dates Franke's work 1991–94.
The Blockade preset (verbatim from the decompressed program)
{name:"Blockade",gradients:[[[255,255,255],[0,0,0]],[[0,0,0],[255,255,255]],[[255,146,0],[142,111,26]],[[255,255,255],[255,146,0]],[[255,0,255],[0,0,0]],[[0,0,170],[0,0,255]],[[0,0,0],[0,0,0]],[[0,0,0],[0,146,0]],[[255,255,255],[255,0,255]]],background:[0,0,0],settings:{fps:90,shapeMorphSpeed:.002,postSaturationBoost:1.4,transitionSpeedDiv:1,fadeSpeed:.001,colourEasing:317,ageColourShift:290,automatonChange:10,columnsDivisor:6,presetRandomRatio:0},disabledRuleIndices:[1,3,5,6,7,8,14,15,16,17,18,19,32,33,34,35,36,37,38,40,42,44,45,46,47,48,52,53,20,21,23,29,27,26,25,24,4,10,31,49,30,58,56,51,57,59,60,50,43]}
For comparison, the Spring preset, whose rule list and timing the other six series tokens share:
{name:"Spring",gradients:[[[255,0,0],[0,0,255]],[[255,255,255],[197,143,44]],[[0,0,0],[255,255,255]],[[120,204,203],[255,204,200]]],background:[179,179,179],settings:{fps:60,shapeMorphSpeed:.005,postSaturationBoost:2,transitionSpeedDiv:25,fadeSpeed:.01,colourEasing:100,ageColourShift:600,automatonChange:10,columnsDivisor:4,presetRandomRatio:.5},disabledRuleIndices:[66,65,64,63,62,61,60,59,58,57,56,55,54]}
Settings of all eight presets
| Token | Ground | fps | shapeMorphSpeed | colourEasing | ageColourShift | columnsDivisor | postSaturationBoost | presetRandomRatio | rule-sets in pool |
|---|---|---|---|---|---|---|---|---|---|
| Spring | 179,179,179 | 60 | .005 | 100 | 600 | 4 | 2 | .5 | 54 |
| Game | 0,0,0 | 60 | .005 | 100 | 600 | 6 | 1.5 | .5 | 54 |
| Night | 0,0,0 | 60 | .005 | 100 | 600 | 6 | 1.5 | .5 | 54 |
| De Stijl | 226,214,214 | 60 | .005 | 100 | 600 | 7 | 1.5 | .5 | 54 |
| Stained | 210,205,183 | 60 | .005 | 100 | 600 | 6 | 1 | .5 | 54 |
| Markov's Dream | 176,176,176 | 60 | .005 | 100 | 600 | 6 | 2 | .5 | 54 |
| Mother of Pearl (preset name in code: "Ice") | 179,179,179 | 60 | .005 | 299 | 600 | 5 | 1.7 | .5 | 54 |
| Blockade | 0,0,0 | 90 | .002 | 317 | 290 | 6 | 1.4 | 0 | 18 |
transitionSpeedDiv and fadeSpeed are set in every preset but not read anywhere else in this build of the program. automatonChange is 10 in all eight.
How the program uses these settings
presetRandomRatiois the probability that, at each reconfiguration, the automaton generates a random rule-set instead of picking one of the curated rule-sets left in its pool. At 0, Blockade only ever uses curated rules.disabledRuleIndicesremoves curated rule-sets from the pool. The program carries 67. The seven series tokens disable indices 54–66, leaving 54. Blockade disables 49, leaving 18.fpsis the frame rate the timing is written for. The program measures the real frame rate and scales every per-frame step by target ÷ measured, so on a 60 Hz screen a 90-fps preset takes one and a half times larger steps per frame.ageColourShiftis how far a cell's "unmoved" counter must run before its colour target reaches the end of its gradient. The counter grows by 4 per target frame: about 0.8 s at Blockade's settings, 2.5 s at the series settings.colourEasingdivides how far the displayed colour moves toward that target each frame. In real time its lag is roughlycolourEasing ÷ fpsseconds: 1.7 s for most of the series, 5.0 s for Mother of Pearl, 3.5 s for Blockade.shapeMorphSpeed× 4 × fps is how far a cell's quad moves toward its next shape per second: 1.2 for the series, 0.72 for Blockade.columnsDivisorsets cell size: the number of columns is the screen width divided by it.
Rule-sets in Blockade's pool
Kept from the shared pool (10): Rings, tokens, Confetti, Another 2, Simple, Flippy, block 1, block 2, new cross, xmas.
Used by no other token (8): Herb Cube 1, Herb Cube 2, Herb xj, herb switch, horse 1, horse 2, horse 4, something pretty.
Five more rule-sets that no token uses sit in the same disabled block: Herb 3, herb 4, herb float, herb float 2, herb float 5.
In the eight Blockade-only rule-sets, 65% of the cell kinds named in conditions and results are kind 9, the full square (72% counting kind 10, the diamond). In the 54 rule-sets of the series pool kind 9 is 14%; corner triangles (kinds 1–4) dominate there at 42%. Herb Cube 1, verbatim:
{name:"Herb Cube 1",rules:[{conditions:[{n:[0,2],value:9}],result:9},{conditions:[{n:[2,0],value:9}],result:9},{conditions:[{n:[-2,0],value:9}],result:9},{conditions:[{n:[-1,0],value:9}],result:0}]}
Offsets are [column, row], rows counting downward, and the first matching rule wins. A cell becomes a full square when the cell two rows below, or two columns to either side, is a full square. Failing that, it goes empty when the cell directly to its left is a full square.
Palette
Ground rgb(0,0,0). Nine gradients, start → end:
- 255,255,255 → 0,0,0
- 0,0,0 → 255,255,255
- 255,146,0 → 142,111,26
- 255,255,255 → 255,146,0
- 255,0,255 → 0,0,0
- 0,0,170 → 0,0,255
- 0,0,0 → 0,0,0
- 0,0,0 → 0,146,0
- 255,255,255 → 255,0,255