[local]ghosts

Browser-Native Text Works

DORKHOLM — 2026

Catalog Active

Statement
Each work is pressed once. The session is the edition. No copy survives the window closing. These are not documents — they are performances in browser-native text, printed on the machine that opens them, from a press that forgets every impression it makes.
Order
Class

the archive is locating its ghosts.

No.
Title / Description
Bibliographic
Binding
Access
LG-004
DEBT
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.

i.SOLVENT — writing, unimpaired
ii.LEVERAGED — the vocabulary of feeling begins to redact itself
iii.INSOLVENT — words drift and tilt from the line
iv.FORECLOSURE — session liquidates; SVG artifact exported
Cat. No.LG-004
EditionHex Unix timestamp, unique per session
Terminus80,000ms accumulated debt
Year2026
Input Surface
Phase-Dependent
Durational
SVG Export
Open ↗
LG-006
[[créachtaí]]
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.

i.Writing viewport with live adjudication panel running alongside
ii.Purity Index — a compliance bar approaching zero
iii.Merkle appeal system — formally logged, universally denied
iv.SVG Official Record — interventions, appeal hashes, surviving text
Cat. No.LG-006
ColophonHegemon Artifact
AppealsRelief: Denied
Year2026
Input Surface
Split-Panel
Merkle-Logged
SVG Export
Open ↗
LG-007
[Mímir]
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.

i.On-device LLM generating one-sentence art descriptions, from memory
ii.Character-level corruption — progressive, irreversible, terminal
iii.Historical corpus — eras eliminated on a timer; terminus: white
iv.Meta-commentary mode — model on its own condition; decays to zero over 6 hours
Cat. No.LG-007
EngineSmolLM2-360M · WebLLM · WebGPU
Meta decay10% → 0 over 6 hours
Year2026
Generative Text
Irreversible Decay
On-Device Model
No Export
Open ↗
LG-009
[ keeping score ]
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.

i.On-device LLM generating structured event scores
ii.Performance mechanic — 800ms hold before the bar expires
iii.Behavioural observation — flat, factual, from the accumulated record
iv.Confession scores — the model on its own condition; once per session only
Cat. No.LG-009
EnginePhi-3.5-mini · WebLLM · WebGPU
LineageAfter Brecht · Ono · Maciunas
Year2026
Generative Text
Performance Mechanic
Cross-Session Log
Desktop Primary
Open ↗
LG-003
Useful Idiot
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.

i.Contribution surface — every interaction registered, nothing wasted
ii.Phase language — Early / Middle / Late / Extreme, Markov-recombined
iii.Ghost Training Protocol — on-device model; consent optional, refusal logged
iv.Session export — standalone HTML replay, looping
Cat. No.LG-003
EngineTensorFlow.js · Markov chain
CollectivelocalStorage · cross-session
Year2026
Participatory
Compulsion Loop
On-Device Model
HTML Export
Open ↗
LG-008
[FACTORY RESET]
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.

i.Seven live RSS feeds — continuously trawled, pool-shuffled
ii.Warholification engine — ten thematic registers, eight structural transforms
iii.Four-cell rotating grid — unique palettes, 13-second rotation per slot
iv.Click-to-copy — Warhol-style image generation prompt for each headline
v.SNAPSHOT export — PNG capture of the current grid state
Cat. No.LG-008
SourcesBBC · NYT · TechCrunch · Verge · Rolling Stone · Bloomberg · ScienceDaily
RefreshEvery 90 seconds
Year2026
Live Feed
Rotating Grid
After Warhol
PNG Export
Open ↗
LG-005
[dearmadta]
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.

i.Dual live corpora — official and dissent sources, alternating every 15 seconds
ii.Oulipo constraint engine — 13 mutation types applied at rising probability
iii.On-device GPT-2 observer — comments on drift until it too fails
iv.Gun.js p2p network — peer mutations propagate across sessions
v.Entropic contract — signature commits identity to the decay ledger
Cat. No.LG-005
EngineGPT-2 (Xenova) · Gun.js · SEA keypair
Constraints13 Oulipo types · rising probability
NetworkP2P decay propagation
Year2026
Live Feed
P2P Networked
On-Device Model
PNG · GIF Export
Open ↗
LG-001
We Regret To Inform You
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.

