Release Notes

Corrupted Theme 0.3.0: one home for the glitch libraries, deterministic render-to-video, and an LLM-readable surface

Released: July 9, 2026 · npm: @whykusanagi/corrupted-theme · Demo: corrupted.whykusanagi.xyz

Corrupted Theme is a dark, glassmorphic design system with pink/purple accents — built for modern, visually distinctive web applications. 0.3.0 is a consolidation release: every glitch/corruption effects library that had been copy-pasted across the whykusanagi repos now has exactly one canonical home, plus a new set of anime.js-derived orchestration components, deterministic render-to-video support, and a machine-readable surface for LLM agents.

What's new

  • One canonical home for the glitch libraries. Effects I'd duplicated across my own projects — stream overlays, video tooling, this site's thumbnail generator — are now absorbed into Corrupted Theme. One source of truth; I import them instead of copy-pasting.
  • Stream overlay suite — ChromaticPulse, BinaryParticles, GlitchTitleCard, TerminalTakeover, StreamTicker — every one with a live rAF mode and a deterministic frame-seek mode for video export.
  • CorruptedMandala — procedural SVG sacred-geometry background. This visual now lives only in the package, imported rather than re-implemented.
  • Canvas transitions absorbed into the package: AbyssalCableSystem, geometric-morpher, neural-deserializer, spectrum-terminal.
  • 17 new anime-blocks classes re-exported from animation-blocks, plus 12 composite transitions via a new transitions barrel.
  • anime.js-derived orchestration components — ScrollDecode, CorruptedTimeline, GlitchStaggerGrid, corruption-easings — modeled on anime.js v4 APIs but shipped with zero runtime dependencies.
  • Deterministic render-to-videoseededRandom + seekAnimations give every animation a reproducible, frame-addressable mode for offline rendering.
  • Agent surfacedist/manifest.json and dist/llms.txt, generated from JSDoc and published on the CDN, so an LLM can build on-brand from a single fetch.
  • One deprecationlewdMode is now a deprecated alias for nsfw, logging a one-time console.warn. Everything else is additive.

Why this release exists

Corrupted Theme's glitch aesthetic — chromatic aberration, terminal takeovers, particle fields, sacred-geometry backdrops — kept getting reinvented. My OBS stream setup had its own transition canvases. This site's thumbnail generator had its own renderer. My video projects each carried their own copies of overlay components that were, functionally, the same code with slightly different option names. Every fix or feature had to be ported by hand to each copy, and drift was constant.

0.3.0's thesis is simple: pick one home for each effect and import it everywhere. The package absorbs the components wholesale — same visual behavior, canonicalized option names, SFW/NSFW vocabulary pools split consistently — so each project drops its local copy in favor of the import. No more re-vendoring, no more "which copy has the latest fix."

Absorbed components

Stream overlay suite

The overlay suite now in the package: ChromaticPulse, BinaryParticles (continuous or beat-synced), GlitchTitleCard (intro/outro cards), TerminalTakeover, and StreamTicker, plus a companion stream-overlays.css. Every component in the suite ships with a live requestAnimationFrame mode for on-air use and a deterministic renderFrame(frameIdx, fps) + seed mode for offline video export — the same component drives both a live overlay and a rendered clip.

CorruptedMandala

CorruptedMandala (plus corrupted-mandala.css) is a procedural SVG sacred-geometry background: rotating phrase rings, phase-staggered star pulses, a mandorla halo, and an ornamental frame. This visual now lives only in the package — imported, never re-vendored.

Canvas transitions

Absorbed into the package: AbyssalCableSystem, geometric-morpher, neural-deserializer, and spectrum-terminal. neural-deserializer's old lewdMode: true default is now nsfw: false — pass nsfw: true explicitly for the 18+ vocabulary.

anime-blocks absorption

17 new classes re-exported from animation-blocks: TypingTextReveal, CircularDotsIndicator, RectangularWipe, ChromaticAberrationGlitch, RotatingDiamond, GridOverlay, WaveformOscilloscope, ParticleGrid, HeartPulse, ShatterGrid, WaveRipple, SpiralVortex, CircularProgress, RadialBurst, DataStream, HexagonGrid, and CorruptionWave. Alongside them, 12 composite transitions ship through a new transitions barrel: GlitchCascade, RadialGlitch, GridCorruption, TerminalMatrix, WaveDecode, DiamondMorph, AffectionBurst, CombatShatter, ParticleCascade, SystemBoot, DataTransfer, and DiagnosticScan.

terminal-vocab

