Skip to content
Sample of Chromie Squiggle (Snowfro / Cherniak — Squiggles)

art_blocks · CherniakSquiggles

Chromie Squiggle (Snowfro / Cherniak — Squiggles)

An implementation of the squiggle-generation kernel used in Snowfro's *Chromie Squiggle* (Art Blocks #0, November 2020) — the on-chain generative-art project that launched the Art Blocks platform itself and was the work Dmitri Cherniak cited (alongside *Genesis*) as his inspiration for Ringers. The Squiggle is a single undulating line whose segments cycle through a curated palette of colours. NiftyFifty/SquiggleDAO's 2025 documentation classifies the 10,000-piece collection into six 'Types' — Normal, Slinky, Fuzzy, Ribbed, Bold, Pipe — plus six Hyper variants where the colour spread is multiplied 10x. This implementation builds the canonical undulating-curve kernel: a cosine wave with per-segment phase drift, with hue lerped across the spectrum (or via full-spectrum sweep in Hyper mode), and type-specific drawing logic (Fuzzy = pointillism dots; Ribbed = segments with 1-px gaps; Pipe = solid beam). The 'Color Spread' trait — Squiggle's defining DNA parameter — maps to hue_spread >= 1.0.

Original: https://www.artblocks.io/collection/chromie-squiggle-by-snowfro

▶ 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
art_blocks
Source
art blocks
Evolution
curve
Render
segmented_polyline
Complexity
low
Agents
1
Year
2020
Author
Erick Calderon (Snowfro); inspired by the Squiggle Cherniak discovered on Art Blocks day-1

Math essence

For each segment k in [0, num_segments): x_k = lerp(x_start, x_end, k/K); y_k = canvas_centre + amplitude * cos(2*pi*k*freq/K + phase + phase_drift[k]) + wobble[k]; colour_k = HSV->RGB(hue_start + hue_end_diff * k/K + hue_noise * noise[k]). The Type determines how the segment is rasterised: Normal/Slinky/Bold/Pipe draw thick polylines; Fuzzy stamps Gaussian-jittered dots; Ribbed draws the segment then paints a 1-px gap every N segments.

Parameters

Name Type Default Range Description
dim int 600 200–1500 Square canvas side length (px).
num_segments int 24 4–200 Number of segments K (Squiggle DNA: 8–60; Slinky up to 100).
amplitude float 60 0–300 Vertical amplitude of the cosine wave.
curve_freq float 1.2 0.1–16 Cosine waves across the canvas (Slinky: 4+, Pipe: 5+).
hue_start float 0 0–1 Start hue (0–1) of the colour cycle.
hue_end float 0.7 0–1 End hue (0–1) of the colour cycle.
hue_spread float 0.04 0–1 If >= 1.0, sweep full HSL spectrum across curve (Hyper mode).
hue_noise float 0.03 0–0.3 Per-segment random hue jitter.
wobble_amp float 8 0–50 Per-segment vertical wobble in px.
thickness int 2 1–16 Line thickness in px (Bold=6, Pipe=8).
type_ str normal null–null normal|slinky|bold|pipe|fuzzy|ribbed — Squiggle Type.
background_color tuple 255,255,255 null–null Background RGB colour (Squiggle default: white).
seed int 7 0–2147483647 RNG seed.

Reference

First 60 lines of reference.py. Full source: library_external/art_blocks/CherniakSquiggles/reference.py

