[
  { "id": "seam-extractor", "name": "SEAM EXTRACTOR", "codex": "4:seam-extractor", "kind": "extractor",
    "footprint": { "x": 2, "y": 2 },
    "recipes": ["extract-mdat", "extract-bayer-grit", "extract-field-splinters", "extract-silver-frames"],
    "powerDraw": 2, "asset": "seam-extractor", "color": "#8a7a32", "accent": "#48d6ff",
    "flavor": "The miner. Chews mdat seams and spits raw payload. The drill head is CRT-certified. Operators are not." },

  { "id": "belt", "name": "STREAM BELT", "codex": "4:belts", "kind": "belt",
    "footprint": { "x": 1, "y": 1 }, "recipes": [], "powerDraw": 0, "beltSpeed": 2,
    "asset": "belt", "color": "#4a4e52", "accent": "#5ad0ff",
    "flavor": "Moves cargo. Back-pressure is a feature. Riding the belt is discouraged in writing and in no other way." },
  { "id": "lane-splitter", "name": "LANE SPLITTER", "codex": "4:demuxer", "kind": "splitter",
    "footprint": { "x": 1, "y": 1 }, "recipes": [], "powerDraw": 1,
    "asset": "lane-splitter", "color": "#55595e", "accent": "#5ad0ff",
    "flavor": "One lane in, two lanes out, round-robin, no favourites. The only fair machine in the Bitstream." },
  { "id": "buffer-tank", "name": "BUFFER TANK", "codex": "2:buffer-charge", "kind": "buffer",
    "footprint": { "x": 2, "y": 2 }, "recipes": [], "powerDraw": 0, "bufferCap": 300,
    "asset": "buffer-tank", "color": "#5a6068", "accent": "#7fe0ff",
    "flavor": "Smoothness in a tank. Drains at exactly one frame per 16.6ms. Keep it above the red line; below the red line the audio has opinions." },

  { "id": "demuxer", "name": "DEMUXER", "codex": "4:demuxer", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["demux-ore", "demux-container"], "powerDraw": 3,
    "asset": "demuxer", "color": "#4e5a62", "accent": "#ff3fd4",
    "flavor": "The first splitter. Cleaves raw ore into brightness, colour, and pure directional intent." },
  { "id": "demosaicer", "name": "DEMOSAICER", "codex": "4:demosaicer", "kind": "crafter",
    "footprint": { "x": 3, "y": 2 }, "recipes": ["demosaic-rggb", "demosaic-vng4", "demosaic-stripes"],
    "powerDraw": 5, "asset": "demosaicer", "color": "#6a5f52", "accent": "#4fffc4",
    "flavor": "Weaves checkerboard grit into full colour. Feed it stripes and it will jam and extrude MOIRÉ — as designed, as warned, as invoiced." },
  { "id": "dct-press", "name": "DCT PRESS", "codex": "4:dct-press", "kind": "crafter",
    "footprint": { "x": 3, "y": 3 }, "recipes": ["press-color-plate", "press-anchor-slab"],
    "powerDraw": 8, "asset": "dct-press", "color": "#3f4348", "accent": "#3fffe0",
    "flavor": "Spatial into frequency. Slams pixel blocks into coefficient decks; run it backwards and an entire picture falls out of the slot." },
  { "id": "quantizer", "name": "QUANTIZER", "codex": "4:quantizer", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["quantize", "quantize-crime", "skim-ringing"],
    "powerDraw": 4, "asset": "quantizer", "color": "#5e5148", "accent": "#ff3b57",
    "flavor": "The crusher, the moneymaker, the sin. Every bit it destroys becomes room to move. The dial goes to CRIME." },
  { "id": "subsampler", "name": "SUBSAMPLER", "codex": "4:subsampler", "kind": "crafter",
    "footprint": { "x": 2, "y": 3 }, "recipes": ["subsample-422", "subsample-420", "pan-speckle"],
    "powerDraw": 4, "asset": "subsampler", "color": "#4a5560", "accent": "#e04fc8",
    "flavor": "Spins colour down to grade and vents the difference as bandwidth. Leaks by design. Place downwind of anything you are fond of." },
  { "id": "mv-extractor", "name": "MV EXTRACTOR", "codex": "4:mv-extractor-and-p-caster", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["extract-motion"], "powerDraw": 5,
    "asset": "mv-extractor", "color": "#454b52", "accent": "#3fd8ff",
    "flavor": "Watches the footage until it knows where the picture wants to go, then pipes the wanting off as fluid." },
  { "id": "p-caster", "name": "P-CASTER", "codex": "4:mv-extractor-and-p-caster", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["cast-delta-wafer", "cast-janus-wafer"],
    "powerDraw": 4, "asset": "p-caster", "color": "#4d545c", "accent": "#6fa8ff",
    "flavor": "Prints instructions, not pictures. Each one is applied to whatever came before it — correct or otherwise." },
  { "id": "gop-assembler", "name": "GOP ASSEMBLER", "codex": "4:gop-assembler", "kind": "crafter",
    "footprint": { "x": 3, "y": 2 },
    "recipes": ["assemble-gop", "assemble-gop-ibbp", "assemble-gop-i-only", "spool-offset-ribbon",
                "tally-stsz-ledger"],
    "powerDraw": 6, "asset": "gop-assembler", "color": "#7a6a44", "accent": "#5fb0ff",
    "flavor": "One anchor, N wafers, one crate, per the cadence punch-card. Opening a sealed crate is a production verb here, not a crime." },
  { "id": "mosh-reactor", "name": "MOSH REACTOR", "codex": "4:mosh-reactor", "kind": "crafter",
    "footprint": { "x": 3, "y": 3 }, "recipes": ["mosh"], "powerDraw": 8,
    "asset": "mosh-reactor", "color": "#52333e", "accent": "#ff7a3f",
    "flavor": "A decoder sealed in a vessel and starved of anchors. The I-frame leaves through the side airlock. The hallucination leaves through the front." },
  { "id": "bloom-duplicator", "name": "P-FRAME DUPLICATOR", "codex": "4:bloom-loop", "kind": "crafter",
    "footprint": { "x": 1, "y": 1 },
    "recipes": ["tap-bloom", "bloom-grade-1", "bloom-grade-2", "bloom-grade-3", "bloom-grade-4", "bloom-grade-5"],
    "powerDraw": 6, "asset": "bloom-duplicator", "color": "#5a5060", "accent": "#ff9440",
    "flavor": "Stamps the same displacement onto the same cargo every lap. Grade 5 is visibly trying to leave its canister in one direction." },
  { "id": "field-loom", "name": "FIELD LOOM", "codex": "4:field-loom", "kind": "crafter",
    "footprint": { "x": 3, "y": 2 }, "recipes": ["weave-fields", "loom-vhold-roll"],
    "powerDraw": 5, "asset": "field-loom", "color": "#3f5a44", "accent": "#6ef58a",
    "flavor": "Weaves and unweaves time. The two halves of a splinter were captured a moment apart and have never agreed since." },
  { "id": "telecine-puller", "name": "TELECINE PULLER", "codex": "4:telecine-puller", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["mill-judder", "wind-stts-metronome"], "powerDraw": 4,
    "asset": "telecine-puller", "color": "#6e5a38",
    "flavor": "Cranks 24 into 30 on a deliberately lumpy cam. Runs backwards as a purifier, which we do not discuss on site." },
  { "id": "hex-splicer", "name": "HEX SPLICER", "codex": "4:hex-splicer", "kind": "crafter",
    "footprint": { "x": 3, "y": 3 }, "recipes": ["splice-offsets", "chart-stco-map"], "powerDraw": 12,
    "coolPerTick": 0.001,
    "asset": "hex-splicer", "color": "#5a3a3a",
    "flavor": "Nudges the offsets a few bytes so the decoder fetches garbage. Keep its buffer fed, or it splices itself." },
  { "id": "mosquito-trap", "name": "MOSQUITO TRAP", "codex": "5:mosquito-swarms", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["bait-swarm"], "powerDraw": 3,
    "asset": "mosquito-trap", "color": "#2a2e24", "accent": "#a64fff",
    "flavor": "A bug-zapper shaped like a high-contrast edge — the one thing a mosquito swarm cannot resist. Bait it with fresh luma, collect what it catches, sell the catch to people who should know better." },
  { "id": "firewall", "name": "FIREWALL", "codex": "5:parity-mites", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["catch-mite"], "powerDraw": 4,
    "asset": "firewall", "color": "#31383f", "accent": "#3fff7f",
    "flavor": "A drawer that opens only inward, painted with a compliance seal the Bitstream never issued. A parity mite cannot leave a deviation uncorrected, and a forged checkmark IS a deviation — so it climbs in to fix the seal, and the drawer disagrees. Ships live, to buyers who never ask how it is still, faintly, trying." },

  { "id": "artifact-bottler", "name": "ARTIFACT BOTTLER", "codex": "2:science-packs", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 },
    "recipes": ["can-static", "mix-rec709", "mix-dci-p3", "mix-rec2020",
                "cut-sync-key", "bottle-container-pack", "forge-stss-keyring", "cut-ftyp-seal",
                "bottle-analog-pack", "bottle-spatial-pack", "bottle-temporal-pack"],
    "powerDraw": 4, "asset": "artifact-bottler", "color": "#566056", "accent": "#7fe0d8",
    "flavor": "Bottles the triptych. Contents are shelf-stable in the legal sense, i.e. no law has been written that mentions them." },

  { "id": "decode-asic", "name": "DECODE ASIC", "codex": "4:decode-asic", "kind": "power",
    "footprint": { "x": 2, "y": 2 }, "recipes": [], "powerDraw": 0, "powerGen": 20,
    "asset": "decode-asic", "color": "#b9bec4", "accent": "#8fe8ff",
    "flavor": "Cool, efficient, inflexible. Handles standard profiles and declines to imagine anything else. It will outlive you." },
  { "id": "software-decoder", "name": "SOFTWARE DECODER", "codex": "4:software-decoder", "kind": "power",
    "footprint": { "x": 2, "y": 2 }, "recipes": [], "powerDraw": 0, "powerGen": 100,
    "heatPerTick": 0.0033, "coolPerTick": 0.001,
    "asset": "software-decoder", "color": "#6e3a34", "accent": "#ff4a2a",
    "flavor": "Decodes ANYTHING, at any temperature. Five ASICs at full song, one third of the time. Throttles at 0.7, scrams at 1.0, screams throughout. The lag is the damage model." },
  { "id": "asic-cooler", "name": "ASIC COOLER", "codex": "2:heat", "kind": "power",
    "footprint": { "x": 2, "y": 2 }, "recipes": [], "powerDraw": 0, "powerGen": 5,
    "coolPerTick": 0.001, "coolRadius": 2,
    "asset": "asic-cooler", "color": "#a8b4bc", "accent": "#9fe8ff",
    "flavor": "Decodes a little and vents a lot. Stand beside it in summer. Do not stand beside it in the dark, when you can see what it is venting." },

  { "id": "matte-bath", "name": "MATTE BATH", "codex": "10:matte-bath", "kind": "crafter",
    "footprint": { "x": 3, "y": 2 }, "recipes": ["bathe-hard-matte", "bathe-feather"], "powerDraw": 5,
    "asset": "matte-bath", "color": "#5a4a4a",
    "flavor": "Footage in, hard mattes out, softness destroyed. A GHOST FEATHER fed in comes out a HARD MATTE and the machine does not apologize. One mistake ruins the reel." },
  { "id": "optical-printer", "name": "OPTICAL PRINTER", "codex": "10:optical-printer", "kind": "crafter",
    "footprint": { "x": 5, "y": 4 }, "recipes": ["print-composite", "print-blue-screen"], "powerDraw": 18,
    "asset": "optical-printer", "color": "#6a5a3a",
    "flavor": "The iron lung. A cathedral of bellows and lenses that splits footage into three colours and recombines them slightly wrong. It fringes everything it touches, and it is beautiful, and it is slow." },
  { "id": "chroma-keyer", "name": "CHROMA KEYER", "codex": "10:chroma-keyer", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 },
    "recipes": ["key-chroma", "key-hair", "key-semitransparent"], "powerDraw": 6,
    "asset": "chroma-keyer", "color": "#3a6a3a", "accent": "#4fff30",
    "flavor": "Cheap, fast, and thirty-year-old maths. Weeps GREEN SPILL from its seams. Chokes on hair. Do not show it anything semi-transparent; it will decide the pixel belongs to neither of you." },
  { "id": "roto-bench", "name": "ROTO BENCH", "codex": "10:roto-bench", "kind": "crafter",
    "footprint": { "x": 2, "y": 2 }, "recipes": ["roto-cutout", "roto-mixed"], "powerDraw": 2,
    "asset": "roto-bench", "color": "#6a5540",
    "flavor": "Converts anything to a cutout. Perfectly. Eventually. Twenty-four frames of pain per second of footage. When the automation fails the bench never does — it just costs your life instead." },
  { "id": "neural-keyer", "name": "NEURAL KEYER", "codex": "10:neural-keyer", "kind": "crafter",
    "footprint": { "x": 4, "y": 4 }, "recipes": ["neural-key", "neural-unmix"], "powerDraw": 240,
    "asset": "neural-keyer", "color": "#2a2a32",
    "flavor": "Trained on ten thousand synthetic ghosts, because reality could not teach it — you cannot film the answer. Perfect alpha through glass, chainmail and moving hair. You do not unlock this machine. You unlock the power plant it demands." },

  { "id": "archaeology-lab", "name": "ARCHAEOLOGY LAB", "codex": "6:tech-tree", "kind": "lab",
    "footprint": { "x": 3, "y": 3 }, "recipes": [], "powerDraw": 6,
    "asset": "archaeology-lab", "color": "#5a5548", "accent": "#ffc24a",
    "flavor": "Where the factory reads its own strata. Feed it bottled artifacts and it derives the codec that made them: downward for analog secrets, upward for newer sins. The coffee predates the Reel Beds." },

  { "id": "muxer", "name": "THE MUXER", "codex": "7:the-muxer", "kind": "crafter",
    "footprint": { "x": 5, "y": 5 }, "recipes": ["assemble-moov-brain", "mux-container"], "powerDraw": 40,
    "asset": "muxer", "color": "#6a7078", "accent": "#ff3fd0",
    "flavor": "The rocket. A launch gantry embracing a container built of nested boxes, innermost a brain of index tape-reels. It ships the whole file at once, and the file is your entire shipping history, and there is no second launch." },

  { "id": "shipper", "name": "SCREEN UPLINK", "codex": "7:the-muxer", "kind": "shipper",
    "footprint": { "x": 2, "y": 2 }, "recipes": [], "powerDraw": 5,
    "asset": "shipper", "color": "#46525e", "accent": "#ff5ad0",
    "flavor": "Composites whatever you hand it onto THE SCREEN. There is no undo. The absence of undo is the product." }
]