A new terminal-vocab module centralizes terminal-UI vocabulary and charset generators — generateHex, generateKatakana, generateHiragana, corruption blocks, and the CODE_BLOCKS/TERMINAL_* pools. Every pool is split SFW/NSFW, and getters take an explicit nsfw = false parameter.

anime.js-derived components, zero dependencies

Four new orchestration primitives modeled on anime.js v4 APIs for design-reference familiarity, but shipped without adding anime.js — or anything else — as a runtime dependency:

  • ScrollDecode — decodes text as it enters the viewport, either once, re-arming on exit, or scrubbed continuously by scroll position via progress: true.
  • CorruptedTimeline — a scene orchestrator supporting absolute offsets, completion-driven '+=N' offsets, and named labels. It drives every animation contract in the package and is built specifically for sequencing OBS scenes.
  • GlitchStaggerGrid — the new canonical implementation of Pattern 4: Staggered Grid Corruption: ripple propagation from center, index, or an [x, y] origin, a purple → magenta → cyan color ramp, a settle time capped at 4 seconds, at most 12 concurrent animations, and a prefers-reduced-motion fallback.
  • corruption-easingsEASINGS.glitchSnap, EASINGS.decayEase, EASINGS.terminalStep, plus stagger-ripple helpers, mirrored as additive --ease-* CSS custom properties in variables.css.

Deterministic render-to-video

The stream overlay suite's live/deterministic split is backed by two new primitives: seededRandom(seed) — a mulberry32 PRNG added to random-utils — and seekAnimations(root, t) in time-utils, which seeks every animation on a page to a specific timestamp while preserving authored animation-delay stagger and remaining idempotent across repeated calls.

Together they let any component in the package run in two modes: a live requestAnimationFrame loop for on-air overlays, or a seeded, frame-addressable renderFrame(frameIdx, fps) call for offline rendering pipelines that need bit-for-bit reproducible output. The full recipe — seeding, frame stepping, and compositing — is documented in docs/RENDER_TO_VIDEO.md in the package.

An agent surface built for LLMs

A new npm run manifest:generate script parses every exported component's JSDoc and emits two artifacts: dist/manifest.json, covering all 60 exports with their option schemas and @composes relationships, and dist/llms.txt, a dense plain-text surface designed to be the entire context an LLM needs to build on-brand with the package. Both are published on the CDN alongside the CSS and JS bundles, so any LLM session — including a fresh Claude Code session with no repo context — can fetch one file and know the full component surface. The manifest also auto-refreshes the reference table in docs/COMPONENTS_REFERENCE.md, so the human-readable docs and the machine-readable manifest can't drift apart.

Also new: browser-global (IIFE) builds dist/toast.global.js and dist/clipboard-helpers.global.js for no-build CDN consumers, a weekly grouped-and-capped Dependabot configuration with auto-merge for green patch/minor updates, and a dev static server that now sends Cache-Control: no-cache so local testing never serves stale assets.

NSFW handling: lewdMode is now deprecated

The absorbed components arrived with their own option names for the same NSFW toggle that 0.2.0 had already canonicalized elsewhere in the package as nsfw. 0.3.0 finishes that consolidation: every absorbed component now takes nsfw, and lewdMode is accepted only as a deprecated alias that logs a one-time console.warn on first use. Anything still on lewdMode should move to nsfw — the alias is a bridge, not a permanent option.

Two smaller cleanups shipped alongside the rename: TypingTextReveal's inline phrase pools were replaced with the canonical corruption-phrases library, and its DOM construction now goes through textContent instead of string concatenation (XSS-safe). Persona-flavored strings across the absorbed code were also de-themed into plain options — labelTop/labelBottom, logoText/logoSrc, title/messages — and the default terminal prompt changed from celeste@abyss:~$ to system@abyss:~$ so the package reads as neutral infrastructure rather than baked-in Celeste branding.

Upgrading

0.3.0 is additive — no breaking changes, no required migration. Pin the version and add the matching SRI hash:

<link rel="stylesheet"
      href="https://cdn.whykusanagi.xyz/corrupted-theme/@0.3.1/dist/theme.min.css"
      integrity="sha384-09dUKj6tRy5MnkBu0SKlxr9OrybBI7f7YMjySOnY4t1yBHZ377Mwb1NMDktEv6Xd"
      crossorigin="anonymous">

Or from npm:

npm install @whykusanagi/corrupted-theme

lewdMode still works as a deprecated alias, but nsfw is the name going forward — same boolean, same behavior, minus the console warning.

Install from npm Live demo Source & docs Previous release (0.2.1)