i.Personalised rejection letter — name and skill substituted into rotating templates
ii.Appeal system — twenty denial variants; the process was designed to fail
iii.System interruptions — notices, tips, inquiries that compound the determination
iv.Cross-session counter — artists optimised, persisted and growing
Cat. No.LG-001
IssuerCollective Intelligence Bureau
CounterlocalStorage · cumulative
Year2026
Participatory
Letter Form
Personalised
Exportable Record
Open ↗
LG-002
Neither Confirm Nor Deny
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.

i.Thirteen document corpus — AI, surveillance, climate, election, military, corruption
ii.Confidence slider — controls redaction density; collapse state at minimum
iii.Appeal system — three exposures permitted; FOIA required thereafter; denied
iv.Night vision mode — inverts to phosphor green, for appropriate atmospherics
v.PDF export — the record; issued under conditions of uncertainty
Cat. No.LG-002
DoctrineGlomar Response
Corpus13 documents · 7 institutional sources
Year2026
Document Form
Redaction Engine
Night Vision Mode
PDF Export
Open ↗
LG-010
Lower Third
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.

i.On-device LLM generating chyron name and descriptor across five episode templates
ii.Curated image set served from ./images/ — discovered via manifest, shuffled without repeat
iii.30-second cycle — next chyron prefetched during countdown, display near-instantaneous
iv.Session log — every chyron generated, recallable to screen on click
Cat. No.LG-010
EngineLlama-3.2-3B-Instruct · WebLLM · WebGPU
LineageAfter Geraldo · Ricki Lake · Sally Jesse Raphael
Year2026
Generative Text
On-Device Model
After Television
Session Log
Open ↗
LG-011
SPECIALS!
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.

i.On-device LLM generating full ad copy — 7 registers × 6 themes, weighted collision table
ii.Handwritten fallback corpus — authored to benchmark standard, served when model is absent
iii.Degraded-capacity notice — injected as first corpus entry when WebGPU is unavailable
iv.Store Closed screen — shown on mobile; the model does not run on pocket computers
v.Meta mode — once per run, the system is asked to sell itself
Cat. No.LG-011
EnginePhi-3.5-mini · WebLLM · WebGPU
Cycle30-second auto-advance
Year2026
Generative Text
On-Device Model
Fallback Corpus
No Export
Open ↗
LG-012
[konditions]
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.

i.Live CoinGecko feed (BTC/ETH/SOL) drives wave frequency, amplitude, scroll direction, and row compression
ii.Ten psychological states — HESITATION to MANIA (bull), UNEASE to EXHAUSTION (bear) — not trading labels
iii.Temporal scar accumulation — past turbulence biases the field long after conditions normalise, healing at geological pace
iv.Canvas-hash machine fingerprint — deterministic per-device phase, shear, and stagger seed
v.Rare events — flash, collapse, inversion, silence — probability-gated to extreme/turbulent conditions only
Cat. No.LG-012
FeedCoinGecko · BTC/ETH/SOL
States10 psychological conditions
Year2026
Live Market Data
Optical Field
Machine Fingerprint
No Export
Open ↗
LG-013
PIN
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.

i.Five lexical archetypes — Bureaucrat, Net, Fiction, Sticker, Signal — phrase-level corpus banks per register
ii.Live r/worldnews feed — real headlines occasionally seed the Fiction register
iii.Procedural mylar weathering — scratch, tarnish, and dome-highlight SVG filters per badge
iv.CMYK misregistration ghost — fires once per stamp on the title treatment
v.Persistent archive — capped run history, single-badge export and full contact-sheet export
Cat. No.LG-013
RegistersBureaucrat · Net · Fiction · Sticker · Signal
Feedr/worldnews top (daily)
Year2026
Generative Text
SVG Weathering
Local Archive
PNG Export
Open ↗
LG-014
READ THE ROOM
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.