"""CherniakSquiggles — "Squiggles" inspired by Snowfro's Chromie Squiggle.

This is the spectral, harmonic undulating-line family of generative
artworks descended from Erick Calderon's (Snowfro's) *Chromie Squiggle*
(Art Blocks #0, November 2020) — the on-chain generative-art collection
that launched the Art Blocks platform itself.  The Squiggle is a single
undulating line whose segments cycle through a curated palette of
colours; each piece is determined by a hash string that controls the
segment count, the colour spread, the start/end hues, and other
parameters.

The Squiggle's formal language (per NiftyFifty / SquiggleDAO 2025
documentation) has six 'Types':
    - **Normal** — the default undulating line.
    - **Slinky** — tightly coiled spring.
    - **Fuzzy** — line is replaced with small dots (pointillism).
    - **Ribbed** — segmented with breaks that produce a ridged texture.
    - **Bold** — fattened line (chunky ribbon).
    - **Pipe** — solid beam (Slinky grounded).

And six 'Hyper' variants (chromatic boost with color_spread >=10x).
The complete taxonomy:
    - 6,195 Normals, 1,145 Slinkies, 1,074 Fuzzies, 768 Ribbed,
      443 Bolds, 181 Pipes; 128 Hyper variants (Hyper Normal = 104,
      Hyper Slinky = 13, Hyper Bold = 7, Hyper Pipe = 4).

This implementation builds a generic Squiggle-family line that uses
the canonical undulating-curve kernel:

    For each segment k in [0, num_segments):
        x_k = canvas.x_start + (k / num_segments) * canvas.width
        y_k = canvas.centre_y + amp * cos(2*pi*k*freq + phase)
        colour = lerp(hue_start, hue_end, k/num_segments)

The amplitude / frequency / phase are perturbed per segment by
hash-derived noise so the curve has the gentle wobble of canonical
Squiggles.  Hyper mode is achieved by using the full HSL spectrum
spread (colour_spread >= 0.9) and a small wobble (high curve_freq).

This file is named CherniakSquiggles per the project brief but the
Squiggle kernel is canonical Snowfro.  Cherniak's connection is that
Squiggles are referenced as the second project he saw when he first
discovered Art Blocks (alongside Genesis), inspiring his own algorithmic
practice — but the actual algorithm here is the Squiggle kernel,
which Snowfro authored.

Reference:
- https://www.artblocks.io/articles/chromie-squiggle-algorithm-guide
- https://www.artblocks.io/collection/chromie-squiggle-by-snowfro
"""
from __future__ import annotations

from typing import ClassVar

import numpy as np


# ---------------------------------------------------------------------------
def _hsv_to_rgb_vec(h: np.ndarray, s: float = 0.85, v: float = 0.95) -> np.ndarray:
    """Vectorised HSV->RGB. h in [0, 1]."""

Try running it locally

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

python library_external/art_blocks/CherniakSquiggles/reference.py

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

More from art blocks

Sample of Cherniak Ringers (Dmitri Cherniak — Ringers)

Cherniak Ringers (Dmitri Cherniak — Ringers)

art_blocks · CherniakRingers

An implementation of Dmitri Cherniak's *Ringers* algorithm (Art Blocks Curated, January 2021, 1,000 NFTs) — one of the most-cited generative-art projects of the NFT era, and the source of *Ringers #879* ('The Goose') and *Ringers #962* (acquired by LACMA).

View →
Sample of Genesis (DCA — Day-Zero Art Blocks)

Genesis (DCA — Day-Zero Art Blocks)

art_blocks · DcaGenesis

An interpretation of DCA's *Genesis* (Art Blocks #1, November 2020) — one of three Day-Zero collections (alongside Snowfro's Chromie Squiggle and Jeff Davis's Construction Token) that minted in the first 24 hours of the Art Blocks platform.

View →
Sample of Hobbs Flow Field (Tyler Hobbs — Incomplete Control / Fidenza)

Hobbs Flow Field (Tyler Hobbs — Incomplete Control / Fidenza)

art_blocks · HobbsFlowField

The canonical perlin-noise flow-field algorithm described by Tyler Hobbs in his 2020 essay 'Flow Fields', and the algorithmic backbone of his Art Blocks Curated works *Incomplete Control* (Bright Moments, 2021) and *Fidenza* (Art Blocks, 2021).

View →
Sample of Hobbs Watercolor Blob

Hobbs Watercolor Blob

art_blocks · HobbsWatercolorBlob

Layered translucent Gaussian blobs with watercolor-style alpha falloff.

View →
Sample of Hobbs Watercolor Edge (Tyler Hobbs — Soft Textures / Watercolor)

Hobbs Watercolor Edge (Tyler Hobbs — Soft Textures / Watercolor)

art_blocks · HobbsWatercolorEdge

An implementation of Tyler Hobbs' 2017 'watercolor' technique: a recursive polygon-deformation algorithm whose midpoints are jittered by Gaussian noise across many passes, then stacked with low alpha (4% per layer, 30–100 layers total) to produce the soft, ink-bleed look of wet pigment on paper.

View →
Sample of Penne 80s Vector (Aaron Penne — outrun perspective wireframe)

Penne 80s Vector (Aaron Penne — outrun perspective wireframe)

art_blocks · Penne80sVector

The 80s-synthwave outrun grid, the visual aesthetic Aaron Penne references in his generative-art practice (notably in *Apparitions* and his broader body of work).

View →

See all art_blocks artworks →