Generative Algorithmic
Procedural visuals, particle systems, noise fields, real-time rendering. Code-as-art. Canvas/WebGL-driven.
Visual DNA
Code-as-art. Visuals procedurally generated — particle systems, noise fields, recursive patterns. Page feels alive, different on every visit. Canvas/WebGL-driven, non-traditional DOM.
Design Principles
CODE IS THE MEDIUM
Visuals are computed, not designed. Every particle, noise field, and voronoi cell is the output of a program — the page is a program running, not an artifact finished. Nothing is placed by eye; everything is derived from a rule. The aesthetic is not "what the algorithm looks like" but the act of computation itself made visible.
What it prevents: Treating generative output as decoration, or hand-placing "generative-looking" elements. If the visual isn't produced by an actual algorithm at runtime, it's just a static image wearing a costume.
---
ALWAYS ALIVE
The page is never still. Continuous procedural animation is the baseline state — particles drift, noise fields flow, the render re-seeded on load so every visit differs. This is high-motion (axis 6) design: movement isn't an enhancement, it's the existence condition of the page. A paused render is a dead page.
What it prevents: Static hero images styled to look algorithmic. The aliveness is the difference between generative art and a screenshot of generative art.
---
CANVAS OVER DOM
WebGL/Canvas is the primary rendering layer; traditional DOM layout (axis 6 — non-traditional) is secondary. The viewport is the canvas. Structure, texture, and motion come from the render layer first — the DOM provides only the console overlay: seeds, parameters, labels. If a visual can be computed, it should be computed, not built in CSS.
What it prevents: CSS-only recreations of generative effects — gradients standing in for noise fields, marquee standing in for particle drift. The medium defines the style.
---
SIGNAL-PROPORTIONAL SATURATION
The base palette is a neutral monochrome ramp (`#0A0C10` → `#F2F1EE`). Saturated accents — cyan `#22D3EE`, green `#34D399`, amber `#FBBF24`, magenta `#E879F9` — are earned, not applied: they appear only where the algorithm is loud. Color is a function of computed signal: `color = lerp(mono, accent, signal)`. Saturation above ~10% of the viewport means the signal is fake.
What it prevents: Saturated gradients and rainbow palettes that encode nothing. Every color must map to a computed value, or the color is lying about the data.
---
THE CONSOLE IS PART OF THE DESIGN
Seeds, FPS, iteration counts, coordinates — the machine metadata is a first-class UI layer. Monospace labels (`SEED 1742`, `FPS 60`, `PARTICLES 4096`, `NOISE 0.62`) read like terminal output. Text is annotation, not editorial voice — it makes the computation legible and invites the viewer into the system rather than passive consumption.
What it prevents: Opaque, mysterious "art" with no entry point. The console layer turns the page from a spectacle into a system the viewer can read and, ideally, perturb.
Typography System
# Typography System ## Display Typeface | Property | Specification | |----------|--------------| | **Register** | Technical sans-serif or monospace — secondary to the visuals | | **Examples** | Space Grotesk, IBM Plex Mono, JetBrains Mono, Archivo, Roboto Mono | | **Weight** | 400-500 (regular — utilitarian, not elegant) | | **Tracking** | 0.01em-0.03em (slightly open, legible at small sizes) | | **Size** | `clamp(1.25rem, 2.5vw, 2.5rem)` — moderate, never monumental | | **Transform** | Sentence case; UPPERCASE only for console labels | **Why technical type:** The visuals are computed — the type should read as instrumentation, not editorial voice. Monospace and technical sans (Space Grotesk, IBM Plex Mono) share the code's DNA: geometric, uniform, mechanical. The type is secondary to the canvas; it annotates the artwork without competing with it. --- ## Body Typeface | Property | Specification | |----------|--------------| | **Register** | Same family as display — the type system is one instrument | | **Examples** | Space Grotesk Regular, IBM Plex Mono 400, JetBrains Mono 400 | | **Weight** | 400 (regular — no elegance, no weight games) | | **Tracking** | 0.01em-0.02em (standard) | | **Size** | `clamp(0.875rem, 1vw, 1rem)` — 14-16px | | **Line Height** | 1.5-1.6 (compact, code-like) | **Why monospaced rhythm:** Body text in monospace inherits the grid of the code that generated the page. Fixed-width glyphs create a visible algorithmic rhythm — every line aligns to the same column grid, like source code rendered as prose. --- ## Micro / Label Type | Property | Specification | |----------|--------------| | **Register** | Monospace, regular weight, tight tracking | | **Examples** | IBM Plex Mono 400, JetBrains Mono 400 | | **Weight** | 400 | | **Tracking** | 0.05em-0.1em (moderate — machine annotation, not luxury spacing) | | **Size** | 10-11px | | **Transform** | UPPERCASE | **Usage:** Seed values, coordinates, iteration counts, FPS readouts, parameter labels. These are the console layer — "SEED 1742", "FPS 60", "PARTICLES 4096", "NOISE 0.62". They should read like terminal output: fixed-width, dimmed, factual. --- ## Type Scale ``` Display: clamp(1.25rem, 2.5vw, 2.5rem) — moderate, technical Body: clamp(0.875rem, 1vw, 1rem) — 14-16px, regular weight Micro: 10-11px — console annotations, UPPERCASE ``` The scale is compact — 10px to 40px. Typography never dominates; the page hierarchy is carried by the visuals, not the type. The type scale exists to be readable and precise, like a readout under a visualization. --- ## Font Pairing Logic **Single instrument approach:** One technical family — monospace (IBM Plex Mono / JetBrains Mono) for interface and labels, optionally paired with one geometric sans (Space Grotesk / Archivo) for display only. The pairing is minimal: sans for the headline, mono for everything computational. Two voices max — the canvas is the third, loudest voice. **Never:** Serif typefaces (editorial elegance contradicts the computational register), script or decorative fonts (personality competes with the algorithm), oversized display type (the artwork is the hero — type must stay annotation-sized).
Color Architecture
# Color Architecture ## Ground The ground is the canvas itself — the visual field generated by code. There is no static background color; the base is computed per-frame: ```css --color-ground-dark: #0A0C10; /* Near-black with cool undertone — empty canvas */ --color-ground-light: #F2F1EE; /* Off-white — bright canvas, low-saturation base */ ``` **Why tinted neutrals:** Pure #000000 or #FFFFFF reads as static, designed color. Tinted near-black (#0A0C10) and off-white (#F2F1EE) act as neutral seed states — the empty field the algorithm paints into. The ground should feel like a blank buffer before the shader runs, not a deliberate backdrop. --- ## Algorithmically Derived Palette ```css --gen-mono-1: #0A0C10; /* Deep neutral — particle trails sink here */ --gen-mono-2: #3A4046; /* Mid graphite — field density midtones */ --gen-mono-3: #8B939C; /* Cool gray — noise floor, inactive state */ --gen-mono-4: #D8DCE0; /* Pale gray — fine mesh, low-amplitude noise */ --gen-mono-5: #F2F1EE; /* Off-white — brightest value, sparse accents */ ``` **Usage:** The base palette is a monochrome value ramp. Colors are not chosen — they are **sampled** from this ramp by noise fields, particle lifetimes, and distance functions. The palette is a probability distribution, not a swatch book. --- ## Saturated Signal Accents ```css --accent-cyan: #22D3EE; /* Cyan — data signal, active particles */ --accent-green: #34D399; /* Green — growth (L-systems), positive values */ --accent-amber: #FBBF24; /* Amber — heat, density, energy peaks */ --accent-magenta: #E879F9; /* Magenta — rare emergent event, seed highlight */ ``` **Usage:** Saturated accents are **earned, not applied**. They appear where the algorithm decides — a particle crossing a threshold, a noise field exceeding an amplitude, a voronoi cell winning a competition. Saturation is proportional to signal strength: `color = lerp(mono, accent, signal)`. **Rule:** Saturation must be rare and data-driven. If the accent color covers more than ~10% of the viewport, the signal is fake. Accents exist to make the algorithm legible — the viewer should read *where the computation is loud*. --- ## Gradient / Noise-Field Color ```css --noise-field-gradient: linear-gradient( 135deg, rgba(34, 211, 238, 0.25), rgba(139, 147, 156, 0.15), rgba(232, 121, 249, 0.25) ); ``` **Usage:** Gradients are treated as **fields** — continuous functions over space, not decorative fills. A gradient driven by a Perlin noise seed shifts with time and scroll position. The gradient is a visualization of the field itself; it must move, breathe, and re-seed. --- ## Text ```css --color-text-on-dark: rgba(242, 241, 238, 0.9); /* Near-white, near-opaque — code console */ --color-text-on-light: rgba(10, 12, 16, 0.9); /* Near-black, near-opaque */ --color-text-muted: rgba(242, 241, 238, 0.45); /* Muted — parameter labels, seed values */ ``` **Why near-opaque text:** Unlike dreamlike styles, Generative Algorithmic text is a **console layer** — coordinates, seeds, parameters. Text is readable annotation over the generated field, closer to an IDE than a poster. Muted text (45%) is reserved for machine metadata: `SEED 42`, `FPS 60`, `ITERATIONS 1000`. --- ## Color Don'ts | Don't | Do Instead | |-------|------------| | Hand-picked brand palettes | Algorithmically sampled values from a neutral ramp | | Constant accent colors | Signal-proportional saturation — accents only where data is loud | | Static gradient backgrounds | Time-evolving noise-field gradients, re-seeded | | Pure #000000 or #FFFFFF | Tinted neutrals #0A0C10 / #F2F1EE as seed states | | Fully saturated scenes | Monochrome base, saturation below ~10% of viewport | | Color that encodes nothing | Every color change must map to a computed value |
Motion Principles
# Motion Principles
## Philosophy
Motion in Generative Algorithmic is **computed, continuous, and alive**. Nothing animates on a timeline; everything is driven by a running system — particles, noise fields, emergent behavior. The page is never idle and never static: if the render loop stops, the page is dead. Motion is not an effect applied to content — it IS the content. Continuous procedural animation, particle systems, noise-driven movement, real-time rendering — the motion axis is the highest-scoring axis in this style (6/6).
---
## Continuous Particle Flow
```js
// Conceptual — particle systems run on the render loop
function updateParticle(p, time, noise) {
const angle = noise(p.x * 0.001, p.y * 0.001, time * 0.05) * TWO_PI;
p.x += Math.cos(angle) * p.speed;
p.y += Math.sin(angle) * p.speed;
p.alpha = Math.max(0, 1 - p.age / p.lifetime);
}
```
| Element | Behavior | Lifespan |
|---------|----------|----------|
| Particles | Flow along noise field vectors — drift, swirl, converge | 3-8s, then respawn |
| Trails | Fade with age, leave residue | 1-2s fade |
| Count | 500-4000 particles, adaptive to device | — |
| Speed | 0.2-1.5 px/frame, field-scaled | — |
**The flow should never repeat.** A noise field re-sampled each frame guarantees unique trajectories — no two particles follow the same path. The motion feels alive because it is genuinely unscripted.
---
## Noise-Driven Field Distortion
```css
@keyframes field-drift {
0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
50% { transform: translate3d(0.5%, 0.5%, 0) scale(1.005); }
}
```
| Element | Animation | Duration | Easing |
|---------|-----------|----------|--------|
| Background field | Noise offset drift + scale breathing | 12-20s | `ease-in-out`, infinite |
| Voronoi cells | Cell boundary displacement via noise | 8-15s | `ease-in-out`, infinite |
| Procedural geometry | Vertex displacement, sin/noise waves | 6-10s | `ease-in-out`, infinite |
**The field should feel like it's computing.** Every frame re-samples the noise at a slightly different offset — the texture of the page slowly distorts, stretches, relaxes. Like heat shimmer over a grid, the movement is continuous and never completes.
---
## Emergent Behavior
| Effect | Specification |
|--------|--------------|
| Particle convergence | Particles occasionally cluster into recognizable forms, then dissolve |
| Attractor / repeller fields | Cursor acts as a force — particles scatter or collect around it |
| Lifecycle events | Rare emergent moments: bursts, synchronized pulses, cascade flips |
| State resets | Algorithm re-seeds every N seconds or on interaction |
**The page should surprise itself.** Emergent behavior is what separates algorithmic motion from animated CSS: the system occasionally produces something nobody scripted — a spiral, a wave, a flock. These moments are rare (seconds apart), unpredictable, and are the entire point of code-as-art.
---
## Canvas / WebGL Render Loop
| Parameter | Specification |
|-----------|--------------|
| Renderer | Canvas 2D or WebGL — full-viewport, viewport IS the canvas |
| Frame rate | 60fps target, capped; never CSS-transitioned background |
| Redraw | Continuous — no idle state |
| Interaction | Cursor position feeds the noise field (attract/repel) |
| Scroll | Scroll position re-seeds or re-samples the field |
**The page never sleeps.** A CSS-animated page has a finite animation; a procedural canvas is a live system. If the tab is visible, it renders. Real-time rendering is a hard requirement — degrade to a still frame only on `prefers-reduced-motion`.
---
## Interaction States
| Element | Hover / Focus State | Active State |
|---------|--------------------|--------------|
| Cursor | Acts as force field — particles react within radius | Drag = attract, release = scatter |
| UI controls | Parameter readouts update live (seed, count, speed) | Re-seed the field on click |
| Links | Mono text brightness 0.7 → 1.0 (150ms) | — |
| Buttons | "Generate" / "Re-seed" trigger new seed, visual burst | Immediate — the system responds |
**Interactions are computational.** Hovering a control shouldn't just style it — it should affect the field (a repeller force, a live readout). Every click is a system event: re-seed, toggle layer, adjust parameter.
---
## Reduced Motion
When `prefers-reduced-motion: reduce`:
- Particle systems: static frame (render once, no loop)
- Field distortion: disabled
- Emergent events: disabled
- Scroll-driven re-seeding: disabled
```css
@media (prefers-reduced-motion: reduce) {
canvas, .field-layer {
animation: none !important;
transition: none !important;
}
}
```
Render a single composed frame at the current seed instead of looping. The static frame must be a *good* still — the algorithm still produces the artwork, it just doesn't run it.
---
## What NOT to Animate
| Never | Why |
|-------|-----|
| CSS-only decorative animation | The style's core is canvas/WebGL — CSS-only design is banned vocabulary |
| Scripted, repeating loops | Scripted loops are timelines; this style computes, not choreographs |
| Staggered scroll reveals | DOM choreography contradicts "viewport IS the canvas" |
| Bounce / spring physics | Physical comedy is not procedural beauty |
| Auto-playing media | The page itself is the media — it never stops |
| Static imagery with CSS hovers | Static imagery is banned — motion must be generative |
Layout Grammar
# Layout Grammar ## Grid System **No traditional DOM grid.** The viewport IS the canvas — a WebGL/Canvas surface that owns the frame. Content is an overlay, not a layout. Internally: - Canvas layer: fixed inset-0, full viewport — `position: fixed; inset: 0` - HUD overlay: absolutely positioned console layer, `pointer-events: none` on non-interactive elements - Text containers: narrow (max-width 480px), edge-anchored, never centered - Content zones: corners and edges only — the center belongs to the computation - Density: low (axis 3) — the field breathes; UI must not crowd the generated surface --- ## Hero Section | Property | Specification | |----------|--------------| | Height | Full viewport — `min-h-[100dvh]` | | Background | Live Canvas/WebGL render — particle system or noise field, running continuously | | Text position | Edge-anchored — bottom-left console block, top-right metadata | | Headline size | `clamp(1.25rem, 2.5vw, 2.5rem)` — moderate, technical, never monumental | | Text opacity | 90% — console layer, readable annotation over the field | ``` ┌─────────────────────────────────────────┐ │ SEED 1742 · FPS 60 · PARTICLES 4096 │ │ │ │ [Live particle system] │ │ [Noise field — flows continuously] │ │ [Every visit renders differently] │ │ │ │ GENERATIVE FIELD │ │ Code-as-art. Computed, not designed. │ │ [ENTER] │ └─────────────────────────────────────────┘ ``` **The canvas is the hero.** The computation fills the viewport and runs before, during, and after the text exists. Text is a console overlay — seeds, parameters, coordinates. If the render is removed, there is no page. --- ## Section Spacing ```css --section-padding-y: clamp(3rem, 8vh, 6rem); --content-max-width: 480px; --edge-margin: clamp(1.5rem, 4vw, 4rem); --hud-gap: clamp(0.75rem, 1.5vw, 1.5rem); ``` **Spacing is the negative space of the algorithm.** Sections are separated by transitions in the field (noise re-seed, density shift), not by backgrounds or borders. The pacing is continuous — the render never stops between sections. --- ## Layout Patterns ### Pattern 1: Full-Viewport Canvas + Console Overlay ``` ┌─────────────────────────────────────────┐ │ [Live canvas render — entire viewport] │ │ │ │ HUD: seed, params, labels │ │ (corners and edges only) │ │ │ │ ┌──────────────────────┐ │ │ │ SEED 1742 FPS 60 │ ← console │ │ └──────────────────────┘ block │ └─────────────────────────────────────────┘ ``` ### Pattern 2: Canvas + Split Content Strip ``` ┌─────────────────────────────────────────┐ │ [Canvas render continues behind] │ │ │ ├──────────────────┬──────────────────────┤ │ Label │ │ │ Headline │ [Secondary render: │ │ Body text │ voronoi / flow │ │ │ field detail] │ │ SEED 8921 │ │ └──────────────────┴──────────────────────┘ ``` ### Pattern 3: Iterative Sequence (Parameter Evolution) ``` ┌─────────────────────────────────────────┐ │ [Field state A — seed 001] │ │ (evolves as you scroll — same seed, │ │ new parameters) │ ├─────────────────────────────────────────┤ │ [Field state B — re-seeded] │ │ (structure morphs, logic persists) │ ├─────────────────────────────────────────┤ │ [Field state C — rule change] │ │ (same system, different rules) │ └─────────────────────────────────────────┘ ``` --- ## Responsive Behavior | Breakpoint | Layout Change | |------------|--------------| | **Desktop (1200px+)** | Full-viewport canvas, HUD in all four corners, console blocks edge-anchored | | **Tablet (768px)** | Canvas full-viewport, HUD consolidated to top and bottom edges, reduced particle count | | **Mobile (375px)** | Canvas full-viewport, HUD collapses to bottom sheet, particles capped (~25% density), continuous animation preserved | **On mobile:** The canvas still dominates — it is the entire page. The HUD becomes a single bottom-anchored console block; corner metadata drops to seed + FPS only. Performance is prioritized: particle counts scale down before anything else. --- ## Layout Don'ts | Don't | Do Instead | |-------|------------| | Centered content blocks | Edge-anchored, asymmetric console placement | | Card grids | A continuous canvas field with floating HUD elements | | Boxed/bordered containers | HUD elements that float directly over the render | | Solid color section backgrounds | Field transitions — noise re-seeds and density shifts | | Dense text areas | Minimal console text — the computation carries the weight | | Static hero images | A live render running on every visit | | Standard navigation | Minimal HUD nav, mono labels, always on canvas |
Texture & Surface
# Texture & Surface
## Primary Texture: Procedural Patterns
The texture IS the computation. Every surface is generated from code — there are no image assets, no stock photography, no baked textures:
| Pattern | Description | Generator |
|---------|-------------|-----------|
| **Perlin / simplex noise** | Smooth, continuous value fields — the base texture of the page | `noise()` sampled per-pixel or per-vertex |
| **Voronoi cells** | Polygonal cell divisions — cellular structure, growth boundaries | Distance-field Voronoi |
| **Particle residue** | Trails and marks left by moving particles | Particle system history buffer |
| **L-system growth** | Recursive branching structures — plants, crystals, fractals | L-system string rewriting |
| **Flow fields** | Directional vectors rendered as strand/line texture | Noise field sampled along paths |
**The goal:** Every visible surface must be derivable from a function. If you can't describe the texture as an algorithm, it doesn't belong on the page. The texture is data-driven — it changes when the seed, the parameters, or the time step change.
---
## Cellular Noise / Voronoi Surfaces
```js
// Conceptual — voronoi cell rendering
function voronoi(p, cells) {
let nearest = Infinity, cell = 0;
for (let i = 0; i < cells.length; i++) {
const d = dist(p, cells[i].pos);
if (d < nearest) { nearest = d; cell = i; }
}
return cell;
}
```
```css
.voronoi-layer {
background: transparent; /* computed per-frame on canvas */
filter: contrast(1.05) brightness(0.98);
}
```
**Purpose:** Voronoi cells give surfaces a cellular, organic-but-computed quality — crackle patterns, cell membranes, territory maps. Cell borders shimmer as the seed points drift. Voronoi is the texture of *structure emerging from randomness* — the signature generative-algorithmic surface.
---
## Digital Noise Textures
| Texture | Technique | Parameters |
|---------|-----------|------------|
| **Perlin noise field** | Smoothed value noise, 2-4 octaves | Frequency 0.005-0.02, octaves 3, persistence 0.5 |
| **Value noise grain** | Raw random values, smoothed | Cell size 1-3px |
| **FBM (fractal Brownian motion)** | Layered noise octaves | 4-6 octaves, lacunarity 2.0 |
| **Domain warp** | Noise sampling noise | Displacement 20-80px |
**The grain is real data.** Unlike a film grain overlay, generative noise is a live field — it ripples, warps, and responds to the cursor. The texture looks like static because it IS a computed signal, not a flattened effect.
---
## Recursive & Data-Driven Surfaces
| Surface | Treatment |
|---------|-----------|
| **L-system branching** | Recursive growth lines — trunk → branch → twig, 4-8 iterations |
| **Fractal subdivisions** | Self-similar sub-patterns at every scale (diamond-square, midpoint displacement) |
| **Data-driven texture** | Texture maps to live data: FPS, time, mouse position, scroll velocity |
| **Grain from randomness** | Seeded random placement — deterministic per seed, unique per seed |
**The texture must be honest:** if it's data-driven, the data must be real. A texture that claims to visualize the system but is actually a static overlay is the worst kind of fake. Texture density is derived from the density axis (3/6) — moderate: present everywhere, dominant nowhere.
---
## Surface Rules
| Surface | Treatment |
|---------|-----------|
| Background | Full-viewport canvas — noise field, particle trails, procedural pattern |
| Text overlays | Near-opaque (90%), console-layer annotation over the field |
| UI elements | Minimal frames, hairline borders, translucent fills |
| Buttons | "Generate" / "Re-seed" — mono labels, thin outlines, hover = field reaction |
| Navigation | Compact technical strip — coordinates-style links |
| Dividers | None — the field itself separates sections |
**No cards, no panels, no solid backgrounds.** The only surfaces are the generated field and thin instrumentation over it. The UI is a HUD on top of a live simulation — flat, thin, monospaced, and secondary.
---
## Texture Don'ts
| Don't | Do Instead |
|-------|------------|
| Stock photography | Procedurally generated patterns — Perlin, voronoi, L-systems |
| Static grain overlays | Live noise fields — sampled per frame |
| Baked raster textures | Code-generated vector/field textures |
| Random decorative patterns | Seeded, deterministic randomness |
| CSS gradient "noise" | Real algorithmic texture — canvas/WebGL computed |
| Flat solid backgrounds | The generated field IS the background |
Vocabulary Bank
# Vocabulary Bank ## Primary Terms | Term | Why It Matters | |------|---------------| | `procedural generation` | Visuals computed by algorithm at runtime instead of pre-designed — the core of the style | | `particle system` | Thousands of lightweight particles driven by rules — the page's living cells | | `Perlin noise` | Smooth, organic gradient noise used to drive motion, color, and form | | `WebGL canvas` | GPU-accelerated rendering the page is built on, not the DOM | | `real-time render` | Every frame computed live — the scene changes on every visit | --- ## Secondary Terms | Term | Effect | |------|--------| | `flow field` | Particles steered by a vector field — everything drifts along invisible currents | | `voronoi pattern` | Cell-based tessellation from seed points — organic, data-driven geometry | | `L-system` | Recursive grammar that grows branching, plant-like structures | | `seed` | A fixed starting value reproducing the exact same procedural output | | `field line` | Trace a single particle's path through a noise field — the signature generative mark | | `distributed motion` | Individual elements each with their own tiny offset — alive without coordination | | `recursive pattern` | Self-similar structure repeated at smaller scales — infinite depth in a frame | | `data-driven texture` | Texture derived from computed values, not bitmap assets | | `fragment shader` | Per-pixel color computation on the GPU — full-screen algorithmic fields | --- ## Context Terms | Term | Mood | |------|------| | `emergent behavior` | Complex global patterns from simple local rules — the system exceeds its code | | `seeded randomness` | Chaotic but reproducible — every seed is a new world you can return to | | `code-as-art` | The algorithm is the artwork; the browser is the gallery | | `always alive` | Movement never stops — the page is a living system, not a static frame | | `creative coding` | Programming as artistic medium — the culture this style comes from | | `generative art` | Artwork where the artist writes the rules, not the final image | | `canvas over DOM` | Rendering on a single full-viewport canvas rather than styled elements | --- ## Banned Terms | Term | Why It Breaks the Style | |------|------------------------| | `static imagery` | The visuals must be alive and computed, never fixed files | | `traditional DOM layout` | The viewport IS the canvas — no boxed, element-driven page | | `CSS-only design` | Code generates the imagery; CSS alone cannot make it alive | | `stock photography` | Stock images are the opposite of procedural generation | | `pre-rendered assets` | Frames exist before runtime — defeats the always-alive principle | | `fixed gradients` | Gradients must be animated through noise, not static fills | | `pixel-perfect mockups` | The work is the system, not a frozen screenshot | | `hero image` | SVGs and photos step aside — the code itself is the hero | --- ## Prompt-Ready Phrases ``` "WebGL canvas particle system as the entire page (1000+ particles)" "Perlin noise field driving organic drift — motion from the noise field" "flow field — particles steered along an animated vector field" "voronoi-based interlaced, data-driven geometry" "L-system branching, recursive structures grown at runtime" "seeded randomness — deterministic, reproducible per seed value" "algorithmic palette — hue/saturation derived from noise, not hardcoded" "monospace / technical sans-serif labels — text is metadata, visuals lead" "minimal UI floating over the live canvas — viewport IS the canvas" "continuous procedural animation — never static, changes on every visit" "reduced-motion: freeze the field into a single seeded frame instead of stopping" ```
Anti-Slop Checklist
When to Use
# When to Use ## Perfect For | Context | Why This Style Works | |---------|---------------------| | **Creative technologist portfolios** | The work IS the medium — code-as-art demonstrates the skills directly | | **Experimental studios** | Procedural visuals prove the studio's creative-coding capability | | **Data art installations** | Particle systems and noise fields turn data into living, breathing visuals | | **Music visualizations** | Real-time rendering and continuous motion match audio dynamics | | **WebGL showcases** | The style foregrounds the tech it was built with | | **Generative art platforms / NFT projects** | Seeded randomness and algorithmic palettes feel native to the genre | | **Tech-forward brand campaigns** | Always-alive visuals make every visit feel like a premiere | ## Brand Personality Match This style reinforces brands that are: - **Procedural** — comfortable with visuals being computed, not designed - **Alive** — never static, always animating, ever-changing - **Experimental** — pushing boundaries of what a web page can be - **Precise** — algorithmic rigor rather than hand-drawn whimsy - **Code-first** — engineers and creative coders as the audience and the subject ## Avoid When | Context | Why It Fails | |---------|-------------| | **Corporate/B2B** | Continuous motion and canvas rendering undermine formal credibility | | **E-commerce** | The viewport-as-canvas layout can't support product grids or checkout | | **News/journalism** | Readability dies when text is secondary to particle systems | | **Healthcare** | Always-alive, disorienting motion is the opposite of reassuring | | **Government/legal** | Too experimental, too "internet" | | **Content-heavy sites** | Non-traditional DOM can't carry long-form reading structure | | **Brands needing trust** | Ever-changing visuals feel unstable — nothing is ever the same twice | | **Mobile utility apps** | Real-time rendering costs battery and performance for no benefit | ## How to Decide Ask: **"Does my brand want to feel like a living algorithm — computed, precise, and different on every visit?"** If yes → Generative Algorithmic / Code-Art. If no → Consider Data Visualization Aesthetic (if you want data-driven but readable and static), Dark Tech Terminal (if you want technical but DOM-native and text-led), or Data as Texture (if you want algorithmic flavor without canvas takeover). Reference points: **Data Visualization Aesthetic** (axis color 5, texture 6 — shares algorithmic color and texture but keeps editorial layout), **Dark Tech Terminal** (axis motion 3 — technical and dark but restrained in movement), **Data as Texture** (axis texture 6 — borrow the noise-field texture without the full canvas commitment).
Common Mistakes
Mistake 1: Gimmick Overload
**What people do:** Stack every generative effect onto one page — particles, a noise field, voronoi, L-systems, flow fields, all at once, animating simultaneously.
**Why it fails:** The generative density (axis 3) is deliberately low. One coherent system is legible; six competing systems is noise. When every effect vies for attention, none of them mean anything — the page is effectively static because nothing can be read from it.
**Fix:** Pick one generative system per page and let it be the whole story. Iterate a single system (seed, parameters, structure) rather than introducing new ones. Less computation, more meaning.
---
Mistake 2: Performance Death
**What people do:** Render 10,000 particles with dozens of post-processing passes, ignoring framerate, battery, and mobile GPUs. The hero fills the viewport with a long-running heavy render.
**Why it fails:** A generator that stutters at 15fps destroys the illusion of aliveness — the style's entire premise. High-end WebGL chokes mid-tier laptops and phones, and continuous animation on mobile is a battery killer. Performance IS part of the aesthetic: smooth motion is what makes it feel alive.
**Fix:** Target 60fps on mid-range hardware. Cap particle counts by device (density ~25% on mobile), use `requestAnimationFrame` with delta-time clamping, budget the pixel-shader work, and degrade gracefully between breakpoints before degrading the concept.
---
Mistake 3: Meaningless Randomness
**What people do:** Use `Math.random()` everywhere — scattered dots, arbitrary colors, chaotic particle directions — because "it's generative."
**Why it fails:** Pure randomness encodes nothing. The style's power is that visuals map to **computed values**: a particle's color is a signal, a noise field is a structure, a voronoi partition is a relation. Random dots with no governing rule are just noise — the generic "AI art" look this style exists to escape.
**Fix:** Drive everything from a seed and deterministic rules. Prefer Perlin/simplex noise over `Math.random()`, structure over scatter, and make every visual decision traceable to a parameter. If the viewer can't infer the rule, there is no rule.
---
Mistake 4: No Art Direction
**What people do:** Let the raw algorithm output stand unfiltered — whatever the shader renders is the page, with no curated composition, no readable hierarchy, no intentional reading.
**Why it fails:** Algorithms produce fields; art direction produces pages. Raw output has no focal point, no narrative, no entry point — it's instrumental soup. The console layer exists specifically to give the viewer something to read and grasp, but it only works if the composition is directed.
**Fix:** Curate the parameters, seed, and camera to a composition someone would hang on a wall. Add a focal structure — a bright cell, a particle cluster, a region where the field resolves — and let the console labels guide the eye. The algorithm is the artist's brush, not the artist's decision.
---
Mistake 5: Treating Generativity as a Theme
**What people do:** Use generative visuals as a decorative skin over a conventional site — a static "procedural-looking" hero image and a normal grid layout beneath it.
**Why it fails:** This is stock photography in algorithmic clothing. When the generation is simulated, the page loses its honest core — it becomes a screenshot of an aesthetic instead of being that aesthetic. The banned vocabulary exists for this: `static imagery`, `traditional DOM layout`, `CSS-only design`.
**Fix:** Commit to the medium. The canvas owns the frame; the DOM is a console overlay. If the page can't be generative, don't fake it — a truthful minimal design beats a dishonest algorithmic costume.
Reference Gallery
# Reference Gallery ## Live Sites ### Generative Algorithmic Reference Implementation - **What works:** Procedural canvas/WebGL visuals, particle systems, Perlin noise fields, #BFDB38-style algorithmic accent on algorithmically derived bases, gradient/noise color, monospace or technical sans secondary to visuals, continuous motion - **URL:** Reference implementation — the canonical example of this style ### Patrik Hübner (huebite.com) - **What works:** Creative technologist portfolios, WebGL/Three.js experiments, procedural 3D and 2D graphics, strong motion design - **URL:** huebite.com ### ShaderToy (shadertoy.com) - **What works:** The definitive shader playground — real-time fragment shaders, noise fields, procedural geometry, algorithmic color computed per-pixel - **URL:** shadertoy.com ### Chrome Experiments - **What works:** Canonical WebGL/canvas showcase — particle systems, flow fields, generative art, real-time rendering - **URL:** experiments.withgoogle.com/collection/chrome (browse the WebGL and canvas archives) ### Nvidia Studio (nvidia.com/en-us/studio) - **What works:** Technical, precise dark aesthetic wrapping real-time rendering and generation tools — code-adjacent without full canvas takeover - **URL:** nvidia.com/en-us/studio ### Generative Art / NFT Platforms (fxhash, Art Blocks) - **What works:** Seeded-random generative output, algorithmically derived palettes, particle and voronoi studies, "different on every visit" ethos - **URL:** fxhash.xyz, artblocks.io ## Key Visual References ### Procedural Techniques - **Particle systems** — thousands of particles with velocity, gravity, and repulsion - **Noise fields** — Perlin/Simplex noise driving position, color, and flow - **Voronoi patterns** — cell-based segmentation, often animated and colored per-cell - **L-systems** — recursive branching structures (plants, fractals, tree-like forms) - **Flow fields** — noise-driven vectors curving particle paths through space - **Seeded randomness** — the same seed reproduces the same artwork; new seed, new piece - **Procedural geometry** — meshes, grids, and extrusions computed at runtime, not modeled ### Color References - **Algorithmically derived palettes** — color mapped through noise fields, hue rotation, or gradient ramps rather than fixed swatches - **Gradient-based bases** — continuous color transitions across the viewport - **Neon accents on dark** — bright algorithmic hues (electric greens/cyans/magentas) against deep procedural dark bases - **Monochrome → accent** — grayscale particle fields punctuated by a single computed color pop ### Typography References - **Monospace or technical sans-serif** — JetBrains Mono-style, secondary to the visuals - **Minimal UI labels** — small, uppercase, wide-tracked; never competing with the canvas - **Small sizes** — display small, body 14-16px, minimal text overall - **Code-echo styling** — monitored labels, version/seed readouts, FPS counters as decoration ### Motion References - **Continuous procedural animation** — never-ending, never identical - **Particle systems** — 60fps canvas updates, gravity and attractor behavior - **Noise-driven movement** — eased drift, 8-16s cycles, Perlin-sampled - **Real-time rendering** — scroll and pointer input feed the simulation - **Entrance** — fade/scale in 800-1500ms; simulation state persists, page never settles ## Screenshot Notes > When capturing references for this style, look for: > - The visuals (must be procedural/generative — canvas/WebGL, not stock photography) > - The color palette (must be algorithmically derived — gradients, noise-driven, not fixed flat swatches) > - The motion (must be continuous and alive — not one-shot entrance animations) > - The text density (must be minimal — the canvas carries 90% of weight) > - The UI shapes (must shed traditional DOM chrome — viewport IS the canvas) > - The interaction (pointer/scroll must steer the simulation, not just scroll the page) > - The overall mood (must feel like a living machine — computed, precise, ever-changing)
AI Prompts
> Copy this entire prompt and paste it into your AI coding assistant.
---
```
Build a generative-algorithmic page for "FLUXFIELD" — an experimental creative studio. Stack: React + Vite + TypeScript + Tailwind CSS v4 + framer-motion + a WebGL/Canvas renderer (raw WebGL, three.js, or p5.js). Page title: `FLUXFIELD — Code-as-art, rendered in real time`.
Vibe: Code-as-art. Visuals are procedurally generated — particle systems, noise fields, recursive patterns. The page feels alive and different on every visit. Canvas/WebGL-driven, non-traditional DOM. The viewport IS the canvas; UI floats above a living render.
---
## ANTI-SLOP CONSTRAINTS
- NO static imagery or pre-rendered hero images (visuals must be computed at runtime)
- NO traditional DOM layout (single full-viewport canvas is the page)
- NO CSS-only decoration (the generative canvas carries the visual weight)
- NO stock photography, no SVG illustration sets
- NO fixed gradients (gradients derive from noise fields)
- NO static color palette (algorithmically derived, hue from noise)
- NO text-heavy sections (visuals lead; text is floating metadata)
- NO decorative serif display type (monospace / technical sans-serif only)
- NO `overflow-y: hidden` dead pages — the field is interactive, not a wallpaper
---
## FONTS
Load via Google Fonts:
```
https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@400;500&family=Space+Grotesk:wght@400;500&display=swap
```
Usage:
- **IBM Plex Mono 400/500**: Labels, coordinates, readouts — 10-12px, uppercase, tracking 0.15em, `rgba(255,255,255,0.55)`
- **Space Grotesk 400/500**: Headlines — `clamp(1.5rem, 4vw, 3.5rem)`, sentence case, tracking -0.01em
- **Space Grotesk 400**: Body — `clamp(0.875rem, 1vw, 1rem)`, line-height 1.6
- Typography is secondary to visuals — text never competes with the canvas
---
## COLOR SYSTEM
Algorithmically derived — do not hardcode a flat palette:
```css
:root {
--bg-deep: #05060A; /* Near-black stage */
--particle-base: #7AE7FF; /* Cyan base hue for particles */
--particle-alt: #FF6B9D; /* Magenta accent hue */
--text-on-canvas: rgba(240, 245, 250, 0.85);
--text-muted: rgba(240, 245, 250, 0.5);
}
```
Per-particle color: `hsl(hue, 80%, 60%)` where `hue = base + noise(particle.x, particle.y) * 120` — the palette breathes with the field.
Body: `bg-[#05060A] text-[rgba(240,245,250,0.85)] antialiased font-body`.
---
## STRUCTURE
### 1. Render Stage (the canvas)
- Fixed full-viewport WebGL canvas (`position: fixed, inset: 0, z-index: 0`) — the entire page
- Particle system, 1000-2000 particles:
- Each particle: position, velocity, hue, life, size
- Motion: Perlin noise field — steering angle = `noise(x * 0.002, y * 0.002, t * 0.02) * TWO_PI * 2`
- Trail rendering: alpha-fade previous frames (no clear each frame, additive blending)
- Wrap or bounce at viewport edges — never let them die offscreen
- Seed: `Math.floor(Math.random() * 9999)` printed as a UI readout; regenerate button re-seeds
- React to pointer: particles within 150px of cursor get a velocity boost away/along the field
- No extra canvases — one stage, one field
### 2. UI Overlay (floating above canvas)
- `z-index: 10`, pointer-events none on container, auto on controls
- Top-left:
- Label: "FLUXFIELD / GENERATIVE SYSTEM v2.1" — IBM Plex Mono, 10px, uppercase, tracking 0.15em, text-muted
- Headline: "Code-as-art, rendered in real time" — Space Grotesk 500, `clamp(1.5rem, 4vw, 3.5rem)`, text-on-canvas
- Subtext: "A procedural system — particle fields, noise-driven motion, emergent behavior. Every visit is a new seed." — Space Grotesk 400, text-on-canvas, max-width 420px
- Bottom-left readouts (IBM Plex Mono, 10px, text-muted):
- `SEED 2847` / `PARTICLES 1,500` / `FPS 60`
- Bottom-right CTA: "ENTER THE FIELD" — IBM Plex Mono 500, 11px, uppercase, tracking 0.2em, bordered pill, `rgba(255,255,255,0.85)` on `rgba(255,255,255,0.08)` backdrop-blur, hover: hue-shift border to particle-alt
### 3. Overlay Sections (scrollable pages above the stage)
- Sections: `min-h-[100dvh]`, transparent background, translucent text floating over the live field
- Section 1 — WORK: 3-4 entries, each a label + headline + 1 sentence, `max-w-xl`
- Section 2 — METHOD: 3 numbered principles, IBM Plex Mono numerals:
1. "CODE IS THE MEDIUM — visuals computed, not designed"
2. "ALWAYS ALIVE — continuous procedural animation"
3. "CANVAS OVER DOM — WebGL rendering primary"
- Section 3 — ABOUT: 2-3 sentences on creative coding as practice
### 4. Footer
- "FLUXFIELD © 2026 — PROCEDURAL / ALIVE / EVER-CHANGING" — IBM Plex Mono, 10px, uppercase, tracking 0.15em, text-muted
---
## FIELD BEHAVIOR (locked)
```ts
// Perlin flow field — the core of the page
const angle = noise(
p.x * 0.002,
p.y * 0.002,
performance.now() * 0.00002
) * Math.PI * 4;
p.velX += Math.cos(angle) * 0.05;
p.velY += Math.sin(angle) * 0.05;
p.velX *= 0.98; // damping — particles glide, never snap
p.velY *= 0.98;
p.x += p.velX;
p.y += p.velY;
// palette from the field
p.hue = 190 + (noise(p.x * 0.001, p.y * 0.001) * 120); // cyan → magenta
```
- Alpha-trail rendering: `ctx.fillStyle = 'rgba(5,6,10,0.08)'` fillRect per frame, additive `lighter` composite for particles
- Particle count: adaptive — halve if FPS < 45
- `prefers-reduced-motion: reduce` → freeze at seed + 1 static frame, no pointer interaction
---
## ANTI-SLOP (LOCKED)
- Single full-viewport WebGL canvas — the page IS the render
- Particle system / noise field, 1000+ particles
- Continuous procedural animation — never static, never loops
- Seeded randomness — reproducible, seed shown as UI readout
- Algorithmic palette — hue derived from noise, not hardcoded
- Monospace / technical sans-serif — text is metadata
- Minimal floating UI over the field — no cards, no boxes
- Emergent behavior — simple rules, complex page
- No static imagery, no stock, no CSS-only decoration
- No traditional DOM layout — the viewport is the canvas
---
Recreate this page with the exact generative-algorithmic aesthetic: live particle field, noise-driven motion, seeded randomness, and the algorithmic color system above.
```This prompt recreates a specific design pixel-faithfully. Study it to understand the style at its purest.