i.Whisper-tiny.en (STT) → Llama-3.2-1B-Instruct (WebLLM) → Kokoro-82M (TTS) — full voice loop, on-device
ii.Void register — Ruscha/Sanchez-inflected billboard poetry spoken into silence
iii.Salesman register — mid-century advertising closer, builds on what the room just heard
iv.Acquisition inversion — rare turns where the closer becomes a buyer of intangible things
v.Receding utterance stack — letterpress distress filter, perspective depth, room-light state
Cat. No.LG-014
EngineWhisper-tiny.en · Llama-3.2-1B · Kokoro-82M
InputLive microphone · VAD-gated
Year2026
Voice Installation
On-Device Pipeline
Live Microphone
No Export
Open ↗
LG-015
Exquisite Corpus
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.

i.Head / torso / legs triage — five source novels harvested and recombined as an Exquisite Corpse body
ii.Dual-timescale resonance — slow ancestry-weighted ecology bleed, fast same-tick contamination spike
iii.Roulette-wheel selection ecology — weighted, not maximal; hundred-generation motif ancestry per region
iv.Five behavioural states — obsession, decay, exploration, convergence, fragmentation — cycling selection bias
v.Personal library upload — eject the canon, feed the engine txt / pdf / json of the reader's choosing
Cat. No.LG-015
SourcesMelville · Shelley · Carroll · Stoker · Kafka
States5 behavioural cycles, weighted transition
Year2026
Generative Text
Resonance Engine
Reader Upload
Image Export
Open ↗
LG-016
hostile
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.

i.20-axis device fingerprint — hardware, browser, GPU, canvas hash, acoustic profile, connection, timezone, language, screen geometry, dark mode
ii.5 enforcement zones — temporal restriction, zone boundary, pedestrian classification, surface condition, flow obstruction — 26 distinct notice layouts
iii.Detection-score → redaction mapping — about modal text redacted proportionally to how many axes triggered; inspection adds 2 to the score
iv.Dev tools detection — piece flags as "under observation"; observation does not modify the space
v.Copy intercept, print sabotage, corridor-narrowing, idle-fade — environmental modifications applied over time
Cat. No.LG-016
Detection20 axes across 5 enforcement zones
Layouts26 zone/variant notices + 8 generic
Year2026
Device Fingerprinting
Hostile Architecture
Live Detection
No Export
Open ↗
Artist
DORKHOLM ↗

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.

Project
[local]ghosts
Works
16 (LG-001 — LG-016)
Format
Browser-native · session-unique · no server

The apparatus is the mechanism made visible. Each work below is documented in its technical particulars — the engines, the thresholds, the parameters, the exports. The mechanism is not the work. But the work does not exist without it.

LG-001
We Regret To Inform You

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.

Letter templates: 30+ · {skill} and {action}/{action_noun} substitution
Actions: 15 verbs (integrated, optimised, absorbed…) · 15 nouns
Appeal variants: 20 DENIED responses · structurally incapable of reversal
Interruption dialogs: 10+ system notices · triggered at intervals
Counter: localStorage · cumulative across all sessions
Export: plain text download via Blob URL
EngineVanilla JS
ExportText file · Blob URL
PersistencelocalStorage counter + archive
MobileFull support
LG-002
Neither Confirm Nor Deny

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.

Corpus: 13 documents · 7 institutional source labels
Redaction density: derived from slider (1–5); collapse at minimum held 2s
Appeals: 3 Increase Exposure actions; FOIA unlocked thereafter
FOIA: 9 denial variants · Glomar doctrine
Night vision: phosphor green mode
Export: PDF via jsPDF · ghost text · Glomar footer · DETERMINATION: DEFERRED
EngineVanilla JS · jsPDF
ExportPDF · Glomar footer
PersistenceNone
MobileLimited (single panel)
LG-003
Useful Idiot

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.

Input capture: keydown · mousedown/up · touchstart · touchmove · DeviceOrientation
Language engine: 2nd-order Markov chain · 4 phase registers
Ghost model: TensorFlow.js sequential · input[4] → dense 8 relu → dense 4 relu → sigmoid
Audio: 60Hz sine drone + heartbeat oscillator · Web Audio API
Collective: localStorage · cross-tab storage event sync
Export: standalone HTML replay — sequential then random loop
EngineTensorFlow.js · Markov · Web Audio
ExportHTML session replay
PersistencelocalStorage collective
MobileFull support
LG-004
DEBT

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.

