Capillary background

GPU

Thin branching veins: a faint network at rest, new veins that grow toward the cursor and burst from a click.

Sound for slow mornings.Field recordings, mixed for deep work.

Add it to your page

Install asciify-engine and call background() on the section. It draws under the section's content, follows light and dark, pauses off screen and holds a still frame for reduced motion. Defaults: 8px characters, speed 1, answers the pointer.

ts
import { background, capillary } from 'asciify-engine/kit';

const hero = document.querySelector('#hero');
const bg = background(hero, {
  preset: capillary,
  clear: hero.querySelector('.copy'),  // the field stays quiet round it
  cursor: false,                       // optional: no pointer response
});

// On unmount:
bg.destroy();

Options

OptionTypeWhat it does
presetBackgroundPresetRequired. Import it by name; a page pays only for the presets it imports.
clearHTMLElement | falseThe field fades out round it, following layout changes. Without it the preset keeps its own quiet middle.
cursorboolean | 'trail' | 'fluid' | 'lantern'Pointer response. false turns it off, true keeps the preset's own, a name picks the hover. Default: on for presets that answer the pointer.
mark'glyph' | 'dot'Characters or halftone dots. Default: the preset's own; a charset asks for characters.
charsetstringCharacters from empty to dense, or a named set such as blocks, braille or dots.
palettestring | { light, dark }The ink, one colour or one per theme. Wins over color and ink. Default: the preset's graphite for the ground.
ink, colorstringOne ink for both grounds: a CSS colour, a custom property (--brand) or var(--brand, #888).
accentstringPeaks, heads and signals, for the presets that draw them. Default: the preset's own, or one mixed from the ink.
cellSize, speednumberCharacter size (dot spacing for dots) in CSS px, and pace from 0 to 5. Default: the preset's own.
opacity, dithernumberCanvas opacity, 0 to 1 (default 1, Fluid 0.7), and ordered dither, 0 to 1 (default 0).
textstringwordField only: the word drawn. Default ASCIIFY.
lookGlyphFieldOptionsRaw field settings on top, such as { mark: 'stipple' } for a render style or { scene: 'orb' } for wordField's orb.
globalLookbooleanfalse keeps this background's own characters when setGlobalLook re-skins the page. Default true.
lazy, posterboolean, stringMount only near the viewport and release far off it (default true); a still image shown until the first frame, while released and without WebGL2.
reducedMotionbooleanOverrides the visitor's prefers-reduced-motion; unset follows it, holding one still frame.

The handle: update(options), setPreset(preset) (cross-fades, keeping your options), play(), pause(), destroy() and supported (false without WebGL2). field is the GPU glyph field, or null without one: bg.field?.pulse() sends a ring through it.