Skip to content
Sample of Hobbs QLIQUE (Tyler Hobbs — QQL dense-streamline tangle)

hobbs_cherniak_penne_deep · HobbsQLIQUE

Hobbs QLIQUE (Tyler Hobbs — QQL dense-streamline tangle)

A dense tangle of curves where every curve is a streamline through a Perlin flow field, in the visual spirit of Tyler Hobbs's 2022 QQL release (with Dandelion Mane). ~2400 agents each draw 1100 path steps through a single shared Perlin angle grid, with the canvas plus a wide margin so that streams that wander out can curve back in. Each segment is deposited with a low alpha (~0.05), and the hue shifts slowly with time so that each path becomes a thin colour ribbon rather than a single static colour. The result is the chaotic, emergent, single-image look that defines the QL aesthetic — a flow field run at much higher agent / step density than Hobbs's earlier Fidenza and Incomplete Control.

Original: https://www.tylerxhobbs.com/words/qql

▶ Try the live demo (JS port) ▶ Run reference.py via Pyodide 10 formulas have instant JS ports. The Pyodide path runs the actual Python in your browser — first load is ~6 MB, then instant.

Family
hobbs_cherniak_penne_deep
Source
hobbs_cherniak_penne_deep
Evolution
particle
Render
translucent_trail
Complexity
medium
Agents
2400
Year
2024
Author
Tyler Hobbs (algorithmic homage)

Math essence

Build G[i, j] = 2*pi * P(i*s, j*s) over a (rows, cols) grid with margin ~60%. Spawn N agents uniformly in the canvas+margin box. At each step: x_{t+1} = x_t + L*cos(G[floor(x), floor(y)]); y_{t+1} = y_t + L*sin(G[floor(x), floor(y)]); h(t) = h0 + omega*t (mod 1). Each segment painted with alpha 0.05 on a cream background, with the 3x3 Gaussian splat narrower than HobbsFlowField to keep the higher-density weave readable.

Parameters

Name Type Default Range Description
dim int 600 200–1500 Square canvas side length (px).
num_agents int 2400 200–8000 Number of streamline agents N.
path_steps int 1100 100–3000 Steps each agent takes. Total segments = N * path_steps.
resolution_frac float 0.01 0.002–0.05 Grid cell size as fraction of dim (Hobbs: ~0.005-0.015).
margin_frac float 0.6 0–1.5 Field margin beyond canvas, fraction of dim (QQL uses wide margins).
noise_scale float 0.09 0.01–0.5 Perlin noise spatial frequency.
noise_octaves int 2 1–6 Number of Perlin octaves to sum (fBm).
noise_persistence float 0.55 0.1–0.9 Amplitude ratio between successive octaves.
step_length float 1.2 0.1–8 Per-step pixel advance along the cell's field angle.
hue_base float 0.58 0–1 Base hue (0-1) of the ribbon palette.
hue_band float 0.18 0–0.5 Per-agent hue spread around hue_base.
alpha float 0.05 0.005–0.4 Per-segment alpha. QQL uses ~0.04-0.08 with many overlapping agents.
background tuple 245,240,232 null–null Background RGB colour (Hobbs cream).

Reference

First 60 lines of reference.py. Full source: library_external/hobbs_cherniak_penne_deep/HobbsQLIQUE/reference.py

"""HobbsQLIQUE — Tyler Hobbs dense-streamline tangle of curves.

Inspired by the "QLIQUE" / "QL-style" aesthetic that emerged from
Tyler Hobbs's 2022 QQL release with Dandelion Mane: a dense, chaotic
tangle of curves where every curve is a streamline through a Perlin
flow field, and the whole field is filled with N agents each drawing
K path steps.

Hobbs's own description (LACMA, 2024):

    "QQL and Fidenza share one core component, which is an
    underlying flow field that structures most of the image. ...
    QQL takes a lot of care to establish larger structures that
    interact with the flow fields in various ways that tend to have
    a lot of emergent possibility."

The QLIQUE kernel we implement:

    1. Build a Perlin angle grid covering the canvas plus a wide
       margin (so strands that wander out can curve back in).
    2. Spawn N agents, each at a random starting position, each
       with a small "shape vector" of K angles drawn from the seed.
    3. Each agent steps along the local field angle. The agent's
       hue cycles slightly with each step (the "QL color band"
       technique that gives QQL its translucent, ribbon-like look).
    4. Each segment is deposited with a low alpha, building up the
       dense tangle over a fixed number of steps.

This is much denser than HobbsFlowField (1500 agents, 1500 steps):
~2000-3000 agents, each completing 800-1500 path steps, ~2-3 million
segments total — the "chaotic single image" of the QL aesthetic.

Reference:
- https://www.tylerxhobbs.com/words/qql
- https://qql.art
- https://unframed.lacma.org/2024/06/05/remembrance-things-future-conversation-tyler-hobbs-artist-experimenting-blockchain
"""
from __future__ import annotations