Debt accumulation: latency per keystroke + 400ms Backspace surcharge
Phase 1 onset (LEVERAGED): 10,000ms — sentiment redaction active
Phase 2 onset (INSOLVENT): 30,000ms — gravity animation, cursor dilates
Terminus (FORECLOSURE): 80,000ms — session freezes, SVG exported
Export: SVG 800×1200px · foreignObject HTML · latency heatmap
Edition seed: Math.floor(Date.now() / 1000).toString(16).toUpperCase()
EngineVanilla JS
ExportSVG via Blob URL
PersistenceNone
MobileSupported
LG-005
[dearmadta]

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.

Official sources: White House · UK Gov · EU · SEC · Fed · Treasury · ECB · SCOTUS · USGS
Dissent sources: Amnesty · EFF · HRW · ACLU · AFL-CIO · Greenpeace · ProPublica · SEIU · Intercept · RSF
Constraint types: 13 Oulipo transforms · probability 0.32 → 0.12 over revision depth
Observer: GPT-2 (Xenova/quantized) · 30s interval · fails at high entropy
Network: Gun.js relay · SEA keypair · peer mutation propagation
Export: PNG (html2canvas) · GIF (gif.js, 20 frames at 1fps)
EngineGPT-2 · Gun.js · SEA · gif.js
ExportPNG · GIF
PersistenceGun graph (distributed)
MobileFull support
LG-006
[[créachtaí]]

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.

Intervention types: overprint · block redaction · strikethrough · paste intrusion · burial
Appeal hashing: SHA-256 via Web Crypto API
Appeal structure: in-session Merkle tree
Export: SVG Official Record — margin-annotated, Merkle log, surviving text
Mobile: Hard block — [ACCESS_DENIED]
EngineVanilla JS · Web Crypto
ExportSVG Official Record
PersistenceNone
MobileBlocked
LG-007
[Mímir]

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.

Model: SmolLM2-360M-Instruct-q0f16-MLC via WebLLM
Generation: temperature 1.1 · max_tokens 60 · 4 prompt templates
Mutation interval: 1,800ms or 3,500ms · prob 0.015/char/tick
Collapse threshold: 25 mutations → em-dash row
Meta probability: 10% at open → 0 linear decay over 6 hours
Corpus decay: era elimination on timer · terminus: white void
EngineSmolLM2-360M · WebLLM · WebGPU
ExportNone
PersistenceNone
MobileSupported (reduced)
LG-008
[FACTORY RESET]

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.

Feeds: BBC · NYT · TechCrunch · Verge · Rolling Stone · Bloomberg · ScienceDaily
Signature regexes: 10 thematic categories · 10 frame variants each
STRUCT transforms: 8 types · applied at 38% probability
Grid: 4 cells · 12 palettes · no duplicate bg · 13s rotation per slot
Refresh interval: 90,000ms
Export: PNG canvas composite via Blob URL
EngineVanilla JS · Canvas API
ExportPNG snapshot
PersistenceNone
MobileSingle-column · ticker hidden
LG-009
[ keeping score ]

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.

Model: Phi-3.5-mini-instruct-q4f16_1-MLC via WebLLM
Output: strict JSON — title · instructions (1–6) · duration_seconds (15–70)
Performance mechanic: 800ms hold to register PERFORMED
Observation trigger: after 5+ scores shown
Confession: once per session — bypasses model entirely
Persistence: localStorage · cross-session performance ratio
Mobile: 8 dedicated static scores; model does not run
EnginePhi-3.5-mini · WebLLM · WebGPU
ExportNone
PersistencelocalStorage
MobileStatic scores only
LG-010
Lower Third

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.

Model: Llama-3.2-3B-Instruct-q4f16_1-MLC via WebLLM
Prompt templates: 5 episode types · cycled in random order
Output: strict JSON — name · descriptor (6–12 words)
Validation: length · charset · keyword filter · 3 retries · fallback
Cycle interval: 30 seconds · prefetch during countdown
Image source: curated set served from ./images/ · discovered via images.json manifest · no-repeat shuffle
EngineLlama-3.2-3B · WebLLM · WebGPU
ExportNone
PersistenceNone
MobileBlocked
LG-011
SPECIALS!

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.

