Engines

The creative engines follow a simple pattern: rules generate data, visualizations render it.


Sequence Renderer

The Pattern

Rule (math) → Sequence → Visualization (draw) → Canvas

Rules define what numbers to generate. Visualizations define how to draw them. They’re independent — mix any rule with any visualization.

Available Rules

RuleIDDescription
RecamánrecamanJump back by n if possible
FibonaccifibonacciF(n) = F(n-1) + F(n-2)
PrimesprimesPrime numbers only
Triangulartriangular1, 3, 6, 10, 15…
CollatzcollatzEven: n/2, Odd: 3n+1

Available Visualizations

VisualizationIDDescription
Line Graphline-graphConnected points, stock-chart style
Scatter PlotscatterDots positioned by sequence value
BarsbarsVertical bars per sequence step

Data Structures

Rule interface:

type SequenceRule = {
  name: string;
  id: string;
  description: string;
  maxSteps: number;
  getNext: (params: NextStepParams) => number;
};

Visualization interface:

type Visualization = {
  id: string;
  name: string;
  draw: (canvas, sequence) => void;
};

Shared Patterns

State Management

Engines use Zustand for state:

const { value, setValue } = useStore();

Pluggable Architecture

Add new rules or visualizations by:

  1. Defining the data structure
  2. Adding to the registry array
  3. UI updates automatically

This keeps the engine core stable while experiments evolve freely.


Extending