{
  "slug": "lumen-logic",
  "languages": [
    "en"
  ],
  "exhibition": {
    "title": "Lumen & Logic",
    "subtitle": "Every work, hung across eleven rooms of a granary loft",
    "language": "en",
    "status": "current",
    "template": "/assets/templates/granary-loft.glb",
    "multiplayer": false
  },
  "artworks": [
    {
      "id": "adit",
      "title": "Adit",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/adit.webp",
      "description": "One cross-section, scaled about one point, over and over — a passage seen straight down its axis and drawn in pen. Each face of the section runs its own ladder in its own perpendicular distance from the vanishing point, so the spacing on every face is exactly uniform while the faces themselves lie at every angle: rungs across the walkway, verticals down the walls, shallow chevrons overhead, one pitch for all of them. Because two faces meeting at a corner sit at different perpendicular distances, their ladders land at different radii on the ray they share, and the mismatch grows linearly outward — so every seam in the picture is serrated, the corners herringbone rather than mitre, and nothing in the package ever draws a seam. One exponent carries the whole recession: at 0 the ladder is arithmetic and the sheet is a flat even ruling, at 100 it is geometric, at 200 the ring radii go as 1/n and the passage rushes away. Where the ladder would come out finer than the nib it stops, and the middle of the sheet closes on a small dark knot that is crowded lines over paper rather than a blot. Two inks, a wobbling nib whose neighbours meander with it into curtain folds, ragged ends that bunch black against the inked rails, and no wash, alpha, gradient, shadow or clip anywhere.",
      "texture": "/assets/lumen-logic/textures/adit.ktx2",
      "preview": "/assets/lumen-logic/previews/adit.webp",
      "card": "/assets/lumen-logic/cards/adit.jpg",
      "palette": [
        "#979594",
        "#7f7d7c"
      ]
    },
    {
      "id": "aerograph",
      "title": "Aerograph",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/aerograph.webp",
      "description": "A turning mass of spray-can cartoon marks on a fogged black ground. Every mark in the picture, including the opaque ones, is laid down by a single operator — an airbrush, meaning paint deposited as discrete droplets through a mask at a standoff — and standoff is the only softness control in the package: it sets the width of the cone, the size of the droplets that survive the flight and the dose that lands, all three at once, so a fog, a halo, a solid body and a hard keyline are four distances rather than four routines. Hard edges come from masking the cone against a shape and letting the grain run right up to the mask line; soft edges come from withholding the mask, so a halo is not drawn at all but is what remains of an unmasked pass after the opaque body is laid over its inner half, which is why halos stay correct at cusps and needle points. The composition is one turning field — rotation with a weaker radial drift about an off-centre core — and it does four jobs from one sample: where a mark sits, which way its long axis points, how big it is, and how thick the fog is there. Twelve archetypes hang off that field, nine of them the same swept skeleton at different spines and width profiles — pointed almond bodies, long tapering swooshes, asymmetric crescents, tight spirals, raked bands, tick-combs, bead trains, chevron runs and concentric arc stacks — plus rings, wedge fans and one asemic handwritten scrawl; the cartoon eye that dominates the picture is not a thirteenth archetype but four of the twelve stacked in register, so a seed is free to produce a canvas with no eyes in it. Contours are heavy and hand-weighted, and where a dark contour overhangs the ground it simply disappears into it. Colour comes from a slow spatial zone field so greens gather in one quarter and reds run through another, drawn off a luminance ladder sorted from whatever palette the studio hands over. The droplet field is laid twice, once under everything and once over everything, so the mist sits on the surface of the shapes as well as behind them. No gradient, no blur, no shadow, no lattice, no perspective and no legible text anywhere.",
      "texture": "/assets/lumen-logic/textures/aerograph.ktx2",
      "preview": "/assets/lumen-logic/previews/aerograph.webp",
      "card": "/assets/lumen-logic/cards/aerograph.jpg",
      "palette": [
        "#060c0c",
        "#321517",
        "#554a52",
        "#552028"
      ]
    },
    {
      "id": "aigrette",
      "title": "Aigrette",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/aigrette.webp",
      "description": "A full-bleed sheet of crimson strands, every one a smooth round-ended noodle with a pale crest down its middle and dark creases at its flanks, combed out of a single line field written in closed form as a sum of angle functions about a handful of singular points — the construction that describes the cores and deltas of a fingerprint or the whorls in hair. Because the field's charges may be half-integer, it can hold a knot where a few hundred strands converge and vanish, a loop core where they turn back through a half-turn in a chain of nested U-turns, and a delta where three flows meet in a dark seam, all on the same sheet and all combed by the same pass. Strands are grown one at a time, each seeded a spacing off the flank of the strand before it and each stopped the moment it comes within a shorter test distance of anything already on the sheet, so the sheet carries exactly as many strands as it has room for and the fact that a pencil holds its pitch while its radius grows ninefold is a consequence rather than a count. Every rounded tip in the picture is one of those stops and every scalloped front is a row of them; nothing anywhere is an outline. A strand is painted wider than the spacing that placed it, so paint order becomes depth: tips shingle across the bundle they stopped against, the creases are the flanks of the strand underneath showing past the strand on top, and the whole relief comes out of one ratio with no shadow, no transparency and no light. Colour is one hue and one ramp, dark in the knots and blush at the tips, and the total charge of the field decides what the rim does — an all-over bloom that runs off every edge, a single great arch, or near-parallel combing with the structure pooled in the middle.",
      "texture": "/assets/lumen-logic/textures/aigrette.ktx2",
      "preview": "/assets/lumen-logic/previews/aigrette.webp",
      "card": "/assets/lumen-logic/cards/aigrette.jpg",
      "palette": [
        "#9d2d33",
        "#b34047"
      ]
    },
    {
      "id": "algo-grid",
      "title": "Algo Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/algo-grid.webp",
      "description": "A configurable grid where each cell renders an independently seeded piece from a curated set of algorithms. Rows, columns, and gap are adjustable; the pool of algorithms used per cell can be toggled individually with select-all / deselect-all controls.",
      "texture": "/assets/lumen-logic/textures/algo-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/algo-grid.webp",
      "card": "/assets/lumen-logic/cards/algo-grid.jpg",
      "palette": [
        "#d6d6d6",
        "#c2c2c2",
        "#8f8f8f",
        "#a8a8a8",
        "#636363",
        "#3a3432"
      ]
    },
    {
      "id": "almagest",
      "title": "Almagest",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/almagest.webp",
      "description": "A celestial construction chart in fine silvery ink on deep ultramarine paper — a draughtsman's star-atlas plate built from the compass-and-straightedge vocabulary. A dense sunburst pencil of rays blooms at the centre inside concentric circles and pointed star crowns, while a constellation of satellite burst nodes — each a bright speck where many fine rays converge — is scattered in perfect mirror symmetry about the vertical axis and tied together by a web of straight chords that close into irregular polygons. Great compass arcs, some dashed or dash-dot, ripple in from the corners and edges; a thin rectangular frame and a full-height centre axis complete the plate. Four ink brightnesses and three dash styles give the drawing its layered, hand-constructed depth.",
      "texture": "/assets/lumen-logic/textures/almagest.ktx2",
      "preview": "/assets/lumen-logic/previews/almagest.webp",
      "card": "/assets/lumen-logic/cards/almagest.jpg",
      "palette": [
        "#2b499d"
      ]
    },
    {
      "id": "alpenglow",
      "title": "Alpenglow",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/alpenglow.webp",
      "description": "A flat-vector skyline at sunset, in which colour is a function of altitude rather than of the building. Slide a ruler across the picture and every lit surface on the line is the same orange and every shaded one the same slate, whichever tower each belongs to: there are four gradients per depth, each spanning the whole skyline band, and every facade in the city is painted with one of them, so same-altitude-same-colour is not attempted but unavoidable. Both ramps end at the street, which fuses the bases of the whole cluster into one mass. The projection is a pure elevation with no receding face anywhere, so the narrow shaded band down a tower is one rectangle split off by a vertical cut rather than a second face, and depth is occlusion plus a mix toward the sky rather than a camera. Windows are a step off the same ramp, which is why they fade out at the street without anything fading them. Buildings are stacks of setback masses under a crown — flat, stepped, chamfered, spired, domed or notched — dressed in dot matrices, hairline banding, fluting, diagrids or panes on a window grid whose rows are global, so neighbouring towers line up. Still water below carries a squashed, detail-free reflection that fades out downward.",
      "texture": "/assets/lumen-logic/textures/alpenglow.ktx2",
      "preview": "/assets/lumen-logic/previews/alpenglow.webp",
      "card": "/assets/lumen-logic/cards/alpenglow.jpg",
      "palette": [
        "#709bd4",
        "#8486a8",
        "#5f4662",
        "#2a304a"
      ]
    },
    {
      "id": "anemone",
      "title": "Anemone",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/anemone.webp",
      "description": "A radial filament burst erupting from a cellular heart, reproduced from a reference painting. Hundreds of hair-thin, pale strands fan out from just inside a central disc toward the corners — each bending with a steady curl that grows downstream and shivering with a faint wave, tapering from a soft root to a wispy tip. The strands are drawn additively so where they overlap they glow white-hot, like the pappus of a dandelion clock or the tentacles of a sea anemone. At the centre, a dense organic mosaic of jittered polygon cells — packed on a hex lattice and clipped to a ragged disc — forms a scaly, jewel-toned seed-head of greens, teals, blues, reds and gold, deepening toward its core and freckled with tiny gold seed-dots. The whole sits on a hand-mottled earthy ground dusted with fine gold glitter. Deterministic from a seed, defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/anemone.ktx2",
      "preview": "/assets/lumen-logic/previews/anemone.webp",
      "card": "/assets/lumen-logic/cards/anemone.jpg",
      "palette": [
        "#231e19",
        "#3a342e",
        "#504c3e"
      ]
    },
    {
      "id": "aperture",
      "title": "Aperture",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/aperture.webp",
      "description": "One pencil of concentric rings, and the seed decides where each ring is cut. Every ring is a track of equal angular segments set at a random phase: each segment is either filled with the next colour of the palette or left open to the ground. Runs of kept segments merge into long arcs and the dropped ones open the iris, so the same six numbers give a disc that reads as an emblem, a dial, or a shattered halo depending only on the seed. Ring weights vary within one image because each ring fills only part of its own track, and outer rings carry more segments than inner ones. Flat fills, no strokes, no blending — legible at thumbnail size and identical in construction at print resolution.",
      "texture": "/assets/lumen-logic/textures/aperture.ktx2",
      "preview": "/assets/lumen-logic/previews/aperture.webp",
      "card": "/assets/lumen-logic/cards/aperture.jpg",
      "palette": [
        "#dfdacc",
        "#bbbdb5",
        "#f9f5f0"
      ]
    },
    {
      "id": "apollonian",
      "title": "Apollonian Gasket",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/apollonian.webp",
      "description": "An Apollonian gasket: three mutually tangent circles inside a bounding circle, with every curvilinear gap recursively filled by its unique inscribed tangent circle. Curvatures obey Descartes' Circle Theorem k₄ = k₁+k₂+k₃ ± 2√(k₁k₂+k₂k₃+k₃k₁) and centres its complex extension, so the whole fractal packing is forced by a closed-form equation. Discs are shrunk by a paper gap and coloured by recursion depth, size or angle.",
      "texture": "/assets/lumen-logic/textures/apollonian.ktx2",
      "preview": "/assets/lumen-logic/previews/apollonian.webp",
      "card": "/assets/lumen-logic/cards/apollonian.jpg",
      "palette": [
        "#dbdad6",
        "#8b939a",
        "#717a89",
        "#1d3558",
        "#98adb6"
      ]
    },
    {
      "id": "arc-hatch",
      "title": "Arc Hatch",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/arc-hatch.webp",
      "description": "A hand-inked plate of long smooth curves that cross each other and are engraved face by face. A heavy wobbled rectangle borders the sheet, and inside it a dozen or more curves — open sweeps that enter one edge and leave another, large circles and ellipses mostly bigger than the plate, and soft multi-lobed loops — run their full length over the top of one another with no trimming and no occlusion, so the drawing is a flat arrangement rather than a stack. Every area the curves cut out of each other is filled with its own pencil of dead straight parallel hatch lines, clipped hard at the curved boundary, so curved edges and ruled infill play against each other everywhere. Tone is line spacing and nothing else: a face is bare paper, open hatch, tight hatch, or two pencils crossed at ninety degrees that mesh toward black — there is no grey ink, no wash and no shading within a face. Only a handful of hatch directions exist across the whole sheet and unrelated faces reuse them, so the plate reads as one hand working through a fixed set of wrist angles. Every line is walked as short tremulous segments that bow slightly, stop a hair short of the boundary or overshoot it, and vary in weight along their run. The arrangement lays out as a weave, a set of nested rings, a one-way cascade or a vortex about a single focus, on bare paper with a wide margin.",
      "texture": "/assets/lumen-logic/textures/arc-hatch.ktx2",
      "preview": "/assets/lumen-logic/previews/arc-hatch.webp",
      "card": "/assets/lumen-logic/cards/arc-hatch.jpg",
      "palette": [
        "#eae5d9"
      ]
    },
    {
      "id": "arch-panels",
      "title": "Arch Panels",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/arch-panels.webp",
      "description": "An irregular grid of flat-colour panels inside a rounded stadium frame, most carrying one large soft quarter-circle disc or rising arch in a second muted colour, with the outer-corner panels nesting their arcs concentrically inside the frame corners. A calm mid-century-modern gouache abstraction in a dusty palette.",
      "texture": "/assets/lumen-logic/textures/arch-panels.ktx2",
      "preview": "/assets/lumen-logic/previews/arch-panels.webp",
      "card": "/assets/lumen-logic/cards/arch-panels.jpg",
      "palette": [
        "#b3a688",
        "#6997b7",
        "#d59640",
        "#edb184",
        "#979761",
        "#3b3936"
      ]
    },
    {
      "id": "argus",
      "title": "Argus",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/argus.webp",
      "description": "A knotted mass of paint on woven linen: broad magenta ribbons looping around two centres, flat cobalt plates with hard faceted silhouettes ruled inside with fine parallel lines, white combing lying square across the ribbons, and stylised eyes hidden in the tangle. There is one construction behind all of it — the pencil of circles through two points, together with its orthogonal family of Apollonius circles — and every mark is an arc of one of a handful of such pencils or the region between two of them, so nothing on the sheet is a Bézier, an offset polygon or a sampled curve; a thumbnail and a full-size export are the same circles. Because the map ζ = log((z−A)/(z−B)) is conformal, the two families cross at right angles everywhere, so hatching stands square to the band it rules and lashes stand square to the lid they leave, and no normal is computed anywhere in the algorithm. Because its scale factor is a/(cosh ξ − cos η), a band of constant width in the chart tapers on the sheet by coth²(ξ/2) between its belly and its tail — so one number takes a stroke from an even ribbon to a whip that starves to a point, no width profile is ever written, and every stroke is thinnest where it crosses between the two whorls, which is what gives the mass its waist. The same factor spaces the ruling, so hatching tightens exactly where a stroke narrows. Ribbons are translucent and multiply where they cross, so the deepest plums in the picture are crossings rather than palette entries, while the plates are opaque and read as cut paper on top. An eye is not drawn as an eye but built as a pencil the size of a thumbnail: its lids are two arcs cusped at the corners, its lashes are members of the orthogonal family, and its gaze rides the axis between them. The linen is a real plain weave — two dashed families a half-pitch out of phase, so exactly one thread is drawn at every crossing — laid over the paint rather than under it, and the light in the sheet is the bands themselves dilated and painted pale.",
      "texture": "/assets/lumen-logic/textures/argus.ktx2",
      "preview": "/assets/lumen-logic/previews/argus.webp",
      "card": "/assets/lumen-logic/cards/argus.jpg",
      "palette": [
        "#bfadb2",
        "#a686a3"
      ]
    },
    {
      "id": "asemic-scrawl",
      "title": "Asemic Scrawl",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/asemic-scrawl.webp",
      "description": "An all-over field of looping, cursive \"asemic\" scribbles in the automatic-drawing tradition. The whole sheet is packed edge-to-edge with continuous curved strokes in bright pen and brush colours — navy, red, green, gold, orange, sky-blue and magenta — each a curvature-momentum random walk that coils into loops and knots, drawn under a multiply blend so crossings deepen. A few long sweeping strands cross the sheet corner to corner and a handful of loose circular halos glow like little suns among the tangle, over a bright warm-white ground.",
      "texture": "/assets/lumen-logic/textures/asemic-scrawl.ktx2",
      "preview": "/assets/lumen-logic/previews/asemic-scrawl.webp",
      "card": "/assets/lumen-logic/cards/asemic-scrawl.jpg",
      "palette": [
        "#f5ede0"
      ]
    },
    {
      "id": "astral-vault",
      "title": "Astral Vault",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/astral-vault.webp",
      "description": "A hand-drawn visionary mandala in white and grey ink on black: a chamfered hexagonal reliquary of nested ornamental frames — chip rows, chevrons, ladder rungs, checkers — encloses a warped-mesh portal, a ribbed ceiling fan and a glowing central eye. Mirrored machine ornaments (ribbed cylinders, moiré lenses, ziggurat steps, contour-line tangles) flank the core, all set into a triangulated lattice that radiates to the canvas corners with per-triangle insets, subdivisions and hatching. Clusters of bright wireframe dodecahedra and geodesic balls gather near the corners, and organic root-tangles pool around a soft glow at the bottom. Every line wobbles like pen on paper, and ink brightness is tiered so the eye, core and polyhedra float above the dimming field.",
      "texture": "/assets/lumen-logic/textures/astral-vault.ktx2",
      "preview": "/assets/lumen-logic/previews/astral-vault.webp",
      "card": "/assets/lumen-logic/cards/astral-vault.jpg",
      "palette": [
        "#7b7c79",
        "#959490",
        "#656663"
      ]
    },
    {
      "id": "aurora",
      "title": "Aurora",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/aurora.webp",
      "description": "Luminous aurora borealis curtains sweep across a star-filled night sky. Layered noise-distorted waves in neon greens, purples, and cyans bloom against deep darkness using additive light blending.",
      "texture": "/assets/lumen-logic/textures/aurora.ktx2",
      "preview": "/assets/lumen-logic/previews/aurora.webp",
      "card": "/assets/lumen-logic/cards/aurora.jpg",
      "palette": [
        "#d2e3e6",
        "#214365",
        "#90a1c4"
      ]
    },
    {
      "id": "banded-pods",
      "title": "Banded Pods",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/banded-pods.webp",
      "description": "A dense quilt of overlapping rounded-rectangle pods, each filled with concentric marker bands cycling through a vivid spectrum and outlined in dark ink. Pods shingle over one another inside a ragged organic silhouette on white, echoing hand-drawn contour-blob art.",
      "texture": "/assets/lumen-logic/textures/banded-pods.ktx2",
      "preview": "/assets/lumen-logic/previews/banded-pods.webp",
      "card": "/assets/lumen-logic/cards/banded-pods.jpg",
      "palette": [
        "#797361",
        "#e1e0e4",
        "#bdb3b4",
        "#b09b96",
        "#d5cfbf",
        "#80958a"
      ]
    },
    {
      "id": "bauhaus-tiles",
      "title": "Bauhaus Tiles",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bauhaus-tiles.webp",
      "description": "A grid of geometric tiles inspired by Bauhaus and Memphis design, each cell randomly filled with one of: checkerboard, horizontal or vertical stripes, concentric quarter-circle arcs, bullseye rings, split rectangles, half-circles, staircases, or dot grids. Bold primary and accent palette colours give each composition a graphic, architectural quality.",
      "texture": "/assets/lumen-logic/textures/bauhaus-tiles.ktx2",
      "preview": "/assets/lumen-logic/previews/bauhaus-tiles.webp",
      "card": "/assets/lumen-logic/cards/bauhaus-tiles.jpg",
      "palette": [
        "#89617a",
        "#6f8a9a",
        "#52867e",
        "#ea645f",
        "#77825c",
        "#c47849"
      ]
    },
    {
      "id": "bead-curtain",
      "title": "Bead Curtain",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bead-curtain.webp",
      "description": "Dense parallel chains of spheres draped over an undulating surface defined by multi-octave sine waves. A directional light source shades each sphere with a radial gradient, producing chiaroscuro peaks and valleys that evoke draped fabric or a beaded curtain.",
      "texture": "/assets/lumen-logic/textures/bead-curtain.ktx2",
      "preview": "/assets/lumen-logic/previews/bead-curtain.webp",
      "card": "/assets/lumen-logic/cards/bead-curtain.jpg",
      "palette": [
        "#f1f1f1",
        "#dbdbd9",
        "#bbbcb7",
        "#7e7d77",
        "#a5a5a5"
      ]
    },
    {
      "id": "bead-maze",
      "title": "Bead Maze",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bead-maze.webp",
      "description": "A toy-like bead maze on a regular grid. Seeded random walks grow a black liquorice maze of rounded one-cell corridors — pill-capped dead ends, smoothly filleted elbows, T-junctions, occasional thick blobs and closed loops enclosing a single cell — with uniform white gutters keeping parallel runs apart. Every cell the maze does not claim receives one flat colored bead centered in the cell, in three crisp size tiers, drawn from a pop palette of teal, red, yellow, orange, pink and blue plus small ink-black beads. Flat opaque paint throughout — no outlines, no gradients, no texture.",
      "texture": "/assets/lumen-logic/textures/bead-maze.ktx2",
      "preview": "/assets/lumen-logic/previews/bead-maze.webp",
      "card": "/assets/lumen-logic/cards/bead-maze.jpg",
      "palette": [
        "#b2aca7",
        "#96928d",
        "#cac7c1"
      ]
    },
    {
      "id": "bevel-tiles",
      "title": "Bevel Tiles",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bevel-tiles.webp",
      "description": "A dense grid of rectangular tiles where each cell carries a diagonal highlight-to-shadow bevel gradient, creating a 3D relief illusion. Global color flows via bilinear interpolation across four palette corners, with an optional vertical split that maps cool and warm tones to separate canvas sections, producing a rich chromatic mosaic with emergent moiré interference.",
      "texture": "/assets/lumen-logic/textures/bevel-tiles.ktx2",
      "preview": "/assets/lumen-logic/previews/bevel-tiles.webp",
      "card": "/assets/lumen-logic/cards/bevel-tiles.jpg",
      "palette": [
        "#697080",
        "#5f97a6",
        "#84414a",
        "#ab6851"
      ]
    },
    {
      "id": "bifurcation",
      "title": "Bifurcation",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bifurcation.webp",
      "description": "The bifurcation diagram of the logistic map x → r·x(1−x): for every pixel column, fix r, iterate past the transient and histogram the orbit. One curve forks into 2, 4, 8… branches (the Feigenbaum cascade), dissolves into curtains of chaos and reopens in windows of order. Log-scaled density maps through the palette — periodic branches burn white-hot while chaotic mist stays faint. Zoom dives into the self-similar windows.",
      "texture": "/assets/lumen-logic/textures/bifurcation.ktx2",
      "preview": "/assets/lumen-logic/previews/bifurcation.webp",
      "card": "/assets/lumen-logic/cards/bifurcation.jpg",
      "palette": [
        "#0a0819",
        "#463339",
        "#7c4e52"
      ]
    },
    {
      "id": "biomorph",
      "title": "Biomorph",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/biomorph.webp",
      "description": "A dense pen-and-ink organism: a roiling mass of overlapping organic lobes, each hand-filled with its own texture — stipple shading, flowing contour lines, packed bubbles, concentric rings, or fine cross-mesh. Deep black voids and thin white veins thread between the lobes for a monochrome, hyper-detailed dotwork drawing.",
      "texture": "/assets/lumen-logic/textures/biomorph.ktx2",
      "preview": "/assets/lumen-logic/previews/biomorph.webp",
      "card": "/assets/lumen-logic/cards/biomorph.jpg",
      "palette": [
        "#e7e4dd",
        "#b2b0ab",
        "#75746f",
        "#cfcdc5",
        "#615f5b"
      ]
    },
    {
      "id": "biophilic",
      "title": "Biophilic",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/biophilic.webp",
      "description": "Tapered trunks and branches each terminate in a mathematically correct golden spiral (logarithmic, φ-based). Spiral start position is randomised — early or fully at the tip. Multiple trunks, random sub-branching at every level.",
      "texture": "/assets/lumen-logic/textures/biophilic.ktx2",
      "preview": "/assets/lumen-logic/previews/biophilic.webp",
      "card": "/assets/lumen-logic/cards/biophilic.jpg",
      "palette": [
        "#ddd6b2",
        "#c7bf80",
        "#a2a75d",
        "#a6b08d"
      ]
    },
    {
      "id": "bleu-coast",
      "title": "Bleu Coast",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bleu-coast.webp",
      "description": "A one-ink seaside screen-print poster: a whole coastal scene drawn in a single deep cobalt ink on cool off-white paper, where tone comes only from stroke density — scribbled maritime-pine canopies with paper gaps, striated dark trunks, a horizon of dashed sea over a pale shore wash, bare-paper paths crossed by parallel cast-shadow hatching, and spiky grass tufts. A single flat golden-yellow sun disc rests on the horizon, painted under the ink so canopies and sea dashes overlap it. Four seeded scene grammars — Pine Path, Dunes, Harbor and Cove — recombine a shared library of pines, pole trunks, cabins, lighthouses, jetties, boats and the signature leaning/fallen bicycles, so every seed reads as a sibling of the same hand in a different place. A widely letter-spaced caps caption with a seed-derived edition tag sits below the panel. Eleven params (seed, scene, trees, horizon, sun size, ink density, cast shadows, props, paper margin, title, subtitle) with a new shared Bleu Coast palette.",
      "texture": "/assets/lumen-logic/textures/bleu-coast.ktx2",
      "preview": "/assets/lumen-logic/previews/bleu-coast.webp",
      "card": "/assets/lumen-logic/cards/bleu-coast.jpg",
      "palette": [
        "#f5f4ef",
        "#c0c5de",
        "#a3abd6",
        "#6b87cd"
      ]
    },
    {
      "id": "block-burst",
      "title": "Block Burst",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/block-burst.webp",
      "description": "A swarm of extruded rectangular prisms exploding out of a single central vanishing point in one-point perspective. Each box is a flat, axis-aligned coloured square cap whose corners are pulled back toward the canvas centre by a per-box reach, so its two inner side walls stretch inward. Boxes with a near-full reach collapse onto the centre and read as thin wedges that weave a rainbow pinwheel where the beams meet, while shorter-reach boxes stay chunky cubes near the rim. Every box is shaded three ways — a lit cap, a mid inner wall and a deep shadow wall — and larger caps are painted last so they sit in front. Defaults to the Portrait canvas with the Block Burst palette.",
      "texture": "/assets/lumen-logic/textures/block-burst.ktx2",
      "preview": "/assets/lumen-logic/previews/block-burst.webp",
      "card": "/assets/lumen-logic/cards/block-burst.jpg",
      "palette": [
        "#974a89",
        "#b9a791",
        "#4c5b82",
        "#b0906b",
        "#c7c3b2",
        "#cc96bf"
      ]
    },
    {
      "id": "block-city",
      "title": "Block City",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/block-city.webp",
      "description": "A dense isometric metropolis of flat-colored box buildings. An occupancy grid is packed with buildings of varying footprints and heights, depth-sorted and drawn back-to-front with three flat faces — top, left and right — every edge traced in dark ink. Facades carry inset window panels: dense mosaics of small squares each filled with a random palette color, or a few large outlined panes. Blocks Across sets the grid scale, Max Height and Towers % shape the skyline, and Windows %, Mosaic Detail and Ink Weight dress the facades.",
      "texture": "/assets/lumen-logic/textures/block-city.ktx2",
      "preview": "/assets/lumen-logic/previews/block-city.webp",
      "card": "/assets/lumen-logic/cards/block-city.jpg",
      "palette": [
        "#94665f",
        "#ba5141",
        "#bf834f"
      ]
    },
    {
      "id": "blot-oracle",
      "title": "Blot Oracle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/blot-oracle.webp",
      "description": "A strictly two-tone poster figure on bone paper: one connected ink mass whose outline is not drawn but solved for. Discs, hard-cornered squares, triangles and round-capped capsules are posed on a seeded armature into a signed-distance field, fused by a smooth minimum so junctions fillet like poured metal where the blend is open and keep their hard corners where it is closed, then bitten into by subtracted circles that leave clean crescent scoops in the outline and clean round holes in the interior. The zero-contour of that field is traced by marching squares and filled even-odd as a single silhouette with no keyline anywhere. Behind the head a fan of straight hairline rays radiates from a point and is painted first, so the mass occludes their inner ends and every ray stops dead on the silhouette. Inside the ink, clipped hard to it, a sparse instrument diagram is engraved in the paper colour: open rings, solid dots, spoked asterisks, node-and-rod linkages with round joins, two-stroke arrows, short sine squiggles, nested chevrons, closed stadium tracks and long shallow sweeps — placed by rejection sampling so they never crowd, and cut off mid-stroke wherever they reach the edge. Two colours and no third: every light mark is the paper showing through. No outline, no gradient, no shading, no texture, no face.",
      "texture": "/assets/lumen-logic/textures/blot-oracle.ktx2",
      "preview": "/assets/lumen-logic/previews/blot-oracle.webp",
      "card": "/assets/lumen-logic/cards/blot-oracle.jpg",
      "palette": [
        "#eae5db",
        "#cecac0",
        "#a5a29a",
        "#33312c",
        "#4f4d48"
      ]
    },
    {
      "id": "bold-geo",
      "title": "Bold Geo",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bold-geo.webp",
      "description": "Overlapping diagonal colour bands, fan sectors, and solid circles in a flat Bauhaus-inspired style. Large shapes in vibrant palette colours layer over each other, creating bold geometric collages with no gradients.",
      "texture": "/assets/lumen-logic/textures/bold-geo.ktx2",
      "preview": "/assets/lumen-logic/previews/bold-geo.webp",
      "card": "/assets/lumen-logic/cards/bold-geo.jpg",
      "palette": [
        "#bf689e",
        "#a77d82",
        "#dc7668",
        "#8d3a8a",
        "#5e61af",
        "#2381c1"
      ]
    },
    {
      "id": "bornite",
      "title": "Bornite",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bornite.webp",
      "description": "An extreme macro photograph of a tarnished mineral crust, computed rather than shot. One population of iridescent flakes — cracked plates, tufts of hair-fine filament and specular points — is scattered through a shallow depth volume, and every colour in the picture comes from thin-film interference: a film thickness field sets the optical path difference, the wavelength-dependent reflectance is integrated against the CIE colour matching functions and converted to sRGB, so the plates band through Newton's series — gold, orange, magenta, violet, blue, cyan and back — instead of sampling a ramp. A tilted plane of focus and an aperture then do the rest of the work: elements are bucketed into depth slices, each slice is convolved with its own circle of confusion and composited back to front with occlusion, so a narrow diagonal band of the frame resolves into razor-sharp seams and everything else melts into broad banded masses, while defocused speculars open into rim-bright aperture discs. Nothing is painted soft; softness is what the lens does to sharp material.",
      "texture": "/assets/lumen-logic/textures/bornite.ktx2",
      "preview": "/assets/lumen-logic/previews/bornite.webp",
      "card": "/assets/lumen-logic/cards/bornite.jpg",
      "palette": [
        "#25282a",
        "#060b1d",
        "#3d3d3f"
      ]
    },
    {
      "id": "botanical-lsystem",
      "title": "Botanical L-System",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/botanical-lsystem.webp",
      "description": "Procedural plants from rewrite grammars: turtle-interpreted L-systems grow ferns, trees, bushes and weeds, while the Barnsley fern path uses a 4-map iterated function system. Angle jitter and per-depth tapering lend each run an organic, hand-grown feel.",
      "texture": "/assets/lumen-logic/textures/botanical-lsystem.ktx2",
      "preview": "/assets/lumen-logic/previews/botanical-lsystem.webp",
      "card": "/assets/lumen-logic/cards/botanical-lsystem.jpg",
      "palette": [
        "#efeedc"
      ]
    },
    {
      "id": "braid",
      "title": "Braid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/braid.webp",
      "description": "Interlocking ribbon artwork inspired by Celtic knots and chain-link patterns. Two bold solid-filled ribbons follow rose-curve paths, each flanked by many fine parallel echo lines that create a halo effect. The ribbons interweave, alternating over and under at crossing points.",
      "texture": "/assets/lumen-logic/textures/braid.ktx2",
      "preview": "/assets/lumen-logic/previews/braid.webp",
      "card": "/assets/lumen-logic/cards/braid.jpg",
      "palette": [
        "#f0ead8",
        "#e2bbad",
        "#d47b43"
      ]
    },
    {
      "id": "brigandine",
      "title": "Brigandine",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/brigandine.webp",
      "description": "A frontal colossus assembled from a couple of hundred flat plates of painted paper on bare cream, in the manner of a brigandine — armour of small plates riveted between cloth, one moving figure at a distance and an assembly of separately cut pieces up close. The composition is an armature: a tree of part boxes — a crest, a head, a shoulder yoke, a stack of chest registers, a pelvis, and per side a shoulder pad, an arm chain ending in a fist and a leg chain ending in a foot — laid out in one normalised figure frame, generated once for one side and reflected, with centre parts carved as a half and reflected onto themselves. The reflection copies polygons and nothing else: every plate is dealt its own colour and each side is dealt separately, so the picture is exactly mirror-symmetric in its geometry and not at all in its paint. There is one cutting operator — a convex polygon split by a straight chord — applied recursively inside each box until it holds its share of the plate budget or nothing may be cut again, so every plate is convex, the plates of a part tile it exactly, and every contour in the picture is a straight segment or a circle. A plate is a load rather than a fill: one flat colour, a weak lightness ramp in a direction of its own, and a fine isotropic mottle, with no shading model anywhere — the bevelled reading comes from the cut, never from a light. There is no outline and no grout: plates butt, and a cut edge is dealt one of three roles, so about one join in eight carries a narrow shim of ink or slips to show the paper through. Every plate large enough may carry hardware placed in its own frame against its own inscribed box — stripe runs, nested chevrons, rung ladders, concentric roundels, rivets, rimmed slots, tooth combs, windows and corner notches — drawn only if it fits, so nothing is ever clipped by its host. A foot is the whole operator recursed exactly once: a small hull with its own boxes, its own finer cut and its own vehicle hardware, so the machine is assembled out of machines. Nothing in the package knows what a face is: a small box at the top that happens to take a mirrored pair of items over a grille simply reads as a head, and a seed is free to produce a figure with nothing legible on it.",
      "texture": "/assets/lumen-logic/textures/brigandine.ktx2",
      "preview": "/assets/lumen-logic/previews/brigandine.webp",
      "card": "/assets/lumen-logic/cards/brigandine.jpg",
      "palette": [
        "#e5e3dc",
        "#cbc3c0",
        "#b0aeaf",
        "#848b89"
      ]
    },
    {
      "id": "bristle-burst",
      "title": "Bristle Burst",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bristle-burst.webp",
      "description": "A maximalist explosion of overlapping bristle-stroke shards. Each shard is a fan of hundreds of fine straight streaks radiating from a tight apex in one vivid hue; a noise-driven length profile — often quantized into stepped slabs — shapes the silhouette, per-streak jitter frays the edges into torn feathered fringes, and rare extra-long whiskers shoot across neighbouring shards. Per-bristle tonal jitter and scattered dark hairs give every wedge a shredded dry-brush texture; large shards underneath and small accents on top tile the whole canvas in a riot of violets, cyans, reds and golds.",
      "texture": "/assets/lumen-logic/textures/bristle-burst.ktx2",
      "preview": "/assets/lumen-logic/previews/bristle-burst.webp",
      "card": "/assets/lumen-logic/cards/bristle-burst.jpg",
      "palette": [
        "#644ca4",
        "#8a537f",
        "#bc4874",
        "#4671b7"
      ]
    },
    {
      "id": "broken-color",
      "title": "Broken Color",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/broken-color.webp",
      "description": "Abstract-expressionist palette-knife painting built from the broken-colour technique. Thousands of short, angular knife dabs are stamped in painter order, each taking a saturated palette hue that, with high probability, deviates from the slowly drifting regional colour — so red, blue, green and gold sit side by side and optically mix at a distance. A fraction of dabs are laid in metallic gold leaf. The accumulated paint thickness forms a height field; surface normals drive Blinn-Phong shading so overlapping knife ridges catch bright highlights while crevices fall into a dark underpainting, producing thick impasto relief. Gold dabs gain a broad, warm sheen that shimmers across the canvas.",
      "texture": "/assets/lumen-logic/textures/broken-color.ktx2",
      "preview": "/assets/lumen-logic/previews/broken-color.webp",
      "card": "/assets/lumen-logic/cards/broken-color.jpg",
      "palette": [
        "#8b7151"
      ]
    },
    {
      "id": "brush-flow",
      "title": "Brush Flow",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/brush-flow.webp",
      "description": "Interwoven serpentine brushstroke ribbons. A seeded value-noise field is read as an angle map — every point steers in a direction set by noise · swirl · 2π, so a high swirl makes the field coil and fold and neighbouring regions disagree sharply. From a jittered grid of seed points each stroke is integrated both forward and backward through the field, tracing long S-curved ribbons that meander and loop over one another. Each ribbon is painted as a thick base band overlaid with offset, tone-varied bristle sub-strokes for a dry-brush striation, in cycling crimson and tan hues biased by a warm-mix control. A few dark paint drips then dribble down the lower canvas.",
      "texture": "/assets/lumen-logic/textures/brush-flow.ktx2",
      "preview": "/assets/lumen-logic/previews/brush-flow.webp",
      "card": "/assets/lumen-logic/cards/brush-flow.jpg",
      "palette": [
        "#76493b"
      ]
    },
    {
      "id": "brush-kiss",
      "title": "Brush Kiss",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/brush-kiss.webp",
      "description": "A sinusoidal brush ribbon that scans vertically, each pass painting a thick overlapping stroke whose position follows a sine wave. Perlin-style amplitude and frequency variation breaks the mechanical regularity into a hand-painted quality. Colors interpolate continuously through the active palette from top to bottom, producing a layered gradient wash reminiscent of Nicolas Barkas's \"Brush Kiss — Layers\" series.",
      "texture": "/assets/lumen-logic/textures/brush-kiss.ktx2",
      "preview": "/assets/lumen-logic/previews/brush-kiss.webp",
      "card": "/assets/lumen-logic/cards/brush-kiss.jpg",
      "palette": [
        "#0b122b"
      ]
    },
    {
      "id": "bulge-grid",
      "title": "Bulge Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/bulge-grid.webp",
      "description": "A hand-drawn zentangle grid of square tiles. Woven op-art tiles fill with nested quadratic curves that share the cell corners — piling ink into radiating bursts at each grid vertex and fanning into four petals toward the centre — while sparser nested-triangle tiles open up airy negative space. A per-point wobble gives every stroke its pen-drawn wander.",
      "texture": "/assets/lumen-logic/textures/bulge-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/bulge-grid.webp",
      "card": "/assets/lumen-logic/cards/bulge-grid.jpg",
      "palette": [
        "#a8b0af",
        "#c9cdc7"
      ]
    },
    {
      "id": "burin",
      "title": "Burin",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/burin.webp",
      "description": "One family of fine lines on a dark plate, straight 45° hatching in the corners and swung round into vertical runs and terraced staircases where a shape the picture never draws disturbs them. There is one scalar field and one pen: the field is a linear ramp — the grating — plus a compactly supported bump over the element, and every line is an integer level set of it, so nothing anywhere is clipped, masked, offset or cut, and no line ends inside the frame. The whole behaviour of the picture is one dimensionless number, the relief number R, which is the bump’s slope measured against the grating’s: the maximum turn away from the base direction is asin(R), spacing runs between T/(1+R) and T/(1−R), and R < 1 is exactly the condition for the phase to have no critical points — which makes the family a foliation, so lines cannot cross, cannot branch and cannot close into islands. `Relief` is that number as a percentage of the bound and the amplitude is solved from it rather than set, which is why the knob sweeps end to end without ever tangling; the failure at the top is not crossing but splaying, since crowding is bounded at twice the base density while thinning is not bounded at all. Tone is spacing and nothing else — one ink, one width, no shading pass anywhere — and the terraces along one pair of sides and the smooth vertical runs along the other are the same turn seen ninety degrees apart. The element is a knob and every one of them is an exact Euclidean distance function, because it is |∇d| = 1 that turns the bound into a formula instead of a search: rounded square, disc, stadium, ring, hexagon, cross, or one per seed. The profile is a knob too — a plateau with a soft shoulder, a bevel that creases at both ends of its ramp, or a ridge that puts the welt on the outline and leaves the interior flat.",
      "texture": "/assets/lumen-logic/textures/burin.ktx2",
      "preview": "/assets/lumen-logic/previews/burin.webp",
      "card": "/assets/lumen-logic/cards/burin.jpg",
      "palette": [
        "#1a3f39"
      ]
    },
    {
      "id": "cable-urchin",
      "title": "Cable Urchin",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cable-urchin.webp",
      "description": "A dense disc of white patch cables packed edge to edge on black. Every cable is a constant-width round-section cord routed from one port on the rim to another by a turn-limited walk that steers against a shared occupancy grid — so cables keep an even gutter and never fuse — and against a slow flow field, so neighbours often run near-parallel for a stretch. A minority of cables are routed instead in crisp right-angle jogs with rounded elbows, as if cleated down. Every cable is painted casing-then-body — a wider stroke in the ground colour laid immediately under its own coloured body — cable by cable in routing order, so every crossing carries a hard keyline of bare ground and the mass of cord stays legible instead of fusing into a white blob. Both ends of every cable terminate at the rim in a drawn jack plug — a boot, a fat barrel, two banded rings and a domed tip — collinear with the cable at the joint and pointing outward along its own port axis, so the whole disc bristles with a spiked corona of connectors. The disc can pack as a plain even ball, hollow out into a ring around an open core, squash into a lens, or wobble into an amoeba, and a share of cables can be tinted from the palette in spatial clusters rather than staying strictly monochrome.",
      "texture": "/assets/lumen-logic/textures/cable-urchin.ktx2",
      "preview": "/assets/lumen-logic/previews/cable-urchin.webp",
      "card": "/assets/lumen-logic/cards/cable-urchin.jpg",
      "palette": [
        "#5a5a5a",
        "#1c1c1c",
        "#7c7f7e"
      ]
    },
    {
      "id": "camber",
      "title": "Camber",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/camber.webp",
      "description": "A full-bleed quilt of isometric blocks laid on a sheet that has been bent and cracked. Every mark in the picture is one rhombus of a single rhombille tiling whose vertices are integer points of a triangular lattice, grouped three to a hexagon so each block reads as a cube with a top, a left and a right face; because two rhombi that share a corner compute it from the same pair of integers, the tiling is closed by construction rather than by tolerance. A smooth two-octave displacement field then moves every vertex as a function of where it lands on the sheet, so rows bow and local scale drifts and no amount of bending can open a seam — and because the field is read in sheet coordinates it is one camber for the whole picture. Two or three straight faults cut that sheet into shards, and each shard carries the quilt with its own offset and its own fraction of a degree of turn: nothing is ever drawn along a fault, so the seam is only where one clip ends and the next begins and the rhombi on both sides are simply cut. Colour answers to two authorities that disagree. The deal — which face is left as paper, which ink it takes, which element the block is — is a pure function of the block's lattice coordinates, so it belongs to the quilt and slides with it across a crack, and because the ink index is linear in those coordinates the field is streaked with faint ribbons of one hue running along the lattice's own directions. The register those inks come from — a quiet palette that leaves half its faces white, or a hot one that leaves almost none — is a function of the block's position on the sheet, evaluated once at its centre, so a broad diagonal band of hot, dense colour runs straight through the faults the quilt jumps and its ragged edge never cuts a block in half. A block is filled five ways — the three rhombi of a cube, the same three lit from the other side so it reads as a socket, the hexagon as one flat slab, six triangles as a pinwheel, or each rhombus split on its long diagonal into a faceted gem — and every one of them fills the same hexagon, so the tiling stays closed whichever is chosen. Flat fills and one hairline of ink around every face: no gradient, no transparency, no blend mode, no shadow, no texture, no jitter, and nothing in front of anything else.",
      "texture": "/assets/lumen-logic/textures/camber.ktx2",
      "preview": "/assets/lumen-logic/previews/camber.webp",
      "card": "/assets/lumen-logic/cards/camber.jpg",
      "palette": [
        "#be9784",
        "#c37563"
      ]
    },
    {
      "id": "casbah",
      "title": "Casbah",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/casbah.webp",
      "description": "A hill town piled into one connected heap of flat-colour façades over a ground of hard-edged horizontal colour bands. A mound-shaped occupancy mask — a bulging waist, a stepped ragged skyline with one dominant peak, a foot that breaks up into stilts — is packed edge to edge by a greedy maximal-rectangle tiling, so every façade is cut from the same grid, no two neighbours can overlap or leave a gap, and the heavy constant-weight black contour web is the tiling itself rather than an outline drawn around anything. Each façade takes one flat opaque fill that no neighbour is allowed to repeat, and most take a grid of small white four-pane windows, a minority of them round-topped. Blocks whose top edge is exposed grow a roof plane over the façade behind them — a gable, a shed sheared sideways, an overhanging awning or a hip — ruled with black and white diagonal stripes at a pitch held constant across the sheet, so a large roof carries many bands and a small one carries three. The sky boundary of the same mask is read a second time to stand a register of monuments on the skyline — a dome on a drum with a finial, an arcaded lantern, a needle spire with a banded shaft, a steeple, a clock tower with a white face and two hands — and one wide arcade gate is reserved in the middle of the mass before packing, pierced by an odd number of round-arched openings that are repainted with the background bands so the ground shows straight through the town. Outside the silhouette a thin scaffold of near-vertical and near-horizontal rails crosses and overshoots itself, densest against the mass and thinning outward, drawn before the town so the town buries it, and dropping out of the foot of the heap as long legs. Every fill is opaque and flat: no perspective, no side faces, no shading, no gradient, no shadow and no texture, and the only depth cue in the picture is overlap.",
      "texture": "/assets/lumen-logic/textures/casbah.ktx2",
      "preview": "/assets/lumen-logic/previews/casbah.webp",
      "card": "/assets/lumen-logic/cards/casbah.jpg",
      "palette": [
        "#91575e",
        "#5a5a71",
        "#d9666e"
      ]
    },
    {
      "id": "caustics",
      "title": "Caustics",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/caustics.webp",
      "description": "Pool-floor light caustics from first-principles optics: a sum-of-sines water surface refracts a dense grid of vertical rays by Snell's law (η = 1/1.33); each ray is traced to the floor and accumulated into a density buffer. Where the curved surface focuses light the density spikes into the singular bright filaments of the caustic web, tone-mapped through the palette.",
      "texture": "/assets/lumen-logic/textures/caustics.ktx2",
      "preview": "/assets/lumen-logic/previews/caustics.webp",
      "card": "/assets/lumen-logic/cards/caustics.jpg",
      "palette": [
        "#1f74a9",
        "#0d4a85",
        "#368db8"
      ]
    },
    {
      "id": "cellophane",
      "title": "Cellophane",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cellophane.webp",
      "description": "A sheet of independent plates, each a handful of oversized hard-edged shapes laid down as translucent inks that multiply where they cross — so most of the colours in the finished picture are mixtures that no palette entry contains, and the picture is read through the stack rather than off the top of it. Every shape is far larger than its plate and is cropped by it, so half-planes, wedges, bands, discs, half- and quarter-discs, pointed lenses and capped tongues arrive as fragments rather than as objects. Straight edges are not free: each plate draws three to five directions and reuses them, and a share of them converge on one or two focus points, so a plate reads as designed rather than scattered. One keynote hue is chosen for the whole sheet and recurs in most plates; greys sit under the saturated inks to keep the overlaps legible; a few near-blacks stay opaque and read as holes punched through the stack. The paper is then cut back in over the top: long tapering white slivers slice clean through the inks, and a share of plates carry one aperture — a lens, a disc, a sector or a rounded square — knocked back to clean paper and filled with a tight bundle of wavy hairlines whose wobble drifts from line to line so the bundle crowds, opens and appears to branch. Flat, hard-edged, unoutlined — no gradients, no shadows, no texture, no keylines. On a dark preset the inks screen instead of multiply, so the same picture prints light on dark.",
      "texture": "/assets/lumen-logic/textures/cellophane.ktx2",
      "preview": "/assets/lumen-logic/previews/cellophane.webp",
      "card": "/assets/lumen-logic/cards/cellophane.jpg",
      "palette": [
        "#cbb9b7",
        "#fac9c4",
        "#9899a5",
        "#89636c",
        "#857d8e"
      ]
    },
    {
      "id": "chine",
      "title": "Chine",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/chine.webp",
      "description": "A chain of straight creases, seen only through the threads that cross them. A chine is the hard fold line of a hull, where two plates meet — a sheet bent and never stretched — and there are a dozen of them here, each a plain segment, alternately short and long, tilted independently and stacked from above the frame to below it. Nothing draws them. What is drawn is a bundle of fifty-odd fine threads, and the whole of their geometry is one law: every thread meets every crease at the same fraction of that crease’s length, and the fractions are evenly spaced. That is the entire construction, and everything the picture appears to contain is a consequence of it. The chain of lozenges is the short creases pinching the bundle and the long ones letting it out. The nested chevrons are nothing but tilt: a crease lies at an angle, so the threads bend at staggered heights, and a staggered row of bends in a dense parallel bundle reads as an arrowhead. The dark crossings are two creases disagreeing about their tilt. Because the threads are ruled between consecutive creases, they can only cross if the quadrilateral those two creases span folds over on itself, so one orientation test per pair — damped, never rejected — guarantees that no two threads in the picture ever meet, at any count, and that every one of them runs unbroken from the top edge to the bottom. The creases are left visible the way a setting-out line is: each is drawn on past the bundle to the frame at a quarter of a thread’s ink, and never inside it, so the faint greys wandering through the empty paper are the construction itself and their crossings fall exactly where the geometry says they must. Everything is straight. There is no curve, no shading, no depth and no second ruling.",
      "texture": "/assets/lumen-logic/textures/chine.ktx2",
      "preview": "/assets/lumen-logic/previews/chine.webp",
      "card": "/assets/lumen-logic/cards/chine.jpg",
      "palette": [
        "#f7f7f7",
        "#e1e1e1"
      ]
    },
    {
      "id": "chladni",
      "title": "Chladni",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/chladni.webp",
      "description": "Standing wave nodal patterns rendered at pixel resolution. The function cos(m·x)cos(n·y) − cos(n·x)cos(m·y) = 0 defines lines where sand collects on a vibrating plate. Each (m,n) mode pair produces a distinct symmetric figure — the same patterns Chladni drew by bowing metal plates in 1787.",
      "texture": "/assets/lumen-logic/textures/chladni.ktx2",
      "preview": "/assets/lumen-logic/previews/chladni.webp",
      "card": "/assets/lumen-logic/cards/chladni.jpg",
      "palette": [
        "#050d14"
      ]
    },
    {
      "id": "chroma-blocks",
      "title": "Chroma Blocks",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/chroma-blocks.webp",
      "description": "An irregular colour grid of overlapping rectangular blocks. Vertical and horizontal grid lines are placed at random, non-uniform positions to form one shared lattice; every base cell is filled with a random palette colour, then larger blocks spanning several cells are layered on top — all snapped to the same lattice — yielding a dense patchwork of flush solid-colour fields in mixed sizes.",
      "texture": "/assets/lumen-logic/textures/chroma-blocks.ktx2",
      "preview": "/assets/lumen-logic/previews/chroma-blocks.webp",
      "card": "/assets/lumen-logic/cards/chroma-blocks.jpg",
      "palette": [
        "#936c6c",
        "#54685b",
        "#41374d",
        "#ac9783",
        "#ae883e",
        "#617480"
      ]
    },
    {
      "id": "chromatic-bubbles",
      "title": "Chromatic Bubbles",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/chromatic-bubbles.webp",
      "description": "Densely packed circles of varying sizes, each rendered as concentric colour rings. A smooth spatial hue field organises nearby circles into warm or cool zones, while each ring alternates hue direction to produce vibrant, jewel-like contrast.",
      "texture": "/assets/lumen-logic/textures/chromatic-bubbles.ktx2",
      "preview": "/assets/lumen-logic/previews/chromatic-bubbles.webp",
      "card": "/assets/lumen-logic/cards/chromatic-bubbles.jpg",
      "palette": [
        "#bcb4ae"
      ]
    },
    {
      "id": "chromatic-grid",
      "title": "Chromatic Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/chromatic-grid.webp",
      "description": "A grid of rectangular cells on a black background, each containing a full gradient rectangle, a gradient right triangle in one of four corner orientations, or nothing. Palette colors are sampled with 2–3 stops per cell and randomised gradient angles, producing a bold mosaic of vibrant geometric shapes.",
      "texture": "/assets/lumen-logic/textures/chromatic-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/chromatic-grid.webp",
      "card": "/assets/lumen-logic/cards/chromatic-grid.jpg",
      "palette": [
        "#ffffff"
      ]
    },
    {
      "id": "circle-grid",
      "title": "Circle Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/circle-grid.webp",
      "description": "A regular grid of circles drawn in varied palette colors, with a padded white border. Each cell background is filled with a palette color, so the interstitial spaces between circles — including the curvilinear gaps where four circles meet — are vividly colored rather than plain white.",
      "texture": "/assets/lumen-logic/textures/circle-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/circle-grid.webp",
      "card": "/assets/lumen-logic/cards/circle-grid.jpg",
      "palette": [
        "#8dcd86",
        "#b782b4",
        "#869c7b",
        "#67e1bc",
        "#8d87d6",
        "#da633e"
      ]
    },
    {
      "id": "circuit-loom",
      "title": "Circuit Loom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/circuit-loom.webp",
      "description": "A multi-pen plotter loom: hundreds of thin ink lines stacked as horizontal channels flow in smooth combed waves from the left and right edges toward a central vertical spine, where they snap onto a grid and route through rounded right-angle circuit traces — nested squares, spirals, switchbacks and a bullseye — before exiting the canvas top and bottom as narrow cable necks. Pen colours cycle in short runs with azure blue dominant; groups of lines fray apart near the margins and end mid-air like loose threads, and a few fans of fine black lines sweep across the field like combed hair.",
      "texture": "/assets/lumen-logic/textures/circuit-loom.ktx2",
      "preview": "/assets/lumen-logic/previews/circuit-loom.webp",
      "card": "/assets/lumen-logic/cards/circuit-loom.jpg",
      "palette": [
        "#d1d7d9",
        "#a5abb1",
        "#bfc4c1",
        "#969095"
      ]
    },
    {
      "id": "city-map",
      "title": "City Map",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/city-map.webp",
      "description": "Flow field (Perlin noise) + constrained random walker, mimicking city maps and topographic contours.",
      "texture": "/assets/lumen-logic/textures/city-map.ktx2",
      "preview": "/assets/lumen-logic/previews/city-map.webp",
      "card": "/assets/lumen-logic/cards/city-map.jpg",
      "palette": [
        "#fefefe",
        "#dfe2e8"
      ]
    },
    {
      "id": "clifford",
      "title": "Clifford Attractor",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/clifford.webp",
      "description": "A strange attractor defined by four parameters. Millions of points orbit the attractor according to x′ = sin(a·y) + c·cos(a·x), y′ = sin(b·x) + d·cos(b·y). Density is mapped logarithmically to colour, exposing fine fractal filaments and dense basins invisible at low point counts.",
      "texture": "/assets/lumen-logic/textures/clifford.ktx2",
      "preview": "/assets/lumen-logic/previews/clifford.webp",
      "card": "/assets/lumen-logic/cards/clifford.jpg",
      "palette": [
        "#6a4116",
        "#3a2110",
        "#b9711a",
        "#97521e",
        "#150f0a"
      ]
    },
    {
      "id": "cloison",
      "title": "Cloison",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 64,
      "kind": "image",
      "source": "artworks/lumen-logic/cloison.webp",
      "description": "A full-bleed painted wall carved into interlocking flat-colour cells behind one heavy black keyline. The sheet is a grid, and every cell of it is owned by exactly one region, so the regions are a partition with no ground, no gap and nothing in front of anything else — the keyline is the partition itself rather than an outline drawn around a shape. The regions grow two ways. A limb is a thick self-avoiding walk that runs, turns square and runs again, dilated to a constant width and cut dead by the frame where it runs off; a lump is a compact competitive growth into whatever the limbs left, and a final sweep gives any sealed-off pocket a region of its own, so every cell is claimed by construction. Each region is then traced into closed loops, and every boundary decoration is a pure function of the boundary rather than of the region: a maximal straight run of seam is dealt a shared curve — bowed into a soft lobe, cut into a balanced sawtooth whose points fit their sockets exactly, or left straight — and each corner where exactly two regions meet is dealt a shared fillet, so one side’s rounded convex corner is the other side’s concave one struck on the same arc, and a small hand-wander displaces both sides of every seam identically. Because the two owners of a seam compute the identical curve from the identical key, the wall can grow lobes, teeth and a painted wobble and still tile the sheet exactly: whatever the alphabet does, it only moves area from one side of a shared line to the other. Colour is dealt so that no two neighbours repeat, with one exception — the mass colour, which is allowed to touch itself and so fuses into larger black areas. A minority of regions carry an echo, built by eroding their own cells by one and tracing again, which is why it follows every turn of the outline, pinches out in a narrow arm and sometimes breaks into islands; a minority carry a coarse dressing on the wall’s own grain — checker, dots, stripes, sawtooth rows, dashes, cross-hatch or rings; scattered cells carry one of fourteen hand-drawn marks, squiggles and tally combs and spirals and ladders and boxed crosses, each sitting inside its own cell so it can never cross a seam; and a few regions are handed an eye at their far end, which is the only figuration in the picture and turns a bent limb into an animal. Flat opaque fills and one keyline weight: no gradient, no transparency, no blend mode, no shadow, no texture and no depth anywhere.",
      "texture": "/assets/lumen-logic/textures/cloison.ktx2",
      "preview": "/assets/lumen-logic/previews/cloison.webp",
      "card": "/assets/lumen-logic/cards/cloison.jpg",
      "palette": [
        "#6f484f",
        "#aa9f56",
        "#839f8b",
        "#837441",
        "#355846",
        "#a3ada0"
      ]
    },
    {
      "id": "coffer",
      "title": "Coffer",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/coffer.webp",
      "description": "One ruled surface, cut up and re-aimed. A sheet is partitioned into rectangular fields by guillotine cuts snapped to the ruling's own period, and every field is filled by the same primitive: a guide polyline stroked again and again as it is translated away from itself, once per entry of a single global cycle of line colours and widths. The vocabulary of guides is closed by one rule — within a guide, every segment's normal must make the same angle with the sweep direction — so a side, a 45° diagonal, a right-angled L, a chevron and a staircase can all be offset by nothing more than a translation, their mitred corners staying exactly coincident as they nest, and only a frame, whose opposite sides move opposite ways, needs an inset instead. Because the cycle and its period are global and the cuts land on that period, the ruling reads as one system across the whole sheet, and what distinguishes one field from its neighbour is only where it aims its bundle and which entry of the cycle it starts on — so one field comes up hairline-red and the next comes up broad blue without a new colour entering anywhere. The perimeter is a single inset frame, which is why every corner of the sheet carries the same nest of mitres, and every field boundary is finally ruled in the cycle's thinnest, darkest line, so the picture reads as a drawn plan of a partition rather than as patches that happen to abut. Flat and hard-edged throughout: every mark is a butt-capped straight stroke, and the ground shows through the cycle's gaps as bare paper — no curve, no gradient, no transparency, no relief, no texture.",
      "texture": "/assets/lumen-logic/textures/coffer.ktx2",
      "preview": "/assets/lumen-logic/previews/coffer.webp",
      "card": "/assets/lumen-logic/cards/coffer.jpg",
      "palette": [
        "#a0c1c6"
      ]
    },
    {
      "id": "coiled-ribbon",
      "title": "Coiled Ribbon",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/coiled-ribbon.webp",
      "description": "Generates a twisted torus-like composition by drawing many concentric rounded rectangles, each rotated by a fixed step from the previous. The accumulating rotation creates the illusion of a coiled ribbon or a cross-section of a torus viewed at an angle.",
      "texture": "/assets/lumen-logic/textures/coiled-ribbon.ktx2",
      "preview": "/assets/lumen-logic/previews/coiled-ribbon.webp",
      "card": "/assets/lumen-logic/cards/coiled-ribbon.jpg",
      "palette": [
        "#ebe7d6",
        "#d7cead",
        "#9ea19d",
        "#fcfbfc",
        "#958964",
        "#566170"
      ]
    },
    {
      "id": "collage-muse",
      "title": "Collage Muse",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/collage-muse.webp",
      "description": "A frontal portrait assembled entirely from paper collage: torn patches in warm paper tones interleaved with hot pop colours, giant black numerals, asemic word fragments, chart motifs (a pie disc, a target mark) and halftone dot grids build the skin, while huge cyan-irised eyes with fanning lashes and full glossy pink lips anchor the likeness and a column of packed white capitals forms the neck. Everything floats on an angular teal-and-magenta paint-shard field laced with a web of thin white and black scratch lines, confetti and splatter — after the contemporary mixed-media pop-collage motif.",
      "texture": "/assets/lumen-logic/textures/collage-muse.ktx2",
      "preview": "/assets/lumen-logic/previews/collage-muse.webp",
      "card": "/assets/lumen-logic/cards/collage-muse.jpg",
      "palette": [
        "#c1b7a9",
        "#7b8488",
        "#354c5d",
        "#a69c92"
      ]
    },
    {
      "id": "color-drip",
      "title": "Color Drip",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/color-drip.webp",
      "description": "Vertical stripes of vivid, contrasting colors flow from top to bottom. Each stripe is randomly sized within a configurable width range. Near the bottom, the stripes melt away into organic drip shapes that taper to points, evoking paint running down a canvas.",
      "texture": "/assets/lumen-logic/textures/color-drip.ktx2",
      "preview": "/assets/lumen-logic/previews/color-drip.webp",
      "card": "/assets/lumen-logic/cards/color-drip.jpg",
      "palette": [
        "#976c78",
        "#bd8652",
        "#67b771",
        "#89ac4a",
        "#834bc5"
      ]
    },
    {
      "id": "color-field",
      "title": "Color Field",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/color-field.webp",
      "description": "Abstract flowing color fields using Perlin-noise-deformed organic blobs, in a strict corporate palette (Mustard Yellow, Navy Blue, Dark Grey, Off-White).",
      "texture": "/assets/lumen-logic/textures/color-field.ktx2",
      "preview": "/assets/lumen-logic/previews/color-field.webp",
      "card": "/assets/lumen-logic/cards/color-field.jpg",
      "palette": [
        "#5a6062",
        "#af9044",
        "#3a4e6c",
        "#e2b13b",
        "#877c5b"
      ]
    },
    {
      "id": "colorfall",
      "title": "Colorfall",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/colorfall.webp",
      "description": "Elongated organic blobs distributed across the canvas via Poisson-disc sampling. Each shape is a tapered bezier ellipse with a near-vertical orientation biased by a configurable wiggle, creating the effect of coloured droplets caught mid-fall. Larger blobs render behind smaller ones for natural Z-depth. Colour is assigned by position band to ensure no single hue dominates any region.",
      "texture": "/assets/lumen-logic/textures/colorfall.ktx2",
      "preview": "/assets/lumen-logic/previews/colorfall.webp",
      "card": "/assets/lumen-logic/cards/colorfall.jpg",
      "palette": [
        "#c0a25c",
        "#87c674",
        "#a48f78",
        "#e9a78c",
        "#c5c098",
        "#899699"
      ]
    },
    {
      "id": "comb-weave",
      "title": "Comb Weave",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/comb-weave.webp",
      "description": "A mid-century op-art paper relief: a dark navy panel on a cream mat, filled with thin cream strips that each run straight, bend once at 90°, and run on. The strips nest into combs of parallel L-shapes whose corners march along crisp 45° staircases, concatenating into one meandering spine from the top edge to the bottom, with combs opening left and right of it in alternation. Long runs bleed through neighbouring combs so horizontal and vertical strips cross into dense woven grid patches, each crossing showing a thin navy gap where one paper strip passes over another, and a faint relief shadow sits under every strip so the surface reads as layered cut paper.",
      "texture": "/assets/lumen-logic/textures/comb-weave.ktx2",
      "preview": "/assets/lumen-logic/previews/comb-weave.webp",
      "card": "/assets/lumen-logic/cards/comb-weave.jpg",
      "palette": [
        "#909099",
        "#5e647c",
        "#3a4166"
      ]
    },
    {
      "id": "combed-silk",
      "title": "Combed Silk",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/combed-silk.webp",
      "description": "Twisting, folding ribbons of dragged pigment over a basket-woven magenta canvas. A handful of thick ribbons are traced through a seeded noise flow field and painted as dense sheaves of parallel combed strands. Each ribbon slowly rotates along its length, so as it turns edge-on its width foreshortens to a crease and the lit ridge sweeps across the strands and flips — the bands read as glossy satin folding over itself. Cross-strand curvature and a travelling specular highlight give a sculpted, three-dimensional sheen, while a dark ink edge and soft cast shadow lift each ribbon off the woven ground.",
      "texture": "/assets/lumen-logic/textures/combed-silk.ktx2",
      "preview": "/assets/lumen-logic/previews/combed-silk.webp",
      "card": "/assets/lumen-logic/cards/combed-silk.jpg",
      "palette": [
        "#a5337e",
        "#ba5997",
        "#8f1365"
      ]
    },
    {
      "id": "compass-rose",
      "title": "Compass Rose",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/compass-rose.webp",
      "description": "A hand-drafted compass-construction study on aged cream vellum: two wobbled ink circles frame an N-pointed star whose slender kite points are shaded in translucent coloured pencil, split lengthwise into two hues that pool toward each tip. Inside, rings of nodes are woven by a dense near-complete graph of ink chords with faint octagram tracery, small translucent colour facets nestle between them (cool hues at the centre, warm further out), construction spokes overshoot the circles, prick dots mark every vertex, and a red asemic annotation floats in the annulus over a mottled, speckled paper ground.",
      "texture": "/assets/lumen-logic/textures/compass-rose.ktx2",
      "preview": "/assets/lumen-logic/previews/compass-rose.webp",
      "card": "/assets/lumen-logic/cards/compass-rose.jpg",
      "palette": [
        "#ece1c4",
        "#d7ccae",
        "#baa495"
      ]
    },
    {
      "id": "concentric-tiles",
      "title": "Concentric Tiles",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/concentric-tiles.webp",
      "description": "A grid of cells each containing clipped concentric circles. Clip shapes — semicircles, crescents (lunes), and lens forms (vesica) — alternate between dark and light backgrounds, creating a study in positive/negative space through optical line mixing. A single accent-colour cell breaks the monochrome palette.",
      "texture": "/assets/lumen-logic/textures/concentric-tiles.ktx2",
      "preview": "/assets/lumen-logic/previews/concentric-tiles.webp",
      "card": "/assets/lumen-logic/cards/concentric-tiles.jpg",
      "palette": [
        "#111111",
        "#562619",
        "#d7471f"
      ]
    },
    {
      "id": "conformal",
      "title": "Conformal Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/conformal.webp",
      "description": "An enhanced phase portrait of a rational complex function f(z) = Π(z−zᵢ)/Π(z−pⱼ): every pixel is coloured by arg f(z) mapped cyclically through the palette, so colour swirls counter-clockwise around zeros and clockwise around poles, joined by silky conformal flow. Brightness bands follow the fractional part of log|f| as contour rings of modulus. No iteration, no fractal — the artwork is the function itself.",
      "texture": "/assets/lumen-logic/textures/conformal.ktx2",
      "preview": "/assets/lumen-logic/previews/conformal.webp",
      "card": "/assets/lumen-logic/cards/conformal.jpg",
      "palette": [
        "#4f5779",
        "#995a38",
        "#809d5c",
        "#4e7e5e",
        "#82515b",
        "#a0874e"
      ]
    },
    {
      "id": "contour",
      "title": "Contour",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/contour.webp",
      "description": "Topographic iso-contour lines traced via marching squares on a multi-octave fBm height field. Lines are coloured by elevation through a geological palette, evoking USGS survey maps, orienteering charts, and terrain models.",
      "texture": "/assets/lumen-logic/textures/contour.ktx2",
      "preview": "/assets/lumen-logic/previews/contour.webp",
      "card": "/assets/lumen-logic/cards/contour.jpg",
      "palette": [
        "#e6e3d9"
      ]
    },
    {
      "id": "coral",
      "title": "Coral",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/coral.webp",
      "description": "Fractal coral colonies branching upward from the ocean floor, with vivid tropical polyps blooming at every terminal. Dense branching trees in hot pinks, oranges, and teals on a deep sea background.",
      "texture": "/assets/lumen-logic/textures/coral.ktx2",
      "preview": "/assets/lumen-logic/previews/coral.webp",
      "card": "/assets/lumen-logic/cards/coral.jpg",
      "palette": [
        "#0a4561",
        "#485362",
        "#617b70"
      ]
    },
    {
      "id": "cosmogram",
      "title": "Cosmogram",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cosmogram.webp",
      "description": "A folk-science cosmological diagram painted on wood: a black panel framed by a glyph border (dot grids, bead strings, silhouette figures, DNA sine bands) holds a great hourglass mesh of cream curves pinching around a central quadrant-ring emblem with a chord-connected node graph. Dashed lattice arcs, rainbow arc gates, edge half-targets, a beaded vertical axis, red pinch fans and hand-wobbled lines complete the mystical chart.",
      "texture": "/assets/lumen-logic/textures/cosmogram.ktx2",
      "preview": "/assets/lumen-logic/previews/cosmogram.webp",
      "card": "/assets/lumen-logic/cards/cosmogram.jpg",
      "palette": [
        "#5c5143"
      ]
    },
    {
      "id": "cosmos",
      "title": "Cosmos",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cosmos.webp",
      "description": "Multiple spiral galaxies scattered across deep space, each with a dense glowing core, logarithmic spiral arms, and a neon halo. Stars follow an exponential disk profile with arm scatter that grows with radius, creating organic Milky Way shapes. Screen-blend glow on cores and halos produces a futuristic neon light effect.",
      "texture": "/assets/lumen-logic/textures/cosmos.ktx2",
      "preview": "/assets/lumen-logic/previews/cosmos.webp",
      "card": "/assets/lumen-logic/cards/cosmos.jpg",
      "palette": [
        "#000009",
        "#022129"
      ]
    },
    {
      "id": "cowlick",
      "title": "Cowlick",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cowlick.webp",
      "description": "Ink lines on bare paper, and nothing else — no fill, no grey, no crossing anywhere on the sheet. Every line begins as one ray of a plain pencil leaving a single point, and is then handed to a reparametrisation of the circle that is the identity where it starts and a fixed comb by the time it reaches the rim, so each line bends through one annulus and runs straight again on both sides of it, at a new angle. That comb is a product of Poisson kernels — one per seam, each with its own place and depth — normalised back to a single turn, which makes it strictly increasing and therefore makes crossing impossible rather than merely unlikely: two lines that started in order stay in order at every radius, however hard the comb squeezes. Because the map is closed form its derivative is the local line spacing, and that is what draws the picture. A fan is grown against one target spacing: wherever two neighbours have opened past it a new line is started between them on the spot, with a free tapered tip out in the open field, and wherever the coordinate crowds them below it the younger of the two retires — so the paper carries exactly as many lines as it has room for, evenly in the open fans, while nothing at all stops the lines from piling into near-solid black creases at the seams. Weight follows depth in that hierarchy, so the few lines that reach the centre are the heavy structure of the drawing and every hairline is infill. A slow waver sampled in the map’s own coordinates rather than per line makes neighbours bow together and stay parallel through the bow, the way a hand draws a bundle. The pencil itself is a knob — rays from one point, the arcs through two points, or plain parallels — which changes the whole subject of the picture without changing a single thing about the mark.",
      "texture": "/assets/lumen-logic/textures/cowlick.ktx2",
      "preview": "/assets/lumen-logic/previews/cowlick.webp",
      "card": "/assets/lumen-logic/cards/cowlick.jpg",
      "palette": [
        "#d3d1cd"
      ]
    },
    {
      "id": "crease-lattice",
      "title": "Crease Lattice",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/crease-lattice.webp",
      "description": "A sheet of fine graph paper crumpled flat. One displaced quad lattice fills the page, and every cell is filled by bilinearly mapping a unit grid of hairlines onto its own four corners — so the little grid shears, squashes and tilts exactly as the cell does, and each cell reads as a torn square of graph paper seen at an angle rather than as a flat tile. Cell tone is carried by hatch weight, not fill: pale cells are hairlines on bare paper, dark ones have strokes so heavy they fuse into a near-solid block. The lattice is displaced by a coherent height field — soft lobes several cells wide, plus a handful of hard near-vertical crease lines that pinch whole columns of cells to slivers — and gathered, so column widths and row heights run unequal like fabric drawn on a thread. That same height field lights the sheet from the upper left, darkens cells the fold compresses, and sorts them back to front, so raised cells swell slightly and overlap their neighbours and the sharpest folds read as hard black creases. Colour is one hue-and-luminance ramp along a chosen axis, deep indigo through violet to magenta, mottled by a slow independent field so the tone clusters into shadowed and lit regions. The lattice is laid out as a plain grid, a running bond, a sheared parallelogram field or a polar ring-and-spoke web, and its silhouette is left ragged — border cells jut, pull in, or drop out entirely — on bare paper with a wide margin.",
      "texture": "/assets/lumen-logic/textures/crease-lattice.ktx2",
      "preview": "/assets/lumen-logic/previews/crease-lattice.webp",
      "card": "/assets/lumen-logic/cards/crease-lattice.jpg",
      "palette": [
        "#707297",
        "#b694d9",
        "#9799b1",
        "#d5b3e6",
        "#5b50a3",
        "#9767ce"
      ]
    },
    {
      "id": "crimp",
      "title": "Crimp",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/crimp.webp",
      "description": "A white sheet strewn edge to edge with short flat strips of colour, each one bent two to four times and cut off square. There is one mark and one material: a walk of a few steps swept into a ribbon of a single width shared by the whole picture, so a hundred and forty unrelated marks read as one cut of paper. The walk is taken on a hidden lattice of directions — a handful of headings spaced evenly around the circle and rotated together by the seed — and on one ladder of lengths, which is why parallels and repeated runs turn up everywhere without a single mark sitting on a grid: direction and length are quantised, position is not. Every turn is a whole number of quanta, never zero and never a reversal, so nothing in the sheet is straight and nothing folds back on itself, and a mark is refused a step that would bring it within its own width of a part of itself it does not already touch. Five turn policies share that one generator: a free walk, a staircase whose turns alternate, a coil whose turns all agree, a closed circuit whose last two lengths are solved rather than drawn so the strip meets itself exactly and paints as a ring with the paper showing through, and a star that hangs one or two more arms off an ordinary walk’s own fold. The ribbon is mitred at the folds and cut flat where a mitre would spike, and a share of the ends are cut on the slant like scissor work. Marks are seeded by best-candidate sampling over the sheet inflated past its own edges, so density is even and the picture is a crop out of a field that continues; colour is dealt flat and then repaired, so no two marks that run within a strip-width of each other carry the same ink. Nothing is outlined, blended or made transparent — where two strips cross, one simply covers the other, and the order is shuffled rather than stacked.",
      "texture": "/assets/lumen-logic/textures/crimp.ktx2",
      "preview": "/assets/lumen-logic/previews/crimp.webp",
      "card": "/assets/lumen-logic/cards/crimp.jpg",
      "palette": [
        "#e6d7cc"
      ]
    },
    {
      "id": "cube-type",
      "title": "Cube Type",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cube-type.webp",
      "description": "Text set as a wall of extruded letter cubes. Each character becomes the front face of a block in oblique projection — a chunky modular glyph in near-black ink filling the square, its counters reading as small grey triangles and squares — with a light top face and a darker side face extruding up-left or up-right per block. Rows stagger like brickwork and the first and last rows shorten to round the composition, after the classic painted 3D-alphabet motif.",
      "texture": "/assets/lumen-logic/textures/cube-type.ktx2",
      "preview": "/assets/lumen-logic/previews/cube-type.webp",
      "card": "/assets/lumen-logic/cards/cube-type.jpg",
      "palette": [
        "#c7c5c0",
        "#e8e7e0",
        "#6c6b67"
      ]
    },
    {
      "id": "cube-ziggurat",
      "title": "Cube Ziggurat",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cube-ziggurat.webp",
      "description": "A monochrome isometric fractal pyramid. Stacks of shrinking cubes — a big cube, a smaller cube centred on its top, and on until a tiny nubbin caps the tower — stand on a triangular formation, one small stack at the apex and progressively more and larger stacks toward the bottom-front, so the whole piece reads as a triangle built of self-similar cube ziggurats. Every cube carries a mini cube perched on the left corner of its top face, and the minis carry tinier cubes still, echoing the recursion down to a few pixels. Faces are flat and unoutlined — white left faces, light-grey tops, black right faces — and every cube throws a soft translucent grey drop shadow that carves the white-on-white silhouettes out of the plain ground.",
      "texture": "/assets/lumen-logic/textures/cube-ziggurat.ktx2",
      "preview": "/assets/lumen-logic/previews/cube-ziggurat.webp",
      "card": "/assets/lumen-logic/cards/cube-ziggurat.jpg",
      "palette": [
        "#ffffff",
        "#acacac",
        "#cdcdcd"
      ]
    },
    {
      "id": "curlicue",
      "title": "Curlicue",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/curlicue.webp",
      "description": "The curlicue fractal — partial sums of the exponential sum Σ e^{iπθn²} drawn as a path of unit steps whose heading turns by an arithmetically growing angle Δφ = 2πθ·n. For irrational θ the thread coils into nested galaxies, unwinds, and coils again at ever-larger scales, its structure encoding the continued-fraction expansion of θ. One constant, one walk, one line — coloured along its own arc length.",
      "texture": "/assets/lumen-logic/textures/curlicue.ktx2",
      "preview": "/assets/lumen-logic/previews/curlicue.webp",
      "card": "/assets/lumen-logic/cards/curlicue.jpg",
      "palette": [
        "#07080c",
        "#312c2d"
      ]
    },
    {
      "id": "cutout-collage",
      "title": "Cutout Collage",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/cutout-collage.webp",
      "description": "Bold flat-colour modernist collage: overlapping organic cut-out shapes — leaf lenses, rounded blobs, thick crescent loops and a wavy ribbon — layered over angled colour planes, punctuated by an op-art concentric-arc patch and a black checkerboard registration mark. Vivid palette, no gradients.",
      "texture": "/assets/lumen-logic/textures/cutout-collage.ktx2",
      "preview": "/assets/lumen-logic/previews/cutout-collage.webp",
      "card": "/assets/lumen-logic/cards/cutout-collage.jpg",
      "palette": [
        "#4c6976",
        "#363c97",
        "#4d9a6c",
        "#9a7b72",
        "#724d94",
        "#557cd4"
      ]
    },
    {
      "id": "dahlia",
      "title": "Dahlia",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dahlia.webp",
      "description": "A full-bleed dahlia rosette built from overlapping airbrushed spheres. Concentric rings of gradient orbs grow geometrically from a glowing yellow core, each ring twisted so the orbs chain into curved spiral arms; colours cycle per arm (candy pinks and cobalt blues), a warm orange halo tints the innermost orbs, and heavy film grain gives the gradients a spray-paint texture.",
      "texture": "/assets/lumen-logic/textures/dahlia.ktx2",
      "preview": "/assets/lumen-logic/previews/dahlia.webp",
      "card": "/assets/lumen-logic/cards/dahlia.jpg",
      "palette": [
        "#a985d1",
        "#e6b0d3",
        "#7076d3"
      ]
    },
    {
      "id": "dancette",
      "title": "Dancette",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dancette.webp",
      "description": "Nested chevrons packed edge to edge into a triangular fan, after a painted hourglass of two point-to-point triangles on bare paper. Every chevron in the picture is a level set of `max(α, β)` in the fan’s own affine frame, which is why its two arms run parallel to the two sides of the triangle holding them, why its vertex sits on the centre line, and why its ends land on those sides rather than stopping in mid-air — and why, once the vertex would fall outside the base, the chevron simply has none and reads as two lone runs of slivers in the far corners. The radii fall in a geometric progression, so band width tracks distance from the point and the colour rhythm comes out at the same number of chevrons per cycle down at the point as out at the base. Each boundary is then a jointed polyline displaced radially by its own amount, measured in bands rather than in pixels, out of one coherent field over (position along the chevron, band index) — so neighbouring boundaries lean together, converge, touch and cross, and the picture is made of long tapers and wedges biting across several stripes at once instead of a frayed edge. The whole thing is drawn with one primitive: the fan from its point out to one boundary, cut by its own base, filled outermost first over the top of everything inside it. A stripe is the part of one fill the next fill does not cover, a taper is where the two converge, a spike is where they touch and a dropout is where the inner one has overtaken the outer — four marks at four amounts of one crossing, with no stripe, taper, spike or dropout anywhere in the program, no seam to close and no stroke in the package. Colour is one dominant ground and thin chords of ink, each chord an ink and the ink furthest from it in lightness, so the pairings come off the palette rather than off a table. The ladder stops where a band would come out thinner than a line and the residue is filled solid, so the point closes on a small dark knot. The host is a knob — an hourglass, one triangle, a diamond, a four-way pinwheel, or a fan whose point sits off the sheet so the chevrons cross it nearly parallel — and it is nothing but the list of fans. Every edge is straight: no outline, no gradient, no shadow, no transparency, no texture and no curve anywhere in the picture.",
      "texture": "/assets/lumen-logic/textures/dancette.ktx2",
      "preview": "/assets/lumen-logic/previews/dancette.webp",
      "card": "/assets/lumen-logic/cards/dancette.jpg",
      "palette": [
        "#e4d2c4",
        "#c4856b",
        "#eeece1",
        "#d1b09b"
      ]
    },
    {
      "id": "datum",
      "title": "Datum",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/datum.webp",
      "description": "A floating island of flat-colour panels assembled on a shared field of straight lines. Every panel is a quadrilateral or triangle cut from the same two dozen datum lines, grouped into a few near-parallel direction families, so edges run on from one shape into another across the whole composition and nothing is quite square. Panels are laid down one at a time and must touch what is already there, so the mass grows into a connected clump with a ragged silhouette made of whole panel edges; later panels cover earlier ones opaquely. A share of the panels are filled with the ground instead of paint, a share are hatched with tight parallel rules, and a few carry a knocked-out disc, a bracket counter or a solid dot. One hue carries the composition and every overlap is forced to contrast. Last, the picture is laced with its own construction drawing: a share of the datum lines are stroked as hairlines that run clean across the paint and overshoot into the empty ground, with registration crosses at their intersections outside the mass and short stacks of graded rules alongside it. Flat, hard-edged, opaque — no gradients, no texture, no transparency.",
      "texture": "/assets/lumen-logic/textures/datum.ktx2",
      "preview": "/assets/lumen-logic/previews/datum.webp",
      "card": "/assets/lumen-logic/cards/datum.jpg",
      "palette": [
        "#d8d5d3",
        "#939379",
        "#ad9fa3",
        "#7d6166",
        "#5a80a5"
      ]
    },
    {
      "id": "dawn-quilt",
      "title": "Dawn Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dawn-quilt.webp",
      "description": "A quilt of mirrored triangle rows — up/down isoceles triangles pairing into square-set rhombi — colored by two quantized gradient axes: a noisy cool-to-warm split sweeps deep teals and slate blues on the left into maroons, brick reds, corals and golds on the right, while a dark-to-light ramp melts near-black tones along the top into bright mint and amber along the bottom. Swatches cluster into solid patches with scattered bright accent pops, and a delicate off-white lattice of continuous diagonals, horizontals and faint verticals overlays the field at full and half pitch, subdividing every triangle.",
      "texture": "/assets/lumen-logic/textures/dawn-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/dawn-quilt.webp",
      "card": "/assets/lumen-logic/cards/dawn-quilt.jpg",
      "palette": [
        "#43747d",
        "#d7835b",
        "#b5676d",
        "#734d5a",
        "#52a999",
        "#81cbb6"
      ]
    },
    {
      "id": "demilune",
      "title": "Demilune",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/demilune.webp",
      "description": "Coloured paper discs on a flat ground, laid out in a loose grid with a clear margin and a scatter of empty cells — and every one of them built from a single primitive, the half-disc, hinged on its own diameter. A disc is two half-discs sharing one straight edge, and each half is independently absent, laid flat, or bent up out of the sheet through an angle of its own. That one angle does three things at once, all by the same rotation: it foreshortens the half toward its hinge, so the curved edge flattens and the piece reads as card standing proud of the table; it uncovers a crescent of the disc underneath, whose width is a function of the angle rather than a shape anyone cut; and it shears the half’s shadow across the sheet, since the shadow of a rotated plane figure under a single directional light is that same figure under one shear and one scale. So the six things the picture appears to contain — a plain disc, a disc bisected into two colours, a lone half on the ground, a bowl lifted off an underlay, a thin crescent, and an open book with both halves raised around a shared seam — are not six motifs but six values of one triple. Hinge lines are mostly upright or across with a few degrees of wander; the halves of a bisected disc are always different inks, and a raised flap never matches what it uncovers, or the fold would be invisible. One light serves the whole sheet, weak and slightly soft, so every shadow falls the same way and a raised face sits a shade lighter than the same ink lying flat. Flat matte colour throughout: no outline, no gradient, no texture, and no shape anywhere that is not a circle or half of one.",
      "texture": "/assets/lumen-logic/textures/demilune.ktx2",
      "preview": "/assets/lumen-logic/previews/demilune.webp",
      "card": "/assets/lumen-logic/cards/demilune.jpg",
      "palette": [
        "#bfa9be",
        "#8b9280",
        "#cbc19e"
      ]
    },
    {
      "id": "dichroic",
      "title": "Dichroic",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dichroic.webp",
      "description": "A hard-edged abstract in which the picture is read through the stack rather than off the top of it. The frame contains exactly two kinds of object — an axis-aligned rectangle and a disc — and neither chooses anything for itself. Every rectangle takes all four of its edges from one lattice of coordinates shared by the whole sheet, built by splitting the frame down recursively so a few very wide bands sit beside slivers a few pixels across, and a share of the coordinates are echoes placed hard against an existing line to make those slivers. Discs ignore the lattice entirely and are the counter-system: drawn from a power law so most are far larger than the frame with their centres off the sheet, they arrive as arcs cutting across the orthogonal grain, and where two of them overlap the double thickness of ink makes a lens, a wedge or a pointed X that is nowhere drawn. No pane picks its colour either: one slow hue field and a second, independent lightness field run across the sheet, and a pane reads both at the point where it happens to sit, so the colour travels smoothly from crimson through magenta and rose to gold and lemon while the value rises and falls on its own schedule. Every pane is laid down translucent, most of them faint and a few near-opaque, so the picture accumulates: the darks are where dark panes stacked four deep and the lights are where pale ones did, and most of the colours in the finished frame — the tans, the apricots, the blue-greys, the plums — are mixtures that no palette entry contains and none can. A share of the panes are stroked instead of filled, at a higher opacity, so keylines run through the dense passages and keep them legible. Large panes are painted first and small ones last, with enough slack in the order that the stack never reads as sorted. Flat, orthogonal, hard-edged — no gradients, no blur, no shadow, no texture, no blend modes, and no shape that is not a rectangle or a circle.",
      "texture": "/assets/lumen-logic/textures/dichroic.ktx2",
      "preview": "/assets/lumen-logic/previews/dichroic.webp",
      "card": "/assets/lumen-logic/cards/dichroic.jpg",
      "palette": [
        "#cb9871",
        "#bc6f6c",
        "#8e5556",
        "#6d3a50"
      ]
    },
    {
      "id": "differential-growth",
      "title": "Differential Growth",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/differential-growth.webp",
      "description": "A closed curve grows by relaxing under node repulsion and neighbour attraction while inserting new nodes along stretched edges. Confined to the canvas it folds into space-filling meanders — brain coral, fingerprint ridges and cerebral convolutions.",
      "texture": "/assets/lumen-logic/textures/differential-growth.ktx2",
      "preview": "/assets/lumen-logic/previews/differential-growth.webp",
      "card": "/assets/lumen-logic/cards/differential-growth.jpg",
      "palette": [
        "#f6eddd",
        "#e8cbb9"
      ]
    },
    {
      "id": "disc-tangle",
      "title": "Disc Tangle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/disc-tangle.webp",
      "description": "A heap of overlapping paper discs, each one packed edge-to-edge with a different hand-drawn ink pattern. Discs are chain-packed outward from a first stone so the heap grows as one connected mass with no islands, and painted strictly back to front — every disc is opaque, so a new one crops its neighbours into crescents, lenses and slivers, and depth is occlusion alone with no shadow and no transparency anywhere. Each disc clips to its own hand-wobbled circle and is filled in its own local frame from a library of twelve tangle motifs: bold diagonal stripes with pencil-shaded bubbles, a checkerboard bulged over a sphere, cobbled pebbles, combed flow lines that bundle and relax, packed ring targets stippled in their gaps, coiled spiral rosettes ringed with ticks, an irregular web of facets each hatched at its own angle, meandering double-line ribbon loops, hatched arc scales in curving rows, ninety-degree basket weave, nested crescent bands about a centre outside the disc, and nested contours inside one organic blob. Ink and bare paper carry the drawing; colour is an accent, drawn per disc from a slow spatial hue field so pinks, greens and chartreuse cluster into zones rather than speckling, and a soft graphite hatch shades one side of a few forms. Every line is walked as short tremulous segments so the whole sheet reads as pen on paper. The heap lays out as a bloom, a column, a diagonal drift or a loose scatter, on bare paper with a clear margin.",
      "texture": "/assets/lumen-logic/textures/disc-tangle.ktx2",
      "preview": "/assets/lumen-logic/previews/disc-tangle.webp",
      "card": "/assets/lumen-logic/cards/disc-tangle.jpg",
      "palette": [
        "#dddedc",
        "#c2c0bf",
        "#a2a6a2",
        "#91928b"
      ]
    },
    {
      "id": "dither-facets",
      "title": "Dither Facets",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dither-facets.webp",
      "description": "Quadrant panels of bold diagonal bands and sharp triangular shards, each filled with vivid linear gradients or Bayer-dithered density ramps. Fine stripe bundles, ordered-dither halftone triangles, and chevrons layer over deep black in a glitchy vaporwave palette — a distinct composition per panel.",
      "texture": "/assets/lumen-logic/textures/dither-facets.ktx2",
      "preview": "/assets/lumen-logic/previews/dither-facets.webp",
      "card": "/assets/lumen-logic/cards/dither-facets.jpg",
      "palette": [
        "#828282",
        "#dedede",
        "#363636",
        "#a3a3a3",
        "#76567e",
        "#29658c"
      ]
    },
    {
      "id": "dla-dendrites",
      "title": "DLA Dendrites",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dla-dendrites.webp",
      "description": "Diffusion-limited aggregation: random-walking particles freeze on contact with a growing cluster, building the branching fractals of window frost, mineral dendrites and crystal growth. Cells are coloured by arrival age so the structure blooms outward through the palette.",
      "texture": "/assets/lumen-logic/textures/dla-dendrites.ktx2",
      "preview": "/assets/lumen-logic/previews/dla-dendrites.webp",
      "card": "/assets/lumen-logic/cards/dla-dendrites.jpg",
      "palette": [
        "#0b0706",
        "#2f1e12"
      ]
    },
    {
      "id": "domain-warp",
      "title": "Domain Warp",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/domain-warp.webp",
      "description": "Op Art dot grid built from sinusoidal domain warping. A high-frequency grid of dots — defined by the product sin(k·x′)·sin(k·y′) — is spatially distorted by offsetting each coordinate with a low-frequency sine wave in the perpendicular direction. The result compresses rows of dots into continuous bands in some regions and fans them apart in others, producing the shimmering undulation illusion associated with Bridget Riley and Victor Vasarely.",
      "texture": "/assets/lumen-logic/textures/domain-warp.ktx2",
      "preview": "/assets/lumen-logic/previews/domain-warp.webp",
      "card": "/assets/lumen-logic/cards/domain-warp.jpg",
      "palette": [
        "#868686"
      ]
    },
    {
      "id": "doodle-mural",
      "title": "Doodle Mural",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/doodle-mural.webp",
      "description": "A pop-graffiti mural in one thick black ink line on warm cream, in the 1980s subway-drawing tradition. Hand-drawn divider lines split the sheet into horizontal registers, and each register hosts a frieze of large cartoon figures — dancers with flung limbs and X faces, a crawling breaker, a DJ deck spinning outlined turntable discs, a blocky grinning robot, a big blob face, a radiant sun — every figure a bold rounded outline packed with squiggle ornament and haloed by short radiating motion dashes. All remaining paper is stuffed edge-to-edge with small wobbly filler doodles (zigzag and wave trains, spirals, greek keys, X’s, stars, dot clusters, combs, worms, chevrons) at an even horror-vacui density, held a thin cream halo away from every figure so the crowd stays readable inside the noise.",
      "texture": "/assets/lumen-logic/textures/doodle-mural.ktx2",
      "preview": "/assets/lumen-logic/previews/doodle-mural.webp",
      "card": "/assets/lumen-logic/cards/doodle-mural.jpg",
      "palette": [
        "#bab6aa"
      ]
    },
    {
      "id": "dot-bloom",
      "title": "Dot Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dot-bloom.webp",
      "description": "A halftone screen of tangent dots over a soft ground, each dot sampling an organic colour bloom — a teal-to-blue crown collapsing into a dark void and opening again into orange and red below. Dots dissolve into the ground at the bloom's capsule edge, and a scattering of beveled \"lens\" dots carry a diagonal specular split.",
      "texture": "/assets/lumen-logic/textures/dot-bloom.ktx2",
      "preview": "/assets/lumen-logic/previews/dot-bloom.webp",
      "card": "/assets/lumen-logic/cards/dot-bloom.jpg",
      "palette": [
        "#dfb39d",
        "#9d919f",
        "#c59683",
        "#565476",
        "#836058",
        "#df8a67"
      ]
    },
    {
      "id": "dot-columns",
      "title": "Dot Columns",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/dot-columns.webp",
      "description": "Vertical columns of hand-drawn dots that follow a shared cubic bezier drift curve. Each column cycles through independent colour runs, evoking risograph printing and the generative dot work of Tyler Hobbs.",
      "texture": "/assets/lumen-logic/textures/dot-columns.ktx2",
      "preview": "/assets/lumen-logic/previews/dot-columns.webp",
      "card": "/assets/lumen-logic/cards/dot-columns.jpg",
      "palette": [
        "#f7f6ee"
      ]
    },
    {
      "id": "drift",
      "title": "Drift",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/drift.webp",
      "description": "Particles tracing organic paths through a Perlin noise field, leaving soft fading trails. Overlapping lines in deep navy and warm gold build into a dense, meditative texture on an off-white ground.",
      "texture": "/assets/lumen-logic/textures/drift.ktx2",
      "preview": "/assets/lumen-logic/previews/drift.webp",
      "card": "/assets/lumen-logic/cards/drift.jpg",
      "palette": [
        "#d9d7d5"
      ]
    },
    {
      "id": "ectype",
      "title": "Ectype",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/ectype.webp",
      "description": "An uploaded photograph, abstracted until only its structure is left. The source is reduced exactly once — to a small colour raster, its luminance, and the gradient of that luminance — and every mark in the picture is then either a point drawn from a density made out of that reduction, or a curve integrated through a direction made out of it. The density mixes edge magnitude with tone, because tone alone spends every mark on a dark background and edges alone spend none on a pale subject; points are drawn from it by inverse-CDF sampling and then pushed toward a weighted centroidal tessellation by Lloyd relaxation, which is exposed as a knob precisely because the useful answer is *not converged* — every iteration trades a little of the photograph for a little more evenness. Facets, Cells and Stipple are that one point set read three ways: its Delaunay triangulation, that triangulation’s Voronoi dual, and the points themselves as discs sized by local density. Flow and Grating are one integrator on two direction fields — the image’s own isophote direction, rotated a quarter turn off the gradient so strokes run *around* forms rather than cutting across them and handing over to a noise field wherever the gradient is only sensor noise; or a constant angle, where two families a few degrees apart beat into a moiré that is nowhere computed. Colour is a rule rather than a copy: the sampled hue verbatim, or snapped to the active palette in a space that weights lightness double because form in a photograph *is* lightness, or discarded entirely for a two-ink ramp. The whole construction runs on a fixed 640-pixel working raster in normalised coordinates, so a thumbnail and a full-size export are the same picture mark for mark, and the source image is never blitted onto the canvas.",
      "texture": "/assets/lumen-logic/textures/ectype.ktx2",
      "preview": "/assets/lumen-logic/previews/ectype.webp",
      "card": "/assets/lumen-logic/cards/ectype.jpg",
      "palette": [
        "#a24f40",
        "#4d5154",
        "#8f715d"
      ]
    },
    {
      "id": "enamel-jam",
      "title": "Enamel Jam",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/enamel-jam.webp",
      "description": "A slab of interlocked cartoon parts in flat enamel colour behind heavy black keylines. Twelve abstract archetypes — capped tubes bent into C-curves, S-curves, hooks, coils and mitred bolts, tapering horns, pointed lenses, plump pods, discs punched into targets, sawtooth crowns, serrated comb-leaves and pie-wedge fans — are dropped largest-first into a greedy occupancy pack so they nestle, overlap and interlock edge to edge, each one fully opaque so depth is occlusion alone. Colour comes from a separate layer: the plane is carved into large convex cells by one family of straight lines (irregular facets, parallel bands or radial wedges), each cell flooded a rung of a luminance-sorted tone ladder, and every form is filled by repainting that same partition inside its own outline one or two rungs offset — so a single unbroken tube steps through three tones along its length and the tone boundary runs dead straight across form after form, like an off-register colour plate under a key plate. Sparse lighter ink detail — ringed eyes, stitch rows, nested arc bands, dots, lash ticks and punched holes — sits on top, a few spiky forms break the slab edge onto the bare ground, and the composition is trimmed to a hard-edged convex slab that leaves a bare margin on all four sides. Flat opaque fills and hard outlines only — no gradients, no shading, no transparency and no text anywhere.",
      "texture": "/assets/lumen-logic/textures/enamel-jam.ktx2",
      "preview": "/assets/lumen-logic/previews/enamel-jam.webp",
      "card": "/assets/lumen-logic/cards/enamel-jam.jpg",
      "palette": [
        "#5a5273",
        "#756e8d",
        "#423b87",
        "#6957a8"
      ]
    },
    {
      "id": "enfilade",
      "title": "Enfilade",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/enfilade.webp",
      "description": "One polygon, scaled about one point, over and over. A convex cross-section is placed on the sheet and repeated toward an off-centre vanishing point at a constant ratio, so every ring in the picture is the outer one at a smaller size in the same orientation, and the walls between consecutive rings are the only regions the renderer knows about. Those walls are not stroked but filled, which is what makes the ruling kink rather than mitre at every corner of the cross-section and carry a different width into each wall it enters, in exact proportion to that wall's distance from the vanishing point. Each wall is cut laterally into cells by rays through the vanishing point, and every cell draws exactly one quadrilateral, spanning from one fractional depth to another — so a stripe is that quad at half a band, a solid block is the same quad at a whole band, a blank is the same quad at zero, and the three marks the eye reads as three different things are one operator at three values of one number. Which value a cell takes comes from a coherent field sampled in the corridor's own along-and-into coordinates rather than on the page, so blocks step inward and shrink as they recede and can never fall out of register with the ruling that made them; a smaller share of cells take a phase offset instead and the ruling steps sideways. Away from the field the duty is one global constant, which is why the rulings run unbroken around every ring and read as ruled rather than drawn. The stack terminates where a band would come out finer than a line and whatever is left is filled solid, so the throat closes on a small dark knot exactly as it does on paper, and outside the mouth of the cross-section the ground is simply bare. Two inks, chosen off the palette by luminance distance from the ground; straight lines throughout; no rotation between rings, no outline, no gradient, no shadow, no transparency and no curve anywhere in the picture.",
      "texture": "/assets/lumen-logic/textures/enfilade.ktx2",
      "preview": "/assets/lumen-logic/previews/enfilade.webp",
      "card": "/assets/lumen-logic/cards/enfilade.jpg",
      "palette": [
        "#8894ae",
        "#6b7da2",
        "#b4b8be"
      ]
    },
    {
      "id": "entasis",
      "title": "Entasis",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/entasis.webp",
      "description": "A rigid square lattice of diamond bullseyes, drawn after each axis has been pushed through one monotone hyperbolic stretch about the centre — so the middle of the sheet is magnified, the rim compresses without limit, and the pattern never folds. The picture reads as a sphere and is not one: the map is separable, x = β·tanh(κ·w) applied independently to each coordinate, which is what puts the fine concentric arcs into the corners rather than an empty margin. Nothing here is a lens; the swelling does not fade back to a flat grid at the edge, because there is no edge to fade to. Two kinds of site alternate in a checkerboard and they differ only in which end of the ladder is heavy: at a bullseye the outer rings carry the weight and merge into a solid diamond, at a saddle they are hairlines and the cell reads as pale hatch, and the seam between them is the X where four cells meet. The ladders tile the sheet exactly — a ring reaches half a cell and meets its neighbour on the cell edge, so nothing overlaps and nothing is left over. The one law that makes the sheet hold together is that a ring is stroked at a fraction of its OWN local gap and never at an absolute width: as the frame compresses the rings crowd, and their weights crowd with them, so the ink share stays flat from centre to corner while the marks themselves get four times finer. Write that weight in pixels instead and the rim goes solid black. The apparent bulge is not in the pattern and not in a lens — it is in the ruler, which is what entasis means.",
      "texture": "/assets/lumen-logic/textures/entasis.ktx2",
      "preview": "/assets/lumen-logic/previews/entasis.webp",
      "card": "/assets/lumen-logic/cards/entasis.jpg",
      "palette": [
        "#9099df",
        "#6e7ad8"
      ]
    },
    {
      "id": "entropy-grid",
      "title": "Entropy Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/entropy-grid.webp",
      "description": "A regular grid of small stroke-only motifs on dark navy — concentric rings and nested squares that decay into loose scattered clusters under a smooth spatial disorder field. Order is warm and chaos is cool: tidy motifs stroke in creams and rusts, jumbled ones in steel blues, with shape (circle vs. square) chosen by a second noise field so coherent square blocks emerge inside the sea of rings. Transitions take several cells — rings drift progressively off-centre, radii scatter, and colour cools — so the sheet reads as one continuous field of order melting into entropy.",
      "texture": "/assets/lumen-logic/textures/entropy-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/entropy-grid.webp",
      "card": "/assets/lumen-logic/cards/entropy-grid.jpg",
      "palette": [
        "#32353b"
      ]
    },
    {
      "id": "escarpment",
      "title": "Escarpment",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/escarpment.webp",
      "description": "A hard-edge painted abstraction in which the entire sheet is one stack of parallel bands sheared by a single jagged step function, so every edge in the picture is a translated copy of the same profile — the terraces below the shear line, the boundaries of the shattered zone and the hairline rims that separate them all bend at the same places, and nothing in the frame carries a contour of its own. The profile is a stair-stepped polyline that crosses the sheet corner to corner and never doubles back, built from a small alphabet of repeated angles so the zigzag reads as designed rather than as noise; because the bands are translates rather than perpendicular offsets, a band widens where it runs shallow and narrows where it runs steep, and the tightest corners can never round off or collide. A contiguous run of bands straddling the line is not filled flat but shattered: treated as one region rather than as a stack, it is cut by straight chords that run clean across its whole width and converge on hubs sitting on the profile's own corners, so long near-parallel slivers open into splayed fans wherever the line turns, and a second generation of cuts breaks a share of the facets into small shards. Colour is two families kept apart: the terraces take a cool ladder that jumps rather than ramps, so a near-black navy sits straight against a pale sky; the facets take a warm run that drifts slowly along the bolt from orange through carmine to coral and cream, with adjacent facets forced to contrast and a scatter of green accents as the only cool note inside the hot mass. Two hairline bands — pale on the far side, near-black on the near — separate the two families, and they are bands in the same stack rather than outlines drawn on top. Every region is then combed with opaque tone-shifted hairlines along its own long axis so the paint reads as brushed rather than printed. Flat, straight-edged, opaque: no curves, no gradients, no transparency, no shadow, no outline, no noise.",
      "texture": "/assets/lumen-logic/textures/escarpment.ktx2",
      "preview": "/assets/lumen-logic/previews/escarpment.webp",
      "card": "/assets/lumen-logic/cards/escarpment.jpg",
      "palette": [
        "#78373e",
        "#85a1c0",
        "#6782ad",
        "#d34f3b",
        "#535f78",
        "#d1794d"
      ]
    },
    {
      "id": "euclid",
      "title": "Euclid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/euclid.webp",
      "description": "An antique geometry-plate reproduced from an engraved figure sheet: aged paper packed with dozens of small numbered construction figures drawn in fine sepia ink. A grid of cells is each filled with one figure drawn from a large repertoire — triangles with medians and altitudes, circles with chords, diameters and inscribed polygons, star-diagonal polygons, quadrilaterals with diagonals, ellipses with axes and foci, isometric cubes, pyramids and other wireframe solids, sine curves, spirals, lemniscates, hatched angle sectors, coordinate grids with parabolas, armillary globes, concentric circles, intersecting circles with their radical axis and external tangent constructions — with dashed construction lines, dotted vertices and little italic point letters. Every figure gets a hand-lettered \"Fig. N\" caption and the whole plate carries a double-ruled border, foxing specks and an edge vignette. `Construction Detail` sets how many cevians, radii and hatch lines each figure grows, `Hand Jitter` the slight rotation and scale wobble of each drawing, `Ink Weight` the line thickness, and `Columns`/`Rows` how densely the sheet is packed. The render is a single-pass, seeded `CanvasRenderingContext2D` routine and defaults to the `Landscape` canvas with the `Euclid` palette.",
      "texture": "/assets/lumen-logic/textures/euclid.ktx2",
      "preview": "/assets/lumen-logic/previews/euclid.webp",
      "card": "/assets/lumen-logic/cards/euclid.jpg",
      "palette": [
        "#d3bf95"
      ]
    },
    {
      "id": "face-moire",
      "title": "Face Moiré",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/face-moire.webp",
      "description": "Encodes a procedural face into a line-grating moiré pattern. Two layers of vertical sine waves interfere: the background layer is uniform, while the face layer is phase-shifted only within the face geometry. The human eye picks up the subtle interference contrast as a shape, revealing eyes, nose, and mouth without any figurative drawing.",
      "texture": "/assets/lumen-logic/textures/face-moire.ktx2",
      "preview": "/assets/lumen-logic/previews/face-moire.webp",
      "card": "/assets/lumen-logic/cards/face-moire.jpg",
      "palette": [
        "#9b823d"
      ]
    },
    {
      "id": "facet-fruit",
      "title": "Facet Fruit",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/facet-fruit.webp",
      "description": "A single piece of fruit, cut from paper and printed. One of ten subjects — pear, apple, lemon, cherry, fig, avocado, peach, plum, pomegranate or strawberry — is generated from a half-width profile, then simplified by arc length into a straight-edged polygon whose vertices crowd where the profile turns fastest, so the silhouette reads as hand-cut rather than drawn: long straight runs down the flanks, short edges at the shoulders, and a subtle left-right asymmetry so no two sides match. Its interior is recursively guillotined into a handful of large convex flat planes — every cut runs the full width of whatever region it divides, always across that region's longer axis, so a tall fruit is banded horizontally first and each band is then cut vertically — and the planes are painted inside a clip of the silhouette, so the cuts appear to run edge to edge with no outline, no gap and no gradient. Each plane takes one flat colour by quantising a Lambert light model evaluated on an ellipsoid inscribed in the fruit, so tone descends coherently away from the light and the rim always turns dark — a picture with no gradient anywhere still reads as a round solid — with a seeded jitter that breaks the strict ordering by a step or two so it looks hand-mixed. Over the top the sheet is printed: a fine clumping per-pixel grain across fruit and paper alike, a granular dissolve that erodes every edge into scattered specks of fill outside and paper inside, and a clumped scatter of bright flecks — pale in the lit regions, hot red in the deep ones — dense across the middle of the body and sparse at its ends. A tapered near-black stem flares out of the top, and a leaf, a calyx or a spiked coronet finishes the fruits that carry one.",
      "texture": "/assets/lumen-logic/textures/facet-fruit.ktx2",
      "preview": "/assets/lumen-logic/previews/facet-fruit.webp",
      "card": "/assets/lumen-logic/cards/facet-fruit.jpg",
      "palette": [
        "#e7e6df",
        "#e1dbac",
        "#f0bb2a",
        "#f0d36f"
      ]
    },
    {
      "id": "facet-garden",
      "title": "Facet Garden",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/facet-garden.webp",
      "description": "A cubist watercolour collage: the whole plate is fractured into seamless angular facets in muted, paper-blended tones, then overlaid with bold geometric features — circles, semicircles, quarter-discs and triangular wedges, each either a saturated watercolour wash or a panel of black-and-white diagonal stripes. A botanical layer of pointed veined leaves and stippled daisies is scattered on top, and thin crack lines run across the whole composition. Every fill pools pigment toward its edges for a hand-painted feel. Deterministic from a seed.",
      "texture": "/assets/lumen-logic/textures/facet-garden.ktx2",
      "preview": "/assets/lumen-logic/previews/facet-garden.webp",
      "card": "/assets/lumen-logic/cards/facet-garden.jpg",
      "palette": [
        "#aeada1",
        "#9b9286",
        "#a88260"
      ]
    },
    {
      "id": "fan-facets",
      "title": "Fan Facets",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/fan-facets.webp",
      "description": "A bordered rectangle recursively bisected into an irregular mesh of triangles, each hatched with a pencil of straight lines fanning from one corner to the opposite edge. Acute corners spin off long near-parallel slivers while wide corners open into broad sunbursts, giving a dense, faceted line-drawing. Defaults to white ink on charcoal.",
      "texture": "/assets/lumen-logic/textures/fan-facets.ktx2",
      "preview": "/assets/lumen-logic/previews/fan-facets.webp",
      "card": "/assets/lumen-logic/cards/fan-facets.jpg",
      "palette": [
        "#434245"
      ]
    },
    {
      "id": "fascicle",
      "title": "Fascicle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/fascicle.webp",
      "description": "A bundle of about two hundred straight rays leaves a small inked core in a jittered ring and can only thin outward: every ray is laid at the origin, none is ever born in the field, and each simply stops at its own radius — roughly a third of them early, in the middle of the sheet, and the rest together at the rim with a ragged, independently drawn edge. Each surviving ray owns the channel between itself and its next surviving neighbour and fills it with a ladder of short black slabs: the gap between slabs is fixed, the slab swells from a tick near the core to its full length two thirds of the way out and shortens again at the rim, and each slab reaches most of the way across its channel, so a slab is a rung rather than a dot. Every ladder has its own phase and its own draws, which is why the sheet has texture and not concentric rings — the rows the eye insists on seeing are not there, and the correlation between neighbouring ladders is indistinguishable from the correlation between ladders half a turn apart. Because a channel runs to the next ray still alive, the survivors’ slabs widen into the space the dead rays leave and the sheet stays covered as the bundle thins, capped so that no slab spans much more than its nominal share. The heavy black annulus around the core is not drawn: it is where the rays are closer together than their own width. So is the ragged outline: it is two hundred independent draws from one distribution and nothing else.",
      "texture": "/assets/lumen-logic/textures/fascicle.ktx2",
      "preview": "/assets/lumen-logic/previews/fascicle.webp",
      "card": "/assets/lumen-logic/cards/fascicle.jpg",
      "palette": [
        "#ffffff",
        "#afafaf",
        "#7d7d7d",
        "#656565",
        "#dedede"
      ]
    },
    {
      "id": "feather-mandala",
      "title": "Feather Mandala",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/feather-mandala.webp",
      "description": "A dense dahlia-like bloom of layered, hand-cut feather plumes radiating from the canvas centre. Concentric rings of lanceolate petals nestle into one another and twist into a pinwheel core, drawn outermost-first so shorter inner plumes overlap like paper cut-outs. Each petal takes a colour from the palette and is overlaid with a clipped white gelli-print motif — a feather rib with barbs, bold paint splatter, or fine speckle — evoking a botanical cyanotype collage on soft ivory paper.",
      "texture": "/assets/lumen-logic/textures/feather-mandala.ktx2",
      "preview": "/assets/lumen-logic/previews/feather-mandala.webp",
      "card": "/assets/lumen-logic/cards/feather-mandala.jpg",
      "palette": [
        "#bea798",
        "#e1d1c2",
        "#a57e72"
      ]
    },
    {
      "id": "filament",
      "title": "Filament",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/filament.webp",
      "description": "A luminous cosmic web wrapped around a circular void. Thousands of nodes are scattered radially around an empty centre — densest in a bright ring just outside the void and thinning toward the corners. Each node is wired to its nearest neighbours with hair-thin straight segments, and the whole mesh is drawn with additive blending so overlapping strands glow where they pile up. Short links keep the tracery clean and never spill into the dark hole, evoking a neuron culture, a slime-mould network, or filaments of galaxies strung through the deep field.",
      "texture": "/assets/lumen-logic/textures/filament.ktx2",
      "preview": "/assets/lumen-logic/previews/filament.webp",
      "card": "/assets/lumen-logic/cards/filament.jpg",
      "palette": [
        "#070919"
      ]
    },
    {
      "id": "flame",
      "title": "Flame",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/flame.webp",
      "description": "Fractal flames: the chaos game on an iterated function system whose affine maps are composed with nonlinear variations (sinusoidal, spherical, swirl, horseshoe). Millions of orbit points condense onto the attractor; log-scaled density gives structure and a colour coordinate blended per function paints each region its own hue — a self-luminous nebula, optionally folded into k-way rotational symmetry.",
      "texture": "/assets/lumen-logic/textures/flame.ktx2",
      "preview": "/assets/lumen-logic/previews/flame.webp",
      "card": "/assets/lumen-logic/cards/flame.jpg",
      "palette": [
        "#06040e",
        "#31133b",
        "#5a3337"
      ]
    },
    {
      "id": "flash-sheet",
      "title": "Flash Sheet",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/flash-sheet.webp",
      "description": "A tattoo-flash sheet of bold marker doodles on a tiling of flat process-ink panels. The sheet is cut into equal rows and each row independently partitions one shared column grid into butting panels — no gutters, no rules, no margin — so panel edges never line up between rows; the panels are then four-coloured from a locked process set so no two sharing an edge carry the same ink. Every panel hosts exactly one doodle, and every mark in every doodle is made by a single operator: a skeleton polyline swept at a width profile and replayed as a stack of concentric passes at decreasing widths in alternating inks, so a solid shape, a hollow outline, a double-lined mark and a plain one are four settings of one pass stack rather than four routines. The inks in that stack are resolved from the panel underneath rather than from the motif — the keyline is black unless the panel is too dark for black to read, judged as a perceptual lightness gap — so a motif never knows what colour it is and the same doodle comes out dark on a cyan panel and light on a black one. Thirty-odd subjects across three families draw from that one nib: swept strokes (zigzag columns, coils, squiggle trains, tally runs, chevron stacks, arrows, spirals, bangs, queries, dollar signs, plus-chains, note clusters, asemic script ribbons, starbursts and swooshes), closed bodies (skulls, ghosts, blobs, hearts, gems, coffins, flames, leaves, eyes, fish, clouds, teeth, splats, crowns, popsicles, bones, nested triangles and stacked discs), and a face kit of five eyes against five mouths dropped into the ambiguous ones to turn a shape into a creature. Each subject declares the panel proportion it wants, so narrow strips get tall subjects and square panels get compact ones and nothing is ever stretched to fit; each is fitted by a uniform transform that solves its own tilt, and a few adjacent panels merge into diptychs carrying the same subject twice, mirrored, in swapped inks. Every stroke is heavy, round-capped, tapered at free ends and hand-wobbled by the same amount relative to its own panel, so the whole sheet reads as one sitting. All grounds are painted before any mark and every mark is fully opaque: depth is occlusion alone, with no gradient, no transparency, no shadow, no texture and no type anywhere.",
      "texture": "/assets/lumen-logic/textures/flash-sheet.ktx2",
      "preview": "/assets/lumen-logic/previews/flash-sheet.webp",
      "card": "/assets/lumen-logic/cards/flash-sheet.jpg",
      "palette": [
        "#855d57",
        "#a66240",
        "#664782",
        "#918b37",
        "#6a8483"
      ]
    },
    {
      "id": "flow-field",
      "title": "Flow Field",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/flow-field.webp",
      "description": "Smooth, continuous streamlines driven by Perlin noise, mimicking the gentle currents of a slow river or wind patterns. Dense, never-intersecting lines in muted teals and deep navy with warm gold accents.",
      "texture": "/assets/lumen-logic/textures/flow-field.ktx2",
      "preview": "/assets/lumen-logic/previews/flow-field.webp",
      "card": "/assets/lumen-logic/cards/flow-field.jpg",
      "palette": [
        "#e4e5de"
      ]
    },
    {
      "id": "fluid-pour",
      "title": "Fluid Pour",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/fluid-pour.webp",
      "description": "An acrylic \"Dutch pour\" bloom: thin tapering ribbons of fluid paint fan out radially from an off-centre origin into flower-like lobes, each vein snaking through a domain-warped noise field and edged with a pale paint-skin outline where colours meet. Amethyst purples and turquoise flow over a dark ground, with a bright core of lacy silver \"cells\" — the tell-tale bubbles that form when a lighter paint pushes up through a heavier one.",
      "texture": "/assets/lumen-logic/textures/fluid-pour.ktx2",
      "preview": "/assets/lumen-logic/previews/fluid-pour.webp",
      "card": "/assets/lumen-logic/cards/fluid-pour.jpg",
      "palette": [
        "#1f243d",
        "#0e0e1b",
        "#4ba4c1",
        "#1c4456",
        "#5e81b3"
      ]
    },
    {
      "id": "flux-grid",
      "title": "Flux Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/flux-grid.webp",
      "description": "A regular lattice of points displaced by a domain-warped flow field. A first pass of fractal value noise bends the sample coordinates into swirling, self-folding domains; a second pass reads the displacement vector there. Pushed hard, the grid folds onto itself, and the local compression of each warped cell — a discrete Jacobian — drives brightness, so points pile into luminous caustic ridges where the field converges and thin to bare navy where it stretches. Evokes a starfield drawn through turbulent glass.",
      "texture": "/assets/lumen-logic/textures/flux-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/flux-grid.webp",
      "card": "/assets/lumen-logic/cards/flux-grid.jpg",
      "palette": [
        "#545c70"
      ]
    },
    {
      "id": "folk-tree",
      "title": "Folk Tree",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/folk-tree.webp",
      "description": "A Gond-style tree of life: a slender trunk forks into tapering branches that end in a packed bouquet of circular rosettes. Each rosette is filled with hundreds of tiny pointed leaves placed by a twisted golden-angle spiral, so cream swirl lines emerge between the leaf rows and each cluster reads as a little whirlpool with an open eye. Black ink on cream paper.",
      "texture": "/assets/lumen-logic/textures/folk-tree.ktx2",
      "preview": "/assets/lumen-logic/previews/folk-tree.webp",
      "card": "/assets/lumen-logic/cards/folk-tree.jpg",
      "palette": [
        "#eae2d0",
        "#9b9589",
        "#d5cdbd",
        "#b6afa1"
      ]
    },
    {
      "id": "folk-vase",
      "title": "Folk Vase",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/folk-vase.webp",
      "description": "Naïve mixed-media flower-vase collage: a big bulbous patterned vase — periwinkle blue quilted with concentric doily mandalas, dots and sparkles — sitting on a dark stitched table, holding a fanned bouquet of stylised folk-art blooms (layered dahlias, concentric-ring poppies, dotted daisies and a little spiral rosette) on curving stems among decorated paisley leaves, against a soft sky.",
      "texture": "/assets/lumen-logic/textures/folk-vase.ktx2",
      "preview": "/assets/lumen-logic/previews/folk-vase.webp",
      "card": "/assets/lumen-logic/cards/folk-vase.jpg",
      "palette": [
        "#bbdff0",
        "#8a8fb6",
        "#cdc1c2",
        "#9cb5d5",
        "#554e8e",
        "#bf9eb4"
      ]
    },
    {
      "id": "fourier",
      "title": "Fourier Epicycles",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/fourier.webp",
      "description": "N nested circles rotate at prime angular frequencies — x and y driven by independent prime sets so the path never simply retraces. The endpoint traces a dense Lissajous knot over many rotations. Amplitude decays geometrically with each added circle, so the first circle dominates the large-scale shape while later circles add fine detail.",
      "texture": "/assets/lumen-logic/textures/fourier.ktx2",
      "preview": "/assets/lumen-logic/previews/fourier.webp",
      "card": "/assets/lumen-logic/cards/fourier.jpg",
      "palette": [
        "#02030a"
      ]
    },
    {
      "id": "foxfire",
      "title": "Foxfire",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/foxfire.webp",
      "description": "A near-black sheet in which every bright thing is the same luminous underpainting showing through a dark glaze. The underpainting is never painted: it is a smooth colour field of overlapping saturated blooms, and the picture consists of openings cut in an opaque skin laid over it, each opening taking its colour by sampling the field at its own position — so a disc, the seam beside it and the drip running off it are all the same hue, and that hue changes slowly across the sheet. The skin is four or more panels of dark cloth, cut row by row so the vertical seams do not line up between rows, separated by uneven dark gutters, and each panel is tinted by the field beneath it rather than by an arbitrary dark — olive over the chartreuse, plum over the magenta, umber over the orange. Each panel wears one of three surfaces: a plain-weave scrim drawn as two families of dashed hairlines whose dash period is the other family's pitch, so the lattice of bright crossings comes for free; a coarse checker of soft blooms where the glaze runs thin; or a comb of brush drag across the panel. A share of the panel edges show a bright hairline in the gutter beside them, never more than two per panel, and never as an outline. The dominant mark is a flat enamel disc, sparse and off-lattice, with radii drawn from a power law so the largest is several times the smallest and the small ones dominate; each carries a thin rim one step round the hue circle and darker, a share carry a halo built as a small stack of concentric opaque annuli stepping down into the panel, and a share are painted in the glaze instead so they read as holes punched through the picture. Paint then runs: every drip starts on a seam or a panel edge, tapers as it descends, wanders, and ends in a pendant head; some pool into flat irregular puddles; constellations of spatter fan from a point along a shared direction; and a few hairline loops of dried skin sit on the cloth. Opaque throughout — no transparency, no gradient, no shadow, no blur, no outline and no per-pixel work anywhere.",
      "texture": "/assets/lumen-logic/textures/foxfire.ktx2",
      "preview": "/assets/lumen-logic/previews/foxfire.webp",
      "card": "/assets/lumen-logic/cards/foxfire.jpg",
      "palette": [
        "#231e15",
        "#493716"
      ]
    },
    {
      "id": "fragments",
      "title": "Fragments",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/fragments.webp",
      "description": "Angular line-arrangement art inspired by \"Renders Game\" by MountVitruvius. N random straight lines cross the canvas, forming triangular regions at every pairwise intersection. Each triangle is independently assigned a solid palette fill, parallel hatching (ink lines aligned to one edge), or both. Bold structural lines are drawn on top of all fills.",
      "texture": "/assets/lumen-logic/textures/fragments.ktx2",
      "preview": "/assets/lumen-logic/previews/fragments.webp",
      "card": "/assets/lumen-logic/cards/fragments.jpg",
      "palette": [
        "#e0dac6",
        "#c4b48e",
        "#a3b6a7",
        "#b35432",
        "#c6c7b5"
      ]
    },
    {
      "id": "fringe-rug",
      "title": "Fringe Rug",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/fringe-rug.webp",
      "description": "A rectangular woven \"rug\" floats in a wide paper margin: a grid of square-ish tiles, each flooded edge-to-edge with mitre-sharp concentric bands — nested diamonds, elongated lozenge eyes, chevrons, L-bends and stair-step zigzag meanders — their colours cycling through a vivid felt-tip spectrum punctuated by black and white snap bands. Some tiles merge into larger 2×1, 1×2 or 2×2 statement motifs; a few drop to rhythmic two-tone bars. The signature move: where the bands meet the panel edge they never stop — every band escapes as a loose thread, gently curling outward to a staggered random length, so all four sides fray into the fringe of an unravelling textile, each thread continuing the colour of the band it frays from. Nine params (seed, columns, rows, band width, big tiles, zigzag mix, fringe length, fringe curl, paper margin) with a new shared Fringe Rug palette.",
      "texture": "/assets/lumen-logic/textures/fringe-rug.ktx2",
      "preview": "/assets/lumen-logic/previews/fringe-rug.webp",
      "card": "/assets/lumen-logic/cards/fringe-rug.jpg",
      "palette": [
        "#a8a2ab",
        "#8b8690",
        "#6b5968"
      ]
    },
    {
      "id": "frond-current",
      "title": "Frond Current",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/frond-current.webp",
      "description": "A dense, edge-to-edge drift of small flat leaf-sprigs on a near-black ground. A smooth seeded flow field — an all-over curl, a set of rotating eddies, a single streaming cascade or two interleaving braids — is integrated into streamlines, and each streamline becomes a run: a chain of discrete sprigs dropped nose-to-tail at roughly one sprig-length spacing, each turned to the local tangent and nudged off it, so a readable curving stroke emerges from marks that were never joined. Every sprig is a bowed spine hung with short pointed barbs swept forward toward the tip, their lengths following a lanceolate profile that peaks near the base and runs out to a point, and their bases overlapping by a fusion amount that takes the same mark from an open skeleton of separate needles to a single solid serrated blade. Four sprig families share that skeleton: the pinnate frond, the fine-barbed plume, the split lanceolate blade and the round-lobed bract. Size belongs to the run rather than to the sprig, drawn from a power law with a long tail, so a handful of runs carry the larger gestures while most stay small. Colour belongs to the run too, drawn from a slow spatial zone field so neighbouring runs agree and each ink owns a region, with a per-sprig break probability seeding off-colour intruders into every zone so no region is ever pure. A second slow field opens clearings where no run is seeded, letting the ground pool into dark rivers between the colour masses. Everything is opaque and painted largest-first with a weave jitter, so depth is occlusion alone and the stack interleaves rather than sorting cleanly. Full bleed, flat fills only — no outlines, no gradients, no shadows, no transparency and no text anywhere.",
      "texture": "/assets/lumen-logic/textures/frond-current.ktx2",
      "preview": "/assets/lumen-logic/previews/frond-current.webp",
      "card": "/assets/lumen-logic/cards/frond-current.jpg",
      "palette": [
        "#544f50",
        "#2e3848",
        "#86664d"
      ]
    },
    {
      "id": "furl",
      "title": "Furl",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/furl.webp",
      "description": "One strip of paper, twisted along its length and drawn flat-on with a single nib, as nothing but the tracks of a few dozen points fixed across its width. A point at cross-coordinate s lands on the spine plus s times the strip's half-width times the cosine of its twist angle, and four of the picture's most characteristic features are that one formula rather than anything drawn: where the twist carries the strip edge-on the cosine passes through zero, so the projected width vanishes and every track meets at a single point on the spine; past that pinch the cosine has changed sign, so the whole strip has turned over and the coloured stripe running down it appears on the opposite edge without ever moving through the lines between; the gap between neighbouring tracks is the projected width divided by the count, so a nib of one constant weight covers a larger and larger share of the band as a pinch approaches and the passage goes solid black by crowding rather than by fill; and where the band passes across itself, which part is in front is decided by depth, the band being cut into lobes at its own pinches and painted back to front — a cut that costs nothing, because two lobes meet exactly where the width is zero. The twist is a total turn rather than an amplitude, so every hundred and eighty degrees adds exactly one pinch and the knob is the lobe count in disguise, while a seeded reparametrisation makes the lobes come out uneven without ever changing how many there are. The strip cannot cusp: its half-width times the spine’s curvature is bounded below one once, globally, so no track can cross another and the package carries no collision test, no clamp and no retry — past a point, wandering further narrows the band instead. The track itself is drawn four ways: a plain line, a line whose weight follows the strip’s own foreshortening so the pinches stay crisp, a chain of beads sized from the local gap so they shrink to nothing at a fold and can never touch across the band, or a line broken on a rhythm that is a function of length alone, so the breaks line up across every track and a cross-band ripple appears that nothing draws. Line only — two inks and the bare ground, no gradient, no transparency, no shading, no shadow and no texture, and no outline other than the strip’s own two edges.",
      "texture": "/assets/lumen-logic/textures/furl.ktx2",
      "preview": "/assets/lumen-logic/previews/furl.webp",
      "card": "/assets/lumen-logic/cards/furl.jpg",
      "palette": [
        "#f7f7f5",
        "#dfdedb"
      ]
    },
    {
      "id": "gadroon",
      "title": "Gadroon",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/gadroon.webp",
      "description": "A sheet of bare paper carrying a dozen and a half fans of parallel curved ridges in blue-black ballpoint, each fan a set of concentric arcs at one pitch shared by the whole sheet — so a tight hook, a rainbow fan and a near-straight comb are three radii of one primitive rather than three kinds of mark. The fans are not placed on the sheet, they accrete: each new one is hung off a fan already there and is drawn only where no earlier fan has taken the paper, so it stops dead against its neighbour's outline and leaves a channel of clear ground between them. Every ragged front in the picture is a trim rather than a boundary, every empty eye is an inner radius nobody filled, and every bare lake is where the growth ran out of room — none of the three is drawn. A hashed minority of fans are weavers: they ignore the rule and run straight through whatever is already there, so two grids of ridges cross into a dense woven mesh with neither of them broken, thinned or on top. The mark is a scribble — a looping quiver that crosses back over its own path — with an amplitude budget that makes ridges of one fan unable to touch by arithmetic rather than by a collision test. Ink runs in patches between iron and cobalt, a few ridges strike bolder than the rest, and the radius draw is log-uniform, so one seed gives a raft of tight hooks and the next a few enormous lazy sweeps that read as straight combs.",
      "texture": "/assets/lumen-logic/textures/gadroon.ktx2",
      "preview": "/assets/lumen-logic/previews/gadroon.webp",
      "card": "/assets/lumen-logic/cards/gadroon.jpg",
      "palette": [
        "#cccdd0",
        "#f7f6f1",
        "#b6b8bf"
      ]
    },
    {
      "id": "gale-tree",
      "title": "Gale Tree",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/gale-tree.webp",
      "description": "A tree in a gale, drawn without ever drawing a tree. Every mark on the sheet is the same mark — one continuous, uniform-width hairline — and every hairline is born at a single hub and pointed radially away from it, then progressively handed over to a wind field as it travels. Near the hub the radial direction still wins, so a few hundred strands run parallel and the trunk appears; further out the wind takes over and the same strands splay, comb and coil into a crown, wrapping whole turns around explicit vortices and streaming off the downwind edge. A second family launched into the lower half-plane keeps its radial heading almost to the edges and lays down the ground fan. A share of strands loop once through a closed curl; a few escape as long clean strays across empty sky. Colour follows the wind rather than a light source: hairs launched windward take the blacks and the deep greens, hairs launched downwind take burnt orange, amber, gold and the pale straw highlights, so the mass reads as a dark compressed shoulder against a hot streaming lee side with no shading anywhere.",
      "texture": "/assets/lumen-logic/textures/gale-tree.ktx2",
      "preview": "/assets/lumen-logic/previews/gale-tree.webp",
      "card": "/assets/lumen-logic/cards/gale-tree.jpg",
      "palette": [
        "#8e8a80",
        "#aeb8bb",
        "#694e2b",
        "#8e6844",
        "#ab9f94",
        "#7b7267"
      ]
    },
    {
      "id": "gambado",
      "title": "Gambado",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/gambado.webp",
      "description": "A child seen from behind, floating mid-leap on warm empty paper, built from one solid: the tapered capsule — a segment with a radius at each end, understood as the union of the balls along it. Its projection is exactly the convex hull of its two end discs, so a silhouette is two circular arcs joined by the outer common tangents in closed form, and there is no sampled geometry anywhere in the package. Every mark is that one shape: a limb, a paint blob, a fold in a sleeve, the terminator on a floating body, a flower petal, a fin on a miniature rocket. Each limb chain is cut at a parameter into a clothed run and a bare run — a garment is a cut of the primitive, not a mask, so the hem is a real circle of the solid and the seam cannot open a gap. What is clothed takes a broad shadow, a narrow sheen and a few creases and reads as volume; what is bare takes a cloud of flat camouflage blobs and no shading at all and reads as pattern, and that opposition is the picture. The paint belongs to the body rather than to the limb: a blob is admitted to every solid it actually meets in 3-D and drawn identically under each one’s clip, so a blob straddling an elbow crosses the joint with no gap and the camouflage reads as one painted body seen through several windows. Around the figure float spheres with mottled faces, one hand holds a radial bloom, and miniature craft and astronauts — the same armature builder at a fortieth of the scale — tumble past the heels. Everything is opaque and painted back to front, so depth is occlusion alone. Nothing is outlined: the only stroke in the package runs under the fills, so all that survives of it is a soft keyline around the figure that lifts it off the paper.",
      "texture": "/assets/lumen-logic/textures/gambado.ktx2",
      "preview": "/assets/lumen-logic/previews/gambado.webp",
      "card": "/assets/lumen-logic/cards/gambado.jpg",
      "palette": [
        "#eeebe3",
        "#cfc0c2"
      ]
    },
    {
      "id": "geo-calavera",
      "title": "Geo Calavera",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/geo-calavera.webp",
      "description": "A frontal skull assembled entirely from flat Bauhaus modules snapped to one irregular, bilaterally symmetric lattice. Quarter-ring hooks, elbow pipes, solid bars, concentric rosettes, stripe columns, checker patches and rounded tooth pills fill a procedural skull silhouette whose mandible ends in a ragged staircase of columns; every grid line the modules cross re-colours them, so a single unbroken shape steps through cream, magenta, cyan and amber across its length. Row lines lock to the anatomy — brow, socket, nose base, tooth rows, jaw — so the concentric-ring eye targets, a negative-space keyhole nose and two rows of tooth pills always read, while thin black grout seams turn the mass into inlay. Around it a near-black void is dressed with small discs, ring outlines, hairline bundles, long single rules and a corner bracket. Flat fills only — no gradients, no outlines.",
      "texture": "/assets/lumen-logic/textures/geo-calavera.ktx2",
      "preview": "/assets/lumen-logic/previews/geo-calavera.webp",
      "card": "/assets/lumen-logic/cards/geo-calavera.jpg",
      "palette": [
        "#201b1f",
        "#7a4d48",
        "#ab938c",
        "#554538",
        "#967b6d",
        "#d39271"
      ]
    },
    {
      "id": "geo-triangles",
      "title": "Geo Triangles",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/geo-triangles.webp",
      "description": "A dense grid of squares, each split diagonally into two triangles. Colors are drawn from a value-noise field so similar hues cluster into large coherent zones, while the per-cell diagonal direction — noise-driven, random, or checkerboard — creates a faceted, quilt-like surface. Palette defaults to bold reds against cool blue-grey.",
      "texture": "/assets/lumen-logic/textures/geo-triangles.ktx2",
      "preview": "/assets/lumen-logic/previews/geo-triangles.webp",
      "card": "/assets/lumen-logic/cards/geo-triangles.jpg",
      "palette": [
        "#ad94a3"
      ]
    },
    {
      "id": "gestural-burst",
      "title": "Gestural Burst",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/gestural-burst.webp",
      "description": "Abstract expressionist painting simulation: a domain-warped colour-region base layer combined with multi-pass flow-field brushstrokes that radiate outward from a configurable burst origin. Wide base washes build colour mass regions while progressively narrower strokes on top create directional energy and rough, bristle-like edges.",
      "texture": "/assets/lumen-logic/textures/gestural-burst.ktx2",
      "preview": "/assets/lumen-logic/previews/gestural-burst.webp",
      "card": "/assets/lumen-logic/cards/gestural-burst.jpg",
      "palette": [
        "#c38f8c",
        "#96b68d"
      ]
    },
    {
      "id": "ginkgo",
      "title": "Ginkgo",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ginkgo.webp",
      "description": "Fan-shaped botanical leaves inspired by the ginkgo biloba tree. Each leaf is drawn with bezier curves forming the characteristic bilobed outline with a central notch, radiating veins clipped to the leaf boundary, and a short petiole stem. Leaves are scattered across the canvas with configurable size range, count, and overlap.",
      "texture": "/assets/lumen-logic/textures/ginkgo.ktx2",
      "preview": "/assets/lumen-logic/previews/ginkgo.webp",
      "card": "/assets/lumen-logic/cards/ginkgo.jpg",
      "palette": [
        "#f2ebd9",
        "#d0ca8c",
        "#b28a2f"
      ]
    },
    {
      "id": "girih",
      "title": "Girih",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/girih.webp",
      "description": "Islamic star patterns by Hankin's polygons-in-contact method: a square, hexagonal or octagon-square grid is decorated by launching two rays from every tile-edge midpoint at a fixed contact angle; their intersections form interlocking stars and rosettes that flow seamlessly across tile boundaries. One angle parameter sweeps the whole design from soft weave to needle-sharp burst; strands render as traditional cased straps over muted tile grounds.",
      "texture": "/assets/lumen-logic/textures/girih.ktx2",
      "preview": "/assets/lumen-logic/previews/girih.webp",
      "card": "/assets/lumen-logic/cards/girih.jpg",
      "palette": [
        "#9ea19d"
      ]
    },
    {
      "id": "glitch-orrery",
      "title": "Glitch Orrery",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/glitch-orrery.webp",
      "description": "A neon vector glitchscape reproduced from a reference image. Large wireframe spirograph bodies — spheres and tori built from dozens of overlapping thin circle outlines whose stroke colour grades cyan through electric blue into violet, several carrying a smaller rainbow core of yellow, orange and green rings — orbit above a corrupted datascape. The lower canvas collapses into digital glitch: horizontal shred bands of dense vertical stripes in mixed neon, striped perspective wedges that read as receding 3D planes, fine hatch blocks of tiny coloured dashes, and irregular black debris cutouts that shatter the bands into a fragment horizon. Threaded through the airy upper half are bubble-chain arcs of swelling outlined circles and dotted trails, all on a near-black ground. The render is a single-pass CanvasRenderingContext2D routine driven by a mulberry32 PRNG; deterministic from a seed, defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/glitch-orrery.ktx2",
      "preview": "/assets/lumen-logic/previews/glitch-orrery.webp",
      "card": "/assets/lumen-logic/cards/glitch-orrery.jpg",
      "palette": [
        "#0b0a11",
        "#18202c",
        "#363e44"
      ]
    },
    {
      "id": "glossolalia",
      "title": "Glossolalia",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/glossolalia.webp",
      "description": "A page of writing in a language that does not exist, filling a warm off-white board edge to edge and running off all four sides. The alphabet is invented from the seed rather than authored: a grammar of bowls, posts, limbs and bars assembles a closed set of eight to a dozen vocables — a round O, a U, a V, an H, a bowl stopped by a post — and every one of the several hundred marks on the board is an instance of one of them, so the page reads as language rather than as pattern. It reads that way because of two levels of repetition: the vocables are drawn with a heavy frequency skew, so a few forms carry the whole panel and one or two appear twice in the entire picture, and the marks are grouped into short words from a lexicon that has its own skew, so clusters recur down the page and the same letter often doubles or triples immediately. Nothing is drawn twice from the same geometry — every instance passes through a fresh hand that gives it its own size, lean and aspect, a coarse three-swing tremor in place of true curvature, and its own stroke overrun and undershoot, so the bowl rarely closes and the crossbar overshoots one post and misses the other. The mark is a stubby loaded brush at a shallow constant angle: thick relative to the letter so counters close into blobs, mildly heavier on the strokes that run across the nib than along it, pooling where strokes meet inside a letter, and breaking into dry skips that show the board rather than fading to grey, because every value in the ink is a question of whether the brush touched down. Across the board a slow spatial field moves the weight and the wetness in patches several letters wide, unrelated to the rows, which is the only thing keeping an all-over field of one alphabet from reading as a printout. The board underneath is two or three sheets butted and taped, with a faint seam off centre and a slight tonal step across it. Two colours and no hue: near-black ink with a cool cast on a warm off-white support.",
      "texture": "/assets/lumen-logic/textures/glossolalia.ktx2",
      "preview": "/assets/lumen-logic/previews/glossolalia.webp",
      "card": "/assets/lumen-logic/cards/glossolalia.jpg",
      "palette": [
        "#c9c9c2"
      ]
    },
    {
      "id": "glyph-grid",
      "title": "Glyph Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/glyph-grid.webp",
      "description": "A poster grid of bold, blocky invented ideographs. Each cell is filled with a heavy black glyph built from thick rounded strokes — frames, combs, parallel bars, windowpanes, ladders, hooks, rings and discs — separated by thin white channels, then accented with solid vermilion dots and bars in the style of a constructivist type specimen. A density control packs each glyph from an airy open alphabet to near-solid slabs.",
      "texture": "/assets/lumen-logic/textures/glyph-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/glyph-grid.webp",
      "card": "/assets/lumen-logic/cards/glyph-grid.jpg",
      "palette": [
        "#908d8c",
        "#acaba9",
        "#7a7877"
      ]
    },
    {
      "id": "gnomon",
      "title": "Gnomon",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/gnomon.webp",
      "description": "One monumental solid on bare cream, after a hard-edge painting of a blue slab: a light face square-on to the viewer, a darker face raking away down its side, and one black mass behind it that hugs its lower edges and closes to a sharp point above its shoulder. There is one solid, one lamp and one lens, and every mark is a consequence of those three rather than a shape that was drawn. The reference is a correct perspective projection of a box — extending its two horizontal edge families gives vanishing points that fit a pinhole camera to within a degree — so this builds a real solid and a real camera instead of nudging the corners of a quadrilateral. The black is not the blue offset a little: a translated shadow keeps every edge parallel to the edge it came from, and in the reference the slab's left edge and the shadow of that same edge lean five degrees apart. It is a real cast shadow instead — a point lamp, a wall behind, and the solid projected onto it — with the lamp solved in closed form from the two things a picture actually shows, how much bigger the shadow is and how far it is thrown, rather than positioned by hand. One thing physics will not do, and the package says so rather than hiding it: a box's shadow edges are always parallel to the box's own, because an edge at constant depth takes a constant magnification, so an honest black is a rim of uniform width. The reference's tapers, from 22 % of the slab's width at the top to 13 % at the bottom. So the black is cast from the same solid turned a few degrees about its own centre — the rotation put where a painter puts it, in the caster rather than in the physics, and it goes back to an honest shadow at a cant of zero. One primitive builds every element: the convex hull of two parallel convex polygons, the upper a scaled copy of the lower — which keeps every side face planar, makes hidden-surface removal a sign test per face, and means the visible faces tile the silhouette exactly, so nothing is ever sorted or depth-buffered. The tone of a face is an index into the palette and never a tint of one colour, because the reference's two blues are two different blues rather than one blue darkened; and the ladder is keyed by how squarely a face meets the viewer rather than by the light, which is the poster convention the painting follows and not the physics. The frame is fitted to the solid and its shadow together, so the solid drifts off centre away from the lamp on its own. The element is a knob — slab, wedge, chamfered block, pentagonal pylon or faceted column, any of them battered or flared by a taper — and it is nothing but the list of convex bases the same camera and lamp run on.",
      "texture": "/assets/lumen-logic/textures/gnomon.ktx2",
      "preview": "/assets/lumen-logic/previews/gnomon.webp",
      "card": "/assets/lumen-logic/cards/gnomon.jpg",
      "palette": [
        "#b7b5a7",
        "#6491b6",
        "#827f77",
        "#9fc1ca",
        "#5caed6",
        "#595855"
      ]
    },
    {
      "id": "goo-lagoon",
      "title": "Goo Lagoon",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/goo-lagoon.webp",
      "description": "A cool-toned doodle-monster mural in the street-pop sticker-wall tradition: a full-bleed crowd of plump cartoon creatures — grinning triangle-toothed heads, sad flowers, a horned cat-face shedding a tear, one-eyed fanged beasts, ghosts, melting slimes and sleepy-lidded blobs — each rendered as a soft-shaded 3-D balloon with a cream rim-light, glossy highlighted googly eyes and drips, embedded in a cross-hatched dark-teal ground and dotted with small number and name-tag badges. A greedy space-filling pack crowds the cast into interlocking footprints, full-bleed, in a fixed blue-green-cream lagoon palette.",
      "texture": "/assets/lumen-logic/textures/goo-lagoon.ktx2",
      "preview": "/assets/lumen-logic/previews/goo-lagoon.webp",
      "card": "/assets/lumen-logic/cards/goo-lagoon.jpg",
      "palette": [
        "#68846c",
        "#476462",
        "#70919f"
      ]
    },
    {
      "id": "gradine",
      "title": "Gradine",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/gradine.webp",
      "description": "Large overlapping families of concentric rings on black, in three flat inks, where every mark on the sheet is one step of a single ruler and the only thing that changes across the picture is which centre a mark is measured from. The ruler is one number — the sheet’s short side divided by a count — worked out once before any disc exists and never worked out again, so a ring lands at an exact multiple of it and nothing anywhere derives a spacing from the family it belongs to. The consequence is the picture: a big family carries more rings than a small one and never wider ones, and the corduroy runs on at exactly the same gauge across every seam even though the centre it is struck about has jumped, so the sheet reads as one material that has been re-centred rather than as several laid side by side. The black eye at a family’s middle is not an object but the handful of steps the ruler skips, which is why it is the same size in the largest family and the smallest; and because a radius is not a whole number of steps, every family ends on a leftover — a black annulus between its outermost ring and its true edge, a different width in every one of them, that nothing draws. Centres sit on a triangular or square lattice and take their ink from arithmetic on the index alone: site (i, j) is coloured (i + 2j) mod 3, so no two adjacent sites can share an ink, with no search and no possibility of failure. One inequality then carries that from the lattice to the picture — the largest radius plus the largest centre displacement must not exceed half the lattice’s second-neighbour distance, and the radius alone must not reach a neighbour’s centre — applied as a single clamp with nothing checked at runtime, and between them they make two visible things impossible rather than merely unlikely: no two overlapping discs ever share an ink, and every family’s eye survives every occlusion, at any seed. Asking for a bigger radius past that ceiling does nothing, and the way to buy one is to spend less on jitter; cross the ceiling and the guarantee does not degrade but collapses, because the lattice’s entire second-neighbour ring is precisely the class that shares an ink. Discs are painted back to front in lattice scan order and each fills its own clip with the ground before stroking, so occlusion is the only compositor and a seam is always one family’s own boundary, an arc and never a straight line. The order is deliberately blind to colour: deal the draws by ink instead and one of the three is all but wiped off the sheet. Nothing is transparent, additive, blurred, outlined or shaded, and there is no second scale of detail — the finished sheet has four colours in it, three inks and the ground, and the ground is the largest of them by area, being every gap between rings, every eye and every leftover at once. Colour carries no information whatever: it is a function of the index, constant across all of a family’s rings, and everything the picture says it says with the ruler.",
      "texture": "/assets/lumen-logic/textures/gradine.ktx2",
      "preview": "/assets/lumen-logic/previews/gradine.webp",
      "card": "/assets/lumen-logic/cards/gradine.jpg",
      "palette": [
        "#392e27",
        "#5f5045"
      ]
    },
    {
      "id": "graffiti-facets",
      "title": "Graffiti Facets",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/graffiti-facets.webp",
      "description": "A street-art wall of angular faceted planes, reproduced from a reference image. The frame is recursively sliced into convex facets, each flooded a mostly-neutral silver/grey (warm tan and bright accents punctuate) and filled with fine parallel hatch lanes that either run dead straight or kink exactly once at a shared fold crease, so the planes read as folded paper. Facet edges are stroked bold in dark navy with a share picked out in electric blue, and every plane is darkened along the edges facing away from the light so neighbouring facets cast soft shadow gutters and read as layered folds. The whole is then tagged with graffiti — soft pink spray-paint blooms with drips and looping yellow scribbles. The render is a single-pass CanvasRenderingContext2D routine driven by a mulberry32 PRNG. Deterministic from a seed, defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/graffiti-facets.ktx2",
      "preview": "/assets/lumen-logic/previews/graffiti-facets.webp",
      "card": "/assets/lumen-logic/cards/graffiti-facets.jpg",
      "palette": [
        "#a9acac",
        "#c2c3c3",
        "#959794"
      ]
    },
    {
      "id": "graffiti-pulse",
      "title": "Graffiti Pulse",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/graffiti-pulse.webp",
      "description": "A layered graffiti abstraction reproduced from a reference image. A dense allover camo field of oversized abstract letterform fragments — filled blades and crescents, chunky round-capped bent strokes, angular wedges and thick ring arcs, in forest greens, olives, teals, near-blacks and a pale mint — sits on a bare pink ground, some fragments extruded into short slabs shaded down-right. Enormous pale-mint ghost-script scrawls loop through the mid-canvas, then thin coral ribbons and wider pink cut-out slices snake across the field, a cluster of signal-red bars punctuates one quadrant, and a single flat magenta disc floats above. The top layer is a monumental two-tone yellow hero band — a pulse, bolt, arrow or staircase entering off one edge, kinking sharply across most of the canvas and exiting off another, its underside carrying a darker-yellow shade so it reads as a flat slab with thickness. The render is a single-pass CanvasRenderingContext2D routine driven by a mulberry32 PRNG; deterministic from a seed, defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/graffiti-pulse.ktx2",
      "preview": "/assets/lumen-logic/previews/graffiti-pulse.webp",
      "card": "/assets/lumen-logic/cards/graffiti-pulse.jpg",
      "palette": [
        "#e1b9a2",
        "#d9c8c9",
        "#f2d692",
        "#b6b1b4"
      ]
    },
    {
      "id": "gravel-grid",
      "title": "Gravel Grid",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/gravel-grid.webp",
      "description": "A homage to Georg Nees’ \"Schotter\" (1968): a grid of equal square outlines that begins as a perfectly ordered lattice at the top and progressively dissolves into rotational and positional chaos toward the bottom, the squares tumbling and overlapping like scattered gravel. Each square’s random rotation and offset scale with its row index, so order gives way to disorder in a smooth top-to-bottom ramp. Black ink on cream paper.",
      "texture": "/assets/lumen-logic/textures/gravel-grid.ktx2",
      "preview": "/assets/lumen-logic/previews/gravel-grid.webp",
      "card": "/assets/lumen-logic/cards/gravel-grid.jpg",
      "palette": [
        "#e8e3d7"
      ]
    },
    {
      "id": "grid-shapes",
      "title": "Grid Shapes",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/grid-shapes.webp",
      "description": "A grid of cells where each cell renders one randomly-chosen shape — triangle, circle, half-circle, quarter-circle, square, diamond, or cross — filled with pastel palette colors. Toggle which shape types appear and control grid density and gap padding.",
      "texture": "/assets/lumen-logic/textures/grid-shapes.ktx2",
      "preview": "/assets/lumen-logic/previews/grid-shapes.webp",
      "card": "/assets/lumen-logic/cards/grid-shapes.jpg",
      "palette": [
        "#b09e9d",
        "#81d3a8",
        "#aebbcf",
        "#d7b593",
        "#cda4bf"
      ]
    },
    {
      "id": "growth-rings",
      "title": "Growth Rings",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/growth-rings.webp",
      "description": "Distorted concentric growth rings reminiscent of agate stone or tree cross-sections. A unified Perlin noise field warps all rings coherently so they ripple without crossing, coloured in cycling jewel tones.",
      "texture": "/assets/lumen-logic/textures/growth-rings.ktx2",
      "preview": "/assets/lumen-logic/previews/growth-rings.webp",
      "card": "/assets/lumen-logic/cards/growth-rings.jpg",
      "palette": [
        "#756153"
      ]
    },
    {
      "id": "guilloche",
      "title": "Guilloché",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/guilloche.webp",
      "description": "A rose-engine bloom on a black plate, in which nothing you can see is a line anybody drew. The unit of drawing is not a mark but a *pencil* — a family of eighty closed loops that differ only by a smooth sweep of one shape exponent — and every petal outline, every rib and every needle in the central star is a place where that family crowds. One profile makes all of it: a radius built as a waist plus a rise, the rise being sin(pi·u) raised to an exponent and multiplied by a bounded ripple, so a fat lobe, a lens and a needle are three values of one number rather than three shapes. The waist is what carries the picture: at zero a strand dives to the origin several times a turn and reads as a needle, and at three quarters it is a shallow undulation on a near-circle and reads as an arc running across — so as the waist ramps down the ladder the field turns from broad bands at the rim into converging needles at the centre, on one continuous construction rather than two kinds of mark. The picture is a geometric ladder of such pencils, each turned against the last by a fraction of its own petal cell, with the petal count halving inward — the outer layers carry `fold` petals and the inner ones twice that — and the ink walking the palette with a stride rather than in order, so colour steps crimson, gold, crimson, violet by layer while staying flat around any circle. The ink is light rather than paint: hairlines composite additively at an alpha normalised against the strand count, so the strand slider buys smoothness and never brightness and the plate cannot be burned white. With no swirl the pencil is provably nested and no two strands of a layer ever cross; swirl shears it into the crisscross that gathers at the tips, and is a pure shear that leaves every layer's radial envelope exactly where it was. Nothing is scattered, packed or rejected — the seed shapes the ladder and the rest is arithmetic, so the N-fold symmetry is exact to floating point rather than tuned.",
      "texture": "/assets/lumen-logic/textures/guilloche.ktx2",
      "preview": "/assets/lumen-logic/previews/guilloche.webp",
      "card": "/assets/lumen-logic/cards/guilloche.jpg",
      "palette": [
        "#0c0306",
        "#6e2a45"
      ]
    },
    {
      "id": "hand-stars",
      "title": "Hand Stars",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/hand-stars.webp",
      "description": "Fills the canvas with hand-drawn stars of varying types — asterisks, polygon stars, and Mercedes-style tristars — scattered across a grid in different sizes and palette colours, each drawn with wobbly bezier strokes that give a sketched, imperfect quality.",
      "texture": "/assets/lumen-logic/textures/hand-stars.ktx2",
      "preview": "/assets/lumen-logic/previews/hand-stars.webp",
      "card": "/assets/lumen-logic/cards/hand-stars.jpg",
      "palette": [
        "#ecf3f1"
      ]
    },
    {
      "id": "harmonograph",
      "title": "Harmonograph",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/harmonograph.webp",
      "description": "A compound pendulum simulator. Two slightly-detuned damped oscillators drive x and y independently, their interference producing intricate spiraling Lissajous figures that gradually collapse to rest. Each frequency ratio and phase produces a unique, unrepeatable knot.",
      "texture": "/assets/lumen-logic/textures/harmonograph.ktx2",
      "preview": "/assets/lumen-logic/previews/harmonograph.webp",
      "card": "/assets/lumen-logic/cards/harmonograph.jpg",
      "palette": [
        "#140906",
        "#3e270d"
      ]
    },
    {
      "id": "hex-cells",
      "title": "Hex Cells",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/hex-cells.webp",
      "description": "Pointy-top hexagonal grid coloured by a Perlin noise field. A configurable fraction of cells are randomly subdivided into six equilateral triangles tinted with slight colour variation, producing a stained-glass or mosaic effect.",
      "texture": "/assets/lumen-logic/textures/hex-cells.ktx2",
      "preview": "/assets/lumen-logic/previews/hex-cells.webp",
      "card": "/assets/lumen-logic/cards/hex-cells.jpg",
      "palette": [
        "#038b8f"
      ]
    },
    {
      "id": "hilbert",
      "title": "Hilbert Ribbon",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/hilbert.webp",
      "description": "Hilbert's space-filling curve (or the closed-loop Moore variant) generated by L-system rewriting: one unbroken self-avoiding ribbon that visits every cell of a 2ⁿ×2ⁿ grid exactly once. The stroke colour sweeps the palette along the path, and because the curve preserves locality, colour settles into soft interlocking blocks with fractal boundaries — a recursive labyrinth carrying a single gradient thread.",
      "texture": "/assets/lumen-logic/textures/hilbert.ktx2",
      "preview": "/assets/lumen-logic/previews/hilbert.webp",
      "card": "/assets/lumen-logic/cards/hilbert.jpg",
      "palette": [
        "#c1e3ca",
        "#eacda9",
        "#a3c6cd",
        "#a0a2a6",
        "#dba593"
      ]
    },
    {
      "id": "hocket",
      "title": "Hocket",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/hocket.webp",
      "description": "Nothing here is drawn as a whole shape. Every plate in the picture is built outward from a chosen span of an existing plate's edge — the two share that segment exactly — so an assembly grows by hand-off the way a hocket passes one melody between two voices, and the heavy constant-weight keyline web is a consequence of the growth rather than an outline drawn around anything: a black line runs on from one plate into the next because there is only one line there. A chain walks a drifting spine, kinking and doubling back and throwing off short side-chains, and it is a figure only because it ended up tall, connected and vertical on an empty ground — no silhouette is decided in advance and none can be, since the outline is whatever the chain grew into. The same primitive, grown three different distances, gives the huge slabs that run off the frame edges, the figures themselves, and the fittings hung on them: a bar with a row of teeth, a run of plates each wider than the last with cross-bars over it, a fan of hairlines running past an edge, a sawtooth hem, an inset window. No plate is ever painted: its fill is a clipped window onto one of half a dozen bolts of stock — coarse pixel mosaic, ruled graph, fine static speckle, marbled curl, scattered confetti, flat and one soft ramp — whose lattices are pinned to absolute sheet coordinates rather than to the plate, so a stock reads as one continuous printed sheet running under every shape cut from it, however far apart they are. Under everything lies a pale ground ruled with hundreds of short horizontal dashes, and over everything strict painter’s order: every plate is opaque, nothing is blurred, shaded, lit or blended, and there is not one curve in the picture.",
      "texture": "/assets/lumen-logic/textures/hocket.ktx2",
      "preview": "/assets/lumen-logic/previews/hocket.webp",
      "card": "/assets/lumen-logic/cards/hocket.jpg",
      "palette": [
        "#c6b38c",
        "#bc8956",
        "#e0b461",
        "#becbc0"
      ]
    },
    {
      "id": "hopf",
      "title": "Hopf Flowers",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/hopf.webp",
      "description": "The Hopf fibration S³ → S²: every base point on the 2-sphere lifts to a great-circle fibre of the 3-sphere, any two fibres linked exactly once. Families of base points — latitude rings, a Fibonacci spiral or a great-circle band — are lifted, stereographically projected to R³ (where fibres become perfect nested circles on tori) and drawn as depth-shaded additive rings that thread through one another: four-dimensional topology as a woven flower of light.",
      "texture": "/assets/lumen-logic/textures/hopf.ktx2",
      "preview": "/assets/lumen-logic/previews/hopf.webp",
      "card": "/assets/lumen-logic/cards/hopf.jpg",
      "palette": [
        "#03020a",
        "#1d1c25"
      ]
    },
    {
      "id": "hyperbolic",
      "title": "Hyperbolic Tiles",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/hyperbolic.webp",
      "description": "A regular {p,q} tessellation of the hyperbolic plane in the Poincaré disk — the geometry of Escher's Circle Limit prints. A central regular p-gon with q meeting at each vertex ((p−2)(q−2) > 4) is reflected across its edges by circle inversion; every edge is a geodesic arc orthogonal to the boundary circle. All tiles are congruent in the hyperbolic metric, yet shrink exponentially toward a rim they never reach — infinity compressed into a disk, coloured by generation depth, sector or parity.",
      "texture": "/assets/lumen-logic/textures/hyperbolic.ktx2",
      "preview": "/assets/lumen-logic/previews/hyperbolic.webp",
      "card": "/assets/lumen-logic/cards/hyperbolic.jpg",
      "palette": [
        "#4f4f6d",
        "#2e1b2f",
        "#6a9b78"
      ]
    },
    {
      "id": "il-cubo",
      "title": "Il Cubo",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/il-cubo.webp",
      "description": "After Edward Zajec's Il Cubo (1971): a field of isometric cubes on an oblique unit grid. Each occupied cell carries a stack of coherently-lit cubes (top, left, right faces); world-adjacent cubes share whole face edges and fuse into continuous beams, walls and staircases. Empty cells leave the slate background and a few resolve to flat lozenges, giving the interlocking, maze-like block structure of the original.",
      "texture": "/assets/lumen-logic/textures/il-cubo.ktx2",
      "preview": "/assets/lumen-logic/previews/il-cubo.webp",
      "card": "/assets/lumen-logic/cards/il-cubo.jpg",
      "palette": [
        "#cbaa90"
      ]
    },
    {
      "id": "image-blend",
      "title": "Image Blend",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/image-blend.webp",
      "description": "Vectorizes multiple source images and combines them using one of eight structural blend modes: contour interleaving, boolean XOR masking, geometry/color swapping, skeleton-texture fusion, flow-field particle simulation, frequency-band decomposition, Voronoi territorial division, and path-morph interpolation. Accepts 1–10 images; each mode produces a visually distinct emergent artwork that exists nowhere in the source images individually.",
      "texture": "/assets/lumen-logic/textures/image-blend.ktx2",
      "preview": "/assets/lumen-logic/previews/image-blend.webp",
      "card": "/assets/lumen-logic/cards/image-blend.jpg",
      "palette": [
        "#fefdf9"
      ]
    },
    {
      "id": "imbricate",
      "title": "Imbricate",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/imbricate.webp",
      "description": "A frontal machine mask laid up out of two to four hundred overlapping plates on a near-black ground, in the manner the name says: imbricate, arranged in overlapping order like roof tiles, so what you see of any plate is what the next one did not cover. One armature of part boxes — a fan, a rake, a flank, a cheek, a jaw, and on the axis a crown, a brow, a muzzle and a chin — is laid out in a normalised figure frame; the right half and the centre are generated and the whole is reflected, and unlike its neighbour `brigandine` the reflection copies the paint as well as the geometry, so the two halves are the same picture and not merely the same silhouette. Each part hull is chamfered and then cut by one operator — a convex polygon split by a straight chord at a free angle — with any cut that would leave a sliver rejected and retried, and every plate chamfered afterwards, so the mask is blunt polygons and not shards. A plate is painted as a stack element rather than filled: a linear gradient along its part’s own axis, then at one plate in six a window inset into it holding a dot lattice or a run of parallel slats clipped hard by the window’s own outline, then a mint rail down its most axis-facing edge with a tight halo, then a glow, and last a black outline. That outline is the package’s second law: its width is set by the sheet and never by the plate carrying it, and the same is true of every texture pitch, which is what makes the picture read as drawn rather than modelled. Behind the mask a second generator obeys a geometry the mask does not share — a strictly octilinear field of grey traces, long horizontal runs joined by forty-five degree joggles and ending in ring pads and stub bars, mirrored about the same axis on a radial vignette that fades to black at the corners. Blades rise from behind the crown and segmented tubes hang from behind the flank, so neither shows where it begins. Nothing in the package knows what a face is: a mint ellipse on the axis over the largest silver plates simply reads as one, and a seed is free to produce a figure with nothing legible on it.",
      "texture": "/assets/lumen-logic/textures/imbricate.ktx2",
      "preview": "/assets/lumen-logic/previews/imbricate.webp",
      "card": "/assets/lumen-logic/cards/imbricate.jpg",
      "palette": [
        "#101012",
        "#3e474b"
      ]
    },
    {
      "id": "impasto",
      "title": "Impasto",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/impasto.webp",
      "description": "Digital impasto painting generated from domain-warped fractional Brownian motion. A double-warp fBm produces the sweeping, curved brushstroke shapes. Surface normals computed from the height field drive Blinn-Phong shading — ambient, key, and fill lights give ridges bright highlights and deep crevice shadows. A decoupled colour-noise layer picks palette hues independently of height, creating chromatic layering where warm tones peek through cool ones. A soft radial glow composites over the base to simulate a central light source.",
      "texture": "/assets/lumen-logic/textures/impasto.ktx2",
      "preview": "/assets/lumen-logic/previews/impasto.webp",
      "card": "/assets/lumen-logic/cards/impasto.jpg",
      "palette": [
        "#58a4e6",
        "#7475fb",
        "#5b6ad2",
        "#9da4ed",
        "#9d619f",
        "#80d8da"
      ]
    },
    {
      "id": "ink-bloom",
      "title": "Ink Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ink-bloom.webp",
      "description": "A dense chrysanthemum-like bloom drawn entirely in hairline ink on paper. Every petal is a plume: a bundle of fine parallel strands that share one strongly curled spine, converge to needle points at root and tip, swell lanceolate in the middle, and fray or split into finger-tips at the end. Dozens of plumes radiate from a scattered central root zone with locally coherent curl, layered back-to-front so each body blanks the line work beneath it, while a transparent fraction of bundles lays its strands straight across the layer below as patches of fine crosshatch. A few extra-wide S-curved cascades sweep vertically through the heart of the bloom on top of everything — a pen-and-ink linear drawing of combed, wind-blown plumage.",
      "texture": "/assets/lumen-logic/textures/ink-bloom.ktx2",
      "preview": "/assets/lumen-logic/previews/ink-bloom.webp",
      "card": "/assets/lumen-logic/cards/ink-bloom.jpg",
      "palette": [
        "#f7f6f2",
        "#cfcdc9"
      ]
    },
    {
      "id": "ink-facets",
      "title": "Ink Facets",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ink-facets.webp",
      "description": "A hand-drawn crystalline shard cluster. A bounding rectangle is recursively split by random chords into a tessellation of convex facets — larger facets are picked to split more often, giving a natural mix of big and small shards — then border facets are culled by a wavy radial mask so the mass reads as a ragged blob with a few protruding spikes. Each shard is engraved with fine parallel hatch lines whose colour sweeps from a cool blue base toward a brighter cyan or magenta flare, producing an iridescent gem facet, and outlined in dark ink. Renders deterministically from a seed and defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/ink-facets.ktx2",
      "preview": "/assets/lumen-logic/previews/ink-facets.webp",
      "card": "/assets/lumen-logic/cards/ink-facets.jpg",
      "palette": [
        "#c9cfe1",
        "#acb2d5"
      ]
    },
    {
      "id": "ink-quilt",
      "title": "Ink Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ink-quilt.webp",
      "description": "A notebook page quilted with a gently warped patchwork grid drawn in two fineliner inks — indigo-navy and teal — on cream paper. Undulating row bands of varied heights are each cut into rounded-corner cells of wildly different widths, separated by thin cream gutters, and every cell is outlined in one ink and filled by hand: wall-to-wall parallel hatching, hatching that fades around a blank cream core, stipple shading dense at the border and melting away toward the centre, a sheaf of long crossing leaf outlines, or a sparse resting scatter of dots. A single smooth warp field bends borders and fills together, so the whole lattice sways like it was ruled freehand over flowing guide lines.",
      "texture": "/assets/lumen-logic/textures/ink-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/ink-quilt.webp",
      "card": "/assets/lumen-logic/cards/ink-quilt.jpg",
      "palette": [
        "#d4dac5"
      ]
    },
    {
      "id": "ink-swatches",
      "title": "Ink Swatches",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ink-swatches.webp",
      "description": "A sketchbook page of hand-drawn black-ink doodle swatches laid out on a loose grid. Each cell is randomly assigned one of eleven motifs — vertical barcode strokes, a solid block fractured into triangular shards, an angular node web punctuated by filled ink blobs, overlapping scribbled loops with a single filled dot, an orthogonal rectangular labyrinth, diagonal cross-hatching, nested rings or rectangles around a solid core, stacked wavy lines, a single Archimedean spiral, a gradient stipple dot field, and a hand-inked checkerboard. Every stroke is wobbled to mimic a pen, and each swatch is nudged and tilted so the grid reads as filled by hand rather than printed.",
      "texture": "/assets/lumen-logic/textures/ink-swatches.ktx2",
      "preview": "/assets/lumen-logic/previews/ink-swatches.webp",
      "card": "/assets/lumen-logic/cards/ink-swatches.jpg",
      "palette": [
        "#dbd5c3",
        "#c1baab"
      ]
    },
    {
      "id": "ink-tangle",
      "title": "Ink Tangle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ink-tangle.webp",
      "description": "A hand-drawn \"zentangle\" tessellation in black ink on warm cream paper. The sheet is carved into irregular, flowing regions — a noise-warped Voronoi partition whose boundaries meander like a pen line — and every region is packed edge-to-edge with a single texture: tightly tessellated concentric nested-polygon \"spiral\" maze motifs, very tight circle packing of wildly varied size, dense flowing masses of solid-black teardrop scales, or packed filled-black dots. Nothing is a flat fill — every dark mass is built from packed black marks leaving thin cream veins — and dark (scales / black-dots) regions abut light (spiral / bubbles) ones so the sheet reads as a high-contrast, all-over organic mosaic of ink patterns.",
      "texture": "/assets/lumen-logic/textures/ink-tangle.ktx2",
      "preview": "/assets/lumen-logic/previews/ink-tangle.webp",
      "card": "/assets/lumen-logic/cards/ink-tangle.jpg",
      "palette": [
        "#a6a195",
        "#8b857c",
        "#6c685f"
      ]
    },
    {
      "id": "intarsia",
      "title": "Intarsia",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/intarsia.webp",
      "description": "A frontal bust cut from coloured stock and stacked into relief, in the woodworker's sense: every object in the frame is one primitive — a plate with a shrinkable silhouette, cut once and then re-cut inward as a run of concentric copies of itself, each copy a step further up the stack and a step along a hue-sorted pool of pastel stock, with dark seam plates alternating into the run wherever it is long. The only depth cue in the picture is a hard kerf sliver: each plate and each band fills its own silhouette once in near-black, offset a few thousandths of the frame down-light, before filling it in colour — so the stack reads as lit stock without one gradient, one outline, one bevel or one shaded face anywhere. The same primitive builds all of it. A procedural head shell is tiled by a couple of dozen rounded organic plates that ignore the anatomy and run across brow, cheek and jaw; the nose, lips, nostrils and ears are small stacks; the neck runs into shoulders dressed in long collar bands that follow the shoulder line off both edges; two very large concentric-ring lenses — a bullseye, a lobed rosette or one wide banded visor, by seed — stand where the eyes should be and overrun the brow; and a crown of a hundred-odd tapering blades is combed out of the skull through a curl-noise flow field, shingled consistently so the mass reads as one flow, split per blade into a pass behind the head and a pass over the forehead so the hair is stitched to the figure rather than pasted behind it. The ground is one flat colour used nowhere else in the picture, carrying nothing but a faint even grain. No gradient, no outline, no glow, no blur, no perspective and no light model: the light exists only as the direction every kerf falls, and flattening it to zero leaves a flat marquetry panel.",
      "texture": "/assets/lumen-logic/textures/intarsia.ktx2",
      "preview": "/assets/lumen-logic/previews/intarsia.webp",
      "card": "/assets/lumen-logic/cards/intarsia.jpg",
      "palette": [
        "#55307d",
        "#6c6966",
        "#938477",
        "#9d86ac"
      ]
    },
    {
      "id": "iso-blocks",
      "title": "Iso Blocks",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/iso-blocks.webp",
      "description": "Noise-driven isometric voxel landscape. Each column on an oblique grid receives a height from fBm Perlin noise; stacks of cubes are rendered back-to-front with three-face lighting (top, left-face, right-face) for a clean 3-D appearance.",
      "texture": "/assets/lumen-logic/textures/iso-blocks.ktx2",
      "preview": "/assets/lumen-logic/previews/iso-blocks.webp",
      "card": "/assets/lumen-logic/cards/iso-blocks.jpg",
      "palette": [
        "#dfd9d0",
        "#c3b5a8",
        "#9c8e7e",
        "#a9a299"
      ]
    },
    {
      "id": "iso-nest",
      "title": "Iso Nest",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/iso-nest.webp",
      "description": "A psychedelic topographic maze: the plane is seeded with many small nuclei and every pixel is coloured by iso-contours of its distance to the nearest nucleus, so concentric offset rings grow outward and fuse into interlocking zig-zag ridges. A coherent domain warp gives the contours their hand-drawn ripple, and each successive ring steps along a pink-to-violet palette ramp. A large procedurally generated organic silhouette is masked out of the field and traced in a few cobalt-blue outlines, the only cool accent in the hot-pink labyrinth.",
      "texture": "/assets/lumen-logic/textures/iso-nest.ktx2",
      "preview": "/assets/lumen-logic/previews/iso-nest.webp",
      "card": "/assets/lumen-logic/cards/iso-nest.jpg",
      "palette": [
        "#e5bfd0",
        "#f7f1ee"
      ]
    },
    {
      "id": "jackstraws",
      "title": "Jackstraws",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/jackstraws.webp",
      "description": "A mid-century textile print: a softly jittered grid of large flat-colour circles — vermilion, marigold, straw yellow, blush pink, teal, forest green, cobalt, black and brick — on warm light-grey paper, with a scattering of cells left empty. Over the whole surface lie clusters of straight white sticks, like spilled jackstraws: each circle is slashed by its own cluster of roughly parallel and criss-crossing strokes, long near-vertical sticks thread down the columns connecting rows, short clusters fall on the bare paper, and thin white seams mark the column joins.",
      "texture": "/assets/lumen-logic/textures/jackstraws.ktx2",
      "preview": "/assets/lumen-logic/previews/jackstraws.webp",
      "card": "/assets/lumen-logic/cards/jackstraws.jpg",
      "palette": [
        "#cbd7cf",
        "#d4beb5"
      ]
    },
    {
      "id": "jalousie",
      "title": "Jalousie",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/jalousie.webp",
      "description": "One tall carved mask on a plain ground, filled edge to edge by the product of two rulings. A dense stack of flat horizontal slats of uneven height — most middling, a clustering minority reduced to hairlines — runs from crown to chin, and a sparse pencil of long straight cuts, one of them always the vertical centre line and one or two of them bent at the brow, crosses the entire figure without stopping at anything. Every cell is a slat sheared by the cuts: horizontal top and bottom, slanted sides. Colour is the product of the two indices — the region of the line arrangement a cell falls in supplies its hue family, the slat it belongs to supplies its value along a walk down the stack — so the picture reads as six or seven large angular masses at a distance and as two hundred stripes up close, though neither was ever drawn as a shape. A small share of cells step one value off their slat and a smaller share take a saturated out-of-family ink, dropping isolated magentas and teals into a cool field. Flanking slabs project at the cheeks over a hairline of ground, a stand carries the chin, white rules snap to slat boundaries and cross the figure edge to edge, and four flat mirrored marks sit on top: half-disc eyes in a bed of near-black slats, a long tapered nose that re-reads the same slats in pale tints, and lips split into two hot inks at the centre. Every fill is opaque and every edge is hard.",
      "texture": "/assets/lumen-logic/textures/jalousie.ktx2",
      "preview": "/assets/lumen-logic/previews/jalousie.webp",
      "card": "/assets/lumen-logic/cards/jalousie.jpg",
      "palette": [
        "#f6f4f2",
        "#adb5c6",
        "#5a7283",
        "#9c928f",
        "#d9d4d4"
      ]
    },
    {
      "id": "janus",
      "title": "Janus",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/janus.webp",
      "description": "A cubo-modernist head built twice. One ladder of horizontal levels runs edge to edge across the sheet and every edge in the picture snaps to it — the panelled ground behind the figure, the tops and bottoms of the face planes, and the bases of the panels below the jaw alike — so a dozen unrelated shapes stay locked to one system. A single vertical seam, straight above the brow and below the chin and bowed into a profile curve between them, splits the head; the sitter is then constructed independently on each side of it, at its own scale and its own elevation, from a short vocabulary of large opaque planes: slabs, teardrop lobes, thick crescents, quarter-discs and wedges, painted back to front so depth is occlusion alone. Because the two views are resolved at different scales, their features refuse to meet — one eye is larger than the other and rides higher, each with its own iris hue and lash flicks, while the lips sit astride the seam as the one mark both views share. Where a plane crosses a level it steps to the next tone in its own ladder, contours fall on a share of the boundaries at varying weight, panels of hairline stripes, disc columns, square columns and speckled bands fill the body, and outline-only arcs and circles drift across the ground. Flat matte ink throughout, under an even canvas grain.",
      "texture": "/assets/lumen-logic/textures/janus.ktx2",
      "preview": "/assets/lumen-logic/previews/janus.webp",
      "card": "/assets/lumen-logic/cards/janus.jpg",
      "palette": [
        "#ac9876",
        "#797f67",
        "#284941",
        "#8c6847",
        "#d29e8f"
      ]
    },
    {
      "id": "jointed-idol",
      "title": "Jointed Idol",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/jointed-idol.webp",
      "description": "A modernist cubo-figurative panel on raw cream canvas: a jointed idol assembled from four primitive volumes — a vesica lens, an ovoid, a tapered round-capped band and a raked paddle hand — posed by a seeded skeleton over a large rounded slab. One global family of long, gently curved arcs is then laid across the whole panel, and every shape it touches is sliced by it: the slab, the limbs and the head are all broken into flat fields by the same curves at the same places, so a cut runs on through from the slab into the limb above it and the panel reads as one fractured plane rather than as a stack of decorated cut-outs. Parts are opaque and painted back to front, so depth is occlusion alone — no shading, no gradient, no transparency, no perspective. Every facet takes one flat chalky ink — mustard, tan and putty against deep violet, dark plum and near-black brown, with grey-pink and warm taupe between them — chosen so no two neighbours are a near-match, which is what lets the cuts stay legible with nothing drawn on them. A cream hairline traces the silhouette of every part and the gap between every digit, and appears nowhere else: the internal cuts carry no line and the slab carries none either. Some facets are painted in the ground colour, and the face is one of them — a negative scoop in the head with no feature drawn on it at all. A dry scumble and a canvas weave sit under everything at a contrast low enough that the fields still read flat.",
      "texture": "/assets/lumen-logic/textures/jointed-idol.ktx2",
      "preview": "/assets/lumen-logic/previews/jointed-idol.webp",
      "card": "/assets/lumen-logic/cards/jointed-idol.jpg",
      "palette": [
        "#c8b693",
        "#97888c",
        "#80624b",
        "#614d59",
        "#87786a",
        "#e3d2a3"
      ]
    },
    {
      "id": "julia",
      "title": "Julia Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/julia.webp",
      "description": "The Julia set of f(z) = z² + c rendered per pixel: smooth escape-time gradients outside, orbit traps inside — each interior orbit records its closest approach to a point, circle or cross, filling the set with ghost-rings that echo its internal geometry. One angle parameter walks c around 0.7885·e^{iθ}, sweeping through rabbits, dendrites and seahorse spirals.",
      "texture": "/assets/lumen-logic/textures/julia.ktx2",
      "preview": "/assets/lumen-logic/previews/julia.webp",
      "card": "/assets/lumen-logic/cards/julia.jpg",
      "palette": [
        "#a57e54",
        "#606679"
      ]
    },
    {
      "id": "kaleido-quilt",
      "title": "Kaleido Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/kaleido-quilt.webp",
      "description": "A fine grid of half-square-triangle cells arranged as concentric rainbow diamonds around a bright central medallion, with 4-fold mirror symmetry. Colour follows the Manhattan-distance ring through the hue wheel, punctuated by black rings; cell diagonals face the centre so triangles line up into diamond bands and rays to the corners. Order near the centre dissolves into a scrappier black-flecked field toward the edges. A thin stitch line overlays every cell.",
      "texture": "/assets/lumen-logic/textures/kaleido-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/kaleido-quilt.webp",
      "card": "/assets/lumen-logic/cards/kaleido-quilt.jpg",
      "palette": [
        "#6c5457",
        "#4b7265"
      ]
    },
    {
      "id": "kerf",
      "title": "Kerf",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/kerf.webp",
      "description": "A laminated block of flat colour seen at one cut: the top face, the bottom face, and, where the blade went through, the edge grain with every ply exposed at its own thickness. The picture is one object rather than three pictures stacked, and three laws carry it. A face is a guillotine subdivision — every edge lies on a line that halves an enclosing rectangle — with a grain that decides which axes it may be cut along: the top of the block is cross-grained and splits both ways, the bottom is straight-grained and splits along one axis only, which is why its panels run edge to edge with no horizontal cut anywhere. One function, one axis mask. A leaf refuses every colour its neighbours are using, so every edge is visible without an outline, except where a weld fires and a leaf takes a neighbour’s colour instead — which is the only way an L-shaped field can appear, and the package has no L-shaped shape. And the band is one ply tape, generated once and read once per course at an offset that performs a lazy random walk down the courses, so a course is a view rather than a thing that was made. Two consequences of that follow with nothing to draw them: two courses at the same offset are identical in every boundary and every colour, so a repeated course is the walk returning rather than anything copying anything, and courses whose offsets differ by one step share their boundaries shifted by exactly that step. The palette is positional and split: a face may only paint the plies that reach the outside of the block while the cut exposes every ply there is, so the band always carries colours neither face shows and never the reverse. A course may chatter into two half-thickness reads one step apart, and one shorter second cut may be scored into a face — the only mark in the package painted over another. The whole model is built in unit coordinates and mapped once at draw time, so a preview and a print are similar rectangle for rectangle. Flat opaque colour throughout: no outline, no gradient, no transparency, no blend mode, no shadow, no texture, no clip, no canvas transform and no curve of any kind.",
      "texture": "/assets/lumen-logic/textures/kerf.ktx2",
      "preview": "/assets/lumen-logic/previews/kerf.webp",
      "card": "/assets/lumen-logic/cards/kerf.jpg",
      "palette": [
        "#6b6464",
        "#858489",
        "#9a999c",
        "#4b2d35",
        "#44425c",
        "#784c46"
      ]
    },
    {
      "id": "lariat",
      "title": "Lariat",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lariat.webp",
      "description": "Paint thrown, not drawn. Every mark on the sheet is one filament of paint launched along a trajectory that keeps the curvature it left with — a heading walked by a mean-reverting momentum, so a mark sweeps, folds and occasionally closes a loop without ever being told where to end — while carrying a volume that decays as it is laid down, giving a width that starves monotonically from a blunt head to a needle tail. The whole element vocabulary follows from that one budget: loaded heavily and thrown slowly it is a broad opaque blade; loaded lightly it is a hairline whip; and once the radius falls under the paint’s own break threshold the mark stops being a ribbon and becomes a row of beads, their radius 1.89 times and their spacing 9.02 times the radius at which it failed, with a satellite drop in each gap — the classical Plateau–Rayleigh collapse of a liquid column too thin to stay a column, which is why the droplet fields read along the lines that spawned them and shrink as they go. Thrown fast enough the filament never forms at all and atomises instead, laying a soft cone of colour with no edge anywhere, and those sprayed cones are the only transparency in the picture. The thick marks alone earn the wet behaviours — pendant drips hanging straight down the sheet whatever direction the mark was travelling, a lit rail and a shadowed rail down their flanks under one consistent light, and round cells punched through to the colour beneath. Roles are taken from the palette by luminance, the darkest for the blades and the lightest for the pours, and everything is stacked in strict painter’s order over a shared diagonal axis, so no mark is ever glazed, blended or tinted by what it crosses.",
      "texture": "/assets/lumen-logic/textures/lariat.ktx2",
      "preview": "/assets/lumen-logic/previews/lariat.webp",
      "card": "/assets/lumen-logic/cards/lariat.jpg",
      "palette": [
        "#42474c",
        "#757761",
        "#586976",
        "#839993"
      ]
    },
    {
      "id": "lath",
      "title": "Lath",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lath.webp",
      "description": "A dense net of white laths on a dark plate: one rectangular lattice whose every node has been displaced once, drawn as the runs through those nodes rather than as lines laid over them. A run is a polyline whose vertices are consecutive lattice nodes, and every mark in the picture is one — the long jagged verticals, the broken horizontal stretches, the stubs that end in mid-air, the shallow diagonals that span two cells at a stride of two, and the short cell braces are five settings of one primitive, not five kinds of line. Because a node is displaced once and every run through it reads that one position, two runs that meet at a node meet exactly: every junction in the picture is a real joint rather than two lines happening to cross, which is what makes the field read as one grid under strain instead of a pile of independently wobbled strokes. Straightness belongs to the node as well: a minority of rows and columns are struck as battens, which pins one ordinate of every node on them, so a dead-straight rule crossing the whole plate is literally the run along that row — the jagged chains that cross it therefore have a vertex sitting on it, and where a batten row meets a batten column the node is the only one in the picture standing exactly on the undisplaced lattice. Weight belongs to the node too, so a junction is the same width for both runs through it and reads heavier than either. Displacement is capped at half the smaller of a node’s own two neighbouring gaps, so nodes can meet but can never swap order, at any setting and with no runtime check. Every mark is a fill and never a stroke — each segment a quadrilateral between its two nodes’ half-widths, each node a disc of its own radius — so the union is seamless at any bend angle with no mitre and no join, and a single opaque ink means paint order decides nothing about what is visible. The lattice overhangs the plate by a cell on every side and is clipped to it, so runs are cut by the frame rather than ending at it, and the package contains no edge case. Two inks and no third: no tone, no gradient, no transparency, no blend mode, no shadow, and no curve anywhere except the knuckle at a joint. Turn the jitter off and the same picture collapses to a plain ruled grid.",
      "texture": "/assets/lumen-logic/textures/lath.ktx2",
      "preview": "/assets/lumen-logic/previews/lath.webp",
      "card": "/assets/lumen-logic/cards/lath.jpg",
      "palette": [
        "#666460",
        "#504f4b",
        "#393834"
      ]
    },
    {
      "id": "lego-wall",
      "title": "Lego Wall",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lego-wall.webp",
      "description": "Renders a colorful Lego brick wall with running-bond offset rows. Each row is filled with bricks of varying widths in authentic Lego colors, complete with top-face highlights, edge shadows, and circular studs for a tactile 3D feel.",
      "texture": "/assets/lumen-logic/textures/lego-wall.ktx2",
      "preview": "/assets/lumen-logic/previews/lego-wall.webp",
      "card": "/assets/lumen-logic/cards/lego-wall.jpg",
      "palette": [
        "#b38263",
        "#5a6858",
        "#995b34",
        "#837470"
      ]
    },
    {
      "id": "lichen",
      "title": "Lichen",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lichen.webp",
      "description": "Soft, aggregated organic growth resembling macro photography of lichen, moss, and algae. Amorphous blob-like clusters with Perlin-noise-distorted edges in earthy sage greens and deep forest tones on a warm cream ground.",
      "texture": "/assets/lumen-logic/textures/lichen.ktx2",
      "preview": "/assets/lumen-logic/previews/lichen.webp",
      "card": "/assets/lumen-logic/cards/lichen.jpg",
      "palette": [
        "#607749",
        "#7c8e61"
      ]
    },
    {
      "id": "light-streaks",
      "title": "Light Streaks",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 51,
      "kind": "image",
      "source": "artworks/lumen-logic/light-streaks.webp",
      "description": "A radiant sheaf of long, thin, tapering colour shards sweeping across the canvas at shallow angles and fanning from a soft focal point. Streaks cross into hard-edged flat facets; cool blues and teals dominate the top while warm reds, oranges and cream stream through the middle, with a few bright accent slivers on top — all flat, saturated colour on a dark navy ground.",
      "texture": "/assets/lumen-logic/textures/light-streaks.ktx2",
      "preview": "/assets/lumen-logic/previews/light-streaks.webp",
      "card": "/assets/lumen-logic/cards/light-streaks.jpg",
      "palette": [
        "#806a61",
        "#1b2f37",
        "#5a484d",
        "#a48069"
      ]
    },
    {
      "id": "line-weave",
      "title": "Line Weave",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/line-weave.webp",
      "description": "Op Art piece built entirely from dense parallel lines. Two corner-to-corner diagonals divide the canvas into four triangular regions: the top and bottom triangles receive a single line family (horizontal and vertical respectively), while the left and right triangles receive two overlapping families that produce a Moiré interference crosshatch. Inspired by the kinetic line works of Jesús Rafael Soto and Carlos Cruz-Diez.",
      "texture": "/assets/lumen-logic/textures/line-weave.ktx2",
      "preview": "/assets/lumen-logic/previews/line-weave.webp",
      "card": "/assets/lumen-logic/cards/line-weave.jpg",
      "palette": [
        "#f5128c"
      ]
    },
    {
      "id": "lino-quilt",
      "title": "Lino Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lino-quilt.webp",
      "description": "A patchwork of flat two-tone panels, each stamped with one bold symmetric block-print cut-out. The frame is guillotine-partitioned into rectangular panels of varied sizes; every panel gets a colour ground and one linocut-style glyph built from a union of organic primitives (blobs, leaf-lenses, thick strokes, angular chips) laid down in an ink colour and replayed under a bilateral, 4-fold, or radial symmetry. Symmetric holes are then carved back to the ground colour and a faint spray grain gives the hand-pulled stencil feel. Flat colour, no gradients.",
      "texture": "/assets/lumen-logic/textures/lino-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/lino-quilt.webp",
      "card": "/assets/lumen-logic/cards/lino-quilt.jpg",
      "palette": [
        "#7fb5a5",
        "#599488",
        "#272423",
        "#3c526c",
        "#6c6a65",
        "#d5d1ca"
      ]
    },
    {
      "id": "lissajous",
      "title": "Lissajous",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lissajous.webp",
      "description": "Traces 3D Lissajous curves x=sin(a·t+δx), y=sin(b·t+δy), z=sin(c·t+δz) projected orthographically. Multiple layers with independent phase offsets fill the canvas with interlocking knots coloured by time position.",
      "texture": "/assets/lumen-logic/textures/lissajous.ktx2",
      "preview": "/assets/lumen-logic/previews/lissajous.webp",
      "card": "/assets/lumen-logic/cards/lissajous.jpg",
      "palette": [
        "#07060b"
      ]
    },
    {
      "id": "litany",
      "title": "Litany",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/litany.webp",
      "description": "A word written down a troweled gesso board over and over, in which every line is a copy of the line above it rather than a copy of the original — so the error is inherited and compounds, and the writing decays the way a photocopy of a photocopy decays. The letterforms are a monoline geometric sans the renderer owns as polylines rather than as type, which is what lets a generation operator work on them: each pass loses resolution, so curvature flattens and short features like the dot of an i and the crossbar of a t thin and then die permanently; adds a tremor whose amplitude grows and whose wavelength coarsens, so a careful fine shake becomes two or three big swings per stroke; gives every letter its own inherited rotation, ride and size creep until neighbours collide and fuse; bends the baseline; and amputates limbs by cutting strokes short or breaking them in two. The tool degrades on its own axis: the first line is a flat monoline with round terminals and reads printed, the last is a loaded brush whose width swings threefold inside one stroke, pools where it turns, and breaks into dry bristle lines with board showing between them — never a grey, because every value in the ink is a question of where the tool did and did not touch. The decay is aimed rather than open-ended: each letter is pulled toward its counterpart in a second word on its own staggered schedule, so the middle of the column is a legible hybrid and the bottom of it is a different word written by the same failed hand, and because letters keep their own drifting positions instead of being re-set per line, a shorter target makes the writing shrink from the left and the surviving ink sits right of where the block began. Two colours and no hue: near-black ink on an off-white board of soft troweled plates.",
      "texture": "/assets/lumen-logic/textures/litany.ktx2",
      "preview": "/assets/lumen-logic/previews/litany.webp",
      "card": "/assets/lumen-logic/cards/litany.jpg",
      "palette": [
        "#e5e2da",
        "#cdcac2"
      ]
    },
    {
      "id": "loxodrome",
      "title": "Loxodrome",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/loxodrome.webp",
      "description": "One checkerboard, drawn on a sphere and then shown twice. Take a plain unit checkerboard in Mercator coordinates — latitude stretched so the graticule stays square — and pull it back through the complex logarithm: the sphere's south pole opens into a bottomless throat at the middle of the sheet, its north pole flies off past the corners, and the cells become two orthogonal families of logarithmic spirals that cross at the same angle everywhere and shrink toward the throat by a constant ratio, so there is no innermost ring and never can be. Tilt the lattice and both families become loxodromes — the constant-bearing spiral a straight line in Mercator turns into on the way down — which is the only free choice in the whole map, alongside how many cells go round. Because the map is conformal it has a single isotropic scale at every point, and that is exactly what a box filter needs: each pixel is given the true average of the pattern over its own footprint in closed form, so where the cells fall below a pixel they do not sparkle or alias, they converge through a band of moiré rosettes into a clean flat grey. Sitting in the throat is the sphere the whole field is a shadow of, wearing the same checkerboard from the same two floor functions of the same two numbers, with the entire outside world squeezed and inverted into the shell of glass around it and running to infinite compression at its silhouette. Colour comes from a slow wash of three poles across the sheet: the light half of every cell takes the wash, the dark half stays near-neutral, and no cell is ever shaded, outlined or gradient-filled.",
      "texture": "/assets/lumen-logic/textures/loxodrome.ktx2",
      "preview": "/assets/lumen-logic/previews/loxodrome.webp",
      "card": "/assets/lumen-logic/cards/loxodrome.jpg",
      "palette": [
        "#5e5e60",
        "#85918d",
        "#a15875",
        "#a69aa0",
        "#513b44"
      ]
    },
    {
      "id": "lozenge",
      "title": "Lozenge",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lozenge.webp",
      "description": "A quilt of square tiles where every tile is a square pyramid seen from above, struck from one of its own four corners and read as contour bands, so the diagonal runs, the chevrons and the concentric diamond bullseyes in the picture are not three motifs but three coincidences of one. A tile's field is the Manhattan distance from the corner it claims — level sets that are straight 45° segments inside a square, which is why there is no curve anywhere in the package — and the ink falls on the odd bands of that distance at a pitch read off the sheet’s short edge, identical in every tile. Where four tiles round a lattice point claim it their fields are literally the same function and close into a bullseye with no join; where two claim it across an edge, a chevron; where neighbours claim different points, their bands step across the shared edge into the ragged 45° seams that are the sheet’s dominant texture. None of those figures is drawn. The flat colour is the same field again rather than a layer over it: the sub-level set below a tile’s own anti-diagonal is exactly half the tile, so painting it gives a right triangle, painting it on two neighbours that claim opposite ends of their shared edge fuses the two halves into a parallelogram, and painting all four quadrants of a claimed point gives a full diamond — one rule, three silhouettes, and an ink band abutting every painted edge because the band count per tile is odd and the anti-diagonal therefore always lands on ink. Each block is packed independently and with 180° symmetry from that small vocabulary, taking a footprint and its rotated image at once so the free cells stay symmetric and no placement is ever undone, and each block spends one shared accent on the shapes that have no axis and a pair of its own on the ones that do. Flat opaque colour throughout: no outline, no gradient, no transparency, no blend mode, no shadow, no texture and no canvas transform.",
      "texture": "/assets/lumen-logic/textures/lozenge.ktx2",
      "preview": "/assets/lumen-logic/previews/lozenge.webp",
      "card": "/assets/lumen-logic/cards/lozenge.jpg",
      "palette": [
        "#ac847d",
        "#737e9c",
        "#8f5b58",
        "#96a88b"
      ]
    },
    {
      "id": "lumen-lattice",
      "title": "Lumen Lattice",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/lumen-lattice.webp",
      "description": "A screen-print \"room of light\" under a triangulated white net. Flat colour planes compose a one-point-perspective interior: tall wall slats on the left (one stripe-hatched), a pinched cream light band, mirrored fans of pink and blue wedges rising to red corner fields, and a dominant dark chamber holding inset teal and near-black panels. Each plane is textured with a regular halftone dot grid or fine stripe hatch in a darker ink, and the whole surface is unified by a uniform square lattice carrying cell diagonals, edge-midpoint diamonds, and white node dots at every intersection. Flat colour throughout — no gradients, no blending.",
      "texture": "/assets/lumen-logic/textures/lumen-lattice.ktx2",
      "preview": "/assets/lumen-logic/previews/lumen-lattice.webp",
      "card": "/assets/lumen-logic/cards/lumen-lattice.jpg",
      "palette": [
        "#b08c90",
        "#7f8ea8",
        "#335751",
        "#d2a9ad"
      ]
    },
    {
      "id": "lyapunov",
      "title": "Lyapunov",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/lyapunov.webp",
      "description": "Markus–Lyapunov fractals: the logistic map forced by a periodic two-letter parameter sequence (rₙ = a or b following a pattern like AABAB), with every point of the (a, b) parameter plane coloured by the orbit’s Lyapunov exponent λ = ⟨ln|r(1−2x)|⟩. Stable order (λ < 0) glows as interpenetrating metallic blades; chaos (λ > 0) recedes into a deep sea — a map of stability itself, with superstable filaments running as bright veins.",
      "texture": "/assets/lumen-logic/textures/lyapunov.ktx2",
      "preview": "/assets/lumen-logic/previews/lyapunov.webp",
      "card": "/assets/lumen-logic/cards/lyapunov.jpg",
      "palette": [
        "#2d1e0a",
        "#644111",
        "#81561b"
      ]
    },
    {
      "id": "maelstrom",
      "title": "Maelstrom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/maelstrom.webp",
      "description": "A heap of shredded matter turning around one eye, on flat black. Two families of mark are piled into a single lobed envelope and interleaved in one paint order, so neither sits on top of the other: flat opaque cut shapes with no outline and no texture — pointed petals, boomerang crescents, acute triangles, tapering slivers, plain discs and cupped hooks, a share of them painted in inks that sit down at the ground so they punch holes in the mass and crop their neighbours into slivers — and constant-width filaments with round ends that run at low curvature and keep dropping into complete ringlets, the loop of longhand rather than the meander of a flow field. The shapes stop at the edge of the heap; the filaments carry on past it, so the silhouette is drawn by escaping line while the mass is drawn by cut paper. Over all of it is printed one screen of small dark dots, which is the piece: the screen is stencilled against the accumulated shapes, so it prints on the heap and never once on the bare ground, small shapes catch nothing, and neighbouring shapes hold their dots in register because they are sampling the same lattice. That lattice is warped by a single vortex — far out it is loose staggered rows, and as it nears the eye the rows bend, the pitch tightens and the dots shrink with it until they are clean spiral arms winding into a small concentric bullseye. The same vortex leans the filament walk, so the heap turns around the point its dots drain into. Flat and opaque throughout: no outline, no gradient, no blur, no shadow, no taper and no perspective, with depth from occlusion and a little plain alpha on a minority of elements to supply the muted tones between the primaries.",
      "texture": "/assets/lumen-logic/textures/maelstrom.ktx2",
      "preview": "/assets/lumen-logic/previews/maelstrom.webp",
      "card": "/assets/lumen-logic/cards/maelstrom.jpg",
      "palette": [
        "#231f19",
        "#393530",
        "#5c524a"
      ]
    },
    {
      "id": "mail-art",
      "title": "Mail Art",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/mail-art.webp",
      "description": "An \"arte postale\" collage in the mail-art tradition. The sheet is packed edge-to-edge with bold serif capitals, digits and ampersands scattered at every angle in printer's red, blended so overlaps deepen like layered rubber-stamp ink. Over the swarm sit the marks of the postal system: circular cancellation postmarks with curved legends, looping blue ballpoint scribbles, a dark ink tangle, a scatter of small word-stamps and a diagonal PRIORITAIRE / PRIORITY sticker.",
      "texture": "/assets/lumen-logic/textures/mail-art.ktx2",
      "preview": "/assets/lumen-logic/previews/mail-art.webp",
      "card": "/assets/lumen-logic/cards/mail-art.jpg",
      "palette": [
        "#e3b4af"
      ]
    },
    {
      "id": "marble",
      "title": "Marble",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/marble.webp",
      "description": "Domain-warped fractional Brownian motion creates swirling organic fills reminiscent of geological cross-sections and polished marble stone. A noise field is displaced by a second warp field before sampling, producing hypnotic nested color bands with sharp edges.",
      "texture": "/assets/lumen-logic/textures/marble.ktx2",
      "preview": "/assets/lumen-logic/previews/marble.webp",
      "card": "/assets/lumen-logic/cards/marble.jpg",
      "palette": [
        "#8547ac",
        "#ad78c5",
        "#c298d4",
        "#c99c97"
      ]
    },
    {
      "id": "maurer-rose",
      "title": "Maurer Rose",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/maurer-rose.webp",
      "description": "The rose curve r = sin(n·θ) sampled at angles θ = k·d°. Connecting the 361 sample points with straight chords reveals hidden geometry — when d is prime and coprime with 360, the web of lines forms elaborate self-similar star patterns far more complex than the underlying smooth curve.",
      "texture": "/assets/lumen-logic/textures/maurer-rose.ktx2",
      "preview": "/assets/lumen-logic/previews/maurer-rose.webp",
      "card": "/assets/lumen-logic/cards/maurer-rose.jpg",
      "palette": [
        "#0a111e",
        "#26394e"
      ]
    },
    {
      "id": "meander",
      "title": "Meander",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/meander.webp",
      "description": "A folded-strata colour field crossed by meandering white contour lines. A diagonal crest coordinate sweeps from a warm cadmium-yellow upper-left to a cool grey lower-right and is folded by domain-warped noise, so the bands read as draped, wave-like strata. A vivid blue accent band — rimmed on both sides with magenta — runs along the crest of the fold. Fine knife-scrape noise elongated along the fold direction is baked into a height field and lit with Blinn-Phong shading for a palette-knife impasto relief, with a few grey ringed stones set in the warm field. Finally, long white ribbons are integrated as streamlines through the fold tangent and drawn on top, meandering down the slope.",
      "texture": "/assets/lumen-logic/textures/meander.ktx2",
      "preview": "/assets/lumen-logic/previews/meander.webp",
      "card": "/assets/lumen-logic/cards/meander.jpg",
      "palette": [
        "#9b958b",
        "#6f7182",
        "#c8b363"
      ]
    },
    {
      "id": "melton",
      "title": "Melton",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/melton.webp",
      "description": "A single sculpture of thick felt, photographed on a studio sweep: a hidden mass wrapped and crossed by broad flat panels of one material, some bending away into the air on hard creases, some rolled into open tubes, all of them cut from stock of one thickness. Every part in the picture is one primitive — a sheet, meaning a circular-arc cross-section swept along a spine and given thickness — and the two things a sheet can do are the two ways that arc and that spine can bend. The cross-section’s turn takes a flat strap through a shallow curl to a closed tube with a visible mouth and a darker inner wall, so a tube is not a different object but the same one rolled further, and the arc length is exactly the sheet’s width however far it rolls. The spine is the integral of a bend rate, so a crease is not a discontinuity but a short run held at the tightest radius the material allows — the same radius that limits the roll — which is why every fold in the picture has the small rounded ridge that felt has and paper does not. Sheets are planted on a hidden ellipsoid that is never drawn, hug it for a distance of their own choosing, and then release into free air where gravity bends them, so the object reads as cloth wrapped round something rather than as limbs attached to a body. Nothing is painted back to front: the picture is resolved in a depth buffer, which is the only way a strap can pass behind the mass at its root and in front of it at its tip. One soft light does everything — a broad wrap-around diffuse with no specular anywhere, a hemispheric ambient gated by screen-space occlusion so the crevices under overlapping panels carry the depth, a faint fibre lift at grazing angles, and one shadow map that serves the object and the paper behind it alike. The sweep is geometry, not a gradient: a floor curving up into a wall, lit by the same light, which is where the background’s fall-off and the shadow pooling under the object come from. Colour is the shared palette sorted into a luminance ladder and read by the light model, warm in the key and cool in the fill, so the same object comes out cream, charcoal or terracotta depending on the preset. A two-octave grain and a slight fibre fuzz along every silhouette go over the finished frame. No outline, no specular, no flat fill and no mark anywhere that is not a lit surface.",
      "texture": "/assets/lumen-logic/textures/melton.ktx2",
      "preview": "/assets/lumen-logic/previews/melton.webp",
      "card": "/assets/lumen-logic/cards/melton.jpg",
      "palette": [
        "#bcbcb8",
        "#d8d5d0",
        "#e9eae8"
      ]
    },
    {
      "id": "membrane",
      "title": "Membrane",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/membrane.webp",
      "description": "Dense organic cellular network — a Voronoi tessellation with smooth bulging membrane walls and a spatial density gradient, rendered as flat black cells separated by white walls, with up to 5 stacked depth layers darkening toward the back. Evokes biological tissue, soap foam, or crazed glaze.",
      "texture": "/assets/lumen-logic/textures/membrane.ktx2",
      "preview": "/assets/lumen-logic/previews/membrane.webp",
      "card": "/assets/lumen-logic/cards/membrane.jpg",
      "palette": [
        "#212121"
      ]
    },
    {
      "id": "mist-quilt",
      "title": "Mist Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/mist-quilt.webp",
      "description": "A full-bleed contact sheet of single-ink monotype landscape prints — a grid of near-square tiles, each a violet-indigo wash pulled on cream paper. Tile darkness clusters across the sheet, from ghost-pale ghost pulls to a few near-black floods, and most tiles carry a landscape motif: stacked mountain-ridge silhouettes with atmospheric perspective, a bumpy treeline over a low horizon, or shore/field horizontals with pale reflection streaks. A monotype texture stack layers over every tile — plate-drag banding, cloudy mottle, granular speckle, dark flecks, hairline scratches and creases, and smudged brayer edges — so the whole quilt reads as hand-pulled gel-plate prints, moody and atmospheric.",
      "texture": "/assets/lumen-logic/textures/mist-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/mist-quilt.webp",
      "card": "/assets/lumen-logic/cards/mist-quilt.jpg",
      "palette": [
        "#9890aa",
        "#6a6391"
      ]
    },
    {
      "id": "modular-times",
      "title": "Modular Times",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/modular-times.webp",
      "description": "Modular multiplication table visualized as chords in a circle. Each point n on a circle of p points connects to point (n × d) mod p. As d increases: 2 traces a cardioid, 3 a nephroid, higher values produce increasingly complex epicycloids — pure number theory rendered as geometry.",
      "texture": "/assets/lumen-logic/textures/modular-times.ktx2",
      "preview": "/assets/lumen-logic/previews/modular-times.webp",
      "card": "/assets/lumen-logic/cards/modular-times.jpg",
      "palette": [
        "#070707"
      ]
    },
    {
      "id": "moire-dots",
      "title": "Moiré Dots",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/moire-dots.webp",
      "description": "A crisp disc of stippled cream dots on a dark ground. Dots sit on concentric ring arcs about the centre with equal radial and arc spacing, so faint radial spokes read near the middle and phantom secondary circles emerge further out. Each dot is sized by an interference field — the summed concentric cosine waves of several sources (one central, the rest on a symmetric ring) — so bright and dark bands curve around every source and weave a moiré across the disc.",
      "texture": "/assets/lumen-logic/textures/moire-dots.ktx2",
      "preview": "/assets/lumen-logic/previews/moire-dots.webp",
      "card": "/assets/lumen-logic/cards/moire-dots.jpg",
      "palette": [
        "#171513",
        "#302f2b"
      ]
    },
    {
      "id": "moire",
      "title": "Moiré",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/moire.webp",
      "description": "Overlays N families of sinusoidal stripe gratings at equally-spaced angles. Beating between near-parallel families produces sweeping low-frequency fringes — the classic moiré interference effect — mapped through a banded colour palette.",
      "texture": "/assets/lumen-logic/textures/moire.ktx2",
      "preview": "/assets/lumen-logic/previews/moire.webp",
      "card": "/assets/lumen-logic/cards/moire.jpg",
      "palette": [
        "#2786f8"
      ]
    },
    {
      "id": "mola",
      "title": "Mola",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/mola.webp",
      "description": "A dark panel carrying a few dozen flat marks in two inks, printed by a wallpaper group. The marks are packed once inside a single lattice cell and then emitted at every image of themselves under the group generated by one lattice translation and one half-turn about the sheet's centre, so the picture is exactly invariant under turning it upside down — occlusions included, not only silhouettes — and every shape in it occurs an even number of times with half of them inverted, while the marks themselves run clean across the lattice so the sheet reads as a print rather than as a tiling. There is one drawing primitive: a centreline swept at a width profile, capped round, capped with a ball, or run to a cusp, so a long lumpy creature body, a pointed leaf, a serpentine that finishes in a fat ball, a lollipop and a plain bullseye are five settings of one operator rather than five shapes. A mark’s silhouette is the union of its swept band and its terminal discs and is never a boolean: the same construction recomputed one keyline wider is exactly its outward offset, and painting that offset in the ground colour immediately under the mark's own ink is the whole of the picture’s depth — it is what puts a channel of bare ground of one constant width between every pair of neighbours, and what breaks the mark underneath by exactly that same width wherever one crosses another, with nothing anywhere clipped, masked, blended or made transparent. Everything cut into a mark — round holes that shrink along its axis, a comb of round-ended slots down one flank, a nested eye of concentric discs, an accent swash that is the mark's own centreline drawn again and thinner — is placed at a station along that centreline and measured against the local width, so it rides round every bend, and it carries no casing at all, which is why a nested thing touches its host while two separate marks never do. An eye reshapes what carries it: the body is bulged to at least twice the eye’s radius before the sweep runs, so the swelling is the eye’s own doing. Nothing in the package knows what a face is — a body that happens to take a comb, a run of shrinking holes, one eye and one swash simply reads as a head, and a seed is free to produce a sheet with no creature in it.",
      "texture": "/assets/lumen-logic/textures/mola.ktx2",
      "preview": "/assets/lumen-logic/previews/mola.webp",
      "card": "/assets/lumen-logic/cards/mola.jpg",
      "palette": [
        "#514441",
        "#665956"
      ]
    },
    {
      "id": "mondrian",
      "title": "Mondrian",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/mondrian.webp",
      "description": "Recursive binary space partitioning of the canvas into rectangles. Each split is horizontal or vertical at a random position; terminal cells are mostly background-coloured with a configurable fraction receiving bold palette fills and thick borders.",
      "texture": "/assets/lumen-logic/textures/mondrian.ktx2",
      "preview": "/assets/lumen-logic/previews/mondrian.webp",
      "card": "/assets/lumen-logic/cards/mondrian.jpg",
      "palette": [
        "#e7c6c1",
        "#b2b2b2",
        "#9d9d9d",
        "#804756",
        "#e8c947",
        "#b8433d"
      ]
    },
    {
      "id": "monster-mash",
      "title": "Monster Mash",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/monster-mash.webp",
      "description": "A psychedelic doodle-character mural in the street-pop sticker-wall tradition: a full-bleed crowd of flat neon cartoon monsters — sad flowers, grinning mushrooms, striped worms with zigzag-toothed smiles, cyclops heads, zombie skulls, worried coffins, spotted jellies, ghosts, melting slimes, frame-biting jaws and fingers gripping the bottom edge — interlocked with bubble-letter graffiti words, ribbon banners, number patches, tally marks and wavy stripe bands. Every element is a flat saturated fill with a thick wobbly black outline, packed into merged quilt slots so the black ground survives only as narrow gutters between neighbours.",
      "texture": "/assets/lumen-logic/textures/monster-mash.ktx2",
      "preview": "/assets/lumen-logic/previews/monster-mash.webp",
      "card": "/assets/lumen-logic/cards/monster-mash.jpg",
      "palette": [
        "#4f6e64",
        "#6a526a",
        "#3a443a",
        "#a99665",
        "#48335c"
      ]
    },
    {
      "id": "mosaic-riot",
      "title": "Mosaic Riot",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/mosaic-riot.webp",
      "description": "A dense, maximalist psychedelic mosaic. The canvas is recursively split (binary space partition) into a patchwork of rectangular cells of wildly varying size, and each cell is filled with one of ten vivid motifs — confetti pixel-grids, rainbow stripe bands, concentric bullseyes, rainbow corner arcs, checkerboards, nested rectangles, dot grids, and diagonal or wavy stripes. Light cream gaps separate every cell like woodcut outlines, and a hot-magenta-led palette of teal, cyan, lime, orange, yellow and purple gives the whole surface a teeming outsider-art intensity.",
      "texture": "/assets/lumen-logic/textures/mosaic-riot.ktx2",
      "preview": "/assets/lumen-logic/previews/mosaic-riot.webp",
      "card": "/assets/lumen-logic/cards/mosaic-riot.jpg",
      "palette": [
        "#b17a82",
        "#97467c"
      ]
    },
    {
      "id": "motif-atlas",
      "title": "Motif Atlas",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/motif-atlas.webp",
      "description": "A maximalist plate of doodle motifs on warm paper, ruled like a printed page and drawn in one uniform hairline. The sheet is cut into horizontal registers by bare hairlines and each register into butting panels — no gutters, no gaps, and half the rules stopping short or doubling into a caption underline — and every panel is then handed to one of twelve motif engines: dense tangles of interlocking tubes, fields of nested capsules, rows of half-dome creatures on stubby legs under antenna stems, medallion circles opening onto pebble packs and radial pie wheels, swatch grids of small colour squares, hatch blocks, solid bars with inset colour, pin plots of discs on stems, columns of fluted cups tied back to a vanishing point, contoured amoeba masses, meandering worm labyrinths and passages of asemic scrawl. Every form in every engine obeys the same two rules, and the rules are what let twelve unrelated families sit on one sheet as one hand: each is outlined in a single keyline weight that never varies, and each is fully opaque, so an unfilled form is filled with the paper colour rather than left clear and depth is occlusion alone — no shadow, no gradient, no transparency anywhere. Colour is an accent rather than a field: roughly three fifths of all forms are bare paper, a quarter carry putty or warm grey, and only the remainder take canary, shell pink, coral, mint, a rare cobalt or solid black. Panels bleed a little past their own rules, one to three heroes are grown to span several cells before their engine ever runs, and a final routing layer sends long tubes clean across the plate, ignoring every boundary, so the sheet reads as one drawing that happens to be ruled rather than as a contact sheet of unrelated vignettes. Ghost-type clusters, caption rules and corner ticks are tucked into whatever paper is still empty, and one or two forms carry a blank face of two dots and a small arc — the plate's only figurative note, and its only concession to a subject.",
      "texture": "/assets/lumen-logic/textures/motif-atlas.ktx2",
      "preview": "/assets/lumen-logic/previews/motif-atlas.webp",
      "card": "/assets/lumen-logic/cards/motif-atlas.jpg",
      "palette": [
        "#dbd3cd",
        "#c6bcb5",
        "#b0a8a3",
        "#9f8c8c"
      ]
    },
    {
      "id": "mullion",
      "title": "Mullion",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/mullion.webp",
      "description": "A flooded city seen down one street, and one lattice seen in perspective. There is a single world module — one plot wide, one storey tall — and every mark in the picture is either an edge of a box or a line of that module’s grid, so nothing anywhere carries a spacing chosen in pixels. Three things follow rather than being arranged. Every straight mark is horizontal, vertical or aimed at the vanishing point, because every mark is axis-parallel in the world and a pinhole camera has exactly one image for each axis. Tone is the projected pitch of that one grid and nothing else: the mullions close as the inverse square of depth while the courses close as its inverse, so a wall opens into a legible window grid near the camera, beats into moiré as the two rates part company, and finally passes the width of a hairline — at which point the lattice stops and the region is flat ink. The dark lens around the vanishing point is that locus, not a shape, and because a constant-pitch locus on a plane projects to a straight line, its edges are cuts parallel to each face’s own edges that nothing draws. Slabs are packed onto a lattice of plots either side of the street, a few lifted clear of the water so their soffits show, and they occlude by being painted back to front over their own paper. Unbuilt plots are drawn as dotted silhouettes, ticked at the same module, and long needles run past the built mass to the frame edge. The sheet is mirrored about the horizon because it must be: with the eye at water level the reflection of every point at every depth is the exact reflection of its image, so the symmetry is a measurement of the camera rather than a composition — and only the ink is re-rolled below the waterline, never the geometry.",
      "texture": "/assets/lumen-logic/textures/mullion.ktx2",
      "preview": "/assets/lumen-logic/previews/mullion.webp",
      "card": "/assets/lumen-logic/cards/mullion.jpg",
      "palette": [
        "#c6c4c0",
        "#a4a4a1",
        "#5f5f5d",
        "#8c8d8b",
        "#dfdcd8"
      ]
    },
    {
      "id": "murmuration",
      "title": "Murmuration",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/murmuration.webp",
      "description": "A few thousand small brush ticks coiling round an empty black eye, in which the coil is never drawn. One logarithmic spiral is used purely as a coordinate system: because it is the curve that meets every radius at a constant angle, the flow direction anywhere in the frame is closed-form, and because taking the logarithm of the radius turns it into a straight line, the whole arm becomes a straight strip in log-polar space, where a uniform brick-coursed lattice can be laid out with no integration, no noise and no numerical work of any kind. Each lattice site is kept or dropped by a probability that falls off toward the strip edges, so both flanks of the coil dissolve into scattered individuals and neither boundary is ever a line; the arm simply stops at its inner terminus and the void it leaves is the subject of the picture. Every surviving site takes one flat opaque tick turned to the local flow, bowed slightly toward the centre, and scaled by its own radius — so the mark, the course pitch and the band width are all one self-similar object and the coil reads as a single accelerating gesture rather than as a rope. The tick is one of five profiles by seed — a symmetric spindle, a blunt-headed needle, a square-cut chisel, a round-headed comma or an asymmetric blade — and each carries lengthwise dry-brush striations computed from its own width profile, so they stop short of the points exactly where the mark runs too thin to hold them, with no clipping anywhere in the package. Colour is the one axis with no structure at all: each tick draws a hard-random ink from a pool of bone, sky, steel, brick, madder, orange, moss, fern, amber and teal, over-weighted toward bone, with no zone, no run and no drift — every bit of the picture's order lives in where the marks are. Sparks fly clear of the mass, longer than their neighbours and alone on the black; one to four arms wind out of the same eye; and the ground is flat near-black under a faint vertical board grain. No line, no gradient, no glow, no transparency, no outline, no shadow and no light model: the marks never touch, and the spiral exists only as the reason they are where they are.",
      "texture": "/assets/lumen-logic/textures/murmuration.ktx2",
      "preview": "/assets/lumen-logic/previews/murmuration.webp",
      "card": "/assets/lumen-logic/cards/murmuration.jpg",
      "palette": [
        "#141414",
        "#292927"
      ]
    },
    {
      "id": "mycelium",
      "title": "Mycelium",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/mycelium.webp",
      "description": "Branching fungal network threads spread from random origin nodes across a dark substrate. Recursive filaments fork and taper, leaving luminous spore clusters at their terminals in warm golden-amber tones.",
      "texture": "/assets/lumen-logic/textures/mycelium.ktx2",
      "preview": "/assets/lumen-logic/previews/mycelium.webp",
      "card": "/assets/lumen-logic/cards/mycelium.jpg",
      "palette": [
        "#17140c"
      ]
    },
    {
      "id": "nacre",
      "title": "Nacre",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/nacre.webp",
      "description": "A deep saturated ground combed edge to edge with hairline strands, where every strand in the picture is the image of one straight line under a single shared map of the plane. That map is a composition of the closed-form marbling tools — a base wave, radial ink drops that push the stock apart into nested lenses, decaying vortices that rotate it into whorls, and comb tines, some straight and some scalloped, that drag a band of it hard to one side until the family folds back on itself into nested hairpins. Because one smooth injective map moves every point, no two strands ever cross and neighbours stay locally parallel through every fold, so the sheet reads as one continuous deformation of a combed stock rather than as a crowd of independent strokes. The stock is laid out in bundles at a tight pitch separated by wide open channels, and colour is read from a strand’s index within its bundle rather than drawn per strand: each bundle sweeps a smooth arc of a hue ring, so a family runs blush to vermillion to orange while its neighbour runs lavender to cyan to lemon, broken only by the odd fully saturated accent flash and by strands that take a tone of the ground itself and read as a channel cut through. Every ink is tinted toward the value pole opposite the ground, so the picture carries on contrast alone. Flat matte hairlines, opaque, no fills.",
      "texture": "/assets/lumen-logic/textures/nacre.ktx2",
      "preview": "/assets/lumen-logic/previews/nacre.webp",
      "card": "/assets/lumen-logic/cards/nacre.jpg",
      "palette": [
        "#4c61be"
      ]
    },
    {
      "id": "nautilus",
      "title": "Nautilus",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/nautilus.webp",
      "description": "String art wound onto a logarithmic spiral. Nails are placed along r = R·growth^(θ/2π) — the equiangular curve a nautilus shell grows by — and each nail is joined to the one a fixed number of steps ahead with a straight thread. Because the spiral is self-similar, every chord spans the same angle and radius ratio, so the threads sweep out a logarithmic-spiral envelope: a fan of fine lines spiralling from a glowing warm core out to a cool rim.",
      "texture": "/assets/lumen-logic/textures/nautilus.ktx2",
      "preview": "/assets/lumen-logic/previews/nautilus.webp",
      "card": "/assets/lumen-logic/cards/nautilus.jpg",
      "palette": [
        "#050208"
      ]
    },
    {
      "id": "neon-circuit",
      "title": "Neon Circuit",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/neon-circuit.webp",
      "description": "Glowing circuit board traces connect junctions on a dark grid. Each trace emits a layered neon halo in cyan, magenta, and acid green, evoking a cyberpunk neural mesh lit from within.",
      "texture": "/assets/lumen-logic/textures/neon-circuit.ktx2",
      "preview": "/assets/lumen-logic/previews/neon-circuit.webp",
      "card": "/assets/lumen-logic/cards/neon-circuit.jpg",
      "palette": [
        "#0a0b08"
      ]
    },
    {
      "id": "neon-idol",
      "title": "Neon Idol",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/neon-idol.webp",
      "description": "A cyberpunk anime poster in the neon-splatter tradition. Over a deep violet ground flooded with magenta, amber and acid-lime colour zones sits a procedural cel-shaded bust: an anime figure with a blunt-fringe bob banded in iridescent pastels, a dark bodysuit under an off-shoulder white jacket, a choker, a shoulder tattoo and thin glowing cables looping out of frame — the silhouette re-struck in offset magenta and cyan like a mis-registered print. Behind her, a rising-sun ring halo, dark skyline silhouettes, hexagon tech texture, light beams and hazard stripes; over everything, layered ink splatters with satellite droplets, a vertical column of bold asemic kanji-like glyphs with chromatic-aberration ghosts, a jagged gradient-filled manga sound burst, and a scatter of four-point sparkles. Flat fills with heavy ink outlines throughout, in the punk-pop portrait tradition. Deterministic from a seed, defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/neon-idol.ktx2",
      "preview": "/assets/lumen-logic/previews/neon-idol.webp",
      "card": "/assets/lumen-logic/cards/neon-idol.jpg",
      "palette": [
        "#984f55",
        "#702e62",
        "#7a5d89",
        "#9d7e47",
        "#c3abb1",
        "#34263c"
      ]
    },
    {
      "id": "nested-glow",
      "title": "Nested Glow",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/nested-glow.webp",
      "description": "Two concentric squares centered on a dark canvas, each filled with a solid color that softly blurs and fades into its parent layer at the borders. A Moiré overlay is generated pixel-by-pixel via multiplicative interference of two cosine gratings — one horizontal, one rotated by a user-controlled angle — producing characteristic curved fringes across the composition. Seed shifts the base grating phase for visual variation.",
      "texture": "/assets/lumen-logic/textures/nested-glow.ktx2",
      "preview": "/assets/lumen-logic/previews/nested-glow.webp",
      "card": "/assets/lumen-logic/cards/nested-glow.jpg",
      "palette": [
        "#010609",
        "#193d31"
      ]
    },
    {
      "id": "net-quilt",
      "title": "Net Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/net-quilt.webp",
      "description": "A psychedelic gel-pen mosaic: the plane is packed with large irregular polygons (a relaxed Voronoi partition), each base-filled in a saturated hue and flooded with a warped rainbow diamond cross-hatch net that shimmers with moiré. A serpentine chain of ovoid beads runs down the centre on top, each filled with horizontal rainbow zigzag chevrons on black and ringed in white, while flat cobalt dots scatter through the left and right margins. Black ground shows through every net gap and cell boundary.",
      "texture": "/assets/lumen-logic/textures/net-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/net-quilt.webp",
      "card": "/assets/lumen-logic/cards/net-quilt.jpg",
      "palette": [
        "#5471a0",
        "#66495f",
        "#767760"
      ]
    },
    {
      "id": "newton",
      "title": "Newton Fractal",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/newton.webp",
      "description": "Applies Newton's root-finding method to f(z) = z^n − 1 across the complex plane. Each pixel is coloured by which root the iteration converges to; brightness encodes convergence speed. The intricate filigree on root boundaries is a fractal of infinite complexity — no matter how far you zoom in, the same tendrils reappear.",
      "texture": "/assets/lumen-logic/textures/newton.ktx2",
      "preview": "/assets/lumen-logic/previews/newton.webp",
      "card": "/assets/lumen-logic/cards/newton.jpg",
      "palette": [
        "#572411",
        "#675109"
      ]
    },
    {
      "id": "noise-rings",
      "title": "Noise Rings",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/noise-rings.webp",
      "description": "Concentric rings modulated by fractal Brownian motion noise, producing organic topographic contour lines. Rings radiate outward with increasing perturbation, domain warping creates natural drift between layers, and a chromatic gradient flows from pale ice-blue at the center to deep burgundy at the edge.",
      "texture": "/assets/lumen-logic/textures/noise-rings.ktx2",
      "preview": "/assets/lumen-logic/previews/noise-rings.webp",
      "card": "/assets/lumen-logic/cards/noise-rings.jpg",
      "palette": [
        "#9ac1da",
        "#cbdfef"
      ]
    },
    {
      "id": "northern-lights",
      "title": "Northern Lights",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/northern-lights.webp",
      "description": "A dark arctic sky populated with warm flickering stars and a blurred moon anchored in the upper-left corner. Dozens of semi-transparent gradient columns — each carrying three palette hues — are arranged in a wide flex row, rotated at an oblique angle, and blurred into a flowing curtain of atmospheric light. The composition is grounded by two overlapping dark hill silhouettes in the foreground. Inspired by a CSS-only CodePen aurora by Jhey Tompkins.",
      "texture": "/assets/lumen-logic/textures/northern-lights.ktx2",
      "preview": "/assets/lumen-logic/previews/northern-lights.webp",
      "card": "/assets/lumen-logic/cards/northern-lights.jpg",
      "palette": [
        "#151439",
        "#030a15",
        "#342d46"
      ]
    },
    {
      "id": "nova",
      "title": "Nova",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/nova.webp",
      "description": "A stellar explosion rendered as two overlapping particle systems: a dense spherical core blazing from hot white through gold, and a flat galactic disk fanning outward into deep purple. Particles are drawn with additive screen blending for neon glow, and a central bloom gradient anchors the composition. Disk tilt controls the perspective from face-on circle to dramatic edge-on ellipse.",
      "texture": "/assets/lumen-logic/textures/nova.ktx2",
      "preview": "/assets/lumen-logic/previews/nova.webp",
      "card": "/assets/lumen-logic/cards/nova.jpg",
      "palette": [
        "#160015"
      ]
    },
    {
      "id": "nova2",
      "title": "Nova II",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/nova2.webp",
      "description": "Two concentric particle spheres: a small dense inner ball and a vast outer sphere that extends beyond the canvas. Both shells concentrate particles near their surface. In the outer sphere, particles shrink as they approach the edge, creating a tapering glow. Colors shift from gold at the equator to purple at the poles, matching the original Nova palette.",
      "texture": "/assets/lumen-logic/textures/nova2.ktx2",
      "preview": "/assets/lumen-logic/previews/nova2.webp",
      "card": "/assets/lumen-logic/cards/nova2.jpg",
      "palette": [
        "#160015"
      ]
    },
    {
      "id": "obverse",
      "title": "Obverse",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/obverse.webp",
      "description": "A modern-folk mural panel struck twice from one design. A single vertical seam cuts the sheet, and it decides not what is drawn but how: everything on one side is painted — opaque masses of flat colour, each one ringed by concentric offset copies of its own silhouette in alternating chalk white and palette colour, so the halo is not ornament but the only thing keeping one black mass legible against the next — and everything on the other side is drawn, as an unfilled keyline of one weight that never varies anywhere in the picture, enclosing nothing but the void. Both sides are furnished from one vocabulary of folk-amulet motifs: an eye with a marked pupil, a two-lobed mouth with whiskers, a palm with splayed digits, an arched shrine, a lidded vessel, a leaf sprout, an hourglass, a bladed ray fan, a bundle of nested arcs and a tapering wedge — laid out once across the whole sheet on a ladder of uneven registers, so a motif family recurs on both sides in two different hands. The marks that straddle the seam are the point: a dashed rule and its arrowhead, or a form whose edge runs past the divide, are painted to one side of it and drawn to the other in the same stroke, which locks the halves into one picture rather than two panels. Interiors are never hatched and never shaded — where an area is filled it is filled with a lattice of small repeated marks, most often plus signs, otherwise dot rows, broken rules or contour-following waves. Every line carries a hand tremor from one shared noise, so nothing is ruled and no two parallels stay parallel. Flat and opaque throughout: no gradient, no blur, no shadow, no transparency, no perspective, and one accent colour admitted to the drawn side and nowhere else.",
      "texture": "/assets/lumen-logic/textures/obverse.ktx2",
      "preview": "/assets/lumen-logic/previews/obverse.webp",
      "card": "/assets/lumen-logic/cards/obverse.jpg",
      "palette": [
        "#1d1d20",
        "#db6a81",
        "#ada28a",
        "#52a0a3",
        "#485454",
        "#567779"
      ]
    },
    {
      "id": "oculus",
      "title": "Oculus",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/oculus.webp",
      "description": "A hard-edge chromatic machine on black. Every solid in the frame is a flat profile swept along one single shared depth vector, so a nested portal, a scatter of gradient ring bands, glossy beads and an open box all read as one oblique world seen by one camera — and every face they show takes its colour from one spectrum field in screen space, so hue is a function of where you are on the sheet rather than of which object you are looking at, and neighbouring solids share their hues. At centre a coaxial telescope of rings steps inward and one extrusion deeper at each turn, its inner walls ramping black to white so the nest reads as a funnel rather than a stack of plates, bottoming out in a flat black pupil. Several ring faces carry hairline black-and-white stripes that mitre at every corner of the profile into nested chevrons. A white hairline cage — the wireframe of the same sweep — and a spectrum border band bleed the field off all four edges. Opaque, hard-edged, unoutlined: no transparency, no glow, no blur, no shadow, no texture.",
      "texture": "/assets/lumen-logic/textures/oculus.ktx2",
      "preview": "/assets/lumen-logic/previews/oculus.webp",
      "card": "/assets/lumen-logic/cards/oculus.jpg",
      "palette": [
        "#2c2b1d",
        "#649e80",
        "#3a3f77",
        "#786fa6",
        "#7c4753",
        "#5e393c"
      ]
    },
    {
      "id": "op-bloom",
      "title": "Op Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-bloom.webp",
      "description": "A hand-drawn monochrome Op Art bloom. Nested lobed contours radiate from an off-centre focal knot, each ring a circle modulated by a low-order angular harmonic; the lobe phase rotates steadily with depth, shearing the inner petals into curling crescents and unwinding the outer bands into sweeping S-stripes that run off every edge. Gaps between contours are filled alternately ink and paper — hairline-thin at the dense centre, broad at the rim — every contour is stroked with a fine ink line, and a lone hairline construction curve runs through each white band. Seeded low-order wobble keeps the drawing imperfect and hand-made; flat ink on paper throughout — no grey, no gradients.",
      "texture": "/assets/lumen-logic/textures/op-bloom.ktx2",
      "preview": "/assets/lumen-logic/previews/op-bloom.webp",
      "card": "/assets/lumen-logic/cards/op-bloom.jpg",
      "palette": [
        "#818181"
      ]
    },
    {
      "id": "op-facets",
      "title": "Op Facets",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-facets.webp",
      "description": "Op-Art geometric tessellation inspired by Victor Vasarely. A grid of cells, each radiating alternating dark and light wedges from its centre focal point, creates a 3D faceted-plane illusion. A fBm topographic contour texture fills the light wedge areas, blending optical geometry with organic landscape form.",
      "texture": "/assets/lumen-logic/textures/op-facets.ktx2",
      "preview": "/assets/lumen-logic/previews/op-facets.webp",
      "card": "/assets/lumen-logic/cards/op-facets.jpg",
      "palette": [
        "#b4b4b4",
        "#d0d0d0",
        "#868686"
      ]
    },
    {
      "id": "op-lens",
      "title": "Op Lens",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-lens.webp",
      "description": "An Op Art checkerboard of wide tiles refracted through a circular lens. Inside the lens the vertical coordinate is collapsed so the horizontal tile edges dissolve, leaving column edges as vertical stripes that a sinusoidal shear bows into a refracted wave; the warp fades to zero at the rim, where the plain checkerboard returns. Each colour channel is sampled at a slightly different offset, splitting the stripe edges into chromatic-aberration fringes.",
      "texture": "/assets/lumen-logic/textures/op-lens.ktx2",
      "preview": "/assets/lumen-logic/previews/op-lens.webp",
      "card": "/assets/lumen-logic/cards/op-lens.jpg",
      "palette": [
        "#868686"
      ]
    },
    {
      "id": "op-portal",
      "title": "Op Portal",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-portal.webp",
      "description": "A bottomless doorway of nested flat colour bands cut into a full-bleed field of hairline stripes, opening onto a one-point-perspective room. Above the horizon the back wall carries a flat Op-Art pattern — a curtain of vertical bars, a stack of horizontal bands, a bullseye of concentric rings around the vanishing point, or a coarse checkerboard; below it the floor recedes as a fan of wedges radiating from that same point, a perspective checkerboard, or foreshortened transverse rungs. The frame bands run straight off the bottom edge so the portal stands on its floor, and an optional far doorway — a smaller band frame with its own lit opening — sits on the horizon at the end of the room. Flat fills only: hard edges, no gradients, no outlines, exact mirror symmetry unless the vanishing point is pushed off centre.",
      "texture": "/assets/lumen-logic/textures/op-portal.ktx2",
      "preview": "/assets/lumen-logic/previews/op-portal.webp",
      "card": "/assets/lumen-logic/cards/op-portal.jpg",
      "palette": [
        "#584b51",
        "#6c5227"
      ]
    },
    {
      "id": "op-sphere",
      "title": "Op Sphere",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-sphere.webp",
      "description": "A monochrome curved-truchet tiling refracted through a spherical lens. Interlocking quarter-arc ribbons weave the plane into a regular Op Art motif, then a central bulge magnifies the tiles into a glassy orb — crowding them into an ever-finer moiré halo toward the rim, where the flat grid re-emerges in the corners. The Bulge, Sphere Radius, Ribbon width and Randomness knobs reshape the illusion.",
      "texture": "/assets/lumen-logic/textures/op-sphere.ktx2",
      "preview": "/assets/lumen-logic/previews/op-sphere.webp",
      "card": "/assets/lumen-logic/cards/op-sphere.jpg",
      "palette": [
        "#777777"
      ]
    },
    {
      "id": "op-star",
      "title": "Op Star",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-star.webp",
      "description": "Two interlocked triangular prism frames woven into a tilted hexagram, every facet a separate op-art panel: clashing black-and-white stripes, checkers, halftone dots, concentric targets, ray bursts and coarse pixel ramps, cut with vivid spectral gradient panels running blue through white heat to magenta. The star hangs over a patchwork of muted grayscale op fields — shingle cascades, staircase columns, blurred pixel mosaics, herringbone stripe floors and receding wire grids — and casts a hard offset shadow. Crisp, machine-made geometry after Felipe Pantone.",
      "texture": "/assets/lumen-logic/textures/op-star.ktx2",
      "preview": "/assets/lumen-logic/previews/op-star.webp",
      "card": "/assets/lumen-logic/cards/op-star.jpg",
      "palette": [
        "#bebebe",
        "#979798",
        "#b7a37e"
      ]
    },
    {
      "id": "op-twist",
      "title": "Op Twist",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-twist.webp",
      "description": "Nested rotating squares, each a window onto a radial black-and-white pinwheel. Every layer shrinks and rotates by a fixed twist relative to its parent, so the spokes meet at an angular kink along each square edge; the stacked kinks read as a folded, receding tunnel, and a soft drop shadow on each layer lifts it off the one beneath for a hypnotic Op Art vortex.",
      "texture": "/assets/lumen-logic/textures/op-twist.ktx2",
      "preview": "/assets/lumen-logic/previews/op-twist.webp",
      "card": "/assets/lumen-logic/cards/op-twist.jpg",
      "palette": [
        "#878787"
      ]
    },
    {
      "id": "op-vortex",
      "title": "Op Vortex",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-vortex.webp",
      "description": "Concentric star polygons that shrink and rotate toward the centre, creating a hypnotic Op Art tunnel. A sine-modulated polar curve defines each layer's jagged silhouette; iterative scaling and twisting produce the spiral vortex illusion, while a built-in chroma gradient transitions from outer monochrome through deep reds and oranges to a golden yellow centre.",
      "texture": "/assets/lumen-logic/textures/op-vortex.ktx2",
      "preview": "/assets/lumen-logic/previews/op-vortex.webp",
      "card": "/assets/lumen-logic/cards/op-vortex.jpg",
      "palette": [
        "#171415"
      ]
    },
    {
      "id": "op-well",
      "title": "Op Well",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/op-well.webp",
      "description": "A monochrome op-art well of recursive striped polygons. Each level is a regular polygon annulus of dense concentric black-and-white stripes carrying a ring of smaller conical striped rosettes; its center opens through a soft-shadowed rim into the same structure again at a smaller scale, level after level, each one grayer and dimmer, until the well bottoms out in a single tiny rosette. Stripe density stays self-similar across levels, and seeded rotation phases and center drifts keep every descent slightly different.",
      "texture": "/assets/lumen-logic/textures/op-well.ktx2",
      "preview": "/assets/lumen-logic/previews/op-well.webp",
      "card": "/assets/lumen-logic/cards/op-well.jpg",
      "palette": [
        "#7d7d7d"
      ]
    },
    {
      "id": "oriel",
      "title": "Oriel",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 64,
      "kind": "image",
      "source": "artworks/lumen-logic/oriel.webp",
      "description": "A pen drawing of a megastructure at one edge of the sheet, a star-filled void, a banded near body straddling it, and an enormous mass of hatched vapour filling the rest. There is one operation: a single stack of equally spaced parallel planes cuts every solid in the scene, and every stroke is a section of it drawn on whichever surface is nearest the camera. The latitudes of the planet, the shading of a cloud lobe, the laminar grain of the vapour, the nested eddies where it curls and the ruled panels of the megastructure are the same family of curves against differently oriented surfaces, and the tilt of that one stack takes a sphere from concentric ring shading to even banding. Nothing is shaded and nothing is filled to make a tone: the screen pitch of the sections is T/|∇Φ|, which collapses to zero wherever a surface turns edge-on, so limbs go inky, small bodies come out darker than large ones, faces angled away from the stack go solid and faces square to it open up — and the two limbs of a body close at different rates, which is a terminator with no light source anywhere in the algorithm. Because the phase belongs to space rather than to bodies, the level sets run unbroken across a union of overlapping spheres, which is what makes a chain of balls read as one body of vapour with a continuous grain instead of a heap of separately hatched lobes. A sphere section projects to an exact ellipse and its visible arc is a closed-form interval, so a stroke is one canvas primitive and no geometry is ever sampled; a thumbnail and a full-size export are the same curves. Space is the ground and every solid fills its own silhouette with paper before it is ruled, so the void is where no solid happened to be and the stars survive only in the gaps.",
      "texture": "/assets/lumen-logic/textures/oriel.ktx2",
      "preview": "/assets/lumen-logic/previews/oriel.webp",
      "card": "/assets/lumen-logic/cards/oriel.jpg",
      "palette": [
        "#6d6667",
        "#9c62a7",
        "#443e41",
        "#2d1b25",
        "#7d598c",
        "#b27ab5"
      ]
    },
    {
      "id": "outline",
      "title": "Outline",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/outline.webp",
      "description": "Extracts outlines from a source photograph using Sobel edge detection, then renders them over a gradient background derived from the image's dominant colours.",
      "texture": "/assets/lumen-logic/textures/outline.ktx2",
      "preview": "/assets/lumen-logic/previews/outline.webp",
      "card": "/assets/lumen-logic/cards/outline.jpg",
      "palette": [
        "#93583c",
        "#5a3b33",
        "#b37340"
      ]
    },
    {
      "id": "overprint",
      "title": "Overprint",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/overprint.webp",
      "description": "A warm salmon colour-blocked field floats inside a pale paper margin, overprinted with a stack of huge hand-cut organic silhouettes in translucent silkscreen inks. Cobalt masses curl around the centre, grey-taupe columns flank the sides, teal bands and a red half-disc read through the layers, flesh-peach blobs warm the blues and milky veils frost the middle. Where inks cross they multiply into new hues — blue over salmon goes navy-violet, teal over peach goes muted green — while the pale veils lighten instead. A broken yellow ring glows in a gap, thin misregistration slivers ghost a few contours, and columns of teardrop dots, downward drips and speckles give it the grain of a hand-pulled print. Ten params (seed, silhouettes, warm overlays, veils, grey blocks, bands, accents, ink opacity, drips & dots, paper margin) with a new shared Overprint palette.",
      "texture": "/assets/lumen-logic/textures/overprint.ktx2",
      "preview": "/assets/lumen-logic/previews/overprint.webp",
      "card": "/assets/lumen-logic/cards/overprint.jpg",
      "palette": [
        "#e7ad95",
        "#bc9491",
        "#ce8573",
        "#997876"
      ]
    },
    {
      "id": "ovolo",
      "title": "Ovolo",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ovolo.webp",
      "description": "A sheet of ink cut into flat-colour panels by two rulers, where every panel is the same shape and every corner radius belongs to the grid rather than to the panel. One module is read off the short edge and the field is divided into an integer number of units by it, so every cut in the picture lands on one lattice and the column and row counts are outputs rather than settings; the cells are then claimed by one greedy scan that always takes the maximal free rectangle, so the panels are an exact partition and a panel can run down three rows without any packing having to succeed. There is one primitive: a rectangle with four independently struck corner radii, drawn as four circular arcs and four lines. A square panel at full radius is a circle, a long one is a pill, one rounded on a single side is an arch — so the arches, pills, discs and stadiums in the picture are not four shapes but four settings of one, and there is no curve anywhere in the package that is not a circular arc. Each lattice node is dealt one radius, clamped to what the smallest panel cornering on it can afford, and every corner landing on that node is struck on exactly it: neighbours agree by identity rather than by two computations matching, four generous panels open the channel between them into a symmetric four-lobed pool, and one sliver squares off its whole neighbourhood. The channel itself is never drawn — the ground is painted once in the ink colour and every panel is inset by half a gutter on each side, so the gap between any two panels is exactly one gutter wide whatever their sizes, and the sheet's border is a multiple of the same figure. The ink is a colour and not a background: a share of panels are dealt it and vanish into the sheet, known only by the small disc a few of them carry. A panel's field is one flat hue and whatever it carries walks the remaining hues in ring order starting one past its own, so no mark can ever repeat its panel’s colour however many wedges, bands or discs it runs to — which is why nothing in the picture needs an outline. A minority of panels are dressed, each strictly inside its own edges: a cross of thin rules on the panel's own interior unit lines; a group of bars lying a gutter apart in the panel’s own colour, with the ground showing between them and the parent’s rounding kept on the side they sit on; a wheel cut into equal sectors, sometimes overprinted by a second wheel of a different count so the rim breaks into lenses; a square array of tangent discs leaving the field showing in the cusps, some of those discs being wheels themselves; a field of thin bands at the sheet’s one ruling pitch, phased from the sheet’s own origin so bands stay in register across a channel and a large panel simply carries more of them; and a thick band that turns a single corner through a quarter annulus and runs off two edges. Nothing overlaps, nothing is occluded and nothing crosses a channel, so paint order decides nothing about what is visible. Flat opaque colour throughout: no outline, no gradient, no transparency, no blend mode, no shadow and no texture.",
      "texture": "/assets/lumen-logic/textures/ovolo.ktx2",
      "preview": "/assets/lumen-logic/previews/ovolo.webp",
      "card": "/assets/lumen-logic/cards/ovolo.jpg",
      "palette": [
        "#ca7157",
        "#604e44",
        "#ab4836",
        "#8f6c79",
        "#98272c",
        "#cda448"
      ]
    },
    {
      "id": "paint-streams",
      "title": "Paint Streams",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/paint-streams.webp",
      "description": "Vertical paint streams guided by a Perlin noise flow field. Bold colour blocks and fine lines weave together, evoking risograph prints and the generative works of Tyler Hobbs.",
      "texture": "/assets/lumen-logic/textures/paint-streams.ktx2",
      "preview": "/assets/lumen-logic/previews/paint-streams.webp",
      "card": "/assets/lumen-logic/cards/paint-streams.jpg",
      "palette": [
        "#4e8c8b",
        "#6bc2b5",
        "#869e7a",
        "#e6c160",
        "#9fb8a7"
      ]
    },
    {
      "id": "paint-sweep",
      "title": "Paint Sweep",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/paint-sweep.webp",
      "description": "Horizontal (or directional) painted strokes sweep across the canvas, each with organically varying width, gentle centerline wobble, and rough edge texture. Colors cycle through the palette across the canvas. Looks like broad brushstrokes or palette-knife pulls.",
      "texture": "/assets/lumen-logic/textures/paint-sweep.ktx2",
      "preview": "/assets/lumen-logic/previews/paint-sweep.webp",
      "card": "/assets/lumen-logic/cards/paint-sweep.jpg",
      "palette": [
        "#ec8f38",
        "#96be7f",
        "#7376aa",
        "#cc6583"
      ]
    },
    {
      "id": "painted-muse",
      "title": "Painted Muse",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/painted-muse.webp",
      "description": "An expressive brushstroke portrait of a woman in right-facing profile, eyes closed, on a deep teal ground. The face and neck are massed from vivid tapered paint daubs — oranges, golds and reds along the lit front of the face shifting into turquoise, cobalt, mint and violet across the jaw and neck — inside a crisp profile silhouette with a painted closed eye, brow, nostril and full red lips. The dark hair sweeps up into a messy top bun of ragged arc strokes shot through with red, orange and cobalt accents, while behind the head the paint erupts: splatter blobs with sprayed droplets, a fan of palette-knife strokes behind the ear, chunky maroon slashes, drips running along the canvas edge and long flyaway hair strands curling across the background. The shoulders dissolve into broad multicolored strokes at the bottom edge.",
      "texture": "/assets/lumen-logic/textures/painted-muse.ktx2",
      "preview": "/assets/lumen-logic/previews/painted-muse.webp",
      "card": "/assets/lumen-logic/cards/painted-muse.jpg",
      "palette": [
        "#628c69",
        "#526459",
        "#4b4e3a",
        "#203a41",
        "#276167",
        "#a18755"
      ]
    },
    {
      "id": "painterly-bloom",
      "title": "Painterly Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/painterly-bloom.webp",
      "description": "Domain-warped fractal Brownian motion noise layered with a radial vignette — warm pinks, magentas, and yellows bloom outward from the centre while cool blues frame the edges. A Worley cellular texture overlay mimics the organic ridges and cracks of thick impasto paint.",
      "texture": "/assets/lumen-logic/textures/painterly-bloom.ktx2",
      "preview": "/assets/lumen-logic/previews/painterly-bloom.webp",
      "card": "/assets/lumen-logic/cards/painterly-bloom.jpg",
      "palette": [
        "#3b0e30",
        "#82173f"
      ]
    },
    {
      "id": "palette-knife",
      "title": "Palette Knife",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/palette-knife.webp",
      "description": "Abstract expressionist oil painting built from thick overlapping Bézier strokes, each filled with a smooth two-color gradient from the active palette. Strokes are drawn back-to-front using the painter's algorithm, creating the illusion of physically layered, opaque paint. A fine woven-canvas texture is composited on top, with dark threads visible through the paint surface.",
      "texture": "/assets/lumen-logic/textures/palette-knife.ktx2",
      "preview": "/assets/lumen-logic/previews/palette-knife.webp",
      "card": "/assets/lumen-logic/cards/palette-knife.jpg",
      "palette": [
        "#363f4c",
        "#78828c",
        "#5f676b",
        "#a39464",
        "#695d38"
      ]
    },
    {
      "id": "particle-ribbons",
      "title": "Particle Ribbons",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/particle-ribbons.webp",
      "description": "Thousands of brightly coloured particles emerge from a chaotic cloud on one side of the canvas, then flow field currents guide them into smooth, parallel ribbons of glowing light.",
      "texture": "/assets/lumen-logic/textures/particle-ribbons.ktx2",
      "preview": "/assets/lumen-logic/previews/particle-ribbons.webp",
      "card": "/assets/lumen-logic/cards/particle-ribbons.jpg",
      "palette": [
        "#171417",
        "#615741",
        "#d2bdb2",
        "#fefffa",
        "#436d78"
      ]
    },
    {
      "id": "passepartout",
      "title": "Passepartout",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/passepartout.webp",
      "description": "A paper relief built from a stack of window mats. Each card covers the opening left by the card beneath it, has a rectangle cut through its middle, and is rotated a few degrees and pushed off centre, so the apertures corkscrew inward to an off-axis vanishing point. The border between one window and the next is painted as four mitred wedges, each taking its own flat colour, so every ring breaks at its corners along diagonal joins and the stack reads as a spiral of colour rather than as concentric frames. A thin bright laminate core follows the inside of every cut, one raked light drops a short soft shadow into each window from its top and left edges, and the deepest cards are painted near-black. Loose cut scraps — right triangles, tapering wedges, chips and long bars — are laid over the stack aligned to the edges they sit on, and a share of them run off the board onto the wall. Finally the whole board is hit with aerosol: fine speckle fanning from the corners and a scatter of coarse droplets with satellites and one shared tail direction.",
      "texture": "/assets/lumen-logic/textures/passepartout.ktx2",
      "preview": "/assets/lumen-logic/previews/passepartout.webp",
      "card": "/assets/lumen-logic/cards/passepartout.jpg",
      "palette": [
        "#ae9391",
        "#8d5f7a",
        "#c2b0a1",
        "#8f82b6",
        "#7c62ab",
        "#b75aa0"
      ]
    },
    {
      "id": "patch-tangle",
      "title": "Patch Tangle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/patch-tangle.webp",
      "description": "A hand-drawn \"zentangle\" patchwork in warm marker colour on cream paper. The sheet is carved into irregular, flowing regions — a noise-warped Voronoi partition whose boundaries meander like a torn seam — and each patch is flooded with one solid colour drawn from a warm palette of marigold, rust, golden-yellow, mustard, olive and cream, then packed edge-to-edge with a single dark-ink doodle texture: fields of loose open swirls, region-centred concentric arcs, overlapping fish-scales, tight bubble packing, fine stipple, densely tessellated outlined triangles, teardrop petals in offset rows, straight hatch lines or solid seed drops. Tessellating textures are laid on a shared absolute grid so they tile seamlessly across a whole patch. A single region-ownership grid drives both the colour flood and each patch's ink clip, so every pattern lands exactly on its colour and never spills across a seam, and the patches tile the whole sheet with no bare paper showing. Every dark mark is ink-navy over its colour, so coloured patches abut cream ones and the sheet reads as an all-over quilt of felt-tip pattern cells.",
      "texture": "/assets/lumen-logic/textures/patch-tangle.ktx2",
      "preview": "/assets/lumen-logic/previews/patch-tangle.webp",
      "card": "/assets/lumen-logic/cards/patch-tangle.jpg",
      "palette": [
        "#7f5b40",
        "#9a5f20",
        "#917065"
      ]
    },
    {
      "id": "patchbay",
      "title": "Patchbay",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/patchbay.webp",
      "description": "A sheet packed edge to edge with orthogonal multi-core cable on a deep violet ground. A grid is filled with non-crossing snakes grown by straight-biased self-avoiding walks — long runs, single right-angle turns, frequent hairpins that double a cable back beside itself with only a hairline of ground between — and every snake is drawn by stroking its own centreline repeatedly at decreasing widths, so the bundle of equal pastel lanes, its concentric filleted corners and its capsule ends all fall out of the stroker and are never built as shapes. The sheet is then cut into large rectangles, and each rectangle redraws the entire field under a clip with its own ground tone and its own rotation of the colour ramp: a cable therefore changes colour dead square across its width at a block edge, on the same line as the ground and as every other cable, while its geometry runs on unbroken — nothing in the picture is ever cut. Lane inks step a fixed distance apart along a hue-sorted ramp of pastels from a start index read off a slow two-harmonic hue field, so neighbouring cables agree and the hue drifts across the sheet. Cells the routing never claimed carry small low-contrast marks in the ground register — a dash, a pair, a stack, or a seven-segment digit built from the same dashes — and the field runs past its frame and is cut square by it. Every fill is opaque, every edge is a straight line, a quarter-circle fillet or a capsule end, and no cable ever crosses, branches or joins another.",
      "texture": "/assets/lumen-logic/textures/patchbay.ktx2",
      "preview": "/assets/lumen-logic/previews/patchbay.webp",
      "card": "/assets/lumen-logic/cards/patchbay.jpg",
      "palette": [
        "#7c7090",
        "#a3918f"
      ]
    },
    {
      "id": "penrose",
      "title": "Penrose Tiling",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/penrose.webp",
      "description": "The Penrose P3 tiling: an aperiodic covering of the plane by two golden-ratio rhombi (36° thin and 72° thick), generated by Robinson-triangle deflation — each half-rhombus subdivides into smaller ones scaled by 1/φ. Five-fold rosettes and stars emerge locally while the global pattern never repeats. Tiles are coloured by family, orientation or radius and stroked with ink edges; the seed picks a random rotation and offset into the infinite tiling.",
      "texture": "/assets/lumen-logic/textures/penrose.ktx2",
      "preview": "/assets/lumen-logic/previews/penrose.webp",
      "card": "/assets/lumen-logic/cards/penrose.jpg",
      "palette": [
        "#696c78"
      ]
    },
    {
      "id": "petal-bloom",
      "title": "Petal Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/petal-bloom.webp",
      "description": "Mandala-like radial symmetry built from teardrop petal shapes. N petals radiate from the canvas centre, each narrow at the origin and widening toward the outer edge with a rounded cap. Sinusoidal edge waves make adjacent petals appear to interlock. Colors cycle through the palette, producing a vivid floral pattern with C4 or higher-fold rotational symmetry.",
      "texture": "/assets/lumen-logic/textures/petal-bloom.ktx2",
      "preview": "/assets/lumen-logic/previews/petal-bloom.webp",
      "card": "/assets/lumen-logic/cards/petal-bloom.jpg",
      "palette": [
        "#948c74",
        "#d2c5a0",
        "#fafbf8",
        "#dadee1"
      ]
    },
    {
      "id": "phyllotaxis",
      "title": "Phyllotaxis",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/phyllotaxis.webp",
      "description": "Golden-angle seed packing after Vogel — the spiral arrangement of sunflower disks, pinecones and succulent rosettes. Seeds sit at r = c·√n, θ = n·137.5°, producing interlocking Fibonacci parastichies. Warm amber-to-umber tones radiate from a dense core.",
      "texture": "/assets/lumen-logic/textures/phyllotaxis.ktx2",
      "preview": "/assets/lumen-logic/previews/phyllotaxis.webp",
      "card": "/assets/lumen-logic/cards/phyllotaxis.jpg",
      "palette": [
        "#efe5cd"
      ]
    },
    {
      "id": "pigment-rain",
      "title": "Pigment Rain",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/pigment-rain.webp",
      "description": "A light canvas drowned in vertical colour: horizontal bands break into staggered, overlapping blocks, and each block hangs a curtain of densely packed vertical stripes — hairline threads to finger-wide bars in hard-random full-spectrum hues with black, white and grey struck through. Stripe ends melt like pulled wet enamel: drip tails taper to points, teardrop caps round off, thin stripes swell into mid-run bulges, and a few oversized pour-blobs hang heavy over the weave. Later curtains cut off the drips of earlier ones, so the bands read as layered, ragged sheets with slivers of pale ground breathing between the stripes.",
      "texture": "/assets/lumen-logic/textures/pigment-rain.ktx2",
      "preview": "/assets/lumen-logic/previews/pigment-rain.webp",
      "card": "/assets/lumen-logic/cards/pigment-rain.jpg",
      "palette": [
        "#b19fab",
        "#9b869c"
      ]
    },
    {
      "id": "pill-paths",
      "title": "Pill Paths",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/pill-paths.webp",
      "description": "Generates bold stadium (pill/capsule) shapes by tracing random walks across a grid. Each walk is rendered as a thick round-capped stroke, creating a composition of connected pills, arches, and curves with uniform gutters between them. One randomly chosen circle is drawn in an accent colour as a focal point.",
      "texture": "/assets/lumen-logic/textures/pill-paths.ktx2",
      "preview": "/assets/lumen-logic/previews/pill-paths.webp",
      "card": "/assets/lumen-logic/cards/pill-paths.jpg",
      "palette": [
        "#313131",
        "#4b4b4b",
        "#7b5a51",
        "#141414",
        "#eb6945"
      ]
    },
    {
      "id": "pin-nebula",
      "title": "Pin Nebula",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/pin-nebula.webp",
      "description": "A rigid square lattice of pin-lights on near-black, where every cell's mark is sized by a domain-warped interference field whose wavelength sits close to the lattice pitch — so the screen beats against the field and the structure surfaces as broken arcs and phantom diagonals rather than clean rings. A lobed envelope defines a luminous body, but its rim does not fade: past the boundary each cell survives on an independent random threshold, so the body keeps a crisp edge and then comes apart into isolated, full-strength sparks scattered on the same grid out to the frame's corners. The mark itself is a knob — dot, ring, square, diamond, cross or a bar laid along the field gradient — and the brightest pins carry an optional halo that reads them as light rather than as ink.",
      "texture": "/assets/lumen-logic/textures/pin-nebula.ktx2",
      "preview": "/assets/lumen-logic/previews/pin-nebula.webp",
      "card": "/assets/lumen-logic/cards/pin-nebula.jpg",
      "palette": [
        "#050505",
        "#212121"
      ]
    },
    {
      "id": "pixel-quilt",
      "title": "Pixel Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/pixel-quilt.webp",
      "description": "Random rectangular grid with variable column widths and row heights. Each cell is filled with either a solid saturated palette colour or parallel stripes alternating between two colours. The result resembles a hand-stitched patchwork quilt or woven textile.",
      "texture": "/assets/lumen-logic/textures/pixel-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/pixel-quilt.webp",
      "card": "/assets/lumen-logic/cards/pixel-quilt.jpg",
      "palette": [
        "#888d7d",
        "#509e8d",
        "#a59c54",
        "#ab7d73"
      ]
    },
    {
      "id": "plasma",
      "title": "Plasma",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/plasma.webp",
      "description": "Radial heat-field contour visualization. Gaussian potential fields from N seeded point sources are sampled on a grid and rendered as tight marching-squares isolines. Color ramps from deep crimson near sources through magenta to bright pink at the outer fringes, evoking a topographic map of electromagnetic emission.",
      "texture": "/assets/lumen-logic/textures/plasma.ktx2",
      "preview": "/assets/lumen-logic/previews/plasma.webp",
      "card": "/assets/lumen-logic/cards/plasma.jpg",
      "palette": [
        "#060102"
      ]
    },
    {
      "id": "play-blocks",
      "title": "Play Blocks",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/play-blocks.webp",
      "description": "A grid of playful geometric blocks in a bold pop palette. Each cell is split by a diagonal or a straight half-line into two flat colour regions, then optionally topped with a contrasting circle anchored at its centre or an edge midpoint (rendering as a half-moon) and bitten by a background-coloured notch. The result is a modular kit-of-parts poster of triangles, half-circles and cut-outs.",
      "texture": "/assets/lumen-logic/textures/play-blocks.ktx2",
      "preview": "/assets/lumen-logic/previews/play-blocks.webp",
      "card": "/assets/lumen-logic/cards/play-blocks.jpg",
      "palette": [
        "#db947c",
        "#b091b3",
        "#c86aa3"
      ]
    },
    {
      "id": "pod-bloom",
      "title": "Pod Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/pod-bloom.webp",
      "description": "A radial pen-and-ink bloom of curved petals, in the style of a Zentangle botanical drawing. Petals fan out from a dense centre in overlapping rings: some are \"combed\" leaves filled with fine flowing lines that converge to their pointed tips, others are solid-ink crescent seed pods studded with a row of white pebbles that swell in the belly and shrink to tiny dots at the ends. Pure two-tone ink on paper, deterministic from a seed.",
      "texture": "/assets/lumen-logic/textures/pod-bloom.ktx2",
      "preview": "/assets/lumen-logic/previews/pod-bloom.webp",
      "card": "/assets/lumen-logic/cards/pod-bloom.jpg",
      "palette": [
        "#efeae0",
        "#d1cbc2",
        "#716d67"
      ]
    },
    {
      "id": "polar-aurora",
      "title": "Polar Aurora",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/polar-aurora.webp",
      "description": "Star trails arranged via a phyllotaxis golden-angle spiral into concentric glowing rings, each centred on a different attractor \"pole\" — evoking sacred-geometry cosmic clockwork. Wavy aurora curtains in palette greens and violets flow between the rings in screen blend mode. A jagged midpoint-displacement mountain range splits the frame; a mirror-still glacial lake below reflects the ring geometry, doubling the composition.",
      "texture": "/assets/lumen-logic/textures/polar-aurora.ktx2",
      "preview": "/assets/lumen-logic/previews/polar-aurora.webp",
      "card": "/assets/lumen-logic/cards/polar-aurora.jpg",
      "palette": [
        "#050b1e"
      ]
    },
    {
      "id": "polar-waves",
      "title": "Polar Waves",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/polar-waves.webp",
      "description": "Draws concentric closed curves whose radius is a sum of harmonics: r(θ) = R + A·Σ sin(fₙ·θ+φ). Coprime frequencies prevent the waveform from repeating, creating rippled rings that vary continuously from the centre outward.",
      "texture": "/assets/lumen-logic/textures/polar-waves.ktx2",
      "preview": "/assets/lumen-logic/previews/polar-waves.webp",
      "card": "/assets/lumen-logic/cards/polar-waves.jpg",
      "palette": [
        "#020204"
      ]
    },
    {
      "id": "polaris",
      "title": "Polaris",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/polaris.webp",
      "description": "Multiple overlapping rings of concentric partial arcs — each ring layer seeded to a different rotational offset — recreate the moiré interference of long-exposure star-trail photography. A bright accent star anchors the center; softly glowing quarter-arc \"blur arms\" radiate outward like a compass rose. Inspired by arniebradfo's Polaris CodePen animation.",
      "texture": "/assets/lumen-logic/textures/polaris.ktx2",
      "preview": "/assets/lumen-logic/previews/polaris.webp",
      "card": "/assets/lumen-logic/cards/polaris.jpg",
      "palette": [
        "#0f1c21"
      ]
    },
    {
      "id": "pop-manifesto",
      "title": "Pop Manifesto",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/pop-manifesto.webp",
      "description": "A maximalist pop-art protest poster. A body of text is stacked one word per line and set letter by letter, with every character drawn its own way — its own vivid hue, size and font (heavy sans, black sans, serif italic, mono or poster condensed), and its own render treatment: a chunky 3D isometric block extruded on a full pitch/yaw/roll pose, a flat letter, a hard pop drop-shadow, a hollow white outline, or a letter sitting on a rounded white card. Behind the type sits a patchwork of saturated colour blocks decorated with halftone dots, diagonal stripes, checkerboards, concentric rings and grids, and the whole composition is wrapped in a busy geometric border of outlined tiles with checkerboard corners. Floating outlined stickers — dots, triangles and half-domes — are scattered over the field. Every element carries a bold black outline in the acid-pop graffiti tradition.",
      "texture": "/assets/lumen-logic/textures/pop-manifesto.ktx2",
      "preview": "/assets/lumen-logic/previews/pop-manifesto.webp",
      "card": "/assets/lumen-logic/cards/pop-manifesto.jpg",
      "palette": [
        "#555948",
        "#7f7782",
        "#5b6293",
        "#9aa9ac",
        "#89913e",
        "#713b52"
      ]
    },
    {
      "id": "prism-bands",
      "title": "Prism Bands",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/prism-bands.webp",
      "description": "Overlapping semi-transparent horizontal and vertical color bands inspired by color field painting. Warm-to-cool spectrum hues layer across the canvas; where bands intersect, colors mix additively to produce a luminous grid of compound tones.",
      "texture": "/assets/lumen-logic/textures/prism-bands.ktx2",
      "preview": "/assets/lumen-logic/previews/prism-bands.webp",
      "card": "/assets/lumen-logic/cards/prism-bands.jpg",
      "palette": [
        "#e47e5e",
        "#f5a06d",
        "#f5b596",
        "#9b42cb",
        "#f07020",
        "#c88fd2"
      ]
    },
    {
      "id": "prism",
      "title": "Prism",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/prism.webp",
      "description": "Recursive triangular mosaic with midpoint subdivision. A base grid of triangles is repeatedly split into four sub-triangles based on a configurable probability, producing a vibrant fractal-like mosaic reminiscent of shattered glass or crystal facets.",
      "texture": "/assets/lumen-logic/textures/prism.ktx2",
      "preview": "/assets/lumen-logic/previews/prism.webp",
      "card": "/assets/lumen-logic/cards/prism.jpg",
      "palette": [
        "#9b7f74",
        "#89a890"
      ]
    },
    {
      "id": "psy-swirl",
      "title": "Psy Swirl",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/psy-swirl.webp",
      "description": "A hand-drawn psychedelic flow-line drawing: one organic figure on pale paper, carved into flowing swirl cells by a noise-warped, vortex-twisted Voronoi partition. Every cell is filled with onion-skin contour lines — its wavy boundary echoed inward at tight, even spacing until the nested lines converge into sharp flame cusps, hooks and teardrop eddies. Most lines are near-black fineliner ink; scattered runs of a few consecutive lines switch to marker accents (teal, magenta, golden yellow, olive, violet), so the bundles read as multicolour striped currents. Constant hand wobble, no fills — pure line-work.",
      "texture": "/assets/lumen-logic/textures/psy-swirl.ktx2",
      "preview": "/assets/lumen-logic/previews/psy-swirl.webp",
      "card": "/assets/lumen-logic/cards/psy-swirl.jpg",
      "palette": [
        "#cfd0d4",
        "#e4e8e9"
      ]
    },
    {
      "id": "punk-pop",
      "title": "Punk Pop",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/punk-pop.webp",
      "description": "A pop-art riot-zine portrait of a screaming punk. Over a dark ground, a collage backdrop is assembled from halftone dot fields, thin scanline stripe bands, grunge patches peppered with speckle, distressed blocks of eroded monospace type, and jagged two-radius starbursts with hard drop shadows, ink slash wedges or halftone bands eating into them. In front sits a comic-ink portrait: acid-toned skin split by a hard flat shading band, wide angry eyes under heavy slanted brows with scowl creases, a stud earring, a huge open scream with an outlined lip ring, top teeth and tongue, and a multicolored mohawk — a fan of ink-streaked spike blades over a jagged-hairline root cap, banded left to right through the palette hair hues. Every shape is a flat fill traced in heavy black outline, in the Lichtenstein-meets-punk gig-poster tradition.",
      "texture": "/assets/lumen-logic/textures/punk-pop.ktx2",
      "preview": "/assets/lumen-logic/previews/punk-pop.webp",
      "card": "/assets/lumen-logic/cards/punk-pop.jpg",
      "palette": [
        "#100f12",
        "#914430",
        "#37441d",
        "#636625",
        "#877b45",
        "#822566"
      ]
    },
    {
      "id": "purlin",
      "title": "Purlin",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/purlin.webp",
      "description": "Flat cut colour, and one operation behind all of it. A sheet is carved by long straight cuts into convex faces, and because a face of a line arrangement is convex, its mitred inward offset is nothing more than its own edge half-planes pushed in and re-intersected — so every face can be eroded, exactly and in closed form, into a nest of outlines parallel to its own boundary, turning every corner with a sharp mitre. The step is one global constant rather than a fraction of each cell, which is what makes the sheet read as a single material: a big face carries twenty bands and a small one carries three, at identical width, and band count is an output rather than a setting. Where the offsets run out, the nest closes on the face’s straight skeleton — a point in a triangle, a short ridge in anything wider — so the cells fold like low roofs seen from above instead of tunnelling toward a vanishing point. Each band is then cut once more by the same primitive, into the skeleton facet belonging to each side, and each facet is tipped a shade toward the light or away from it by the direction of the side that made it, so the mitre creases show as tonal breaks and the relief costs the picture no gradient, no shadow and no transparency. Colour steps through one cycle built by sorting the palette around the hue wheel, one entry per band, with each face starting at its own phase and the occasional band coming up pale, so neighbouring nests never line up while the whole sheet keeps one colour system. Thin seams run along every band boundary and heavier ones along every cut, and a separate, looser set of long chords is drawn over the finished nests without the nests taking any notice of them, beaded along their length. Finally the whole drawing is passed through one bounded, coherent displacement of the plane, so cuts bow, nests bow with them, and cells that share a cut bow together — a hand, not a jitter, and one that cannot make two bands cross because it is a homeomorphism.",
      "texture": "/assets/lumen-logic/textures/purlin.ktx2",
      "preview": "/assets/lumen-logic/previews/purlin.webp",
      "card": "/assets/lumen-logic/cards/purlin.jpg",
      "palette": [
        "#b09892"
      ]
    },
    {
      "id": "pythagoras",
      "title": "Pythagoras Tree",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/pythagoras.webp",
      "description": "The Pythagoras tree: a fractal of squares. On each square sits a right triangle with apex angle α; on its two legs sit smaller squares, shrinking by cos α and sin α — so the children’s areas always sum to the parent’s, the theorem itself driving the construction. 45° grows the iconic symmetric broccoli; skewed angles bend it into a windswept cypress with spiralling square-chains. Coloured trunk-to-leaf, with optional per-branch jitter for a weather-grown crown.",
      "texture": "/assets/lumen-logic/textures/pythagoras.ktx2",
      "preview": "/assets/lumen-logic/previews/pythagoras.webp",
      "card": "/assets/lumen-logic/cards/pythagoras.jpg",
      "palette": [
        "#f3efe3",
        "#c6c5a3",
        "#a39f73"
      ]
    },
    {
      "id": "quad-cascade",
      "title": "Quad Cascade",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/quad-cascade.webp",
      "description": "A square packed edge to edge with flat-colour tiles at wildly different scales. One coarse grid of squares is recursively split into 2×2 sub-squares, so every tile is square and every tile edge lands on the same power-of-two lattice — boundaries continue across unrelated regions and the sheet reads as one ruled surface rather than as placed panels. How far a region subdivides is read from one smooth spatial field, so detail clusters: whole patches dissolve four levels down into a fine speckle of static while large tiles beside them are never split at all, and an eight-pixel tile can sit against one a twelfth of the sheet wide. Every tile is a flat opaque square carrying at most one further flat mark in a second colour — a corner quarter disc, an edge half disc, an inscribed circle, a quarter-annulus arc band or a straight split — drawn at the tile's own scale, flush with its neighbours, with no outline, no gap, no gradient and no transparency anywhere. Laid over that ground are a handful of large flat masses grown as connected sets of coarse-grid cells: their outer corners are rounded and their inner corners filleted by a purely local rule, so an isolated cell becomes a circle, a pair becomes a pill and a one-wide chain becomes a rounded pipe. Masses take the palette's heaviest colours so they read as figure, a seeded share carry a pale offset halo that detaches them from the ground, and a few of their interior cells are restamped with marks so they are not dead flat. Colour is zoned by a second field into regional families rather than scattered uniformly, and the detail field lays out as a drift, as vertical bands, as a radial core or as uncorrelated scatter.",
      "texture": "/assets/lumen-logic/textures/quad-cascade.ktx2",
      "preview": "/assets/lumen-logic/previews/quad-cascade.webp",
      "card": "/assets/lumen-logic/cards/quad-cascade.jpg",
      "palette": [
        "#774f63",
        "#9d6a87",
        "#c88870",
        "#462849",
        "#4b426a",
        "#a286a2"
      ]
    },
    {
      "id": "quadrat",
      "title": "Quadrat",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/quadrat.webp",
      "description": "A specimen plate justified like a page of type. The sheet is cut by bare hairlines into a stack of shelves whose heights are whole multiples of one small unit, and each shelf is filled left to right out of **runs** — one skeleton repeated several times over, each instance dressed differently — until the runs exactly tile the shelf, either by being stretched to butt against one another or by leaving a blank quad for the page’s furniture to occupy. A run is not a scatter of similar things: along its length exactly one property advances and the rest are drawn freely, so a rank of half-dome creatures steps from open paper through stripes and checks to solid, a rank of spools steps up the tone ladder, and a block of swatches darkens across the page — which is what makes a row read as a series rather than as a crowd. Twenty-one skeletons share one grammar — half-domes on stub legs under antenna stems, fluted spools, nested capsules, bent tubes, stepped ziggurats, combs, kites, solid bars, swatch blocks, lens eyes, tiny chits, asemic scrawl, braided tangles of nested noodle packed until they nestle, medallion circles opening onto pebble packs and radial pie wheels, contoured amoebas, capped stalks and flooded colour panels — and it is the grammar rather than the cast that holds the sheet together: every closed form carries an outline of one single weight and colour, and every form is opaque, so an unfilled form is filled with the paper rather than left clear and depth is occlusion alone — no shadow, no gradient, no transparency anywhere. Hero bands stand a column of specimens against a block edge across several shelves, one hero form is drawn large enough to spill past its own rules and is then deliberately overrun by the ranks beside it, and a graph of wires — tubes, not strokes, so they occlude what they cross — leaves a named point on one specimen, turns through filleted elbows, and arrives at a named point on another, tying the ranks back together across the rules. Colour is clumped rather than sprinkled: a whole run draws its heat at once, so passages of the plate go near-monochrome and passages go hot, and the sheet stays four fifths bare paper with a single accent carrying real area. Ghost type, caption rules, corner ticks and dot rows are tucked into whatever paper the occupancy grid still calls free, and one form carries a blank face of two dots and a small arc — the plate’s only figurative note, and its only concession to a subject.",
      "texture": "/assets/lumen-logic/textures/quadrat.ktx2",
      "preview": "/assets/lumen-logic/previews/quadrat.webp",
      "card": "/assets/lumen-logic/cards/quadrat.jpg",
      "palette": [
        "#ddd2ce",
        "#b9b3af",
        "#9c9883"
      ]
    },
    {
      "id": "quartier",
      "title": "Quartier",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/quartier.webp",
      "description": "A city district drawn on the back of its own survey grid, in pen and crayon on white paper. One irregular set of vertical and horizontal rails is ruled across the sheet and three unlike families read it. An all-over field of freehand tally strokes runs along the rails in hairline, medium and heavy weights, crossing and overshooting every intersection so the page fills with open crosses and tees rather than closed boxes, often doubled and tripled into bundles that read as one edge drawn and redrawn. A register of outlined pen buildings stands on the skyline, one column wide and several rows tall, each packed with one hand-drawn fill — fine parallel hatch, diagonal hatch, columns of oval windows, grids of circles or dots, dash rows, stacked waves, a nested box, or hatch dense enough to fuse into a solid — a few carrying a crude sheared side flap, with small grey staircases stepping up at the roofline. And a band across the lower middle is piled with colour blocks filled in waxy crayon: parallel passes laid along the block, overrunning one edge and falling short of the other so coverage is streaky and the painted shape is softer and larger than the cell that made it, a third of them crossed by a lighter second grain, many overprinted with the same pen motifs and wrapped in a wobbly outline that misregisters against the colour. The band is piled to a ragged skyline and thins to bare paper at its foot and margins, a tenth of its cells left unpainted so pale towers stand inside the mass, and hue runs in short local clusters rather than scattering. The tally field is split stroke by stroke into one pass drawn before the colour and one drawn after it, so the same lattice is at once the paper the district is drawn on and the scaffold standing in front of it. No perspective, no shading, no gradient, no blur and no blend mode: the softness is stroke overlap and the only depth cue is overlap.",
      "texture": "/assets/lumen-logic/textures/quartier.ktx2",
      "preview": "/assets/lumen-logic/previews/quartier.webp",
      "card": "/assets/lumen-logic/cards/quartier.jpg",
      "palette": [
        "#f6f4f0",
        "#dcd7db",
        "#d4c2b4",
        "#9c97a9"
      ]
    },
    {
      "id": "quilling",
      "title": "Quilling",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/quilling.webp",
      "description": "A rosette of rolled paper petals over a sprayed near-black ground. Every petal is one parametric sheet rather than a shape with a gradient painted on it: a tapering spine curve, a width profile along it, and a roll angle that grows toward the tip, sampled as a surface so that the silhouette, the smooth transverse light ramp and the visible underside are all consequences of the same geometry. One fixed light governs the whole picture, so every petal is bright on the same flank; wherever the roll carries the sheet past the horizon the surface turns away and is repainted in a darker, hue-shifted underside, and where the roll is steep enough the projected silhouette folds back over itself into a scroll. The sheets are stacked into concentric rings, each ring rotated in phase and shrunk against the one outside it and each petal tilted off radial so the bloom turns, painted outermost ring first so the inner petals close over the outer ones, with a tight contact shadow where one crosses another and a thin rim light along the lit flank alone. Behind them a wider, entirely flat under-bloom of pointed petals shows only at the rim, each carrying nested contour bands in cycling contrasting hues and, on a minority, a clipped pattern of dot grids, parallel hatch, concentric arcs or paisley scrollwork. Further back, hairline ghost fragments of mandala and paisley ornament radiate from the bloom and are buried by it, over a splatter field of soft colour haze, a shell of fine speckle, flung droplets stretched along their own ray with satellites trailing outward, and thin drips that fall and bead. Depth inside the bloom is overlap and shading alone: no perspective, no cast shadow on the ground, no reflections and no texture.",
      "texture": "/assets/lumen-logic/textures/quilling.ktx2",
      "preview": "/assets/lumen-logic/previews/quilling.webp",
      "card": "/assets/lumen-logic/cards/quilling.jpg",
      "palette": [
        "#1c1812",
        "#857057",
        "#3c3d2a"
      ]
    },
    {
      "id": "quoin",
      "title": "Quoin",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/quoin.webp",
      "description": "One square module rules the whole sheet. A single uniform lattice is packed, largest blocks first, into flat rectangles of one, two, three or four modules a side — claimed exclusively rather than subdivided, so a block may be a domino or a three-wide bar and may start at any lattice coordinate rather than only at a power-of-two one, and whatever the packing does not claim stays a single module. Blocks butt flush with no gutter, no keyline and no ground showing through: the sheet is a partition, full bleed on all four edges. Every block is printed in exactly two inks drawn as a pair from a ladder built out of the palette, with the pair held coherent across neighbours by a smooth field and the polarity flipped per block, so passages of one pairing sit against passages of another, both light-on-dark and dark-on-light are everywhere, and wherever adjacent blocks happen to agree on a ground their fields fuse into masses several blocks across — the only composition in the picture, and an emergent one. Each block then takes at most one hard-edged mark in its second ink: a corner quarter disc, an edge half disc, an inscribed circle, a circle inside a circle, a quarter-annulus band, a run of parallel bars, a field of dots or a diagonal wedge. What ties the marks together is that they are measured and phased in the module rather than in the block — bar pitch and dot pitch are constants of the sheet, so a four-module block carries four times the bars of a one-module block at identical width, mark counts are outputs rather than settings, and bars in unrelated neighbouring blocks land on the same rulings and run across the joint. Nothing is outlined, nothing is transparent, nothing has a gradient and no layer is drawn over the partition.",
      "texture": "/assets/lumen-logic/textures/quoin.ktx2",
      "preview": "/assets/lumen-logic/previews/quoin.webp",
      "card": "/assets/lumen-logic/cards/quoin.jpg",
      "palette": [
        "#63564c",
        "#ac532b"
      ]
    },
    {
      "id": "radial-burst",
      "title": "Radial Burst",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/radial-burst.webp",
      "description": "A centrifugal zoom-blast: thousands of thin, broken paint streaks fired outward from a single off-centre origin. Rays are drawn with additive blending, so the convergence point naturally blooms to a hot white core while the spokes thin and tint toward the rim through a jewel-toned palette of magenta, violet, blue and ember. A grain control snaps the strokes into dashes that let the black ground punch through, and a sparse white speckle scatters star-like flecks across the blast — evoking an exploded spin-painting.",
      "texture": "/assets/lumen-logic/textures/radial-burst.ktx2",
      "preview": "/assets/lumen-logic/previews/radial-burst.webp",
      "card": "/assets/lumen-logic/cards/radial-burst.jpg",
      "palette": [
        "#513f4a",
        "#4c4c81",
        "#45296a",
        "#9f4b60",
        "#8a3c85",
        "#745f70"
      ]
    },
    {
      "id": "raffia",
      "title": "Raffia",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/raffia.webp",
      "description": "Op Art weave of dense parallel-line panels. The frame is recursively sliced by straight cuts — mostly near-horizontal, with occasional steep diagonals — into convex panels, and each panel is flooded with a single family of tightly-spaced hatching whose angle drifts band to band. A fraction of the diagonal panels are crosshatched, carving the dense interference shards that anchor the corners. The overall effect is woven natural fibre: stacked striations of magenta, cream and peach drifting across a warm ground. Inspired by the kinetic line works of Jesús Rafael Soto and Carlos Cruz-Diez.",
      "texture": "/assets/lumen-logic/textures/raffia.ktx2",
      "preview": "/assets/lumen-logic/previews/raffia.webp",
      "card": "/assets/lumen-logic/cards/raffia.jpg",
      "palette": [
        "#b84f73",
        "#c4757f",
        "#d2a59c"
      ]
    },
    {
      "id": "ravel",
      "title": "Ravel",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ravel.webp",
      "description": "A rigid checkerboard of identical discs that holds across the top of the sheet, loses its grip along a ragged front, compacts, falls, and settles into a granular bed on the floor. The lattice is a checkerboard and not a square grid — only the sites where row and column indices sum to an even number carry a disc, so the nearest neighbours sit at a diagonal and the rows alternate between one more and one fewer. Colour is arithmetic rather than chance: a disc is dark if its row index is even and light if it is odd, and it is warm if the Chebyshev distance from its site to the sheet’s top and side edges, counted in double cells, is odd — which is a stack of nested rectangular frames opening downward, read as interlocking chevrons at the top and, past the point where the frames would close, as plain vertical stripes. A disc keeps the colour of the site it came from wherever it is finally drawn. An erosion front, deeper at the sheet’s two side edges than in its middle and rough from column to column, divides the sites that still hold from those that have let go; released material first compacts toward the front, which is why the band immediately under it is denser than the lattice that fed it, then falls, each row further along than the one above, with an exponent steep enough that most of it is still bunched under the front and only the earliest releases have reached the floor. What reaches the floor is deposited by rolling into place, which is what gives the bed its bumpy, single-disc-scale surface. Every site emits exactly one disc: nothing is created, nothing is destroyed, and the only thing that varies across the sheet is how far along its fall each disc has got.",
      "texture": "/assets/lumen-logic/textures/ravel.ktx2",
      "preview": "/assets/lumen-logic/previews/ravel.webp",
      "card": "/assets/lumen-logic/cards/ravel.jpg",
      "palette": [
        "#d1cecd"
      ]
    },
    {
      "id": "reaction-diffusion",
      "title": "Reaction Diffusion",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/reaction-diffusion.webp",
      "description": "Simulates the Gray-Scott reaction-diffusion model: two chemicals U and V react (UV²→2V) while diffusing at different rates. Depending on feed and kill rates the system self-organises into spots, stripes, labyrinthine mazes, or coral-like branching patterns.",
      "texture": "/assets/lumen-logic/textures/reaction-diffusion.ktx2",
      "preview": "/assets/lumen-logic/previews/reaction-diffusion.webp",
      "card": "/assets/lumen-logic/cards/reaction-diffusion.jpg",
      "palette": [
        "#f0ede0"
      ]
    },
    {
      "id": "relief-burner",
      "title": "Relief Burner",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/relief-burner.webp",
      "description": "A wildstyle graffiti burner cut in bas-relief. Every mark in the piece is one primitive — a bar of constant width following a sharply-bent polyline spine, whose top surface folds along that spine into two long faces so each takes its own flat tone from a single-hue luminance ramp by how its tilt catches a fixed upper-left light. A crisp chamfer strip of the palest tone runs along whichever long edge faces the light and the deepest along the opposite one, and beneath the top surface an extruded side wall in the darkest tone lifts the bar off the wall. Most ends spike into a faceted graffiti arrowhead — two barbs swept back from a long apex — and the rest are cut off on a chisel slant. Bars are opaque and stack back to front, so depth is occlusion alone, and they interlock into a dense spiky cluster laid out by one of four families chosen by seed: a sheared burner on a shallow baseline, a chained bolt running one diagonal, a radiating wheel, or a loose scatter. Underneath, the panel is machined with concentric circular steps whose risers brighten to a hairline where they face the light and lay a soft band of shadow on the opposite side, and the whole mass throws one wide diffuse shadow down-right onto it. Finally, paint runs bleed straight off the mass’s own bottom silhouette in the deepest tone, tapering as they fall and ending in a beaded drop.",
      "texture": "/assets/lumen-logic/textures/relief-burner.ktx2",
      "preview": "/assets/lumen-logic/previews/relief-burner.webp",
      "card": "/assets/lumen-logic/cards/relief-burner.jpg",
      "palette": [
        "#111111",
        "#4b2c39",
        "#ad5675"
      ]
    },
    {
      "id": "repousse",
      "title": "Repoussé",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/repousse.webp",
      "description": "A tarnished blue-black plate punched from behind, in the metalworker's sense: a smooth relief surface is raised on the reverse and the front shows only the bosses it pushes through. Those bosses are a golden-angle spiral of a few thousand small studs, laid on r = c·n^e at an exponent above the equal-area one so the mat is nearly solid at the core and opens into wide isolated dots at the margins, each stud sized by its own local spacing and nudged off the ideal point by a fraction of it so the Fibonacci arms waver. Every stud is a hard-edged annulus assembled from overlapping discs — a bright crescent on the lit flank, a dark crescent opposite, a pit at the centre held at one constant near-black, and a specular point on the brightest few — and a share of them invert into punched hollows while a few carry the drag scratch of a slipped punch. Nothing else in the picture is lit. The broad bright lobes ringing a sunken dark core are not painted anywhere: they are the diffuse and specular response of the invisible surface, sampled once per stud, with each mark additionally tilted by the local gradient so the field reads as curved rather than as flat and bright. Under it all lies a plate built only from soft blots and hard specks — overlapping cold washes, dark scumbles, and a granular dendritic crust that climbs from the top of the frame, bleaching the plate toward paper and dissolving the studs it reaches. No glow, no bloom, no gradient ramp, no blur and no painted light: the softness is blot overlap and the light is arithmetic.",
      "texture": "/assets/lumen-logic/textures/repousse.ktx2",
      "preview": "/assets/lumen-logic/previews/repousse.webp",
      "card": "/assets/lumen-logic/cards/repousse.jpg",
      "palette": [
        "#3d474f",
        "#1b2730"
      ]
    },
    {
      "id": "reseau",
      "title": "Réseau",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/reseau.webp",
      "description": "One regular lattice built on a flat surface, bent once, and lit. A single smooth map carries a rectangular grid from that surface to the canvas — a perspective divide that compresses it to one side, then a radial term about a movable centre that bends its straight rows into arcs — and every curve in the finished picture is that one map, so the rows, the colour bands and the lean of every mark cannot disagree. Each cell carries exactly one of three phosphors on a fixed three-cycle with a row-to-row shift, and fires only as hard as that phosphor is wanted where it stands. Three of the picture’s most characteristic features follow from that and nothing draws any of them. Where the light wanted is a pure primary, two cells in every three go dark and the survivors form a sublattice of index three — three times the area per mark, and its texture turned through a right angle to run diagonally, so saturated regions come out visibly coarser than pale ones. Where the light is strong, marks swell past their own cells and fuse, and the only thing left of the ground is a lattice of holes at the cell corners; the bloom is capped as a fraction of each mark shape's own sealing scale, so those holes can never quite close, at any setting, with no runtime check anywhere. And the field is sampled once per cell rather than per pixel — as a mask cannot show detail finer than itself — so its frequency beats against the lattice's and throws fringes far broader than either. A mark's colour is the pure phosphor and never varies; the drive is carried by size alone, at an exponent of one half, which makes the ink's share of the surface exactly proportional to the drive and independent of where the warp has compressed the lattice. Five mark shapes — dash, dot, slot, lozenge, chevron — each a polygon in its cell’s own sheared frame. Flat and opaque throughout: three inks on a ground, no outline, no gradient, no transparency, no blend mode and no blur. The additive colour is spatial, done by the eye, which is why the highlights are a fine speckle rather than a smooth white.",
      "texture": "/assets/lumen-logic/textures/reseau.ktx2",
      "preview": "/assets/lumen-logic/previews/reseau.webp",
      "card": "/assets/lumen-logic/cards/reseau.jpg",
      "palette": [
        "#504d4b",
        "#2b2325",
        "#666561",
        "#0c0a0c"
      ]
    },
    {
      "id": "reticle",
      "title": "Reticle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/reticle.webp",
      "description": "A dark instrument plate built by subtraction. The plate is banded into registers and each register is cut by recursive guillotine subdivision into rectangles that are hatched with parallel hairlines at quantised pitches, filled flat, or left as bare ground — with subdivision depth varying by an order of magnitude between neighbours, so large calm blocks sit against passages of near-illegible fineness. Long straight faults then cross the whole plate and take entire wedges of that field away back to bare ground, slicing blocks mid-block so hatch lines terminate on the diagonal. Inside the bare wedges, and only there, sit pencils of circle outlines that all pass through one common point: geometric radii and a constant angular advance give each family a dense rosette knot at the small end and a logarithmic fan at the large end. Fragments of the field spill into the margins as rows of offcuts. Three inks — sand, cyan and grey — flat and opaque on near-black; no gradients, no glow, no transparency, no curves except the pencils.",
      "texture": "/assets/lumen-logic/textures/reticle.ktx2",
      "preview": "/assets/lumen-logic/previews/reticle.webp",
      "card": "/assets/lumen-logic/cards/reticle.jpg",
      "palette": [
        "#1a333d",
        "#161518"
      ]
    },
    {
      "id": "ribbon",
      "title": "Ribbon",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ribbon.webp",
      "description": "Overlapping Bézier ribbon strips, each a filled path between two parallel edge curves with sine-wave deformation applied perpendicular to direction of travel. Ribbons are drawn back-to-front so they realistically overlap.",
      "texture": "/assets/lumen-logic/textures/ribbon.ktx2",
      "preview": "/assets/lumen-logic/previews/ribbon.webp",
      "card": "/assets/lumen-logic/cards/ribbon.jpg",
      "palette": [
        "#30221b",
        "#2a363d",
        "#6c465c",
        "#414574",
        "#5d5d36",
        "#543b0f"
      ]
    },
    {
      "id": "riffle",
      "title": "Riffle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/riffle.webp",
      "description": "A frame filled edge to edge with one stack of laminae seen on its cut edge — several hundred parallel strands of colour sweeping across the sheet in long coherent curves, packed to hairlines in places and opening into wide slabs in others, like the bowed edge of a block of coloured paper riffled past a thumb. There is no background: every pixel belongs to a lamina, so nothing can be sparse and nothing can glow. Nothing in the picture is placed. The whole stack is one monotone remap of a single across-stack coordinate, built from a handful of harmonics whose phases travel along the frame at different rates, and a lamina’s width on screen is that map’s derivative — so a band is a slab where the map dilates and a hairline where it compresses, the same band changes width several times over along its own length, and every dense, dark passage and every open, bright one is a crowding effect rather than a painted shape. Because the map is monotone, no two strands can ever cross, merge or end. Thickness comes from a repeating block of laminae drawn from a power law so a few slabs sit among many hairlines, and a share of the blocks are mirrored, so the colour ramp folds back on itself and runs meet either at their pale ends or at their dark ones the way a folded stack does. Colour is one narrow family carried on value: a ramp walked in order down each block, with the palette’s own dark desaturated and lifted for the cool-reading hairlines and a near-white for the occasional bright edge, and only ever assigned to thin laminae. Lighting is geometry twice over: each lamina is filled with a cross-band gradient so it reads as a rounded ridge — which is also the only reason a boundary between two laminae is visible, since nothing in the package is ever stroked or outlined — and a slow anisotropic sheen tracks the angle between the local strand direction and one light, so the sheet darkens where it turns and lights where it runs flat. Opaque fills only: no stroke, no outline, no background, no blend mode, no blur, no shadow, no noise field and no per-pixel work anywhere.",
      "texture": "/assets/lumen-logic/textures/riffle.ktx2",
      "preview": "/assets/lumen-logic/previews/riffle.webp",
      "card": "/assets/lumen-logic/cards/riffle.jpg",
      "palette": [
        "#cc7c6c",
        "#bc5a4b"
      ]
    },
    {
      "id": "ripple",
      "title": "Ripple",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ripple.webp",
      "description": "Wave ripple interference. Several point emitters each radiate a family of evenly-spaced concentric rings across a black plane. Where the families overlap their rings beat into a shimmering moiré lattice — the interference pattern of a ripple tank. Every ring is a single thin stroke, painted with a directional warm-to-cool gradient that sweeps the plane, so arcs glow amber and magenta in one corner and cool to cyan across the rest. Additive blending brightens each crossing into a luminous mesh.",
      "texture": "/assets/lumen-logic/textures/ripple.ktx2",
      "preview": "/assets/lumen-logic/previews/ripple.webp",
      "card": "/assets/lumen-logic/cards/ripple.jpg",
      "palette": [
        "#241118",
        "#0f242d"
      ]
    },
    {
      "id": "rocky-terrain",
      "title": "Rocky Terrain",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/rocky-terrain.webp",
      "description": "Procedural rocky terrain rendered pixel-by-pixel using layered fractional Brownian motion combined with Voronoi noise for chunky, faceted boulders. A vertical falloff gradient attenuates all displacement toward the top, dissolving the landscape into a clean void. Palette colors are mapped along a depth ramp — dense, saturated hues emerge at the base and fade through the spectrum to nothing at the summit.",
      "texture": "/assets/lumen-logic/textures/rocky-terrain.ktx2",
      "preview": "/assets/lumen-logic/previews/rocky-terrain.webp",
      "card": "/assets/lumen-logic/cards/rocky-terrain.jpg",
      "palette": [
        "#00030e",
        "#002f68",
        "#2b85b6"
      ]
    },
    {
      "id": "rondel",
      "title": "Rondel",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/rondel.webp",
      "description": "A flat screenprint of three straight rulings and one circle that is never drawn. Two of the rulings belong to the sheet — one vertical, one horizontal, both defined across the whole plate rather than per cell — and a grid of square windows admits one or the other by the parity of its row and column, so a bar leaving one cell lines up with the bar entering the next because it is the same bar. The third ruling, coarser and oblique, belongs to the circle and exists nowhere else. The picture is printed twice in perfect register: once plain, and once again clipped to the circle with every field colour mixed one step toward a single colour of glass and every bar colour left exactly as it was — so the boundary is a line along which several hundred bars change the colour behind them while the bars themselves do not change at all, which is why the circle reads as a pane behind the print rather than a wash over it, though nothing in the package is transparent and no alpha is ever set. One paint order governs the whole sheet — vertical, then oblique, then horizontal — and it is what makes the oblique bands cross the vertical cells unbroken and appear in the horizontal ones as a field of short dashes cut at exactly the horizontal pitch: nothing is drawn as a dash, and the two readings are one order seen in two kinds of cell. Colour is dealt by the orbit of the grid's own half-turn, so cells at either end of a line through the centre are identical, and the rulings are anchored so that the whole picture is exactly invariant under that half-turn: a band set is symmetric about the centre only when twice its phase plus its duty is a whole number, so the phase is not free and the seed may only choose, per ruling, whether a band or a gap straddles the centre line. A bar is filled four ways — solid, twinned into a pair of hairlines at its edges, cut by a second rhythm that depends only on distance along the bar so the cuts line up across every bar and a cross-ruling appears that nothing draws, or breathing on a slow beat six bands wide — and the lens is a disc, a ring, a lozenge or a quatrefoil, all of them centrally symmetric so the half-turn survives the choice. Fills only: no stroke, no outline, no gradient, no transparency, no blend mode, no shadow, no texture, and no border around any cell.",
      "texture": "/assets/lumen-logic/textures/rondel.ktx2",
      "preview": "/assets/lumen-logic/previews/rondel.webp",
      "card": "/assets/lumen-logic/cards/rondel.jpg",
      "palette": [
        "#828091",
        "#9a98a4",
        "#43466c",
        "#bcbcac"
      ]
    },
    {
      "id": "rosette",
      "title": "Rosette",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/rosette.webp",
      "description": "A portrait dissolved into a printed halftone rosette. The picture is a print rather than a drawing: one continuous plate — a shaded relief of one to four overlapping heads, baked from the depth maps of public-domain sculpture scans and ramped into the active palette — is separated into four inks, and each ink is screened at its own angle, the classical 15°/45°/75° process set that beats into the tightest rosette. Three of the inks are subtractive and can only darken; the fourth is opaque and printed last, which is why bright dots can sit over a dark passage in the same picture as dark dots over a pale one. The whole printed sheet is then bent and sliced: a field of Gaussian whorls rotates and slightly compresses it, two octaves of smooth noise smear it, and a stack of horizontal bands cuts it into slabs that slip sideways, hold one row and smear it, or drop toward the shadow ink. Because the screen is evaluated at the bent position rather than at the pixel, the lattice itself curves through the whorls, and where the bend compresses it the separations beat against one another into closed ring systems that nothing in the renderer draws — the misregistered inks fringing pale edges in palette colours for the same reason. The plate is baked once into a fixed 1200-unit raster and every length is a fraction of the frame, so a thumbnail and a full-size export are the same picture, dot for dot.",
      "texture": "/assets/lumen-logic/textures/rosette.ktx2",
      "preview": "/assets/lumen-logic/previews/rosette.webp",
      "card": "/assets/lumen-logic/cards/rosette.jpg",
      "palette": [
        "#aeb1bb",
        "#9995a0",
        "#676277"
      ]
    },
    {
      "id": "rowel",
      "title": "Rowel",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/rowel.webp",
      "description": "A wheel of flat marks on a coloured disc, turned rather than drawn. One curve is built for the whole picture and every mark in it is that curve rotated by an equal step, so nothing is scattered, jittered or chosen mark by mark and the disc carries exact N-fold symmetry; the seed's whole job is to shape the single stroke, through a phase and three harmonics that vanish in value and in slope at both of its ends. The stroke runs from a solid hub out to a stop short of the disc’s edge, and its angular position along the way is a sigmoid of a biased radius — so its lean is zero where it stands on the hub, zero where it ends, and greatest in between, which is what makes it a hook rather than a blade set at an angle, and what makes the hub's rim come out finely serrated by the roots standing on it rather than by any tooth being drawn. A bump supported on the outer stretch swings the stroke back against its own sweep and returns it, curling the tips into question marks without disturbing either end. Width is measured in angle rather than in pixels: a mark’s half-width is a fraction of the angular cell, so the ink’s share of every circle is a function of radius alone and is the same whether the wheel has twenty-four marks or three hundred and sixty — the count is a density control that cannot clog at the hub or gape at the rim, and because that fraction is capped below one, two neighbours can never meet at any radius. The mark itself is one band under four cuts, all taken in the band’s own coordinates so they bend with it: solid, hollowed to two rails, cut along its length into beads, or studded with a row of field-coloured pearls that swell at the belly and shrink to dots at the ends. Colour is dealt in sectors around the disc rather than mark by mark, so it can weaken the wheel’s symmetry but never scatter into speckle. The picture appears to contain two opposite families of spiral and contains one: the second is the shape of the gaps, and nothing draws it. Flat and opaque throughout — two inks, no outline, no gradient, no transparency, no shadow and no texture.",
      "texture": "/assets/lumen-logic/textures/rowel.ktx2",
      "preview": "/assets/lumen-logic/previews/rowel.webp",
      "card": "/assets/lumen-logic/cards/rowel.jpg",
      "palette": [
        "#a4a364",
        "#e5e5d7",
        "#5c5b0e"
      ]
    },
    {
      "id": "rust-storm",
      "title": "Rust Storm",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/rust-storm.webp",
      "description": "Layers fractal Brownian motion noise with domain warping to produce a grungy, distressed canvas of swirling dark colours. Flow-field particle scribbles trace erratic looping paths across the upper canvas, while vertical scratch lines drip downward and horizontal glitch striations pulse through the lower half.",
      "texture": "/assets/lumen-logic/textures/rust-storm.ktx2",
      "preview": "/assets/lumen-logic/previews/rust-storm.webp",
      "card": "/assets/lumen-logic/cards/rust-storm.jpg",
      "palette": [
        "#7f8686",
        "#636868",
        "#a3aaa8",
        "#4a4d4c"
      ]
    },
    {
      "id": "sand-lines",
      "title": "Sand Lines",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sand-lines.webp",
      "description": "A Perlin flow field where each streamline is rendered as a scattered trail of tiny dots rather than a smooth curve. The result mimics serigraphy, risograph printing, or fine sand blown by desert wind.",
      "texture": "/assets/lumen-logic/textures/sand-lines.ktx2",
      "preview": "/assets/lumen-logic/previews/sand-lines.webp",
      "card": "/assets/lumen-logic/cards/sand-lines.jpg",
      "palette": [
        "#efdecb"
      ]
    },
    {
      "id": "sandpile",
      "title": "Sandpile",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sandpile.webp",
      "description": "The Abelian sandpile: N grains dropped on a grid topple — any cell with ≥ 4 grains gives one to each neighbour — until every cell holds 0–3. The stable state is independent of toppling order, and millions of grains on a single point self-organise into an exact fractal mandala of curved wedges and periodic lace, rendered as a crisp four-colour mosaic. Zero randomness: the same grain count always produces the identical figure.",
      "texture": "/assets/lumen-logic/textures/sandpile.ktx2",
      "preview": "/assets/lumen-logic/previews/sandpile.webp",
      "card": "/assets/lumen-logic/cards/sandpile.jpg",
      "palette": [
        "#8199ac",
        "#dad9d3",
        "#576d8a"
      ]
    },
    {
      "id": "scantling",
      "title": "Scantling",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/scantling.webp",
      "description": "A braid of long open splines and a shoal of complete circles are drawn as one flat arrangement inside a rectangle whose two opposite corners carry L-brackets, and every face of that arrangement is filled by its own scantling — the diameter of the largest disc that fits inside it, and nothing else. Solid where there is no room, a horizontal ruling where there is a little, a flat wash where there is a lot, and bare paper above a ceiling. That ceiling is the point: it is what keeps three-quarters of the sheet empty, in two great connected grounds either side of the diagonal corridor the braid runs down. The law is a gate and not a ramp — width decides which treatments a face may have, never how dark it is, so nothing here shades and no face is ever a blend of two things. Nothing overlaps and nothing is layered: circles cut faces exactly as the curves do, which is where the crescents and the long tapering lenses come from, and the black slivers are simply the faces too narrow to be anything else. The ruling is horizontal in every face and is never crossed; give it a second angle and this becomes a different algorithm. The curves are stroked full length over the top at the end, so the drawn line sits centred on the boundary between two fills rather than beside it, and the two brackets mark the corners the braid actually runs between.",
      "texture": "/assets/lumen-logic/textures/scantling.ktx2",
      "preview": "/assets/lumen-logic/previews/scantling.webp",
      "card": "/assets/lumen-logic/cards/scantling.jpg",
      "palette": [
        "#f1f0e7",
        "#d4d4cb",
        "#b1b1aa"
      ]
    },
    {
      "id": "scatter-rings",
      "title": "Scatter Rings",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/scatter-rings.webp",
      "description": "Concentric rings rendered as fields of scattered square dots in alternating colours on a black ground. Dots are seeded uniformly by area within each band, and their draw probability fades toward the band edges, producing soft, noisy, stippled boundaries — a pointillist bullseye.",
      "texture": "/assets/lumen-logic/textures/scatter-rings.ktx2",
      "preview": "/assets/lumen-logic/previews/scatter-rings.webp",
      "card": "/assets/lumen-logic/cards/scatter-rings.jpg",
      "palette": [
        "#080101",
        "#170b2b"
      ]
    },
    {
      "id": "scree-fall",
      "title": "Scree Fall",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/scree-fall.webp",
      "description": "A hard-edged two-ink print of one material changing state down the canvas. A solid banner slab sits at the source edge, and a full-bleed comb of near-equal-width ribs pours out from under it — bent at the lip by an edge flare that splays the outermost ribs outward and a slow lean that waves across the middle, both decaying to dead-straight within the first quarter of the run. Every rib stops on a shared settle profile — a single off-centre mound, a range of dunes, a sharp ridge, a quantised terrace staircase or a near-flat horizon — with per-rib raggedness and the occasional deep plunge, so the boundary reads as the surface of a loose pile rather than as a clipped mask. Before it lands, each rib frays: its last stretch breaks into a train of dashes that shrink and separate as they go, so the bar dissolves into granules instead of being cut off. Below the profile the ground is strewn with grains of one uniform size — solid dots, rotated chips, short ticks or rings punched with a counter — jittered on a grid so they never clump and never leave a void, spilling up across the fraying rib feet and down into the strata. A grain that lands on ink is painted in the ground colour instead, so the rib feet look eaten by granulation and the bars look pitted. At the far edge the material settles into a bed of horizontal strata on the rib pitch, its segments lengthening and thinning out with depth until a single near-full-width bar closes the floor. The whole composition is built in a flow-aligned frame, so the same picture pours down, up, left or right. Two flat inks, full bleed — no outlines, no gradients, no shadows, no transparency and no text anywhere.",
      "texture": "/assets/lumen-logic/textures/scree-fall.ktx2",
      "preview": "/assets/lumen-logic/previews/scree-fall.webp",
      "card": "/assets/lumen-logic/cards/scree-fall.jpg",
      "palette": [
        "#9e9e23",
        "#58542a",
        "#828126",
        "#39332e"
      ]
    },
    {
      "id": "scribble-portrait",
      "title": "Scribble Portrait",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/scribble-portrait.webp",
      "description": "A scribbled ballpoint-pen portrait: dense overlapping pen tangles, placed by rejection sampling against a face-shaped tonal field, build near-black masses in the eye, nose and mouth shadows and thin out to bare paper across the highlights. Long horizontal streaks sweep across and shoot past the head while trailing strokes fall away below it, and a few flat vivid colour fields are painted behind the ink over the hairline and neck.",
      "texture": "/assets/lumen-logic/textures/scribble-portrait.ktx2",
      "preview": "/assets/lumen-logic/previews/scribble-portrait.webp",
      "card": "/assets/lumen-logic/cards/scribble-portrait.jpg",
      "palette": [
        "#f2cddc",
        "#e992be",
        "#a4537f",
        "#a6a8a2"
      ]
    },
    {
      "id": "scrimshaw",
      "title": "Scrimshaw",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/scrimshaw.webp",
      "description": "A monochrome engraving in which the ornament and the night sky are the same drawing. The frame holds nothing but annuli of wheels: a mandala is a small wheel seen whole, a sweeping band across the sheet is one annulus of a wheel far larger than the frame, and the vortex is a wheel with a logarithmic twist so its rings never close. Most wheel centres fall outside the frame, so every large form is cropped and the picture reads as a detail lifted out of something bigger. What any annulus is filled with is never chosen: a single coverage field says how much of the area at that place should be ink, and a register ladder turns that number into a fill — bare ground and a scatter of stars at the bottom of the ladder, then drifts of very fine low-opacity hair, then graded stipple, then bead chains, tick trains and dogtooth, then scallops, meanders, ladders and eyelets in one keyline weight, then packed scale and scrollwork, then dense radial hatch, and at the top a solid swash of ink or of ground. So a single sweeping band passes through five textures along its own length, the ornament frays into isolated repeats and then into single ticks at its margin rather than stopping at an edge, and the sky is not drawn at all — it is the annuli the field told to stay empty. Every value in the picture is a count of lines per unit area: the glow at the centre of a disc is several hundred radial hairlines crowding as they converge, the soft grey of a haze is a bundle of dozens of very faint strands, and the black of deep sky is bare ground. There is no gradient, no blur, no bloom, no shadow and no blend mode anywhere. Every curve is a polyline carrying a slow hand wobble, drawn at one of four line weights, in one of several ink tiers so the near ornament reads brighter than the far. Stars are stratified over the unclaimed ground with a power-law size draw and a soft galactic corridor of raised density, and the largest few carry a four-ray cross flare drawn, like everything else, in lines.",
      "texture": "/assets/lumen-logic/textures/scrimshaw.ktx2",
      "preview": "/assets/lumen-logic/previews/scrimshaw.webp",
      "card": "/assets/lumen-logic/cards/scrimshaw.jpg",
      "palette": [
        "#615f60",
        "#777573",
        "#282729",
        "#454545"
      ]
    },
    {
      "id": "selvage",
      "title": "Selvage",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/selvage.webp",
      "description": "A square cut apart by 45-degree seams into fields of parallel diagonal stripes, where the stripes turn ninety degrees at every seam so each join reads as a mitre. Stripe widths are irregular within a field and the base rhythm differs between fields; the colour sequence refuses neighbouring hues, punctuates with isolated black and bone, and never ramps. Seams that run along their field carry a single wide binding band in one hot colour. Flat, hard-edged, opaque — no gradients, no texture, no transparency.",
      "texture": "/assets/lumen-logic/textures/selvage.ktx2",
      "preview": "/assets/lumen-logic/previews/selvage.webp",
      "card": "/assets/lumen-logic/cards/selvage.jpg",
      "palette": [
        "#79737c",
        "#97948a"
      ]
    },
    {
      "id": "semantic-gravity",
      "title": "Semantic Gravity",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/semantic-gravity.webp",
      "description": "Simulates an AI language embedding space in 2D: three Gaussian-clustered node groups (cyan=logic, magenta=emotion, yellow=action) connected by curved Bezier lines under semantic attraction rules. Nearby same-category nodes connect densely; distant cross-category nodes connect rarely. Rendered with multiply blend mode for CMYK plotter fidelity.",
      "texture": "/assets/lumen-logic/textures/semantic-gravity.ktx2",
      "preview": "/assets/lumen-logic/previews/semantic-gravity.webp",
      "card": "/assets/lumen-logic/cards/semantic-gravity.jpg",
      "palette": [
        "#fcfffe"
      ]
    },
    {
      "id": "serpent-bloom",
      "title": "Serpent Bloom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/serpent-bloom.webp",
      "description": "A one-ink screen-print poster: a single tapering ribbon wound into a chain of alternating loops, with a solid radial rosette nested inside every loop it encloses. The spine is a chain of near-complete rings whose mouths face their neighbours, threaded onto one spline; consecutive rings deliberately overlap, so the body runs across itself and the coil crosses rather than spirals. The ribbon is opaque and is sliced at its own self-intersections into chunks that repaint in alternating parity, so it weaves over and under itself and depth is occlusion alone — no shadow, no transparency, no size cue. It swells at the blunt head, breathes through the loops and narrows to a curled point at the tail. The interior carries one of five skins — a lozenge scale net, nested chevrons, cross-body bands, studded stipple rows or raked hatching — every one drawn in the body’s own arclength-and-lateral frame, so the pattern shears round each bend and stays registered with the outline rather than reading as a flat texture the shape was cut from. Each loop eye is measured against the whole body and filled by the largest rosette that clears it: rings of solid cut-paper petals from one of five families — daisy, ray, cog, spiral eye or pinwheel — around a core of bare ground. Half-fan sprigs on short stalks weight whatever open ground the coil leaves. The panel sits inside a flat mat with a fine ruled keyline, and every edge is walked with a slight hand tremor so the sheet reads as a pulled print. The coil lays out as a serpentine, a spiral, a figure eight or a wander.",
      "texture": "/assets/lumen-logic/textures/serpent-bloom.ktx2",
      "preview": "/assets/lumen-logic/previews/serpent-bloom.webp",
      "card": "/assets/lumen-logic/cards/serpent-bloom.jpg",
      "palette": [
        "#3d3730",
        "#5c554d"
      ]
    },
    {
      "id": "setout",
      "title": "Setout",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/setout.webp",
      "description": "A finished sheet with its own setting-out left on the paper. A few large landscape plates step down the sheet in a zig-zag, alternating either side of centre and each tipped a degree or two off square, and each is flooded with one flat colour off a ladder read top to bottom — so the cascade descends through the palette as it descends the page. A plate is inked by being painted twice: a graphite copy of the same rectangle offset a little, then the colour on top, so the heavy black band lands on exactly two of the four edges and no stroke, mitre or corner join exists anywhere in it. Every other mark on the sheet is derived from the plates rather than scattered among them: a rule is the line through two of their own corners, midpoints or centres, or a line parallel to one of their edges at an exact whole number of modules; an arc is struck from one of those points with its radius measured to another, so every arc in the picture passes through a feature of the composition; a bore sits on the crossing of two rules already drawn and is cross-haired along them. Part of the field is drawn before the plates and buried under the paint and the rest across it, which is what makes the sheet read as layered drafting rather than as a print. Inside every plate, and inside the paper-flooded detail assemblies that occlude the field in the margins — the same painter, a different flood — a local grid at the sheet’s one module is packed with sub-rectangles wearing one of seven dressings: open, solid, knocked out to paper, ruled at the fine pitch, reduced to a bracket, bored with a centre dot, or cut on its diagonal. Because the module is a constant of the sheet rather than a fraction of each plate, a large plate carries more marks than a small one at identical size and every count in the picture is an output rather than a setting. Four inks, one pen weight, no gradient inside any shape, and no transparency anywhere but the paper’s own tooth.",
      "texture": "/assets/lumen-logic/textures/setout.ktx2",
      "preview": "/assets/lumen-logic/previews/setout.webp",
      "card": "/assets/lumen-logic/cards/setout.jpg",
      "palette": [
        "#b09fa1",
        "#c2cbca",
        "#ba6486",
        "#a05661"
      ]
    },
    {
      "id": "sett",
      "title": "Sett",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sett.webp",
      "description": "A thousand small ruled tiles on a square lattice that never moves. Every cell of the grid holds one tile and no cell is empty; the tile is always the same object — a square crossed by five hairlines into six bands of unequal width, each band a flat tone, with one heavier line down a leading edge and a blob at its foot. The bands are not a shading ramp and not equal sixths: a band's width follows its lightness, so a tile is one or two broad pale fields cut by several thin dark rules, which is what keeps a sheet of a thousand of them light instead of muddy. Six bands is the invariant — the tile changes size by half across the sheet and the count never moves, so the ruling pitch is a fraction of the tile rather than an absolute. Three smooth, very-low-order fields ride over the lattice and do all the work: the heading, which sweeps through ninety degrees with no defect anywhere; the size, which packs the tiles edge to edge in a broad plateau and opens paper between them at two opposite corners; and which of two colourways a tile is drawn in, a warm chromatic ladder whose saturation rises as it darkens and a neutral grey one that reads blue only by contrast. Size and colourway are coupled — big tiles run warm, small ones cool. Everything the picture appears to contain, the long sweeping courses, the swirl, the warm ridge, the pale corners, is those three fields showing through a grid that contributes nothing but registration.",
      "texture": "/assets/lumen-logic/textures/sett.ktx2",
      "preview": "/assets/lumen-logic/previews/sett.webp",
      "card": "/assets/lumen-logic/cards/sett.jpg",
      "palette": [
        "#dad3ce",
        "#bfbebe",
        "#bfa996"
      ]
    },
    {
      "id": "sfumato",
      "title": "Sfumato",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sfumato.webp",
      "description": "A soft, smoky gradient painted in the Renaissance sfumato manner — colour blended so finely that no edges remain. A cool violet crown at the top melts through a luminous pale core and down into warm gold, magenta and coral. The whole field is a per-pixel colour ramp read at a domain-warped vertical position, so the bands bend and pool like wet pastel; a strongly anisotropic noise field feathers them into fine brushed streaks along a diagonal current, a radial bloom lifts the core toward white, and a global haze washes the midtones pale for a dreamy, out-of-focus glow. Defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/sfumato.ktx2",
      "preview": "/assets/lumen-logic/previews/sfumato.webp",
      "card": "/assets/lumen-logic/cards/sfumato.jpg",
      "palette": [
        "#e9e3e1",
        "#c7bad4",
        "#da838a",
        "#fff8f7",
        "#ebc9b5"
      ]
    },
    {
      "id": "shard-towers",
      "title": "Shard Towers",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/shard-towers.webp",
      "description": "Constructivist geometric art built from sharp angular polygons. Two archetypes: clustered vertical shards (towers) that mimic skyscrapers or crystals, and zigzagging horizontal stacks (ziggurats) that fold like an accordion. Each form is rendered with a lit front face (outline only) and a solid shadow facet, creating a stark chiaroscuro 3D illusion. Floating satellite lines add a sketchy, dynamic tension around the main composition.",
      "texture": "/assets/lumen-logic/textures/shard-towers.ktx2",
      "preview": "/assets/lumen-logic/previews/shard-towers.webp",
      "card": "/assets/lumen-logic/cards/shard-towers.jpg",
      "palette": [
        "#ffffff",
        "#b8b8b8",
        "#d2d2d2"
      ]
    },
    {
      "id": "shatter",
      "title": "Shatter",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/shatter.webp",
      "description": "Fractures the canvas into irregular polygons using a jittered grid. An underlying quad mesh is distorted by per-vertex noise, then split into triangles and quads by alternating diagonals. Each edge is coloured by a horizontal gradient, producing a shattered-glass aesthetic that transitions from warm orange on the left to pale gold on the right.",
      "texture": "/assets/lumen-logic/textures/shatter.ktx2",
      "preview": "/assets/lumen-logic/previews/shatter.webp",
      "card": "/assets/lumen-logic/cards/shatter.jpg",
      "palette": [
        "#201812"
      ]
    },
    {
      "id": "shirr",
      "title": "Shirr",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 64,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/shirr.webp",
      "description": "A sheet covered edge to edge with fine coloured threads, gathered into waves that crest in step and comb out flat along one side. Nothing in the picture is drawn: every thread is a level set of one smooth scalar field, found by following it rather than by placing it. The field is calibrated so that its derivative across the stack is bounded away from zero, which makes crossing, merging, looping and ending impossible rather than merely unlikely — two threads that start in order stay in order over the whole sheet, and every one of them runs from one edge of the frame to another. The same bound turns the gradient into the composition: the distance between neighbouring level sets is exactly 2π/|∇Φ|, so it is a thread’s own width, and every dark passage in the picture is threads crowded together with their gaps showing while every bright one is threads opened out. No tone is ever computed and there is no lighting model, because there is nothing for one to light. The wave runs along the threads rather than across them, orthogonal to the stack, which is why it can swing a thread past two of its neighbours and undulate two dozen times down the sheet without the stack ever folding; two systems in golden ratio beat against each other so the crest chains never repeat, and one shared field carries them, so neighbouring threads crest together and the crests line up into long oblique chains that nothing draws. Colour works at two scales at once — one slow turn of the palette read as a wheel, laid diagonally across the sheet, and a fixed offset per thread of a fraction of a step around that wheel, so a red filament runs through a blue passage and the surface shimmers. Every length is a fraction of the frame and the only pixel-valued constant in the package is the sub-pixel ink conservation rule, so a thumbnail and a full-size export are the same picture.",
      "texture": "/assets/lumen-logic/textures/shirr.ktx2",
      "preview": "/assets/lumen-logic/previews/shirr.webp",
      "card": "/assets/lumen-logic/cards/shirr.jpg",
      "palette": [
        "#cc6331",
        "#3a7a7b",
        "#a42a5b",
        "#b0a541",
        "#71a159",
        "#6e2b7d"
      ]
    },
    {
      "id": "sigil",
      "title": "Sigil",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sigil.webp",
      "description": "A radial geometric brand mark built from n-fold rotational symmetry. Concentric rings intersect radial spokes at lattice points where diamond marks are placed. A graduated outer ring with tick marks frames the composition; a glowing core anchors the centre. Designed to read clearly at profile-image scale (110 px) while retaining fine detail at print resolution.",
      "texture": "/assets/lumen-logic/textures/sigil.ktx2",
      "preview": "/assets/lumen-logic/previews/sigil.webp",
      "card": "/assets/lumen-logic/cards/sigil.jpg",
      "palette": [
        "#111111"
      ]
    },
    {
      "id": "silk",
      "title": "Silk",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/silk.webp",
      "description": "Thousands of fine filaments swept across the canvas in a single diagonal current. Sampled at a far lower frequency across the flow than along it, neighbouring strands bend together into long parallel waves — folding ribbons of brushed silk or wind-combed hair. Most threads are cool silvery greys; a clustered noise field lifts occasional bands into saturated teal, green and blue glints on deep black.",
      "texture": "/assets/lumen-logic/textures/silk.ktx2",
      "preview": "/assets/lumen-logic/previews/silk.webp",
      "card": "/assets/lumen-logic/cards/silk.jpg",
      "palette": [
        "#4a5353"
      ]
    },
    {
      "id": "sinter",
      "title": "Sinter",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sinter.webp",
      "description": "Discs on a lattice, fused the way powder fuses below its melting point — where two touch, the silhouette is not left to cross in an X but is pulled into a concave neck, a circular fillet tangent to both, so a short chain of tangent discs becomes one closed body whose whole outline is nothing but circle arcs and fillet arcs. The lattice is consumed by seeded self-avoiding chains that grow one to six beads long and are forbidden from ever coming back alongside themselves, so every body is a simple loop and the fusion is always local: soft concave necks inside a body, hard circular edges between bodies, which is the whole tension of the picture. Each body is filled by a single linear ramp along its own axis, but the ramp is a window slid along the palette's full light-to-dark range rather than the range itself, and both the window position and which end of the body gets the bright end are read from one slow value-noise field sampled at the body’s ends — so tone drifts across the canvas in broad regions, bright bands giving way to near-black ones, without any body having been told which region it belongs to. Bodies are laid down in scrambled order, each dropping a soft offset shadow onto everything already painted, so a late dark body can shade an early bright one and the field reads as a shallow pile rather than a flat pattern; behind all of it one wide off-centre bloom lifts the ground out of black in the gaps. Beads may swell from one to the next, and the lattice may be square, where chains bend through right angles, or triangular, where they run straight or zigzag through 120° — the fillet is the same construction either way. Every mark is a fill: no stroke, no texture, no blur, no text anywhere.",
      "texture": "/assets/lumen-logic/textures/sinter.ktx2",
      "preview": "/assets/lumen-logic/previews/sinter.webp",
      "card": "/assets/lumen-logic/cards/sinter.jpg",
      "palette": [
        "#707070",
        "#4d4d4d",
        "#373737"
      ]
    },
    {
      "id": "slab-cipher",
      "title": "Slab Cipher",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/slab-cipher.webp",
      "description": "A block of ultra-bold asemic display type set solid. The frame is cut into rows of unequal height and each row into glyph-width cells on a single visible module; every cell is inked as a hard slab with a share of its corners turned to full quarter-rounds, and because the bodies are all painted before anything is cut away, neighbouring glyphs fuse into one unbroken mass of ink. A second pass punches the ground colour back through it: interior counters — squares, discs, slots, pill bars, triangles, stepped notches and pointed leaf-lenses — and edge bites that eat into the silhouette and turn slabs into hooks, wedges and diamonds. Each glyph draws its counters from one of eleven archetypes defined in a unit square and mapped through one of the eight symmetries of that square, so the same few shapes recur at every orientation and the block reads as a typeface rather than as noise. Every size is a whole number of modules, a seeded share of the seams between glyphs and between rows stays open as a one-module channel, and a fine print grain dusts both flats. Two colours, no outlines, no gradients.",
      "texture": "/assets/lumen-logic/textures/slab-cipher.ktx2",
      "preview": "/assets/lumen-logic/previews/slab-cipher.webp",
      "card": "/assets/lumen-logic/cards/slab-cipher.jpg",
      "palette": [
        "#5f2d15"
      ]
    },
    {
      "id": "sley",
      "title": "Sley",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sley.webp",
      "description": "A cloth filling the frame edge to edge, sixty-odd vertical threads crossed by sixty-odd horizontal ones, with a small bright hole of bare paper wherever two of them miss. Nothing in it is in front of anything else: a crossing is not the colour of whichever thread won but the per-channel product of what both of them let through, so it is always darker than either thread and than the paper, and no thread is ever occluded, shadowed or outlined. The picture is therefore the outer product of two one-dimensional sequences and nothing more — it is rank-1 in optical density, so the discrete mixed second difference across any four crossings is exactly zero, and every two-dimensional thing the cloth appears to have is that identity at work rather than a field anyone painted. The consequence is that most of the hues in the finished picture are absent from its own palette: the broad red passages are orange crossing orange, the near-blacks are a warm thread crossing a cold one, and the palest are two washed bands meeting. Each sequence — a sett — is a run-length walk that steps one place at a time along the palette read as an ordered ramp and reflects at either end, so colour arrives in bands of several threads and the cloth reads as a tonal excursion out and back rather than a cycle or a wander; bands are punctuated by washes diluted toward the paper and by slubs of up to two and a half times the common width, and a few guard rules in an ink that belongs to no band cross the whole sheet at a coarse even spacing. The sett is reflected about the centre of the cloth, and the weft may repeat the warp, so the picture can be symmetric in one axis, both, or across its own diagonal. The gap between threads is one absolute width taken from the mean pitch rather than a share of each thread, which is why every hole is the same size while the bars are not. One shared smooth map sags the whole cloth by about a thread's width, coherently, so neighbours bend together and the weave is slightly out of true without any thread wobbling on its own. The multiply is arithmetic rather than a canvas blend mode, so the ink is computed against the background’s primary colour and a thread has one colour along its whole length whatever is drawn behind the holes; every fill is opaque, every length is a fraction of the frame, and a thumbnail and a full-size export are the same cloth.",
      "texture": "/assets/lumen-logic/textures/sley.ktx2",
      "preview": "/assets/lumen-logic/previews/sley.webp",
      "card": "/assets/lumen-logic/cards/sley.jpg",
      "palette": [
        "#9e4b50"
      ]
    },
    {
      "id": "slipstream",
      "title": "Slipstream",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/slipstream.webp",
      "description": "An abstract graffiti mural of swept volumetric ribbons on a sprayed navy wall, painted twice — once as itself and once as its own slipstream. Every form is one primitive: a spine polyline swept at a width profile with a roll angle, sampled as a parametric surface so a single piece of geometry gives the silhouette, the smooth transverse light ramp across the band and the darker underside that appears wherever the roll carries the surface past the horizon — a blade tapering to a point, a wide band curled past a full turn so it passes over itself, narrow shards, hard-edged backdrop slabs and long spars, all lit by one fixed upper-left light and laid out along one flow angle by a seeded layout family. Because every form is built as data before anything is painted, the whole composition exists as an analytic scene that can be asked for its colour at any point without being rasterised, and the picture's second half is a drag over that scene: a raking band of ruled rows, each walked left to right emitting round-capped capsule dashes whose colour is the scene sampled once at the dash's head and then carried, lifted toward the palette's brightest and slightly hue-jogged, along the dash's entire run. A dash therefore keeps the colour of the place it began even after it has left it, so warm streaks pour out of a rust plane and run on across the navy ground and across the blue coil, and the streak field reads as the sculpture smeared sideways rather than as confetti scattered over it. Runs end where they have crossed a set number of form boundaries, so busy passages come out as short ticks and open ones as long sweeps; row phases are correlated by a slow noise so runs in neighbouring rows agree and gather into vertical-edged slabs; row pitch converges toward the band centre so the field reads as the scan lines of a plane in shallow perspective; and a share of dashes take the ground colour instead and cut the slabs into strips. Under all of it the wall is airbrushed rather than flat — slow clouds, tone-on-tone ghost shapes that never come forward, and an overspray speckle that tightens into a halo along every silhouette — and over all of it hang thin tapering paint runs that bead at the tip. Depth is the ramps, occlusion and the rake alone: no cast shadow, no perspective projection, no blur and no type anywhere.",
      "texture": "/assets/lumen-logic/textures/slipstream.ktx2",
      "preview": "/assets/lumen-logic/previews/slipstream.webp",
      "card": "/assets/lumen-logic/cards/slipstream.jpg",
      "palette": [
        "#342634",
        "#171324",
        "#8a565a"
      ]
    },
    {
      "id": "solar-dancer",
      "title": "Solar Dancer",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/solar-dancer.webp",
      "description": "A symbolic mixed-media scene: a dark plum figure seen from behind, arms flung up in a wide V, erupting from rooted earth into a radiating impasto sunburst. A golden halo crowns the tilted head while chunky ray-wedges — orange, gold, cream, vermilion and teal — fan across the upper canvas. Down the right a cascade of S-curved ribbon bands (magenta, pink, gold, olive, turquoise) sweeps past a teal patch stencilled with gold clockwork gears. The lower third is a patchwork of dark green, navy and olive fields scored with sgraffito cross-hatch and split by gold seams, from which recursive gilded root systems spread downward. Gold-leaf foil flakes are scattered throughout, and the whole panel sits inside a rough painted border on raw cream canvas.",
      "texture": "/assets/lumen-logic/textures/solar-dancer.ktx2",
      "preview": "/assets/lumen-logic/previews/solar-dancer.webp",
      "card": "/assets/lumen-logic/cards/solar-dancer.jpg",
      "palette": [
        "#dbae90",
        "#ac8e68",
        "#797566",
        "#b09e99",
        "#799b84",
        "#537e74"
      ]
    },
    {
      "id": "solar-groove",
      "title": "Solar Groove",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/solar-groove.webp",
      "description": "A record-groove vortex around an off-center sun: dozens of thin concentric rings, each cut open by two tangent horizontal tails — one entering from the left edge below the midline, its mirror exiting right above it — so the whole field reads as one giant smooth S. Strokes are colored by radius through a hot sunset ramp, yellow core through orange, scarlet and crimson to deep purple at the rim, hand-wobbled ever so slightly on a near-black ground, with dark wedges and edge crossings emerging from the geometry.",
      "texture": "/assets/lumen-logic/textures/solar-groove.ktx2",
      "preview": "/assets/lumen-logic/previews/solar-groove.webp",
      "card": "/assets/lumen-logic/cards/solar-groove.jpg",
      "palette": [
        "#7d301a",
        "#471831",
        "#886425"
      ]
    },
    {
      "id": "soutache",
      "title": "Soutache",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/soutache.webp",
      "description": "A dark portrait panel laid with a dozen and a half flat braids, each one a bundle of nine to twenty parallel lines at a single spacing shared by the whole sheet. There is one primitive: a centreline, offset a whole number of times at that spacing, so a straight run, a rounded corner, a square mitre and a rolled end are four pieces of one curve rather than four kinds of mark. A braid’s width is a whole number of spacings, which is what lets an end roll: the centreline continues as a spiral whose radial pitch is exactly the braid’s own width, so one wrap’s innermost line lands on the next wrap’s outermost and the scroll fills at the same spacing as the straight that fed it, at any radius. Where a braid is cut instead of rolled its lines stop one spacing short of each other and the end reads as a forty-five-degree staircase; where it turns square rather than rounding, its corners step out along the bisector by that same one spacing. The braids are grown one at a time by a self-avoiding walk against an occupancy grid, and every hairline of ground between two of them is a consequence of that order rather than anything drawn — as is every dead end, and every bare bay. Each braid is painted three times over the same path: once in the ground colour a hair wider than itself, once in a deep tone at its own spacing so consecutive bands overlap and the braid fills solid, then its crest lines on top in a light one. That single casing stroke is both the hairline channel between neighbours and the break where one braid passes over another, so the two measure the same by construction, and nothing anywhere is clipped, masked, blended or made transparent. Colour is one scalar: the geometry is grown first, so the total length is known, and hue advances monotonically with cumulative arclength to close the wheel exactly once over the sheet — a long braid graduates visibly along itself and its neighbours in the sequence continue its colour, so the panel reads as one rainbow rather than a set of coloured objects. The hand is two terms, and the one that is shared by every line of a braid cannot change a gap at all.",
      "texture": "/assets/lumen-logic/textures/soutache.ktx2",
      "preview": "/assets/lumen-logic/previews/soutache.webp",
      "card": "/assets/lumen-logic/cards/soutache.jpg",
      "palette": [
        "#4d3646",
        "#784866",
        "#3f5d65"
      ]
    },
    {
      "id": "spark-stack",
      "title": "Spark Stack",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/spark-stack.webp",
      "description": "A brand-poster stack of large flat colour planes, every one snapped to a single coarse module lattice: rectangular blocks, quarter-discs, half-discs and circles whose box corners land on lattice nodes, whose radii are whole numbers of modules and whose arc centres are lattice nodes — so edges from unrelated planes line up exactly and the whole mass reads as cut from one sheet. Planes are chain-grown outward from a first one, each landing flush against a neighbour and then biting into it, so the composition is one connected interlocking mass rather than a scatter, and a few deliberately run off the canvas so the sheet reads as a crop out of something larger. Everything is opaque and painted strictly back to front: a plane hides what it covers, there is no outline, no shadow and no transparency anywhere, and depth is occlusion alone. Most planes take one flat saturated hue; a seeded share instead carry a multi-stop gradient ramp drawn from a contiguous run of the palette, every one of them along the same shared angle so separated shapes read as the same material, and a small share take the ink as a near-black counterweight. Whatever lattice cells the mass leaves empty are measured and dressed with fine black line glyphs at a uniform hairline weight — four-point sparkles, ray bursts, curl-headed arrows, dotted rules, dot matrices, thin rings, lattice arcs and crosses — placed only into open ground so a mark never touches a plane. The mass lays out as a column, a diagonal drift, a corner weight or a loose scatter.",
      "texture": "/assets/lumen-logic/textures/spark-stack.ktx2",
      "preview": "/assets/lumen-logic/previews/spark-stack.webp",
      "card": "/assets/lumen-logic/cards/spark-stack.jpg",
      "palette": [
        "#f3d4be",
        "#eeebe8",
        "#e5ce92",
        "#b6a49e",
        "#c6745b",
        "#6ca298"
      ]
    },
    {
      "id": "spectral-torus",
      "title": "Spectral Torus",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/spectral-torus.webp",
      "description": "A glowing twisted torus woven from nested rainbow loops, in the style of long-exposure light-painting photography. Loops are drawn from the outside in: the outer loop is a full circle, and as the index advances toward the centre each loop is shrunk, squished into a thinner ellipse, rotated by an accumulating twist and drifted off-centre — so the inner loops collapse toward a thin, tilted, off-centre ellipse and leave a leaf-shaped void at the core while the rotation sweeps everything into a single smooth vortex. The palette is cycled several times across the stack and every loop is blended additively, so the spectrum reads as separate thin lines where the loops are sparse and burns to white where they bunch.",
      "texture": "/assets/lumen-logic/textures/spectral-torus.ktx2",
      "preview": "/assets/lumen-logic/previews/spectral-torus.webp",
      "card": "/assets/lumen-logic/cards/spectral-torus.jpg",
      "palette": [
        "#433835",
        "#0e0c0b",
        "#2c2321"
      ]
    },
    {
      "id": "spectrum-totem",
      "title": "Spectrum Totem",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/spectrum-totem.webp",
      "description": "A visionary cosmology chart in thin wobbled cream ink on near-black: a glyph border of braille dot-matrices, colored triangles, swatch grids, silhouettes and an eye frames a giant halo of stepped grey annuli whose corners wash into muted rainbow quadrants, rimmed inside and out by thin full-spectrum rings. Hair-thin ray bursts and a dotted axis cross the central void, and a full-height totem column of dark panels — a triangle crest with a dot color-wheel, a rainbow pie wheel, a radiant chalice at dead centre, waveform rows, and a radiant standing figure over descending rainbow bars — is pinned on top, its panels seamed with rainbow stripe bands.",
      "texture": "/assets/lumen-logic/textures/spectrum-totem.ktx2",
      "preview": "/assets/lumen-logic/previews/spectrum-totem.webp",
      "card": "/assets/lumen-logic/cards/spectrum-totem.jpg",
      "palette": [
        "#484944",
        "#2d322c"
      ]
    },
    {
      "id": "spindrift",
      "title": "Spindrift",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/spindrift.webp",
      "description": "A black sheet combed edge to edge with hairline tapered needles falling in dense columns, where the picture is drawn by where the marks stop rather than by the marks themselves. Every column is walked against one anisotropic interference field: ink is emitted wherever the field stands above a threshold, so a column becomes a train of needles broken by black gaps, and each run of ink terminates on the field's own level set. Because neighbouring columns share the field, their tips land on the same locus and the eye reads a crisp curved edge that was never drawn — sweeping chevrons, shallow arches and scalloped bands, with dark pockets where the runs went short and stopped being emitted. Marks are one constant hairline width, so value is carried by length and presence alone; the mark family is a knob — needle, blunt wedge, double-tapered spindle, flat bar, or a needle beaded at the head — and a slow fan leans the whole field a few degrees off vertical the way a comb drags. No outline, no gradient, no transparency, no tone anywhere.",
      "texture": "/assets/lumen-logic/textures/spindrift.ktx2",
      "preview": "/assets/lumen-logic/previews/spindrift.webp",
      "card": "/assets/lumen-logic/cards/spindrift.jpg",
      "palette": [
        "#212324"
      ]
    },
    {
      "id": "spiral-waves",
      "title": "Spiral Waves",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/spiral-waves.webp",
      "description": "A cyclic cellular automaton — the discrete model of an excitable medium. Each cell holds one of S cyclic states and advances to s+1 (mod S) when enough of its eight neighbours already carry s+1. From seeded noise the field self-organises: droplets, colliding wavefronts, then rotating multi-armed spirals that devour everything else. States sweep the palette cyclically, so the rotors read as rainbow storms — order conjured by a one-line local rule.",
      "texture": "/assets/lumen-logic/textures/spiral-waves.ktx2",
      "preview": "/assets/lumen-logic/previews/spiral-waves.webp",
      "card": "/assets/lumen-logic/cards/spiral-waves.jpg",
      "palette": [
        "#8d8871"
      ]
    },
    {
      "id": "spirograph",
      "title": "Spirograph",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/spirograph.webp",
      "description": "A hypotrochoid: a small circle of radius r rolls inside a larger circle of radius R, and a pen at distance d traces the curve. The ratio r/R = P/Q determines how many petals or loops the closed curve has. Multiple overlapping layers with slightly varied pen distances build up a dense, jewel-like web.",
      "texture": "/assets/lumen-logic/textures/spirograph.ktx2",
      "preview": "/assets/lumen-logic/previews/spirograph.webp",
      "card": "/assets/lumen-logic/cards/spirograph.jpg",
      "palette": [
        "#06050a"
      ]
    },
    {
      "id": "splinter",
      "title": "Splinter",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/splinter.webp",
      "description": "Impact fracture. The canvas begins as one rectangle and is recursively split into convex cells, biased toward a focal impact point so cracks grow dense near the impact and large cells stay whole far away. Radial cuts aim through the focal point for a starburst of splinters, while axis-aligned cuts build rectilinear cells at the edges. Each crack is a single thin coloured line on a dark ground.",
      "texture": "/assets/lumen-logic/textures/splinter.ktx2",
      "preview": "/assets/lumen-logic/previews/splinter.webp",
      "card": "/assets/lumen-logic/cards/splinter.jpg",
      "palette": [
        "#050505"
      ]
    },
    {
      "id": "squall-glass",
      "title": "Squall Glass",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/squall-glass.webp",
      "description": "A cold blue gestural squall standing in a column on a dusty blush ground, built by simulating one tool rather than by drawing marks. The primitive is a wide flat blade whose width is divided into cells, each carrying its own pigment, its own remaining load and its own bristle height; dragging it along a path steps that array across a wet pigment buffer, and each cell both deposits a fraction of its load and mixes the colour underneath it back into its own charge. Because the charge is fixed across the blade, a sweep keeps the same striation order from head to tail; because it depletes, every sweep starts opaque and ends in broken dry grooves; and because the blade picks up, the tail of a stroke is coloured by whatever it was dragged across. The same tool set flat and pushed a short distance takes paint away instead — the swept pose of a straight edge is a straight-edged convex plane, its interior smeared along the push, its far edge beaded with the pigment that rolled up in front of it, so the translucent facets are scraped rather than drawn and vanish where there was no paint to remove. Flicked, the same blade atomises: a wide cone of thousands of faint droplets is a soft cream bloom, a narrow cone of a few heavy ones is spatter. Vertical drags lay the blush and slate ground first, dark cobalt masses go down next, arcs sweep over them, planes are scraped back into them, and the blooms and spatter finish. Nothing is outlined, nothing is filled, and no colour is sampled from the palette twice — after the first stroke, the paint is whatever the blade has been through.",
      "texture": "/assets/lumen-logic/textures/squall-glass.ktx2",
      "preview": "/assets/lumen-logic/previews/squall-glass.webp",
      "card": "/assets/lumen-logic/cards/squall-glass.jpg",
      "palette": [
        "#a09cac"
      ]
    },
    {
      "id": "squinch",
      "title": "Squinch",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/squinch.webp",
      "description": "A relief of one paper, seen square on, in which every tone is an angle. There is a single hue and a single light, and the whole range of the picture — the pale faces, the amber ones, the near-black soffits — is one sheet turned five ways, so nothing in it is coloured and everything in it is lit. The unit is a square cell and every event happens at a corner of one: a corner folded up into a tent or down into a pit, swept round into a quarter-arc of radius exactly one cell, run past by a straight band of the same width, lifted into a flap with a soffit hanging under it, or sunk into a scoop cut through to the wall. Seven motifs, four rotations, and no free placement anywhere. The large forms are not large tiles but agreements between neighbours: a hipped pyramid is four cells that have settled on one lattice corner, and a ribbon is a run of cells that have matched ports edge to edge, so what reads as a composed object is emergent from a grid. One chamfer law does most of the drawing — every step in height, straight or curved, takes the same bevel, and because a bevel is toned by its own normal the same rule lays the bright band along every up-light edge and the dark one along every edge facing away, including the crescents on the arcs. Shadow is a mark rather than an effect: a flap darkens its own soffit, a band darkens the sheet beside it, and the panel darkens the wall behind it, all from the one light vector that shades the faces. Because a shadow can only fall on something lower than its caster, sorting the facets by height is the entire depth solution — there is no camera, no perspective and no z-buffer.",
      "texture": "/assets/lumen-logic/textures/squinch.ktx2",
      "preview": "/assets/lumen-logic/previews/squinch.webp",
      "card": "/assets/lumen-logic/cards/squinch.jpg",
      "palette": [
        "#d9bf96",
        "#d6cec0",
        "#dd9e34",
        "#c4a16b"
      ]
    },
    {
      "id": "standard-map",
      "title": "Standard Map",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/standard-map.webp",
      "description": "The Chirikov standard map p′ = p + K·sin θ, θ′ = θ + p′ — the canonical model of Hamiltonian chaos. Being area-preserving, every initial condition traces its own eternal orbit: plotted together as pointillist dots they reveal the KAM portrait — smooth invariant curves, chains of island resonances strung like pearls, and a speckled chaotic sea. Each orbit carries one palette colour by its initial momentum; the kick strength K dials order into chaos.",
      "texture": "/assets/lumen-logic/textures/standard-map.ktx2",
      "preview": "/assets/lumen-logic/previews/standard-map.webp",
      "card": "/assets/lumen-logic/cards/standard-map.jpg",
      "palette": [
        "#12131c"
      ]
    },
    {
      "id": "standing-waves",
      "title": "Standing Waves",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/standing-waves.webp",
      "description": "Superimposes N plane waves equally spaced in angle. Each pixel evaluates the sum cos(2π(x·cosθ+y·sinθ)/λ) across all wave directions, producing crystallographic interference patterns with adjustable banding and colour.",
      "texture": "/assets/lumen-logic/textures/standing-waves.ktx2",
      "preview": "/assets/lumen-logic/previews/standing-waves.webp",
      "card": "/assets/lumen-logic/cards/standing-waves.jpg",
      "palette": [
        "#0e436c",
        "#1d6fa8"
      ]
    },
    {
      "id": "starburst",
      "title": "Starburst",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/starburst.webp",
      "description": "Concentric nested spiky starbursts drawn with multiply blending — each inner ring overlaps the outer with a slight rotation, creating vibrant faceted intersections reminiscent of pop-art explosion bubbles. Noisy polar geometry gives each spike organic irregularity.",
      "texture": "/assets/lumen-logic/textures/starburst.ktx2",
      "preview": "/assets/lumen-logic/previews/starburst.webp",
      "card": "/assets/lumen-logic/cards/starburst.jpg",
      "palette": [
        "#f7c4c7",
        "#ef9abb",
        "#e52f70",
        "#d32a95"
      ]
    },
    {
      "id": "sticker-bomb",
      "title": "Sticker Bomb",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/sticker-bomb.webp",
      "description": "A dense, maximalist sticker-bomb collage in the acid-pop / Memphis tradition: layered, overlapping motifs — concentric rings, banded spheres, hearts, checkerboards, polka dots, diagonal stripes, sparkles, eyes, pie wheels, flowers, crosses and isometric blocks — each drawn flat with thick black outlines and saturated colours, packed edge to edge over a near-black ground. Larger stickers are laid first and smaller ones layered on top to fill the gaps.",
      "texture": "/assets/lumen-logic/textures/sticker-bomb.ktx2",
      "preview": "/assets/lumen-logic/previews/sticker-bomb.webp",
      "card": "/assets/lumen-logic/cards/sticker-bomb.jpg",
      "palette": [
        "#928675",
        "#90635e",
        "#c17e6d"
      ]
    },
    {
      "id": "stipple-terrain",
      "title": "Stipple Terrain",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/stipple-terrain.webp",
      "description": "Layered mountain silhouettes rendered entirely in scattered dots, evoking serigraphy and risograph printing. fBm noise drives ridge profiles; dot density tapers near each ridge, creating atmospheric depth through stippled shadow.",
      "texture": "/assets/lumen-logic/textures/stipple-terrain.ktx2",
      "preview": "/assets/lumen-logic/previews/stipple-terrain.webp",
      "card": "/assets/lumen-logic/cards/stipple-terrain.jpg",
      "palette": [
        "#93acc6",
        "#d8e4f0",
        "#b6cadc"
      ]
    },
    {
      "id": "stitch-grain",
      "title": "Stitch Grain",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/stitch-grain.webp",
      "description": "A panel worked entirely in one mark: a short round-capped stitch, laid in even rows on a brick-bonded lattice, edge to edge across a warm near-black board. Isometric solids stand in the field — plain blocks, cubes with an ambiguous corner notched out, stepped stacks and square rings — and not one of them is outlined. Each is legible only because the grain turns: the ground runs its stitches at one constant angle, every face runs its own lattice sheared to its own edges, and dashes are trimmed hard where one region meets another, so geometry is drawn by a discontinuity in direction and by nothing else. Faces that catch the light group their rows into bands of a single ink, nested concentrically inward from the face edges or anchored as L-shaped chevrons at one corner, mitred along the diagonals so a face reads as a target or a tunnel going into the solid; the band inks step through the light end of the palette, and a speckle probability scatters neighbouring inks through every band so the surface reads as thread rather than as printed colour. The rest stay grain-only, drawn in the same dark inks as the ground and visible as pure orientation, a large cube that appears and disappears as you look at it. Ground ink is drawn per dash from the dark family with a slow spatial bias, so the field blotches warm and cool without a hard edge anywhere. Depth is occlusion alone; every mark is a stroked dash — no fills, no outlines, no gradients, no transparency, no shadows and no text.",
      "texture": "/assets/lumen-logic/textures/stitch-grain.ktx2",
      "preview": "/assets/lumen-logic/previews/stitch-grain.webp",
      "card": "/assets/lumen-logic/cards/stitch-grain.jpg",
      "palette": [
        "#39231f"
      ]
    },
    {
      "id": "strange-flow",
      "title": "Strange Flow",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/strange-flow.webp",
      "description": "Chaotic ODE attractors — Lorenz, Rössler, Halvorsen, Aizawa or Thomas — integrated with Runge-Kutta and projected orthographically from 3D. A bundle of trajectories launched from nearly identical initial conditions rides the attractor, splitting into parallel filaments as chaos amplifies their separation. Additive blending burns dense lobe cores toward white while depth-shaded alpha lets far strands recede — deterministic chaos as a long-exposure light painting.",
      "texture": "/assets/lumen-logic/textures/strange-flow.ktx2",
      "preview": "/assets/lumen-logic/previews/strange-flow.webp",
      "card": "/assets/lumen-logic/cards/strange-flow.jpg",
      "palette": [
        "#030308",
        "#191521",
        "#7c6282",
        "#383249"
      ]
    },
    {
      "id": "strata",
      "title": "Strata",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/strata.webp",
      "description": "Minimalist sedimentary rock layers — stacked horizontal bands with noise-driven undulating edges in warm earth tones, from sandstone through terracotta to slate.",
      "texture": "/assets/lumen-logic/textures/strata.ktx2",
      "preview": "/assets/lumen-logic/previews/strata.webp",
      "card": "/assets/lumen-logic/cards/strata.jpg",
      "palette": [
        "#846650",
        "#cea47e",
        "#af7148"
      ]
    },
    {
      "id": "street-stencil",
      "title": "Street Stencil",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/street-stencil.webp",
      "description": "An urban spray-stencil composition after the street-art motif: a single flat near-black silhouette figure stands on a bare plaster wall and reaches toward one saturated red accent element — a heart balloon, a bird, a kite or a paper plane — that drifts away up into the empty upper corner on a thin wavering line. Stencil overspray softens every edge, paint runs drip from the silhouette, and faint scuffs and stains age the wall, while the vast negative space holds the eye between figure and vanishing accent.",
      "texture": "/assets/lumen-logic/textures/street-stencil.ktx2",
      "preview": "/assets/lumen-logic/previews/street-stencil.webp",
      "card": "/assets/lumen-logic/cards/street-stencil.jpg",
      "palette": [
        "#f0ece6",
        "#eac1bf",
        "#aeaca8"
      ]
    },
    {
      "id": "string-mandala",
      "title": "String Mandala",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/string-mandala.webp",
      "description": "Circular string art — a nail-and-thread mandala. The frame is sliced into nested concentric annuli; each band carries a ring of evenly spaced pins whose straight threads connect pin i to pin i+k. Because the chords envelope a smaller concentric circle, every band fills a clean colour ring that nests against the next one inward, and stacking bands of cycling hue — hot pink, magenta, golden yellow and orange — reproduces the layered woven look. Multiple weave passes thicken each annulus, an accumulating twist offsets the rings, a hand-jitter control scatters the nails for a handmade feel, and a soft white dome glows at the centre.",
      "texture": "/assets/lumen-logic/textures/string-mandala.ktx2",
      "preview": "/assets/lumen-logic/previews/string-mandala.webp",
      "card": "/assets/lumen-logic/cards/string-mandala.jpg",
      "palette": [
        "#f7b3be",
        "#f4d5e0"
      ]
    },
    {
      "id": "stripe-drops",
      "title": "Stripe Drops",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/stripe-drops.webp",
      "description": "Colorful stripes of varying widths extend from one edge of the canvas, each ending in a circular drop of the same color made lighter. Stripes can overlap freely; drops are always non-overlapping. Direction, count, thickness range, and circle size are all configurable.",
      "texture": "/assets/lumen-logic/textures/stripe-drops.ktx2",
      "preview": "/assets/lumen-logic/previews/stripe-drops.webp",
      "card": "/assets/lumen-logic/cards/stripe-drops.jpg",
      "palette": [
        "#49403c",
        "#193b30",
        "#5e868a",
        "#111111"
      ]
    },
    {
      "id": "stripe-quilt",
      "title": "Stripe Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/stripe-quilt.webp",
      "description": "A patchwork of rectangular panels filled with thin vertical barcode stripes at a shared global pitch. Each panel picks its own stripe colour, gap tone, and an optional left-to-right gradient; some panels are solid or have ragged stepped stripe heights. A few pale diagonal ribbons sweep across on top. Hot-pink, red, coral and cream on near-black.",
      "texture": "/assets/lumen-logic/textures/stripe-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/stripe-quilt.webp",
      "card": "/assets/lumen-logic/cards/stripe-quilt.jpg",
      "palette": [
        "#805a68",
        "#432b31",
        "#8f747e",
        "#d6b0ac",
        "#7b2247",
        "#b12560"
      ]
    },
    {
      "id": "substrate",
      "title": "Substrate",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/substrate.webp",
      "description": "Crack propagation inspired by Jared Tarbell. Cracks grow from random seed points, turning perpendicular at collisions. Enclosed regions are flood-filled with palette colours, creating patterns like cracked earth or stained-glass leading lines.",
      "texture": "/assets/lumen-logic/textures/substrate.ktx2",
      "preview": "/assets/lumen-logic/previews/substrate.webp",
      "card": "/assets/lumen-logic/cards/substrate.jpg",
      "palette": [
        "#82796a"
      ]
    },
    {
      "id": "subtle-body",
      "title": "Subtle Body",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/subtle-body.webp",
      "description": "An esoteric anatomical plate on midnight ground: a bilaterally symmetric standing figure with no outline anywhere — its silhouette is implied by hundreds of hairline filaments fanning from a neck node out over the shoulders to skeletal hands and down the legs into a splay of root fibres. The body itself is a matrix of flat beads whose radii are modulated by a smooth field and whose colour steps in tiers with size, from vermilion through amber and ivory to a dim steel; a rosette of concentric bead rings around a vermilion disc sits at the chest, cradled by a cobalt horseshoe, and a beaded axis of stations runs the full height. Where a head would be, a filigree specimen crown — a barbed myriapod, a fern frond, fanned wings or a dotted corona. Around it the plate is dressed in gold hairline: a border, full-width register rules with tick marks and a scatter of small technical margin figures (sunbursts, constellations, spiral fields, star polygons, moiré lenses, perspective grids, triangular lattices). Flat discs and hairlines only — no gradients, no outlines, exact mirror symmetry at zero jitter.",
      "texture": "/assets/lumen-logic/textures/subtle-body.ktx2",
      "preview": "/assets/lumen-logic/previews/subtle-body.webp",
      "card": "/assets/lumen-logic/cards/subtle-body.jpg",
      "palette": [
        "#14213d",
        "#4c4655"
      ]
    },
    {
      "id": "superformula",
      "title": "Superformula",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/superformula.webp",
      "description": "Gielis' superformula generalises circles, stars, shells and flowers from a single polar equation. Nested outlines with drifting exponents and rotation scale toward the centre like layered petals or the whorls of a seashell.",
      "texture": "/assets/lumen-logic/textures/superformula.ktx2",
      "preview": "/assets/lumen-logic/previews/superformula.webp",
      "card": "/assets/lumen-logic/cards/superformula.jpg",
      "palette": [
        "#fbf2e7",
        "#ea917a"
      ]
    },
    {
      "id": "swarf",
      "title": "Swarf",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/swarf.webp",
      "description": "A heaped nest of metal shavings. Every mark is the same primitive — an open path stroked twice, once wide in hard ink and once narrower in a flat light tone — so each ribbon carries a crisp outline down both edges and is fully opaque, hiding whatever it crosses; depth comes from occlusion alone. The ribbons are walked as polylines through a flow field with an off-centre focus, wrapping it tangentially close in and combing radially further out, with abrupt mitred corners and 140-degree hairpins folding them back on themselves, so the pile reads as curled lathe swarf rather than as drawn line. Long smooth sweeps ride over the top and one- and two-segment stubs fill the floor. Beneath it all lies a posterised grisaille under-painting of large hard-edged flat regions — a ringed iris with a warm lens, warped strata, a field of alternating teeth or a shattered plane of shards — which shows through every gap and, because each ribbon takes its tone from the region it starts on, keeps the under-image legible through seventy percent cover. Grisaille throughout with a single warm accent; flat opaque fills and hard outlines only, no gradients and no transparency anywhere.",
      "texture": "/assets/lumen-logic/textures/swarf.ktx2",
      "preview": "/assets/lumen-logic/previews/swarf.webp",
      "card": "/assets/lumen-logic/cards/swarf.jpg",
      "palette": [
        "#86827e",
        "#514f4d"
      ]
    },
    {
      "id": "swash-swarm",
      "title": "Swash Swarm",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/swash-swarm.webp",
      "description": "An exploded piece of calligraphy floating on bare paper. A lens-shaped envelope is laid over an undulating baseline, and a handful of primary strands are walked through it by curvature momentum — a share of them dropping into a loop phase that curls the strand back through itself — then swept into flat polygons by a width profile that swells at the belly and runs to a true needle point at the ends, so every large mark reads as a brush swash rather than a band. A recursive attachment pass hangs satellites off sampled sites along those spines, each one inheriting the local tangent so it reads as growing out of its host: solid discs and rotated ellipses, bowed cones tapering to a spike, bead trains of shrinking dots running off a terminal, pointed lenses, squared-off comb bars, tiny chips, hairline whips that peel away and curl into the margin, and thin echo lines shadowing a big curve at an offset. The largest forms carry counters painted back in the ground colour — ring holes, crescent bites, chip punches — so a disc becomes a donut and a heavy form becomes a shell. Colour is drawn from a slow spatial zone field so each ink clusters in one region without any zone becoming pure, with children usually inheriting their host, and a share of marks taking the structural ink instead. Everything is opaque and painted largest-first with a weave jitter, so depth is occlusion alone and the stack interleaves rather than sorting cleanly. The swarm lays out as a horizontal lens, a radial bloom, a vertical column or a one-sided comet, and whatever bare ground is left just outside it is dusted with tiny chips, ticks and beads. Fill adds primary strands on top of the strand count — more of the biggest shapes, not just more dust — while also raising the ceiling on satellites and micro-marks and spreading strand start points across the whole envelope rather than clustering them at its centre, so the same swarm can read as a spare gesture or, at full fill, as an edge-to-edge field. Flat fills only — no outlines, no gradients, no shadows, no transparency and no text anywhere.",
      "texture": "/assets/lumen-logic/textures/swash-swarm.ktx2",
      "preview": "/assets/lumen-logic/previews/swash-swarm.webp",
      "card": "/assets/lumen-logic/cards/swash-swarm.jpg",
      "palette": [
        "#efe8d8",
        "#d7d4c8",
        "#a3b6a6"
      ]
    },
    {
      "id": "swept-muse",
      "title": "Swept Muse",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/swept-muse.webp",
      "description": "A figure implied entirely by combed hair. Every mark in the piece is one primitive — a bundle of dozens of fine parallel strands sharing a single smooth spine, shaded across its width by a bright ridge set at a per-bundle offset so each reads as a rounded, lit cord, and streaked by a fixed per-strand groove jitter. The bundles are combed through a whorl field around a focus set off to one side of the head: tangential close in, so they wrap it in long shallow arcs, and swinging downward far out, so the mass pours off the corner as a heavy train. They are opaque and stack back to front, so depth is occlusion alone. The figure is never outlined — the innermost bundles are the silhouette curve offset inward and then extended into the flow, so the profile is drawn by where a bundle stops, with three or four pale hairlines for a nostril, a lip seam and an under-chin shadow. A silhouette family is chosen by seed: a profile head, a crested bird, a footed vessel, or none at all. Colour is two ramps split spatially — cool steel over the back and top, hot orange at the face and along the train, interleaving freely at the centre. Long pale flyaway strands escape the mass and taper off over bare ground, and beneath it all a flat neutral panel carries hand-ruled pin-ended drafting rectangles and clouds of ballpoint scribble.",
      "texture": "/assets/lumen-logic/textures/swept-muse.ktx2",
      "preview": "/assets/lumen-logic/previews/swept-muse.webp",
      "card": "/assets/lumen-logic/cards/swept-muse.jpg",
      "palette": [
        "#716d65"
      ]
    },
    {
      "id": "swift-tangle",
      "title": "Swift Tangle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/swift-tangle.webp",
      "description": "A knotted ball of tapering crescent blades, flat and opaque on black. Every arc is a fragment of a circle lying on one implied sphere — orthographic projection turns each into an ellipse fragment whose semi-major axis is the circle's own radius, which is what makes the mass read as a volume rather than a flat scribble. Each arc is swept into a blade by a width profile that peaks off-centre and runs to a true needle point at both ends, so the shapes read as scythes and beaks. Most elements are bare bands, pointed at both ends; a minority are fliers — two to five blades fanning from one shared bulbous head with no seam where they meet, each head carrying a single eye: a solid pupil the colour of the ground with a small glint at its upper right, so the pupil reads as a hole punched clean through. Every shape is one flat colour with no outline, no gradient and no transparency — depth comes from occlusion alone, biased by a weave jitter on the paint order so the ball interlocks rather than stacking cleanly front to back, and by a colour rule that zones hue spatially while also pulling the far side of the ball toward the darkest palette entries and the near side toward the palest. The ball can pack into an even tangle, flatten into near-parallel lenses, lean off-centre, or hollow out into a ring around an open core, and a share of elements are free to sweep past the ball and off the canvas.",
      "texture": "/assets/lumen-logic/textures/swift-tangle.ktx2",
      "preview": "/assets/lumen-logic/previews/swift-tangle.webp",
      "card": "/assets/lumen-logic/cards/swift-tangle.jpg",
      "palette": [
        "#152021",
        "#544d31",
        "#3b6262",
        "#827f57"
      ]
    },
    {
      "id": "swirl-muse",
      "title": "Swirl Muse",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 60,
      "kind": "image",
      "source": "artworks/lumen-logic/swirl-muse.webp",
      "description": "A serene front-facing portrait whose hair erupts into a vortex of swirling paint. The porcelain blue-white face is tilted back with the chin lifted, the eyes closed under arched brows and violet eyeshadow with flicking lashes, the nose hinted by soft shadow and the full lips a deep parted rose. From a scalp ring the hair explodes into a landscape-wide halo of hundreds of curling, tapered ribbon strokes — a dark near-black and maroon understructure, saturated crimson, orange, gold, magenta, cobalt, teal and violet ribbons clustered into local hue groups, and bright accent tints with highlight veins, many swelling into flung droplet heads. Splatter blobs with satellite droplets ring the perimeter, thin whipping filaments arc across and beyond the mass, drips run off the hair, chin and dissolving blue-white chest, and fine spray dots settle over a soft mottled off-white ground.",
      "texture": "/assets/lumen-logic/textures/swirl-muse.ktx2",
      "preview": "/assets/lumen-logic/previews/swirl-muse.webp",
      "card": "/assets/lumen-logic/cards/swirl-muse.jpg",
      "palette": [
        "#9288a7",
        "#ca7b85",
        "#745371",
        "#b0596e",
        "#627298",
        "#dccbcf"
      ]
    },
    {
      "id": "symbol-quote",
      "title": "Symbol Quote",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/symbol-quote.webp",
      "description": "A bold hand-lettered quote over a canvas packed edge to edge with small, brightly coloured, hand-drawn symbols. Symbols are blanketed on a jittered grid, then a pixel read-back pass finds every leftover patch of background and fills it, so no white space survives. The quote is drawn last in a switchable hand-drawn font, black and bold, with symbols showing through the open counters of the letters.",
      "texture": "/assets/lumen-logic/textures/symbol-quote.ktx2",
      "preview": "/assets/lumen-logic/previews/symbol-quote.webp",
      "card": "/assets/lumen-logic/cards/symbol-quote.jpg",
      "palette": [
        "#e7e1e2",
        "#afaaab",
        "#999896"
      ]
    },
    {
      "id": "talisman",
      "title": "Talisman",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/talisman.webp",
      "description": "Patterned geometric charms strung together over a mottled watercolour ground. Bold black-outlined circles, half-circles and quarter-fans arrange down a gentle vertical meander, each packed with a different colourful tessellation — triangle strips, tartan plaid, checker cells, radiating fan stripes, bullseye rings or ink-doodled dots. Small elongated bead pods and loose clusters of solid ink dots fill the gaps, while thin wavy ink threads run top-to-bottom like the strings of a hanging mobile. The Charms, Pattern Detail, Beads, Ink Threads, Wash Texture and Ink Weight knobs reshape the composition.",
      "texture": "/assets/lumen-logic/textures/talisman.ktx2",
      "preview": "/assets/lumen-logic/previews/talisman.webp",
      "card": "/assets/lumen-logic/cards/talisman.jpg",
      "palette": [
        "#c26499",
        "#6f837a",
        "#9e5e85",
        "#9a4048"
      ]
    },
    {
      "id": "tangle",
      "title": "Tangle",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/tangle.webp",
      "description": "Dense web of short orthogonal path segments. Hundreds of independent walkers start at randomised grid positions and step in cardinal directions, turning 90° at each corner with high frequency. Very short segment lengths make every path change direction constantly, filling the canvas with an interlocking tracery of L-shaped and Z-shaped traces. Overlapping paths and slight per-endpoint wobble give the result a hand-drawn quality — closer to a meditative doodle than a maze.",
      "texture": "/assets/lumen-logic/textures/tangle.ktx2",
      "preview": "/assets/lumen-logic/previews/tangle.webp",
      "card": "/assets/lumen-logic/cards/tangle.jpg",
      "palette": [
        "#f9f9f9"
      ]
    },
    {
      "id": "terrazzo",
      "title": "Terrazzo",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/terrazzo.webp",
      "description": "Scattered irregular stone chips in warm terracotta, sienna, and olive tones, set in a cream grout ground. Inspired by Italian terrazzo flooring — each seed produces a unique mosaic of polygon fragments.",
      "texture": "/assets/lumen-logic/textures/terrazzo.ktx2",
      "preview": "/assets/lumen-logic/previews/terrazzo.webp",
      "card": "/assets/lumen-logic/cards/terrazzo.jpg",
      "palette": [
        "#c0aa96",
        "#d2ccba"
      ]
    },
    {
      "id": "tesserae",
      "title": "Tesserae",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/tesserae.webp",
      "description": "A glass-mosaic panel in which every mark on the plate is a tile. The ground is flooded black once and every tessera is then set into it inset from its own cell, so the black between the tiles is exposed grout rather than a drawn outline, and each tile carries a flat opaque fill, eased corners, a two-shade bevel lit from one direction shared by the whole plate, a small gloss and a faint incised mark. Nothing overlaps: the picture is a planar partition of tile fields, so a form does not sit over the background but replaces it, and depth comes from the bevel alone. What makes it read as mosaic rather than as mesh is the andamento — courses run parallel to the boundaries they meet, wrapping every medallion in concentric bands before relaxing back into the drift of the field, running as brickwork with a running-bond offset inside the long forms, converging as a false-perspective lattice down a tapering blade, nestling as dart-thrown pebble beds across the open ground, and breaking into rings, radial fans or crazy paving where a field needs to read as turned or shattered — with every tile graded smaller as it approaches a boundary so a course can turn a tight corner without tearing. A radiant subject of tapering blades on a hub — a star, a rosette, a blade fan, a serpent or a wheel — dominates the plate, each blade cut lengthwise into faceted fields and rimmed on one edge by a course of near-white tiles that does all of the relief work. Scattered through the ground are medallions made of the same tiles: eyes with radial iris striations around a glossed black pupil, ringed or lidded and wrapped in haloes of arc courses and bead chains; petal rosettes; patterned blobs; and small glyph inlays — a spiral, a meander, a ladder, a square-in-square — tucked into whatever ground is still free. Colour arrives in runs of three to eight tiles rather than per tile, every field holds one dominant hue with the other inks as sparse punctuation, and the pale ink is reserved for rims, scleras and highlights. Flat fills and exposed grout only — no outlines, no gradients, no shadows and no transparency anywhere.",
      "texture": "/assets/lumen-logic/textures/tesserae.ktx2",
      "preview": "/assets/lumen-logic/previews/tesserae.webp",
      "card": "/assets/lumen-logic/cards/tesserae.jpg",
      "palette": [
        "#6f3a3e",
        "#865531",
        "#5e5e4e",
        "#7d6a63"
      ]
    },
    {
      "id": "text-shape",
      "title": "Text Shape",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/text-shape.webp",
      "description": "Fills a geometric shape with text characters arranged in a density gradient. The dense side packs characters so tightly the shape appears solid; the opposite sparse side reveals individual readable characters. The smooth transition from filled mass to legible text makes the shape silhouette recognizable. Shapes (circle, square, randomly-rotated triangle) and the dense side direction can each be fixed or randomised per seed.",
      "texture": "/assets/lumen-logic/textures/text-shape.ktx2",
      "preview": "/assets/lumen-logic/previews/text-shape.webp",
      "card": "/assets/lumen-logic/cards/text-shape.jpg",
      "palette": [
        "#111111"
      ]
    },
    {
      "id": "text-vortex",
      "title": "Text Vortex",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/text-vortex.webp",
      "description": "Splits a body of text into sentences and renders each as a radial spoke of tiny type, reading from the canvas rim inward toward the center. Sentences are distributed evenly around the full 360° so every seed fills the entire canvas — the angle between consecutive spokes is exactly 2π divided by the sentence count. Palette colors cycle across spokes; seed controls the starting rotation.",
      "texture": "/assets/lumen-logic/textures/text-vortex.ktx2",
      "preview": "/assets/lumen-logic/previews/text-vortex.webp",
      "card": "/assets/lumen-logic/cards/text-vortex.jpg",
      "palette": [
        "#111111",
        "#2f2919"
      ]
    },
    {
      "id": "thermal-melt",
      "title": "Thermal Melt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/thermal-melt.webp",
      "description": "A false-colour \"thermal\" bust: a smooth, serene procedural face tilted back with eyes closed, built as a per-pixel shaded relief sampled from a baked 3-D head scan (a Lambert-lit height field, real surface normals) and remapped through a psychedelic heat-map gradient — acid-lime highlights, violet midtones, red-orange undersides, deep-indigo shadow. The lower silhouette melts into rounded, volumetric red-orange drips that hang from the jaw and neck. Heavy grain applied to luminance before the colour ramp dusts the whole image with a band-shifting multi-colour speckle over a deep-indigo ground. Deterministic from a seed, defaults to the Portrait canvas.",
      "texture": "/assets/lumen-logic/textures/thermal-melt.ktx2",
      "preview": "/assets/lumen-logic/previews/thermal-melt.webp",
      "card": "/assets/lumen-logic/cards/thermal-melt.jpg",
      "palette": [
        "#311852",
        "#785065",
        "#692256",
        "#96386c"
      ]
    },
    {
      "id": "thread-loops",
      "title": "Thread Loops",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/thread-loops.webp",
      "description": "A scatter of overlapping circular string-art loops. Each loop pins N points evenly on a circle and connects pin i to pin (a·i + b) mod N; the modular times-table makes the straight chords envelope cardioid and multi-cusp caustics. Small dense loops cluster over a few large faint rings, and layered translucent threads in saturated hues weave together where circles overlap.",
      "texture": "/assets/lumen-logic/textures/thread-loops.ktx2",
      "preview": "/assets/lumen-logic/previews/thread-loops.webp",
      "card": "/assets/lumen-logic/cards/thread-loops.jpg",
      "palette": [
        "#eeecea",
        "#d6c6c5"
      ]
    },
    {
      "id": "topology",
      "title": "Topology",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/topology.webp",
      "description": "Marching-squares contour lines of a seeded 2D Perlin noise field. Each threshold level produces one family of isolines; colour cycles through the palette from low to high, creating a dense topographic map aesthetic with smooth organic curves.",
      "texture": "/assets/lumen-logic/textures/topology.ktx2",
      "preview": "/assets/lumen-logic/previews/topology.webp",
      "card": "/assets/lumen-logic/cards/topology.jpg",
      "palette": [
        "#060b15"
      ]
    },
    {
      "id": "torn-effigy",
      "title": "Torn Effigy",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/torn-effigy.webp",
      "description": "A cubo-figurative bust on trowelled cream plaster, cut from painted paper and outlined in a dry black brush. A seeded figure — crown masses, a tapered head, a neck, a wide shoulder mass and descending arms, cropped hard by the top and bottom edges — is carved region by region into flat angular facets by a recursive guillotine that keeps splitting whichever facet is largest and cuts along the region's own axis, so each region ends up with one dominant plane and a scatter of smaller wedges, and no cut ever runs on into the region beside it. Every facet is then filled as a scrap of torn paper rather than a flat colour: sub-patches of related ink divided by ragged, small-scale torn edges, faint print ghosts of blocks and dash-rows on the pale scraps, pale scuff strokes, a dark speck field and a lifted band of lighter ink just inside each boundary, all pitched low enough that the facets still read flat at a distance. Colour is a flat seeded assignment with no light model anywhere — neutral papers through much of the figure, near-black concentrated in the crown, and orange, saffron, crimson, cobalt, violet and teal through the rest — so the picture reads as pasted scraps and never as a shaded solid. Over every facet boundary and around every region runs the piece's loudest mark: a heavy black brush line whose width breathes along its length, whose centreline wobbles, which opens short tapered gaps where the brush skipped, and which runs half again heavier on a silhouette than on an interior seam. A face is made of four facets and nothing else — a long tapering nose wedge, a deep-toned mouth patch, a jaw seam throwing one cheek into dark inks — with no eye drawn anywhere. Hairline cracks, specks and stray colour flecks are laid over figure and ground alike at the end, so the whole sheet reads as one worked plaster surface rather than as a collage pasted onto a backdrop.",
      "texture": "/assets/lumen-logic/textures/torn-effigy.ktx2",
      "preview": "/assets/lumen-logic/previews/torn-effigy.webp",
      "card": "/assets/lumen-logic/cards/torn-effigy.jpg",
      "palette": [
        "#908779",
        "#aa9b8f",
        "#dbd2bd",
        "#6e6351",
        "#608490",
        "#4f4941"
      ]
    },
    {
      "id": "torn-strips",
      "title": "Torn Strips",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/torn-strips.webp",
      "description": "A collage of tall, thin torn- and cut-paper strips packed into horizontal bands, reproduced from a reference image. Each strip is a ragged, softly tapered quadrilateral in a muted-with-punch palette of greys, olives and mustards accented by bright blue, orange, yellow and black. A share of the strips are cut with pinking shears into vertical zigzag ribbons, and many neutral strips carry a fine stipple texture. Deterministic from a seed.",
      "texture": "/assets/lumen-logic/textures/torn-strips.ktx2",
      "preview": "/assets/lumen-logic/previews/torn-strips.webp",
      "card": "/assets/lumen-logic/cards/torn-strips.jpg",
      "palette": [
        "#d7d7c2",
        "#c5bc9d"
      ]
    },
    {
      "id": "torus-knot",
      "title": "Torus Knot",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/torus-knot.webp",
      "description": "A (p,q) torus knot winds p times around the major axis of a torus and q times through its hole. Projected orthographically from 3D with depth-modulated glow, the curve reveals its topological structure as a luminous ribbon in space. Best pairs: (2,3) trefoil, (3,5), (2,7), (3,7).",
      "texture": "/assets/lumen-logic/textures/torus-knot.ktx2",
      "preview": "/assets/lumen-logic/previews/torus-knot.webp",
      "card": "/assets/lumen-logic/cards/torus-knot.jpg",
      "palette": [
        "#05030b"
      ]
    },
    {
      "id": "transom",
      "title": "Transom",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/transom.webp",
      "description": "A hard-edged flat-colour composition in fluorescent ink, drawn once and then printed again in each pane of a window in a different key. Every edge in the picture is horizontal, vertical or at exactly 45°, and none of them is chosen freely: the axis-aligned ones lie on one irregular lattice built by splitting the sheet down recursively, so broad fields sit beside slivers, and the diagonals lie on a dozen datum lines shared by the whole sheet, which is why the cut corner of one slab and the long band crossing another are on the same line. Plates are convex, opaque and painted back to front, so every stepped and notched silhouette in the picture is two plates overlapping rather than a shape anyone drew; a share of them are striped into stacks of bands on the same lattice, and a share carry a mitred bevel — a strip one tone lighter along the edges facing the light and one tone darker along the rest, cut as the set of points nearer to one edge than to any other, so the miters are exact and nothing is offset, outlined or shadowed. Colour is not painted but named: one closed hue circle and one five-rung tone ladder, so a mark carries a pair of integers and no picture can contain more than five colours per palette entry, the pale tints and the near-blacks being rungs of the same hues as the saturated fields. The sheet is then cut into panes by seams that run edge to edge, and each pane repaints the entire composition with the hue circle rotated by its own amount — a shape crosses a seam with every vertex unchanged and only its colours different, and because relief is carried by the tone axis rather than the hue one, the same slab reads as the same lifted slab in every key. Full bleed, no ground, no outline, no gradient, no transparency.",
      "texture": "/assets/lumen-logic/textures/transom.ktx2",
      "preview": "/assets/lumen-logic/previews/transom.webp",
      "card": "/assets/lumen-logic/cards/transom.jpg",
      "palette": [
        "#537eb8",
        "#abe53b",
        "#25a2a1",
        "#e96f3f",
        "#bca12f",
        "#b85358"
      ]
    },
    {
      "id": "tressure",
      "title": "Tressure",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/tressure.webp",
      "description": "A sheet packed with nested rounded rectangles in marker, after a hand-drawn page of concentric black frames on white paper. A rounded rectangle is a box inflated by a corner radius, and that family is closed under erosion by a disc in closed form — the box comes in by the step, the corner comes in by the step — so a nest is two subtractions per band with no polygon clipper, no offsetting library and no sampling error anywhere. Erosion moves every point of a boundary inward along its own normal by the same distance, which is why the bands come out the same width all the way around a shape and in a cell four times bigger; scaling, the obvious alternative, would carry a band three times thicker on the long sides of a 3:1 cell than on its short ones. The step is the width of the marker and belongs to the sheet rather than to the cell, so band count is an output and never a setting: a big cell carries many bands and a small one carries two, at identical width, and every nest terminates on its own when the next erosion would empty the shape. The corner radius is floored rather than merely subtracted, because a hand rounds every corner at whatever size it is drawing — which keeps the corners proportionally round all the way in, makes a long thin cell nest into slots forever, and pinches the band slightly at the corners exactly as the reference does. Nothing is stroked: the fills are laid down outermost first, ink over paper over ink, each covering the whole interior of its shape, so a frame is the part of one fill the next does not cover, the black line the eye follows is the paper showing through, and a solid blot in the middle of a nest is simply the last fill when the count comes out odd. The cells are a guillotine partition that always cuts the longer side, and each one insets its shape by one global mean with a wide spread, so neighbouring masses fuse where two insets both land small — with no adjacency test anywhere. A coherent field over (position around the outline, band index) bows the sides and leans consecutive boundaries together instead of fraying them, each nest tilts a degree or two as a unit, and each shape is nudged off its parent so a frame reads thick at the top and thin at the bottom. The element is a knob — rounded rectangles, stadium slots, sharp rectangles, chamfered boxes, or a mixture — and it is nothing but the list of convex cores the same operator runs on.",
      "texture": "/assets/lumen-logic/textures/tressure.ktx2",
      "preview": "/assets/lumen-logic/previews/tressure.webp",
      "card": "/assets/lumen-logic/cards/tressure.jpg",
      "palette": [
        "#8a8681",
        "#9f9c96",
        "#6f6b65"
      ]
    },
    {
      "id": "truchet",
      "title": "Truchet",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/truchet.webp",
      "description": "A grid of quarter-circle arc tiles, each randomly oriented. The two orientations self-organise into flowing rivers, closed loops, and maze-like passages. Colour bands driven by Perlin noise give smooth regional variation.",
      "texture": "/assets/lumen-logic/textures/truchet.ktx2",
      "preview": "/assets/lumen-logic/previews/truchet.webp",
      "card": "/assets/lumen-logic/cards/truchet.jpg",
      "palette": [
        "#f1e3d3"
      ]
    },
    {
      "id": "tunnel",
      "title": "Tunnel",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/tunnel.webp",
      "description": "One-point perspective grid: radial lines fan out from a configurable vanishing point to the canvas edge, crossed by concentric rectangular rings spaced with perspective foreshortening. Together they create the illusion of an infinite receding corridor.",
      "texture": "/assets/lumen-logic/textures/tunnel.ktx2",
      "preview": "/assets/lumen-logic/previews/tunnel.webp",
      "card": "/assets/lumen-logic/cards/tunnel.jpg",
      "palette": [
        "#01070e"
      ]
    },
    {
      "id": "turgor",
      "title": "Turgor",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/turgor.webp",
      "description": "A head assembled from one thing: a fat tube of soft material, round in cross-section, of slowly swelling and tapering thickness, ending in a blunt cap — and every mark in the picture is that, at four sizes. The tubes lie along the level sets of a single stream function built from a handful of classical flow elements: doublets posed on a seeded armature, vortices, a strain and a uniform stream. Because that field is divergence-free its level sets can never cross, so neighbouring tubes run parallel for long distances, fan apart, spiral into the vortex centres and peel away along the saddles between them, and the mass reads as one combed material rather than a tangle. The silhouette is nowhere drawn: it is the dividing streamline that closes around the whole armature, which is why the brow, the nose and the chin bulge where the elements sit and the profile between them has no corner. Each tube is as thick as a fixed fraction of the gap it sits in, up to a ceiling, so the ribs keep an even weight where the flow crowds and the bare ground opens through in wide holes where it runs slow. Nothing is painted with a gradient. The picture is a relief solved per pixel: every tube contributes an analytic height above the sheet, the nearest one wins the pixel, the surface normal comes in closed form from the tube’s own cross-section and width profile, and one soft light from the upper left produces every value on the sheet — a broad highlight along the lit flank, a fall that steepens toward the silhouette, and a far flank that shifts into deep navy rather than merely darkening. Depth varies along a tube’s own length, so a run passes behind its neighbour at one end and in front of it at the other, which no paint order can do; and where one tube crosses over another the depth discontinuity itself darkens the crevice beneath. Colour is assigned per tube from a ramp read by depth — cream and blush nearest, slate and navy deepest — drifted by a slow wash across the sheet, and the whole thing, mass and bare ground alike, is dusted with one heavy clumped grain.",
      "texture": "/assets/lumen-logic/textures/turgor.ktx2",
      "preview": "/assets/lumen-logic/previews/turgor.webp",
      "card": "/assets/lumen-logic/cards/turgor.jpg",
      "palette": [
        "#ad979c",
        "#817278"
      ]
    },
    {
      "id": "type-tilt",
      "title": "Type Tilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/type-tilt.webp",
      "description": "Renders a body of text as horizontally stretched lines that fill the canvas — one word per line, each scaled to the same width. A grid of geometric shapes (circle, square, or equilateral triangle) is overlaid, and inside each shape the text is shown again, rotated by a configurable angle around the shape centre. The rotation creates a tilted-window illusion: the text outside the shapes reads normally, while the text seen through each shape appears to be printed on a slightly twisted plane. Shapes alternate tilt direction in a checkerboard pattern by default, or can tilt uniformly or at random per seed.",
      "texture": "/assets/lumen-logic/textures/type-tilt.ktx2",
      "preview": "/assets/lumen-logic/previews/type-tilt.webp",
      "card": "/assets/lumen-logic/cards/type-tilt.jpg",
      "palette": [
        "#3a321e"
      ]
    },
    {
      "id": "ulam",
      "title": "Ulam Spiral",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/ulam.webp",
      "description": "The prime spirals: integers written along Ulam's square spiral or Sacks' Archimedean spiral (r = √n, θ = 2π√n), with primes lit as stars. What should be random organises into diagonal streaks and parabolic arcs — the fingerprints of prime-rich quadratic polynomials. Composites fade by their number of prime factors, twin primes carry halos, and Euler’s n² + n + 41 can be picked out in gold. Zero randomness in the field — the pattern is discovered, not drawn.",
      "texture": "/assets/lumen-logic/textures/ulam.ktx2",
      "preview": "/assets/lumen-logic/previews/ulam.webp",
      "card": "/assets/lumen-logic/cards/ulam.jpg",
      "palette": [
        "#0a0b12"
      ]
    },
    {
      "id": "umbel",
      "title": "Umbel",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/umbel.webp",
      "description": "A bouquet of red weeds seen as one ball of flat silhouettes on bare paper — grass blades, foxtail plumes, toothed leaf sprays, pinnate fronds, umbels of tiny florets, catkins and seed pods — built from a single primitive applied at three scales. That primitive is a blade: a curve given a width that varies along it and closed into an outline, where the width is one two-exponent profile whose peak can sit anywhere from the base to the tip. A stem is that profile nearly flat, a grass blade is it weighted to the root, a leaf is it weighted to the middle, a floret is a stub — one function, not a shape library. One recursive rule assembles them: an axis wears blades along it, alternate, opposite, whorled, tufted or gathered into a terminal head, and a blade may itself be an axis, so fronds and umbels come out two levels deep with no new code. One composition rule places them: every axis is rooted in the same small knot at the centre and points away from it, and its tip lands on a shared envelope, so the mass reads as a sphere and the ink thins outward on its own because the number of specimens crossing a circle does not grow with its radius. The apparent botanical variety is a cast of a dozen species sampled once per picture, each one re-grown many times from a different seed — the repeats are what make it read as real plants rather than as texture. Each plant is a single flat ink, so overlapping silhouettes stay legible as objects; depth is occlusion alone. No outline, no gradient, no transparency, no shading, and no mark anywhere that is not a blade.",
      "texture": "/assets/lumen-logic/textures/umbel.ktx2",
      "preview": "/assets/lumen-logic/previews/umbel.webp",
      "card": "/assets/lumen-logic/cards/umbel.jpg",
      "palette": [
        "#ecc1c4",
        "#f5f1f0",
        "#de717a"
      ]
    },
    {
      "id": "undertow",
      "title": "Undertow",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/undertow.webp",
      "description": "A deep off-centre vortex of nested, noise-warped wireframe rings receding into a near-black well. Each band between rings is a terraced step faced with finely woven mesh — sub-ring lines crossed by radial ticks — broken into shingled plates whose seams spiral into the depth. A four-zone lighting field shades the plates: dim graphite abyss, an abyssal blue core, a teal-to-white spiral current pouring toward the eye, and an ivory crest on the opposite arc — while the outermost rings ignite in ember red-orange wherever the organic silhouette bulges outward, over-running a thin red border frame. Depth comes purely from eccentric ring spacing, dark band fills and draw order.",
      "texture": "/assets/lumen-logic/textures/undertow.ktx2",
      "preview": "/assets/lumen-logic/previews/undertow.webp",
      "card": "/assets/lumen-logic/cards/undertow.jpg",
      "palette": [
        "#241a16",
        "#3b4441"
      ]
    },
    {
      "id": "vasarely-tunnel",
      "title": "Vasarely Tunnel",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/vasarely-tunnel.webp",
      "description": "An off-center one-point-perspective box whose four walls each carry a distinct flat color — warm, warm-light, cool, and the red field — stepped into depth bands that lighten toward a pale far panel. A shifted, semi-transparent copy of the box overlaps the first so their crossing walls blend into pastel secondaries, recreating the transparency illusion of Victor Vasarely’s receding color-band corridors.",
      "texture": "/assets/lumen-logic/textures/vasarely-tunnel.ktx2",
      "preview": "/assets/lumen-logic/previews/vasarely-tunnel.webp",
      "card": "/assets/lumen-logic/cards/vasarely-tunnel.jpg",
      "palette": [
        "#b7408d",
        "#e47bb3",
        "#5547a7",
        "#295cc1",
        "#d21a4f",
        "#7a95d0"
      ]
    },
    {
      "id": "vernier",
      "title": "Vernier",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/vernier.webp",
      "description": "A sheet of ribbons in three inks on black, swept into long shallow S-curves, where the whole subject of the picture is which of the three is fat and where. There is one mark and one material: a band of flat colour between two level sets of a single scalar field, and there is no outline, no shading, no gradient, no transparency and no second scale of detail anywhere. That field is the horizontal coordinate plus a handful of sines, and its amplitudes are rescaled so that one sum — of each amplitude times its own horizontal frequency — lands exactly on a number strictly below one. That single inequality puts a positive floor under the field’s derivative, which makes every level set a graph rather than a curve, and therefore makes crossing, merging, looping and ending impossible rather than merely unlikely: every ribbon in the picture runs unbroken from the top edge of the frame to the bottom, no two ever meet, and their left-to-right order is the same at the foot as at the head however far they have swept in between — at any setting, with no check anywhere in the program. The matching sum over the vertical frequencies appears nowhere in that argument, is unbounded, and is the entire source of the lean, so a picture with a hard ordering guarantee still sweeps past sixty degrees. Because the boundaries are solved rather than followed, a ribbon is a filled polygon and its edges are hard; because its width is fixed in the field’s units rather than in pixels, it fattens where the field flattens and thins where the field steepens, so a single ribbon swells and narrows down its own length without anything varying. The ribbons sit on a ladder whose step is modulated, and the modulation’s period is deliberately near three and not three while the inks cycle at exactly three. Because the two periods disagree by a fraction, the assignment of the wide step precesses through the inks across the sheet, so the picture organises itself into broad soft territories of one colour’s dominance that nothing draws an edge around and no parameter names — and setting the disagreement to zero does not switch that off but locks it, starving one ink to a thread over the whole sheet. The ground is only what no ribbon covers: where the ladder’s step is narrower than a ribbon’s maximum width there is no black at all, and where it opens past it the leftover is the black, so the picture’s tone is the ladder seen edge-on and no brightness is ever computed. Colour carries no information whatever — it is a counter over three inks, dealt in strict rotation and constant along a ribbon’s whole length — and everything the picture appears to say with hue it says with width.",
      "texture": "/assets/lumen-logic/textures/vernier.ktx2",
      "preview": "/assets/lumen-logic/previews/vernier.webp",
      "card": "/assets/lumen-logic/cards/vernier.jpg",
      "palette": [
        "#432d42",
        "#4f4c27"
      ]
    },
    {
      "id": "vitiligo",
      "title": "Vitiligo",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/vitiligo.webp",
      "description": "Generative 3D portraits and hands rendered entirely as small greyscale dots, shaded with Phong diffuse lighting on a multi-volume SDF face/hand geometry. Vitiligo — a condition causing depigmented skin patches — is modelled as warped Voronoi regions that boost dot brightness toward white. Fully parametric and reproducible from a seed.",
      "texture": "/assets/lumen-logic/textures/vitiligo.ktx2",
      "preview": "/assets/lumen-logic/previews/vitiligo.webp",
      "card": "/assets/lumen-logic/cards/vitiligo.jpg",
      "palette": [
        "#050505"
      ]
    },
    {
      "id": "vitrine",
      "title": "Vitrine",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/vitrine.webp",
      "description": "A cabinet of isometric specimens: a cloud of boxes, flattened slabs and six-pointed stars suspended inside a wireframe cube, on a ground of diagonal bands. There is one primitive and one lattice — every mark is a face of an axis-aligned box with integer corners, seen along (1, 1, 1) in true isometric — so the picture has exactly three straight directions in it, because the projection admits exactly three. The stars are not stars but 3-D pluses, which this projection turns into regular six-pointed ones without anything drawing a star, and the depth is nothing but occlusion, ordered by an exact box-versus-box test. Each specimen has one ink and shows three flat tones of it assigned by face normal, with a single haze fading the far ones into the case; dressings — stripes, pixel mosaics, plus-signs, inset borders — are traces of the solid’s own subdivision, so a motif meets itself exactly across every edge.",
      "texture": "/assets/lumen-logic/textures/vitrine.ktx2",
      "preview": "/assets/lumen-logic/previews/vitrine.webp",
      "card": "/assets/lumen-logic/cards/vitrine.jpg",
      "palette": [
        "#354252",
        "#172c47",
        "#c1592f",
        "#4e666a",
        "#94553f",
        "#573531"
      ]
    },
    {
      "id": "volute",
      "title": "Volute",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/volute.webp",
      "description": "A sheet covered edge to edge in one field of evenly spaced grooves — rainbow fans, spiral eyes and short combs, in two tones and nothing else. Every line in the picture is the offset of one arc at a whole multiple of a single pitch, and the three motifs are three settings of that one arc rather than three kinds of mark: an arc of a few pitches’ radius offsets into a tight hooked fan, an arc of twenty into a comb that reads as straight, and an arc of zero radius into a set of concentric rings. An eye is the same construction plus one term — a whole number of pitches of radius added per turn of angle — which is the only difference between a target and a spiral anywhere in the package, and it is what lets a line be followed continuously from the open field into the centre. Because the marks are the offsets themselves, walked analytically rather than contoured off any grid, the spacing between neighbours is the same in a tight curl as in a lazy sweep, at any output size, and no two lines can cross or merge: two offsets of one arc are a pitch apart by definition. The sheet is divided by which arc is nearest, and a line is drawn only inside its own arc’s territory and stopped short of the boundary by a fixed clearance — so the ragged fronts where one bundle dies into the next are a consequence of the partition rather than anything drawn, and the channel of bare ground along them is one setting. How far a bundle reaches is not a setting either: a locus draws its next offset, and when none of it survives the partition it tries once more and is finished, so a fan has exactly as many lines as it has room for. The hand is two bounded displacements: a slow bow sampled in the plane, so neighbours bow together and stay parallel through it, and a fine quiver of each line’s own — both capped below the spacing, so the drawing looks made by a hand and still cannot tangle. The lattice of arcs overhangs the sheet by a cell on every side and the drawing is clipped to it, so the field is cut by the frame rather than ending at it.",
      "texture": "/assets/lumen-logic/textures/volute.ktx2",
      "preview": "/assets/lumen-logic/previews/volute.webp",
      "card": "/assets/lumen-logic/cards/volute.jpg",
      "palette": [
        "#c25326"
      ]
    },
    {
      "id": "voronoi",
      "title": "Voronoi",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/voronoi.webp",
      "description": "Biomorphic cellular pattern based on exact Voronoi tessellation with rounded corners, resembling dried earth, plant cells, or paving stones. Muted neutral palette on a warm ground.",
      "texture": "/assets/lumen-logic/textures/voronoi.ktx2",
      "preview": "/assets/lumen-logic/previews/voronoi.webp",
      "card": "/assets/lumen-logic/cards/voronoi.jpg",
      "palette": [
        "#c3b9a3"
      ]
    },
    {
      "id": "watercolor-dots",
      "title": "Watercolor Dots",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/watercolor-dots.webp",
      "description": "A dense field of hand-painted watercolor circles packed into a soft rectangular cluster. Each dot is a single pigment colour drawn from a broad palette, with an irregular organic edge, mottled wash layers and darker pooling at the rim. Translucent overlaps let neighbouring colours bleed together over a warm paper ground.",
      "texture": "/assets/lumen-logic/textures/watercolor-dots.ktx2",
      "preview": "/assets/lumen-logic/previews/watercolor-dots.webp",
      "card": "/assets/lumen-logic/cards/watercolor-dots.jpg",
      "palette": [
        "#dfc6c1",
        "#c0b5ad",
        "#9b9595"
      ]
    },
    {
      "id": "wave-interference",
      "title": "Wave Interference",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/wave-interference.webp",
      "description": "Superposes N circular waves emanating from randomly placed point sources. At every pixel the combined amplitude — the sum of cos(2π·distance/λ) for each source — is computed and mapped through a banded colour gradient. The result is the classic two-slit experiment writ large: where crests meet, bright bands; where crest meets trough, darkness.",
      "texture": "/assets/lumen-logic/textures/wave-interference.ktx2",
      "preview": "/assets/lumen-logic/previews/wave-interference.webp",
      "card": "/assets/lumen-logic/cards/wave-interference.jpg",
      "palette": [
        "#35bd98"
      ]
    },
    {
      "id": "wave-text",
      "title": "Wave Text",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/wave-text.webp",
      "description": "Lays out a body of text as a flowing typographic composition. Words are arranged left-to-right in rows, each row riding a smooth sinusoidal wave so the baseline undulates up and down across the canvas. Individual words vary in font size, creating rhythm and visual weight. One word — chosen randomly or by index — is singled out in a configurable highlight color, creating a focal point within the typographic flow.",
      "texture": "/assets/lumen-logic/textures/wave-text.ktx2",
      "preview": "/assets/lumen-logic/previews/wave-text.webp",
      "card": "/assets/lumen-logic/cards/wave-text.jpg",
      "palette": [
        "#1b1a16"
      ]
    },
    {
      "id": "wavy-plate",
      "title": "Wavy Plate",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/wavy-plate.webp",
      "description": "Renders a three-dimensional wavy surface entirely from dots. Two orthogonal sine waves define the surface height at each grid point, and dot size is modulated by the local wave height to produce the illusion of depth. Dot colors cycle across the active palette based on wave height, creating contour-like color bands that follow the wave crests and troughs.",
      "texture": "/assets/lumen-logic/textures/wavy-plate.ktx2",
      "preview": "/assets/lumen-logic/previews/wavy-plate.webp",
      "card": "/assets/lumen-logic/cards/wavy-plate.jpg",
      "palette": [
        "#a4a9a8",
        "#8f9190"
      ]
    },
    {
      "id": "weave-draft",
      "title": "Weave Draft",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/weave-draft.webp",
      "description": "Generates a textile weaving drawdown — a precise grid where each cell is coloured by modular arithmetic applied to its column and row coordinates. Horizontal bands each use different multiplier pairs, producing distinct weave structures: staggered checkerboards, twill staircases, steep chevrons, and complex houndstooth interlocks.",
      "texture": "/assets/lumen-logic/textures/weave-draft.ktx2",
      "preview": "/assets/lumen-logic/previews/weave-draft.webp",
      "card": "/assets/lumen-logic/cards/weave-draft.jpg",
      "palette": [
        "#60728c"
      ]
    },
    {
      "id": "whorl-quilt",
      "title": "Whorl Quilt",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/whorl-quilt.webp",
      "description": "Hundreds of fine dashed line-whorls comb around a single vortex focus pushed off toward one frame edge. Each concentric ring is walked as a chain of short tangential dashes split by hairline gaps of the glowing ground, and a coherent low-frequency noise field drifts neighbouring rings together so the field bundles and relaxes like combed fibre without ever crossing. Every dash takes a flat colour from a coarse polar checkerboard mosaic concentric with the flow: square-ish cells alternate a dark and light tone of a hue family that itself wanders smoothly across the sheet — big cobalt and periwinkle regions giving way to magenta, pink and violet — while scattered accent dashes flash chartreuse, cream and coral sparks, denser away from the eye. Ten params (seed, ring spacing, line weight, dash length, dash gap, patch size, ring drift, focus offset, checker contrast, accent sparks) with a new shared Whorl Quilt palette.",
      "texture": "/assets/lumen-logic/textures/whorl-quilt.ktx2",
      "preview": "/assets/lumen-logic/previews/whorl-quilt.webp",
      "card": "/assets/lumen-logic/cards/whorl-quilt.jpg",
      "palette": [
        "#c6b0d3",
        "#eac5d7"
      ]
    },
    {
      "id": "windswept",
      "title": "Windswept",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/windswept.webp",
      "description": "A wall of fine streamlines combed out from the left edge that drift rightward through a noise flow field. They begin laminar and tightly stacked, then fray into swirling, overlapping turbulence downstream — like hair caught in a gust or smoke pulled across a still room. Interleaved warm ambers, rust reds, and cool teals over deep black.",
      "texture": "/assets/lumen-logic/textures/windswept.ktx2",
      "preview": "/assets/lumen-logic/previews/windswept.webp",
      "card": "/assets/lumen-logic/cards/windswept.jpg",
      "palette": [
        "#444331",
        "#070705"
      ]
    },
    {
      "id": "wireframe",
      "title": "Wireframe Relief",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/wireframe.webp",
      "description": "A mathematical surface z = f(x, y) — sinc ripples, Gaussian hills, plane-wave dunes or a decaying eggbox — drawn as a classic hidden-line ridge plot: surface rows rendered back to front in pseudo-perspective, each polyline filled below with opaque page colour before stroking, so near ridges cleanly occlude far ones. Retro computational graphing as wall art.",
      "texture": "/assets/lumen-logic/textures/wireframe.ktx2",
      "preview": "/assets/lumen-logic/previews/wireframe.webp",
      "card": "/assets/lumen-logic/cards/wireframe.jpg",
      "palette": [
        "#f5efe6"
      ]
    },
    {
      "id": "wiring",
      "title": "Wiring",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/wiring.webp",
      "description": "Dense circuit-board and transit-map style art built from a seeded BSP subdivision of the canvas. Each rectangular cell is filled with nested rounded rectangles in a muted multi-colour palette, and short connector lines bridge adjacent cell boundaries to create a rich schematic aesthetic.",
      "texture": "/assets/lumen-logic/textures/wiring.ktx2",
      "preview": "/assets/lumen-logic/previews/wiring.webp",
      "card": "/assets/lumen-logic/cards/wiring.jpg",
      "palette": [
        "#f3f1ed"
      ]
    },
    {
      "id": "woven-patchwork",
      "title": "Woven Patchwork",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/woven-patchwork.webp",
      "description": "A binary-space-partitioned canvas divided into irregular rectangles, each filled with a solid palette colour and overlaid with horizontal, vertical, or grid lines that carry a subtle hand-painted wobble via smooth noise domain warping. The result resembles a woven textile sampler or a quilted tapestry of coloured fabric panels.",
      "texture": "/assets/lumen-logic/textures/woven-patchwork.ktx2",
      "preview": "/assets/lumen-logic/previews/woven-patchwork.webp",
      "card": "/assets/lumen-logic/cards/woven-patchwork.jpg",
      "palette": [
        "#5185c3",
        "#6b45db",
        "#b33f84",
        "#b128d3",
        "#ff4c82",
        "#c5a028"
      ]
    },
    {
      "id": "woven",
      "title": "Woven",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 90,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/woven.webp",
      "description": "Simulated loom weave with physically correct over-under thread crossing. Supports plain, twill-2, twill-3, and satin-4 weave patterns. Warp and weft threads draw from a jewel-tone palette with shadow gradients at crossings.",
      "texture": "/assets/lumen-logic/textures/woven.ktx2",
      "preview": "/assets/lumen-logic/previews/woven.webp",
      "card": "/assets/lumen-logic/cards/woven.jpg",
      "palette": [
        "#65472f",
        "#394c46"
      ]
    },
    {
      "id": "yarn-coil",
      "title": "Yarn Coil",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/yarn-coil.webp",
      "description": "A Huichol-style yarn painting: the plane is partitioned into irregular polygon cells whose density rises toward the edges, so a few large facets fan out from the centre while a dense frame of small cells rings the border. Each cell is packed with concentric offset outlines of its own shape — the pressed-yarn coil — spiralling inward to a single eye. Coils are one saturated hue per cell (pink, cobalt, navy, peach, orange, violet) with occasional cream or neighbour-hue strands, and the black ground shows through every gap as an outline.",
      "texture": "/assets/lumen-logic/textures/yarn-coil.ktx2",
      "preview": "/assets/lumen-logic/previews/yarn-coil.webp",
      "card": "/assets/lumen-logic/cards/yarn-coil.jpg",
      "palette": [
        "#2f1c23"
      ]
    },
    {
      "id": "zebra-scaffold",
      "title": "Zebra Scaffold",
      "artist": "Lumen & Logic",
      "medium": "Generative algorithm, archival pigment print",
      "widthCm": 60,
      "heightCm": 90,
      "kind": "image",
      "source": "artworks/lumen-logic/zebra-scaffold.webp",
      "description": "A tumbling scaffold of open quadrilateral frames, each side a thick tube wrapped in crisp black-and-white bands like a striped straw, with white ball joints at the corners, round-capped ends and the odd stub leg ending in a black ferrule. Every frame carries a flat faceted panel — its quad fractured into hard-edged triangles in light and dark shades of one vivid pop hue, like crumpled paper — and frames painted panel-then-tubes in sequence interleave into a dense ragged-edged tangle on warm cream, tubes vanishing behind later panels and re-emerging beyond them.",
      "texture": "/assets/lumen-logic/textures/zebra-scaffold.ktx2",
      "preview": "/assets/lumen-logic/previews/zebra-scaffold.webp",
      "card": "/assets/lumen-logic/cards/zebra-scaffold.jpg",
      "palette": [
        "#e1c3ca",
        "#8d817f",
        "#b9b8c0",
        "#f0ecdf"
      ]
    }
  ],
  "rooms": [
    {
      "id": "atelier",
      "name": "Atelier",
      "url": "/assets/templates/atelier.glb",
      "capacity": 9
    },
    {
      "id": "atrium-ramp",
      "name": "Atrium Ramp",
      "url": "/assets/templates/atrium-ramp.glb",
      "capacity": 22
    },
    {
      "id": "brandenburger-tor",
      "name": "Brandenburger Tor",
      "url": "/assets/templates/brandenburger-tor.glb",
      "capacity": 10,
      "experimental": true
    },
    {
      "id": "cathedral",
      "name": "Cathedral",
      "url": "/assets/templates/cathedral.glb",
      "capacity": 10
    },
    {
      "id": "gallery-hall",
      "name": "Gallery Hall",
      "url": "/assets/templates/gallery-hall.glb",
      "capacity": 16
    },
    {
      "id": "granary-loft",
      "name": "Granary Loft",
      "url": "/assets/templates/granary-loft.glb",
      "capacity": 368
    },
    {
      "id": "kunsthalle",
      "name": "Kunsthalle",
      "url": "/assets/templates/kunsthalle.glb",
      "capacity": 25
    },
    {
      "id": "loft",
      "name": "Loft",
      "url": "/assets/templates/loft.glb",
      "capacity": 12
    },
    {
      "id": "manhattan-loft",
      "name": "Manhattan Loft",
      "url": "/assets/templates/manhattan-loft.glb",
      "capacity": 16
    },
    {
      "id": "pavilion",
      "name": "Pavilion",
      "url": "/assets/templates/pavilion.glb",
      "capacity": 10
    },
    {
      "id": "salon",
      "name": "Salon",
      "url": "/assets/templates/salon.glb",
      "capacity": 12
    },
    {
      "id": "salt-flat",
      "name": "Salt Flat",
      "url": "/assets/templates/salt-flat.glb",
      "capacity": 6,
      "experimental": true
    },
    {
      "id": "times-square",
      "name": "Times Square",
      "url": "/assets/templates/times-square.glb",
      "capacity": 10,
      "experimental": true
    },
    {
      "id": "tour-eiffel",
      "name": "Tour Eiffel",
      "url": "/assets/templates/tour-eiffel.glb",
      "capacity": 10,
      "experimental": true
    },
    {
      "id": "townhouse",
      "name": "Townhouse",
      "url": "/assets/templates/townhouse.glb",
      "capacity": 21
    },
    {
      "id": "underpass",
      "name": "Underpass",
      "url": "/assets/templates/underpass.glb",
      "capacity": 18
    },
    {
      "id": "void",
      "name": "Void",
      "url": "/assets/templates/void.glb",
      "capacity": 7
    },
    {
      "id": "walksches-haus",
      "name": "Walksches Haus",
      "url": "/assets/templates/walksches-haus.glb",
      "capacity": 10,
      "experimental": true
    }
  ]
}