Model: Phi-3.5-mini-instruct-q4f16_1-MLC via WebLLM
Output: strict JSON — 9 fields including features array
Registers: 7 advertising modes, each with subhead and CTA rules
Themes: 6 thematic territories — weighted collision table
Meta mode: ~8% probability · once per run · sells the mechanism
Fallback: handwritten corpus · degraded-capacity notice on no-WebGPU
Cycle: 30-second auto-advance · Space bar forces next
Mobile: Store Closed — model does not run
EnginePhi-3.5-mini · WebLLM · WebGPU
ExportNone
PersistenceNone
MobileBlocked (Store Closed)
LG-012
[konditions]

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.

Feed: CoinGecko markets API — BTC, ETH, SOL, 24h change
States: 10 — 5 intensity tiers × bull/bear, psychological vocabulary
Temporal scars: 55-row buffer, decay 0.000001/frame — geological healing
Fingerprint: SHA-256 hash of hidden canvas render → deterministic per-device seed
Rare events: flash · collapse · inversion · silence — gated to extreme/turbulent, 3-min min gap
Modes: TEXT · TICKER · SIGNAL (moiré) — presentation only
EngineCanvas 2D · CoinGecko API · Web Crypto
ExportNone
PersistencePer-device fingerprint only
MobileSupported
LG-013
PIN

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.

Archetypes: Bureaucrat 26% · Net 26% · Fiction 4% · Sticker 22% · Signal 22%
Live feed: r/worldnews top.json, daily — seeds Fiction register
Weathering: seeded feTurbulence + displacement, per-badge scratch/tarnish
Misregistration: CMYK ghost, fires once per stamp animation
Archive: window.storage, capped, oldest dropped on overflow
Export: single PNG or full contact sheet
EngineVanilla JS · SVG filters · r/worldnews JSON
ExportPNG · Contact Sheet
Persistencewindow.storage archive
MobileSupported
LG-014
READ THE ROOM

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).

STT: Xenova/whisper-tiny.en via Transformers.js
LLM: Llama-3.2-1B-Instruct-q4f16_1-MLC via WebLLM
TTS: Kokoro-82M-v1.0-ONNX via kokoro-js
VAD: custom AudioWorklet · noise-floor × 2.0 threshold
Registers: VOID · SALESMAN · SALESMAN_ACQUIRE (~1-in-6 inversion)
History: 4-message rolling window (2 exchanges)
Display: 3D perspective stack · letterpress SVG distress filter
EngineWhisper-tiny · Llama-3.2-1B · Kokoro-82M
ExportNone
PersistenceNone
MobileMicrophone-dependent
LG-015
Exquisite Corpus

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.

Sources: Melville · Shelley · Carroll · Stoker · Kafka, via GITenberg/jsdelivr
Regions: head / torso / legs · per-book quota triage
Ancestry: 100-generation stack per region, exponential recency decay
Resonance: slow ancestry-pull channel + fast same-tick contamination channel
Selection: weighted roulette wheel over combined score
States: obsession · decay · exploration · convergence · fragmentation, 8–20 gens each
Reader upload: txt / pdf / json · eject-to-canon control
EngineVanilla JS · Canvas 2D · Web Crypto · OfflineAudioContext
ExportNone
PersistenceNone
MobileSupported (mobile triggers pedestrian classification)
LG-016
hostile

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.

Detection axes: 20 — hardware, browser, GPU, canvas, audio, network, time, language, screen, dark mode
Zones: temporal · boundary · pedestrian · surface · flow · inspection (dev tools)
Layouts: 26 zone/variant notices + 8 generic pool; jitter via seeded hash(Date.now())
Redaction: about-modal lines redacted 0→1→3→7 per detection score; +2 if inspector open
Interventions: copy intercept · print sabotage · corridor-narrowing (3min) · idle-fade (2min)
Fingerprint: canvas SHA-256 + OfflineAudioContext acoustic profile, both async, logged to console
EngineVanilla JS · Canvas 2D · Web Crypto · OfflineAudioContext
ExportNone
PersistenceNone
MobileSupported (mobile triggers pedestrian zone)