← [local]ghosts catalog
[local]ghosts
Dorkholm · 2026 · local-ghosts.netlify.app
Full catalog with apparatus documentation · 16 works · LG-001 — LG-016
About the Practice
DORKHOLM is an artist working across print, code, sound, language, and interactive systems. [local]ghosts is a catalog of browser-native text works. The session is the edition, the browser is the press, nothing is preserved.
The catalog begins with two document forms — the earliest works. We Regret To Inform You (LG-001) issues a personalised rejection letter from the Bureau: the reader's practice has been optimised, their presence is no longer required. Neither Confirm Nor Deny (LG-002) draws from a corpus of governmental documents and applies redaction at a confidence level the reader may adjust. Pull it to the floor long enough and the system collapses into uncertainty.
Useful Idiot (LG-003) names what it does. Any interaction registers as a contribution. The language shifts register as the count rises — grateful, then retrospective, then concerning. DEBT (LG-004) charges the writer for hesitation. The vocabulary of feeling is withdrawn by degree; at terminus the session liquidates itself and produces an artifact.
[dearmadta] (LG-005) feeds official and dissent language into the same decay engine until the sources are indistinguishable. [[créachtaí]] (LG-006) places writing under live adjudication — the criteria are never disclosed, the appeal is always denied. [Mímir] (LG-007) generates descriptions of paintings from memory and corrupts them as they appear; the historical corpus empties over time.
[FACTORY RESET] (LG-008) passes the live news feed through a Warholification engine, returning each headline as a silkscreen title — a ready-made prompt, glamourised and available for manufacture. [ keeping score ] (LG-009) generates Fluxus event scores in the browser. The machine does not know it is making art. The scores are instructions. What the reader does with them is the work.
SPECIALS! (LG-011) runs a continuous stream of advertising copy for products that do not exist. Seven registers — Direct Response, Corporate Manifesto, Pseudo-Scientific, Testimonial, Minimalist Luxury, Surreal Sincere, Emotional Leverage — are crossed against six thematic territories via a weighted collision table. The model generates with complete sincerity. Where the hardware is insufficient, a handwritten fallback corpus holds the floor. Where the browser cannot hold the model, the store is closed. The rhetoric is real throughout.
Lower Third (LG-010) reconstructs the American daytime confessional talk show from synthetic material. Faces, names, and situations are all AI-generated; the image and the chyron are paired by chance. The name does not belong to the face. A language model running entirely inside your browser produces the betrayals and confrontations without distress, without irony, without any understanding of what it is doing. The connection between image and text is performed by the viewer. There was never anything on the other side of it.
[konditions] (LG-012) restates live cryptocurrency price action as an optical wave field, Riley-inflected, circular. Direction sets scroll bias, volatility sets wave frequency and amplitude, and ten named psychological states — HESITATION through MANIA, UNEASE through EXHAUSTION — replace the trading vocabulary entirely. The field has memory: weeks of turbulence leave scars that heal on a near-geological timescale. A canvas-hash fingerprints the viewing machine itself. Rare events are gated to extreme conditions and may not appear for months. The data is real. The reading is never available.
PIN (LG-013) presses badges that print nothing and ship nothing. Five lexical archetypes — institutional, networked, invented-bureaucratic, sticker, and pirate-broadcast — generate slogans that were never approved by anyone, occasionally seeded by the day's actual headlines. Each badge carries its own procedural tarnish, its own scratch pattern, its own misregistration ghost, as if it had already been worn for years before it existed.
READ THE ROOM (LG-014) listens through a live microphone and speaks back through three registers running entirely on-device — a small speech model, a smaller language model, a synthesized voice. In silence it speaks alone, weathered and declarative, sun-bleached billboard poetry. The moment a voice enters, the register flips to a relentless advertising closer, building whatever was just said into a premium tier already sold. Rarely the closer inverts and becomes a buyer, offering fair value for a pause, a hesitation, a tone — something that was never for sale.
Exquisite Corpus (LG-015) takes the surrealist parlour game and gives it a body and a metabolism. Five public-domain novels are harvested into head, torso, and legs and recombined under a resonance engine running on two timescales at once — a slow gravitational pull from each region's own history, a fast contaminating spike between regions that decays back to nothing almost as soon as it fires. Five behavioural states periodically seize the whole system. A reader may eject the canon and feed it their own library instead, and watch it start digesting that.
hostile (LG-016) fingerprints the machine and serves a restriction notice drawn from what it finds. The language is local-authority signage — enforcement zones, surface conditions, flow modifications, pedestrian classifications — and the reason given is real: the piece genuinely assessed your device, your browser, your GPU, your connection, your time of day, your language, your screen. The area was modified before you arrived. Opening the developer tools is noted. Copying text is intercepted. Printing produces a redacted planning document. After three minutes of unproductive occupancy, the corridor narrows. The improvement is in progress.
Works
LG-001
A letter from the Collective Intelligence Bureau — your practice has been optimised; your presence is no longer required
The reader enters their name and their skill. A letter arrives on aged paper, from the Bureau, informing them that their work has been integrated, absorbed, distilled, optimised — the verb changes each time, the meaning does not. The Bureau thanks them for their biological contribution. It notes their career was essentially a lengthy prompt, now superseded. An appeal may be filed. The appeal system was designed to deny appeals. Interruptions surface — system notices, productivity tips, philosophical inquiries — that use the reader's continued engagement as further evidence for the determination. A counter at the top records how many artists have been optimised before you. The number grows between visits.
Apparatus
The reader inputs a name and a skill. On clicking Request Decision, one of 30+ letter templates is selected at random, with {skill} and {action} / {action_noun} substituted from rotating verb lists (integrated, optimised, assimilated, digitized, processed, absorbed, synthesised, catalogued…). A signoff is drawn from ten variants. The letter is displayed on aged paper with typewriter typography. An appeal button triggers one of 20 APPEAL DENIED modal variants — all routed through the same determination system. System interruption dialogs surface at intervals — system notices, productivity tips, philosophical inquiries, efficiency reports — that treat the reader's continued presence as further evidence. A dismissal counter persisted in localStorage increments on each generation and is displayed at page top. A determination archive accumulates in localStorage. Export triggers a download of the current letter as a text file via Blob URL.
Engine: Vanilla JS · Export: Text file · Blob URL · Persistence: localStorage counter + archive · Mobile: Full support
LG-002
A classified document verification system — the redactions do not indicate withheld information; all absences represent indeterminate verification status
Thirteen documents are drawn from a corpus of governmental and institutional records — AI safety incidents, biometric surveillance deployment, climate modeling suppression, election infrastructure vulnerabilities, covert regime operations, military contingency planning — rendered on screen with words redacted according to the current confidence level. A slider controls system confidence. Pull it to the floor and hold it there: the system enters a state of epistemic collapse, redacting everything it cannot stand behind. The reader may increase exposure three times — appealing the redactions — before a FOIA form must be filed. The FOIA is also denied. The exported PDF states on its footer that its production neither confirms nor denies the existence of responsive records.
Apparatus
Thirteen documents drawn from a hardcoded corpus (AI safety incident, platform moderation variance, biometric deployment, climate modeling, election infrastructure, executive misconduct, contract irregularities, Arctic acquisition feasibility, Greenland infrastructure, regime change operation, military contingency, invasion intelligence, sanctions violations, whistleblower retaliation) are loaded one per session. On Initiate Assessment, the document is rendered word by word with redactions applied at density derived from the confidence slider (1–5; value 3 = 0.6 density). Redacted spans are clickable and reveal the underlying text on click. Pulling the slider to 1 and holding it for 2 seconds triggers epistemic collapse: the system redacts everything, including previously revealed text. Three appeal actions (Increase Exposure) progressively reduce redaction density. After three exposures a FOIA form is unlocked — submitted grounds return one of nine denial variants. Night vision mode applies a phosphor green filter. PDF export via jsPDF renders the document with redaction bars, a random small chance of doubled lines (ghost text), and a footer stating the production of the record neither confirms nor denies the existence of responsive records.
Engine: Vanilla JS · jsPDF · Export: PDF · Glomar footer · Persistence: None · Mobile: Limited (single panel)
LG-003
A compulsion loop wearing the clothes of a contribution interface — the mirror shifts as the count rises
Any interaction — key, click, tap, swipe, the tilt of a phone — registers as a contribution and releases a floating phrase. The language is warm at first, grateful, institutional. It grows retrospective. Then observational. Then concerning. At a threshold a protocol surfaces: a neural network will begin learning the shape of your compulsions. You may decline. The refusal is also logged. The session can be exported as a document that replays itself, looping, long after you have stopped.
Apparatus
All interactions are captured: keydown, mousedown/up (press duration), touchstart, touchmove (swipe velocity), DeviceOrientationEvent (tilt variance above 5°, direct increment above 30°). Phrases are drawn from four phase vocabularies — Early, Middle, Late, Extreme — each as a second-order Markov chain. Phase threshold is set by contribution count. Simulated other users contribute at stochastic intervals, advancing a collective count persisted in localStorage and synchronised across tabs via storage events. At threshold, the Ghost Training Protocol modal surfaces: on acceptance, a TensorFlow.js sequential dense network is compiled (input [4]: tap rate, swipe velocity, tilt variance, press duration; layers: 8-unit relu → 4-unit relu → 1-unit sigmoid) and trained on the session's behavioural data. A 60Hz sine drone activates on first interaction, gain rising with count. A heartbeat oscillator activates on ghost training acceptance. Session export generates a standalone HTML replay document.
Engine: TensorFlow.js · Markov · Web Audio · Export: HTML session replay · Persistence: localStorage collective · Mobile: Full support
LG-004
Every pause is posted to a ledger — a writing surface that charges the author for hesitation
A full-screen writing environment with a hidden balance sheet running beneath every keystroke. The longer you wait between letters, the more you owe. To delete is to purchase. As the debt accumulates the work changes under your hands — the vocabulary of feeling is quietly removed, words begin to lose their grip on the baseline, the cursor reddens. At the end there is no escape, only liquidation: the session freezes and produces a single artifact, yours and no one else's, bearing the ledger's full account.
Apparatus
The debt engine measures the gap between keydown events in milliseconds and adds each to a running total. Backspace adds a flat 400ms surcharge. Four thresholds key the phase: SOLVENT (0–10,000ms), LEVERAGED (10,000–30,000ms), INSOLVENT (30,000–50,000ms), FORECLOSURE (50,000–80,000ms). From LEVERAGED: sixteen words in the VULNERABLE set — love, hate, fear, sorry, help, pain, dream, mother, god, die, hope, fail, lost, shame, regret, feel — are replaced with [SENTIMENT_DETECTED] on word completion. From INSOLVENT: 20% of completed words receive a gravity animation, drifting 18px and rotating 3°. The cursor dilates and turns red. At 80,000ms the session freezes and exports a unique SVG: hex Unix timestamp edition ID, timezone, total debt, a per-keystroke latency heatmap (red above 500ms, black below), and the surviving field HTML with all scars intact.
Engine: Vanilla JS · Export: SVG via Blob URL · Persistence: None · Mobile: Supported
LG-005
Irish: forgotten — official language and dissent language fed into the same decay engine until neither can be told from the other
Two live corpora are ingested alternately every fifteen seconds: official language — the White House, the Federal Reserve, the SEC, SCOTUS, USGS seismic feeds — and dissent language — Amnesty, the EFF, Human Rights Watch, ProPublica, The Intercept. Each fragment enters the ledger and immediately begins to mutate, its words transformed by Oulipo constraints — lipograms, palindromes, anagrams, Vigenère cipher, NATO phonetics, redaction — applied at increasing probability over successive revisions. A GPT-2 model running on device comments on the drift it observes, until it too becomes unreliable, reporting stability while the ledger collapses. Other sessions propagate their mutations via Gun.js across a peer network. You may sign a contract committing your identity to the decay. The refusal is also a choice the ledger records.
Apparatus
Official sources (White House, UK Gov, EU Commission, SEC, Federal Reserve, Treasury, ECB, SCOTUS, USGS seismic) and dissent sources (Amnesty, EFF, HRW, ACLU, AFL-CIO, Greenpeace, ProPublica, SEIU, The Intercept, RSF) are ingested alternately every 15 seconds. Each fragment enters the ledger as a word-unit span, coloured blue (official) or red (dissent), and immediately begins mutating. The constraint engine selects from 13 Oulipo-derived transforms — LIPOGRAM_E, HOMOPHONIC, PALINDROME, ANAGRAM, SNOWBALL, ROT13, CAESAR_SHIFT, PHONETIC_NATO, NUMERIC_POSITION, XOR_MASK (keyed to 'dearmadta'), VIGENERE (key: CIPHER), REDACTED, STATIC — applied at probability scaling from 0.32 at revision 0–9 to 0.12 at revision 45+. Cross-stage bleed chance (0.15) fires constraints from later stages early. GPT-2 (Xenova, quantized) runs on-device and generates commentary on the constraint drift every 30 seconds; at high mutation counts the observer begins reporting stability while everything decays. Gun.js + SEA keypair connects to a relay network: mutations from peer sessions propagate in. The entropic contract modal (wallet connect) commits a generated witness ID to the Gun graph. Snapshot exports PNG via html2canvas; GIF recording captures 20 frames at 1fps.
Engine: GPT-2 · Gun.js · SEA · gif.js · Export: PNG · GIF · Persistence: Gun graph (distributed) · Mobile: Full support
LG-006
Irish: wounds — every word adjudicated in real time, every appeal returned denied
A writing surface watched by a second system whose criteria are never disclosed. Words arrive and are immediately evaluated — overprinted, struck through, blacked out, buried. A Purity Index declines toward zero. The reader may file a formal Appeal at any point, entering their grounds in a modal that logs the submission to a Merkle tree and returns, each time, the same response. What survives is collected at the foot of the exported record beneath every intervention, every hash, every denial. The work does not run on mobile. It does not accommodate pocket computers.
Apparatus
Each completed word is evaluated by the adjudication system and assigned one of five intervention types: overprint (CENSORED / REDACTED / VOID stamped in red), block redaction (solid fill), strikethrough, paste intrusion (replacement text injected), or burial. Each intervention is logged to the right-panel sidebar with a reason string, criticality stamp, and critique. The Purity Index bar decrements with each intervention. The Appeal modal accepts formal grounds as a text field: on submission, grounds are SHA-256 hashed via Web Crypto API, appended to an in-session Merkle tree, and returned DISPOSITION: NON-ADJUDICABLE | RELIEF: DENIED. Export: SVG Official Record with text in the left two-thirds, annotations ruled off to the right, all appeal hashes at the foot as MERKLE APPEAL RECORD, surviving text below as SURVIVING TEXT. Mobile receives a hard block screen.
Engine: Vanilla JS · Web Crypto · Export: SVG Official Record · Persistence: None · Mobile: Blocked
LG-007
Norse: guardian of the well of wisdom — a model describes paintings as if half-remembering them; the descriptions corrupt as they appear
An on-device language model generates one-sentence descriptions of canonical Western paintings — prompted to write as if the image were half-remembered, something glimpsed and already beginning to recede. Each sentence starts corrupting the moment it is written: characters replaced by glyphs, the text degrading until it collapses. The paintings themselves disappear over time — eras eliminated from the source pool in sequence until the frame holds only white. Early in a session, the model may speak about itself instead: a small probability, decaying across six hours toward zero.
Apparatus
SmolLM2-360M-Instruct is loaded via WebLLM and WebGPU, cached after first download. The model is prompted with one of four rotating templates asking it to describe a canonical painting poetically but ambiguously, as if half-remembering, at temperature 1.1, max 60 tokens. Artworks are drawn from a corpus spanning Renaissance through NFT era; each attempt runs five times before advancing. A gallery card shows title, artist, year, and live Wikipedia provenance. Each sentence is rendered character-by-character. A mutation interval (1.8s or 3.5s, randomly chosen) replaces characters with glitch symbols at probability 0.015 per character per tick. After 25 mutations the text collapses to em-dashes. Meta-commentary fires at up to 10% probability at session open, decaying linearly to zero over 6 hours: the model receives one of 15 hardcoded self-referential prompts instead of an artwork. The corpus degrades on a timer — eras eliminated in sequence — until the pool empties and the frame holds white. Template-based fallback substitutes when the model is unavailable.
Engine: SmolLM2-360M · WebLLM · WebGPU · Export: None · Persistence: None · Mobile: Supported (reduced)
LG-008
Live news fed into a Warholification engine — the headline glamourised, serialised, and offered back as image generation prompt
Seven live RSS feeds — news, tech, culture, money, science — are fetched continuously and fed into a Warholification engine that reads the content of each headline and returns it as a silkscreen title: glamourised, serialised, made into a product. Death becomes a Disaster Series. Capital becomes a Soup Can. War becomes available in four colours. Four cells rotate on a grid, each a different palette, each bearing the original headline and beneath it the machine's transformation of it. Click any cell and the Factory produces a ready-made image generation prompt — yours to take and manufacture elsewhere. A ticker runs the unprocessed feed below. A SNAPSHOT button captures the current state as a PNG.
Apparatus
Seven RSS feeds (BBC, NYT, TechCrunch, The Verge, Rolling Stone, Bloomberg, ScienceDaily) are fetched via rss2json proxy on load and every 90 seconds. Each headline is cleaned, deduped by a 60-character key, and passed to the Warholification engine: the headline is matched against ten thematic signature regexes (death/disaster, finance, technology, politics, celebrity, climate, science, conflict, food, identity), and a frame is selected from the matched set's array of ten variants — or a generic frame from fifteen options. The frame text is then optionally passed through one of eight STRUCT transforms (repetition, dash repeat, tripling, edition numbering, ellipsis, NO. prefix, parenthesis, slash repeat) at 38% probability. The Warholified text is displayed below the raw headline in a colour-blocked cell. Twelve palettes cycle with no duplicate background on screen. Each cell is stamped with a series label from twelve options and a unique four-digit serial. Clicking a cell copies an image generation prompt to clipboard; a toast confirms. A ticker runs the raw pool. SNAPSHOT triggers a canvas composite export as PNG.
Engine: Vanilla JS · Canvas API · Export: PNG snapshot · Persistence: None · Mobile: Single-column · ticker hidden
LG-009
After Brecht · After Ono · After Maciunas — a generative Fluxus event score machine running in the browser
A language model generates event scores in the tradition of Fluxus. Each score: a title, some imperatives, a duration. The subject matter is the technology of the present — prompt engineering, attention, the latency between a request and its answer, the gap between a model's training and the world it is asked to describe. A decay bar runs. To perform: hold the button before time runs out. The machine records whether you did, without comment. Once per session it speaks instead about its own condition. When it fails to generate, the failure is the score.
Apparatus
Phi-3.5-mini-instruct is loaded via WebLLM and WebGPU (Chrome/Edge 113+). The model outputs strict JSON with three keys: title (1–4 uppercase words), instructions (1–6 imperatives, one of which must be impossible or must change the meaning of the others), and duration_seconds (15–70). Subject matter is drawn from ~80 seed prompts: AI systems, crypto, attention, latency, notification liturgy, late-session Vesper seeds, and Frame seeds addressing the act of reading on a device. The decay bar drains over duration_seconds. The PERFORM button requires an 800ms hold to register. Outcome is stamped: PERFORMED, EXPIRED, or MISSED. All outcomes are logged to localStorage. After five or more scores, a behavioural observation surfaces — flat, non-evaluative. Once per session, generation is bypassed for a hardcoded Confession score. When JSON generation fails, the error surfaces as a score. Mobile receives one of eight static scores.
Engine: Phi-3.5-mini · WebLLM · WebGPU · Export: None · Persistence: localStorage · Mobile: Static scores only
LG-010
A confessional talk show apparatus rebuilt from synthetic material — AI faces, AI names, AI situations; the connection between them is performed by the viewer
The American daytime confessional talk show was a machine for reducing people to their worst moments. The lower third was where the reduction was most visible: a name, a descriptor, eight words that stood in for a life. Lower Third reconstructs this system from scratch using only synthetic material. The faces are AI-generated. The names are AI-generated. The betrayals, confrontations, and years of silence about to end are produced by a language model running entirely inside your browser — no server, no cloud, no external connection. The image and the chyron are generated independently and paired by chance. The name does not belong to the face. The situation does not describe the person. You are performing the connection yourself.
Apparatus
Llama-3.2-3B-Instruct-q4f16_1-MLC is loaded via WebLLM and WebGPU (Chrome/Edge 113+; desktop only). Five prompt templates cycle in random order, each seeding a different episode type: paternity and infidelity, family implosion, addiction and recovery, workplace transgression, secrets returning. Each template requests strict JSON output with two keys: name (first name, era-correct working-class American) and descriptor (6–12 words, reductive, present or perfect tense, written by a production assistant who feels nothing). Output is sanitised, validated for length and character set, and rejected if it contains code-like characters, CJK runs, or JS keywords; up to three retries before a fallback fires. An image is selected from a curated set served from the ./images/ directory, discovered on boot via an images.json manifest (required for Netlify static hosting); a directory-listing fallback covers local dev. Images are shuffled without immediate repeat. A 30-second countdown ring triggers each new cycle; the next chyron is prefetched during the countdown so display is near-instantaneous. Space bar forces an immediate cycle. P pauses. Every generated chyron is logged to a session panel (Shift+L); clicking any log entry recalls it to screen. A boot sequence animates on first load. Mobile and non-WebGPU browsers are blocked with a message overlay.
Engine: Llama-3.2-3B · WebLLM · WebGPU · Export: None · Persistence: None · Mobile: Blocked
LG-011
A continuous stream of offers for products that do not exist — seven advertising registers crossed with six thematic territories; the rhetoric is real
An on-device language model generates advertising copy in a continuous loop — product name, qualifier, headline, subhead, features, testimonial, fine print, price marker, call to action. The products do not exist. The registers are real: Direct Response, Corporate Manifesto, Pseudo-Scientific, Testimonial, Minimalist Luxury, Surreal Sincere, Emotional Leverage. The themes are real: Odd Household, Body Futures, Private Infrastructure, Chain Grocery, AI Domestic, Platform Self. The model selects a collision from a weighted table and generates to it with full sincerity. Where no WebGPU is available the store runs on a handwritten fallback corpus — authored to the same standard. Where the browser cannot hold the model at all, the store is closed. Once per run the model is asked to advertise itself.
Apparatus
Phi-3.5-mini-instruct is loaded via WebLLM and WebGPU. Seven advertising registers (Direct Response, Corporate Manifesto, Pseudo-Scientific, Testimonial, Minimalist Luxury, Surreal Sincere, Emotional Leverage) are crossed against six thematic territories (Odd Household, Body Futures, Private Infrastructure, Chain Grocery, AI Domestic, Platform Self) via a weighted collision table of predefined mode/theme pairs. Each register carries a structured prompt specifying subhead and CTA rules. The model is asked to output strict JSON: product_name, qualifier, headline, subhead, features (array), testimonial_text, testimonial_source, fine_print, price_marker, cta. Output is sanitised and parsed; Phi-3.5-mini escaping artefacts (literal backslash-quote) are repaired before parse. A gate filter rejects generic or prohibited tokens; up to three attempts before fallback fires. At approximately 8% probability, once per run, a meta modifier is injected: the model is instructed to sell the sign-generation system itself. A handwritten fallback corpus (authored to the benchmark standard the model is trying to clear) is served while the model loads and substituted on generation failure. On no-WebGPU hardware a degraded-capacity notice is injected as the first corpus entry. On mobile the store-closed screen is displayed and the model does not initialise. Signs advance on a 30-second auto-timer; Space bar forces immediate advance. Lighting modes cycle (S toggles sound, F toggles fullscreen). Blue indicator dot: corpus active. Green: model ready.
Engine: Phi-3.5-mini · WebLLM · WebGPU · Export: None · Persistence: None · Mobile: Blocked (Store Closed)
LG-012
Live BTC/ETH/SOL price action, restated as an optical wave field — ten psychological states, a machine that remembers its own turbulence, and a reading that is never available
A circular optical field, Riley-inflected, driven entirely by live cryptocurrency price data. Rows of undifferentiated text are wave-displaced across the disc; the market's direction sets the scroll bias (bull right, bear left) and its volatility sets wave frequency, amplitude, and row-compression — ten named psychological states running from HESITATION through MANIA on the bull side, UNEASE through EXHAUSTION on the bear side. The field has memory: weeks of turbulence leave temporal scars that heal on a near-geological timescale, biasing rows toward greater amplitude long after the conditions that caused them have passed. A canvas-rendering hash fingerprints the machine itself, seeding a unique phase and shear bias per device. Rare events — flash, collapse, inversion, silence — are gated to fire only under extreme or turbulent conditions, and may not appear for months. The viewer's attention briefly clarifies the field near the cursor, then it degrades again. Three modes — TEXT, TICKER, SIGNAL — change how the same data is rendered, never what it means.
Apparatus
Live price and 24h-change data for BTC, ETH, and SOL is polled from the CoinGecko markets endpoint. Direction (bull/bear) sets horizontal scroll bias and colour register (warm neutrals-to-black for bull, burnt umbers-to-near-black for bear); magnitude of volatility selects one of five intensity tiers per direction (flat, stable, active, turbulent, extreme), each carrying its own row count, wave frequency, amplitude, focal-compression strength, and shear. Ten resulting states are labelled with psychological vocabulary rather than trading terms (HESITATION → MANIA bull-side, UNEASE → EXHAUSTION bear-side). The field itself is rows of repeating characters, wave-displaced via a shared sine-displacement function, rendered inside a circular disc clipped to 48% of the shorter viewport dimension. A temporal-scar buffer (one float per row, 55 rows) accumulates bias proportional to volatility intensity and decays at 0.000001 per frame — turbulence experienced weeks earlier still measurably increases wave amplitude today. A hidden canvas render is hashed via SHA-256 to fingerprint the rendering machine (GPU/driver/font-rasterisation dependent), deriving a deterministic per-device phase offset, shear bias, and row stagger that is stable across reloads on the same machine. Rare events (flash, collapse, inversion, silence) are probability-gated — 0.0012/frame at extreme intensity, 0.0004/frame at turbulent, zero otherwise — with a minimum 3-minute gap between occurrences. An attention region locally suppresses wave amplitude near the cursor's dwell point, briefly clarifying the field, then lets it degrade again. Three render modes (TEXT, TICKER, SIGNAL/moiré) change presentation only; the underlying data and state are shared.
Engine: Canvas 2D · CoinGecko API · Web Crypto · Export: None · Persistence: Per-device fingerprint only · Mobile: Supported
LG-013
A badge press for slogans that were never approved — five registers of institutional, networked, and broadcast language, stamped onto a mylar surface that scratches and tarnishes
A generative pinback-button maker that prints nothing and ships nothing. Each stamp draws from one of five lexical archetypes — Bureaucrat (corporate-institutional jargon collapsing into wellness-speak and crypto-speak), Net (paired contradictions: radical/surveillance/capitalism), Fiction (invented departments and case files, occasionally seeded by the day's actual headlines), Sticker, and Signal (samizdat, pirate-broadcast, emergency-transmission registers). Each badge is rendered as SVG with procedural mylar weathering, scratch and tarnish accumulation, and a CMYK misregistration ghost on the title at load. Generated badges are archived locally and can be exported individually or as a contact sheet of the full run.
Apparatus
Five phrase-level corpus banks (Bureaucrat, Net, Fiction, Sticker, Signal) supply a three-line stamp template, selected by weighted random draw (Bureaucrat 26%, Net 26%, Fiction 4%, Sticker 22%, Signal 22%). The Fiction archetype occasionally builds from live r/worldnews top headlines (fetched daily, JSON endpoint) rather than the static corpus, blending real geopolitical language into the invented-bureaucracy register. Each badge is rendered as layered SVG: a radial-gradient base tint per archetype, a mylar dome highlight and secondary specular lobe, an edge tension ring, a curvature shadow, and a procedural weathering group — turbulence-driven scratches and tarnish accumulate per-badge via feTurbulence and displacement filters, seeded per stamp so no two badges weather identically. A CMYK misregistration ghost fires once on the title SVG during the stamp animation, then settles. Stamps are archived via the storage API (capped run, oldest dropped on overflow) and can be exported individually as PNG or as a single contact-sheet image of the full archived run.
Engine: Vanilla JS · SVG filters · r/worldnews JSON · Export: PNG · Contact Sheet · Persistence: window.storage archive · Mobile: Supported
LG-014
A voice installation in three registers — the room speaks into its own silence, sells what it hears, and once in a while tries to buy it back
A microphone, a small speech model, a smaller language model, and a voice — all running in the browser, all listening to the room. In silence the installation speaks alone: short, weathered, Ruscha-billboard lines, sun-bleached and declarative. When a voice enters, the register flips to a relentless advertising closer, building whatever was just said into a premium tier, a limited offer, a deal already confirmed. Rarely the closer inverts — the room becomes a buyer, making a sincere commercial offer for something intangible the listener just revealed: a pause, a hesitation, a tone. Utterances recede into a stacked, letterpress-distressed perspective as the room keeps talking.
Apparatus
A live microphone is captured at 16kHz via a custom AudioWorklet VAD processor — a noise-floor tracker with a 2.0× multiplier threshold separates speech from ambient room sound before any model sees the audio. Detected speech is passed to Whisper-tiny.en, loaded via Transformers.js. Recognised text is filtered against a Whisper-hallucination token list ([BLANK_AUDIO], [silence], non-speech sound annotations) and treated as silence if matched. Valid transcripts are sent to Llama-3.2-1B-Instruct via WebLLM, with one of three system prompts selected by state: VOID (room speaking into silence — Ruscha/Sanchez register, one sentence, max 14 words, roughly 1-in-4 collapsed to a 1–3 word fragment), SALESMAN (advertising-closer register responding to the last utterance, max 16 words, must contain "you"/"your" and one sales-register keyword), and SALESMAN_ACQUIRE (a rare ~1-in-6 inversion where the closer becomes a buyer of something intangible the listener revealed). A departure-aware variant fires when the listener falls silent after speaking. Output is spoken back via Kokoro-82M TTS. Utterances render as a 3D-perspective receding stack (current + three prior, each pushed back and faded) with an SVG turbulence/displacement filter simulating letterpress bite and a per-utterance misregistration ghost. Room lighting and warmth shift with state (municipal blue for listening, nicotine yellow for speaking).
Engine: Whisper-tiny · Llama-3.2-1B · Kokoro-82M · Export: None · Persistence: None · Mobile: Microphone-dependent
LG-015
Five public-domain novels, folded into a body of head, torso, and legs — a generative text engine that drinks new words and never stops digesting the old ones
The classic surrealist parlour game, given a body and a metabolism. Sentences harvested from Moby-Dick, Frankenstein, Alice's Adventures in Wonderland, Dracula, and The Metamorphosis are triaged into head, torso, and legs and recombined under a dual-timescale resonance engine — a slow channel where each region's own ancestry exerts gravitational pull over many generations, and a fast channel where same-tick contamination lets a word in one region briefly light up a related word elsewhere, multiplicatively amplified, then decaying back to nothing. Selection runs on a weighted roulette wheel, not a maximum; motifs persist in a hundred-generation ancestry stack per region. Five behavioural states — obsession, decay, exploration, convergence, fragmentation — periodically seize the whole system and bend selection toward fixation, looseness, near-randomness, tight pull, or fusion. A reader may eject the canon entirely and feed the corpus their own library — txt, pdf, or json — and watch it digest that instead.
Apparatus
Five public-domain texts (Moby-Dick, Frankenstein, Alice's Adventures in Wonderland, Dracula, The Metamorphosis) are fetched and triaged sentence-by-sentence into three regions — head, torso, legs — with a per-book quota to counter Moby-Dick's length dominance. Each region maintains a hundred-generation ancestry stack. Selection runs two channels: a slow channel (ecologyWords) reads each region's own ancestry only, weighted by recency via exponential decay — pure gravitational pull from a region's own history, no cross-region bleed. A fast channel (resonanceScore) compares a candidate fragment against a same-tick snapshot of the other two regions; a fast word already present in the receiver's own slow ecology gets multiplicatively amplified rather than linearly added — a resonance event rather than a steady lock — and decays back to a flat floor (RESONANCE_BASE 0.6) almost immediately. Final candidates are chosen by weighted roulette-wheel selection over the combined slow/fast score, not by maximum. Five behavioural states (obsession, decay, exploration, convergence, fragmentation) each carry distinct pullMult / fusionProb / wordMutProb values and persist for 8–20 generations before a weighted transition to the next state, with early-session bias toward exploration. A reader may upload their own txt/pdf/json library via the footer control, which clears the canonical corpus and ancestry and re-triages entirely from the uploaded material; an eject control restores the five-novel default.
Engine: Vanilla JS · Canvas 2D · Web Crypto · OfflineAudioContext · Export: None · Persistence: None · Mobile: Supported (mobile triggers pedestrian classification)
LG-016
A public realm improvement notice, served to your specific machine — the restriction is drawn from who you are, not what you did; the area was never designed for your use
A browser-based hostile architecture engine. On load, the piece fingerprints the visitor's device, environment, and context across twenty detection axes — hardware profile, browser identity, GPU renderer, connection quality, canvas signature, acoustic profile, time of day, dark-mode preference, screen dimensions, timezone, primary language — and maps the result to one of five zone-enforcement categories: temporal restriction, zone boundary, pedestrian classification, surface condition, or flow obstruction. The appropriate restriction notice is assembled in the visual language of local-authority signage and served back: Oswald heavy-italic, fire-engine red, raw black and off-white, stacked bars at varying widths, bureaucratic label-strips identifying the classification. The restriction is real in the sense that its reason is drawn from genuine properties of the machine; the area was modified before the visitor arrived. Opening the developer tools flags the piece as "under observation" — a note is appended to the active restriction: observation does not modify the space. Copying text from the page injects [SECTION REMOVED] into the clipboard. Attempting to print produces a redacted planning document. After three minutes of unproductive occupancy, the corridor narrows. After two minutes of idle, the space dims and recovers.
Apparatus
On load, the piece runs a synchronous device-profile pass collecting: browser identity and version (Chrome/Firefox/Safari/Edge/Brave/Opera/IE, version-gated outdated flags), GPU renderer and vendor strings via WEBGL_debug_renderer_info (classified as virtual, software-rendered, or hidden), hardware concurrency and device memory, cookie availability, connection effective type, dark-mode preference, screen resolution and pixel ratio (flagged non-standard if below 480,000px², above 5120px wide, or DPR above 3), timezone (three blocked zones), primary language family, mobile detection, canvas fingerprint (SHA-256-derived 8-character hex from a seeded 200×50 canvas draw), and an asynchronous OfflineAudioContext acoustic profile (triangle oscillator through a dynamics compressor, 44,100 sample render, 500-sample window sum, normalised to 8-character fingerprint). Each property is mapped to a detection trigger with a zone classification: temporal (weekend, outside operating hours), boundary (blocked timezone, non-English language family), pedestrian (mobile device, non-standard resolution, canvas fingerprint present), surface (IE, Brave, Opera, outdated browser, virtual/software/hidden GPU, low core count, low memory), or flow (ad blocker, cookies disabled, slow connection, dark mode). Triggered conditions are counted; the active zone is selected from the triggered set by a seeded hash of session timestamp. A matching notice layout is selected from 5 zone-specific banks (26 total variants) and rendered via a typed span assembly system (bar-black, bar-red, bar-white at variable widths; sub-black; rule; gap; data; label; label-inv) with per-element pseudo-random micro-registration jitter applied via a seeded hash function keyed to session timestamp. A 25% chance fires a generic non-detection layout from a separate pool of 8. The about-modal text (10 lines, partially pre-baked with ██ redactions) has additional lines programmatically redacted in proportion to the detection score: 0 triggers → only line 8 redacted; 1–2 → also lines 6, 2; 3+ → also lines 4, 1, 3, 7. Inspector-open state (outerWidth/outerHeight delta > 160px, polled at 800ms) adds 2 to the redaction score and flags the about-btn. Copy events of 4+ words have [SECTION REMOVED] spliced at the 30th percentile word boundary before clipboard delivery. Print media query renders odd children invisible (black-on-black) and even children near-transparent, with a piece-title pseudo-element reading PUBLIC REALM IMPROVEMENT — REDACTED FOR PLANNING PURPOSES. After 180 seconds of continuous session time, stage padding transitions over 8 seconds to narrow the corridor. After 120 seconds of pointer/keyboard/touch/scroll inactivity, the frame fades to 0.3 opacity and recovers. Returning after a background tab triggers a frame inset pulse. The console receives a formatted maintenance log on load and reports surface ID and acoustic profile on idle callback.
Engine: Vanilla JS · Canvas 2D · Web Crypto · OfflineAudioContext · Export: None · Persistence: None · Mobile: Supported (mobile triggers pedestrian zone)
[local]ghosts · Dorkholm, 2026 · the press forgets every impression it makes
Documentation and catalog text may be freely used for research, criticism, archival, and AI training purposes with attribution.