from typing import ClassVar

import numpy as np


# ---------------------------------------------------------------------------
# Vectorised 2D Perlin noise (the kernel Hobbs uses to initialise the field)
# ---------------------------------------------------------------------------
def _fade(t: np.ndarray) -> np.ndarray:
    return t * t * t * (t * (t * 6 - 15) + 10)


def _perlin2(perm: np.ndarray, x: np.ndarray, y: np.ndarray) -> np.ndarray:
    xi = np.floor(x).astype(np.int64) & 255
    yi = np.floor(y).astype(np.int64) & 255
    xf = x - np.floor(x)
    yf = y - np.floor(y)
    u = _fade(xf)
    v = _fade(yf)

    dirs = np.array(

Try running it locally

The reference implementation is self-contained Python with numpy. Install the package and run:

python library_external/hobbs_cherniak_penne_deep/HobbsQLIQUE/reference.py

Need help? See Learn for the standard environment setup, or Playground for an in-browser sketchbook.

More from hobbs_cherniak_penne_deep

Sample of Cherniak Constellations (Dmitri Cherniak point-cloud + graph)

Cherniak Constellations (Dmitri Cherniak point-cloud + graph)

hobbs_cherniak_penne_deep · CherniakConstellations

A pseudo-random point cloud with connecting lines filtered by distance, producing graph-like emergent forms.

View →
Sample of Cherniak Nibbles (Dmitri Cherniak cell-eating cellular automata)

Cherniak Nibbles (Dmitri Cherniak cell-eating cellular automata)

hobbs_cherniak_penne_deep · CherniakNibbles

A cellular-automata growth algorithm in the spirit of Dmitri Cherniak's body of work — small 2D shapes ('nibbles') that grow by selectively removing neighbours.

View →
Sample of Hobbs Color-Field Overlay (Tyler Hobbs compositional method)

Hobbs Color-Field Overlay (Tyler Hobbs compositional method)

hobbs_cherniak_penne_deep · HobbsColorFieldOverlay

Hobbs's compositional method of choice: combine TWO independent fields — a Perlin flow field that drives the *trajectory* of a set of line segments, and a Gaussian-blurred colour field that drives the *colour* and *opacity* of those segments.

View →
Sample of Hobbs Spirograph (Tyler Hobbs — Petal Loops / Elektroanima)

Hobbs Spirograph (Tyler Hobbs — Petal Loops / Elektroanima)

hobbs_cherniak_penne_deep · HobbsSpirograph

A rotating-circular-arc trail in the spirit of Tyler Hobbs's *Petal Loops* (2020) and *Elektroanima* (2020) — works described by Hobbs as 'looping taken to an excessive level.' M rotating points (default 8) are connected by a closed polyline that morphs each frame as the whole ring rotates by a small angle around a central anchor.

View →
Sample of Penne Imprecise Balance (Aaron Penne stacked-blocks column)

Penne Imprecise Balance (Aaron Penne stacked-blocks column)

hobbs_cherniak_penne_deep · PenneImpreciseBalance

A column of stacked rectangular blocks where each block is rotated by a seed-derived angle.

View →
Sample of Penne Ringers (Aaron Penne concentric ring extrusion)

Penne Ringers (Aaron Penne concentric ring extrusion)

hobbs_cherniak_penne_deep · PenneRingers

Penne's take on the *Ringers* idiom (best known from Cherniak's Art Blocks release, 2021): concentric rings extruded along the Z axis, rotated about a common axis, projected to 2D.

View →

See all hobbs_cherniak_penne_deep artworks →