In QQQLANG, any string of visible uppercase ASCII characters is a valid program.
Each character has three properties:
- An integer (
A=1,B=2, [...],}=67,~=68) - A color
- A function
Functions can take zero or more arguments. If a function takes arguments, the characters that follow are interpreted as arguments. Otherwise characters are interpreted as functions. The exception is the first character of the program string which sets an initial solid color.
For example, the program ABCD has the following interpretation:
Asets the initial color to #78A10FBis the 'border' function that creates a circular gradient around the edges. It takes one argument, the border color.Cbecomes the argument to 'B', the color of 'C' is #FF6B35Dis the 'drip' function, which creates a water drop effect. It takes no arguments.
If the program string ends before the last function has had arguments defined, it will use its own number and color as default arguments. For example, the programs AL, ALL, and ALLL are equivalent.
The question mark character ? is also a function that displays help text. ?1 and ?? show the first page of help, and ?A, ?B, etc. show subsequent pages of help text.
Some functions take an image index as an argument, and uses that old image in some way. ?# shows the history of images and the characters to use to retrieve each image.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
QQQ is short for QQQEJOTTONO, a word that my three-year old son wrote on a label maker. He then went on to write fifty or so other words, until the label roll ran out. I thought it'd be nice if these labels could be treated like code.
So QQQLANG is really a language designed for three year olds. It's a Turing complete* stack-based language that can accept any string of characters as a valid program, because each character is either a function name or an argument, depending on context.
(* Turing complete because it includes a Rule 110 function)
There are 68 functions, some are normal image editing functions like '1' (colorize), and some are weird, like L (3D Lissajous tubes) or V (overlay another image in the stack in Voronoi patterns).
The output images are completely deterministic given the program string and canvas size. You can share a qqqlang.com URL to replicate and fork the image.
QQQLANG is both an image synthesis and editing language. You can upload an image as the starting image, or as arguments to functions that take image inputs. You can also paste images from the clipboard, or paste image URLs.
This project is now finished and the language won't change (other than bug fixes). But anyone can fork the language and add new functions as a different language. It would be both fun and possible to build languages like QQQ-AUDIO, QQQ-VIDEO, QQQ-3D, etc.
Function: spheres — Renders image as texture on two 3D spheres with lighting.
Function: border — Border effect with various shapes.
Arguments:
- Border shape style (A=circular-solid, B=circular-blur, C=horizontal-solid, D=horizontal-blur, E=vertical-solid, F=vertical-blur, G=rectangular-solid, H=rectangular-blur, I=diamond-solid, J=diamond-blur, K=hexagon-solid, L=hexagon-blur, M=sine-horizontal-solid, N=sine-horizontal-blur, O=sine-vertical-solid, P=sine-vertical-blur, Q=triangle-horizontal-solid, R=triangle-horizontal-blur, S=triangle-vertical-solid, T=triangle-vertical-blur)
- Border color
Function: concentric-hue — Alternating original and hue-shifted concentric circles.
Arguments:
- Number of concentric circles
Function: drip — Metaball-based dripping water drops effect.
Function: emerald — Renders reflective 3D emeralds in symmetric pattern.
Function: fft-overflow — 2D FFT with magnitude overflow and chromatic phase shifts.
Arguments:
- FFT multiplier strength
Function: grayscale-colorize — Converts to grayscale then applies rainbow palette.
Arguments:
- Number of posterize colors
Function: hourglass — Hourglass gradient with bitwise color blending.
Function: invert-edges — Inverts colors then adds Sobel edge detection.
Function: julia-fractal — Julia set fractal masking the previous image.
Arguments:
- Fractal zoom depth
Function: kaleidoscope — N-way kaleidoscope effect with zoom.
Arguments:
- Number of kaleidoscope segments
Function: lissajous — 3D Lissajous tube with textured surface.
Arguments:
- Old image for tube texture
- Rotation angle multiplier
Function: moire — Moiré interference pattern with color zones.
Arguments:
- Pattern complexity seed
Function: neon — Neon glow effect on bright edges.
Function: oil-slick — Domain warping with iridescent lighting.
Arguments:
- Warp intensity and depth
Function: pixelate — Pixelate with diagonal split using average/saturated colors.
Arguments:
- Pixel cell size
Function: quad-prism — Negative prism with diagonal inversion and mirroring.
Function: room — 3D room with textured walls, ceiling, and floor.
Function: sierpinski — Sierpiński triangle fractal with color effects.
Arguments:
- Old image for triangle interior
- Fractal detail level (A-~)
Function: tiles — Grid of 3D tiles covering entire canvas, heights based on seed with multiplier.
Arguments:
- Building height multiplier (A=short, ~=tall)
Function: dither — Apply one of 16 dithering algorithms, from subtle to aggressive 2-color modes.
Arguments:
- Dithering algorithm (A=ordered-5level, B=bayer-bw, C=threshold-bw, D=ordered-2bit, E=floyd-rgb, F=floyd-bw, G=atkinson-4level, H=atkinson-bw, I=stucki-6level, J=burkes, K=sierra, L=random-bw, M=cluster-2bit, N=bluenoise-bw, O=bayer2x2-2bit, P=noise-2bit)
Function: voronoi — Voronoi cells alternating between current and old image, with variable pattern shape.
Arguments:
- Old image to alternate with
- Pattern shape
Function: whirl — Swirl distortion from center with quadratic falloff.
Arguments:
- Rotation multiplier (×20°)
Function: cppn — Compositional Pattern Producing Network warps and modulates saturation/value using a neural network. Fully deterministic based on input.
Arguments:
- Effect strength
Function: yuv-shift — YUV color shift with three gradient directions 120° apart: luminance, blue chrominance, and red chrominance shifts.
Arguments:
- Controls angle and intensity of color shifts
Function: zoom-blur — Radial motion blur from center with sharp center.
Arguments:
- Blur strength multiplier (×4px)
Function: bg-remove — Removes background from prev image using ML, composites on specified background.
Arguments:
- Background image to composite behind
Function: colorize — Tints the image with the specified color using gamma-corrected luminance and boosted saturation.
Arguments:
- Tint color applied based on luminance
Function: third-stamp — Replace a vertical third of current image with a third from old image.
Arguments:
- Old image to extract third from
- Old image third (1=left, 2=mid, 3=right, cycling)
- Current image third to replace (1=left, 2=mid, 3=right, cycling)
Function: triple-rotate — Three vertical strips with different rotations.
Function: quad-rotate — Four quadrants each rotated 0°, 90°, 180°, 270°.
Function: triangular-split — Triangular grid with hue shifts and lightness variation.
Arguments:
- Cell size multiplier
Function: posterize — Posterize to 4 levels per channel.
Function: chromatic — Chromatic aberration with RGB channel shifts.
Function: lemniscate — Infinity-loop lemniscate distortion.
Arguments:
- Distortion strength
Function: xor-blend — XOR blend creating glitchy digital artifacts.
Arguments:
- Old image to XOR with
Function: horizontal-shift — Horizontal shift with wraparound.
Arguments:
- Shift amount (A=left, 7=none, ~=right)
Function: rotate-90 — Rotate 90 degrees clockwise.
Function: vertical-shift — Vertical shift with wraparound.
Arguments:
- Shift amount (A=up, 7=none, ~=down)
Function: godrays — Volumetric light scattering from center.
Function: band-transform — Horizontal bands with alternating hue/saturation transforms.
Arguments:
- Number of horizontal bands
Function: insert — Replaces current image with specified old image.
Arguments:
- Old image index to insert
Function: segment-hue-sort — Color-based segmentation, then sorts pixels by hue within each segment.
Function: flip — Flips image horizontally or vertically based on argument parity.
Arguments:
- Flip direction (even=horizontal, odd=vertical)
Function: quadtree-compress — Adaptive quadtree compression - detailed areas keep resolution while uniform areas become large blocks, creating geometric patterns.
Arguments:
- Compression level (A=minimal/detailed, ~=maximal/geometric blocks)
Function: variable-checkerboard — Checkerboard blend with increasing square size from corner to corner.
Arguments:
- Old image to checkerboard with
Function: shear-radial — Combined shear and radial distortion. Shear amount couples to horizontal offset and radial strength.
Arguments:
- Center X offset (A=left, M=center, ~=right)
- Center Y offset (A=bottom, M=center, ~=top)
- Radial/shear strength (A=barrel, M=none, ~=pincushion)
Function: blur — Gaussian blur with adjustable radius using two-pass convolution.
Arguments:
- Blur radius (A=subtle, ~=heavy)
Function: fur — Fur/hair strands growing from pixels based on hue and noise.
Function: zoom — Zoom in 1.2× from center.
Function: stipple — Stipple dots at luminance-based positions.
Arguments:
- Stipple dot color
Function: blend — Blend old image with current using specified mode.
Arguments:
- Old image to blend with
- Blend mode (A=multiply, B=screen, C=overlay, D=darken, E=lighten, F=dodge, G=burn, H=hardlight, I=softlight, J=difference, K=exclusion, L=add, M=subtract, N=xor, O=and, P=or, Q=nand, R=nor, S=xnor, T=average, U=divide, V=grain-extract, W=grain-merge, X=vivid, Y=linear, Z=pin, 0=hardmix, 1=hue, 2=saturation, 3=color, 4=luminosity, 5=replace-dark-third, 6=replace-mid-third, 7=replace-light-third, 8=opacity-25, 9=opacity-50, <=opacity-75, >=glow, ^=negation, !=phoenix, "=reflect, #=freeze, $=heat, %=stamp, &=geometric, '=hypot, (=modulo, )=modulo-reverse, *=sin-blend, +=cos-blend, ,=bitshift-left, -=bitshift-right, .=threshold-max, /=threshold-min, :=threshold-swap, ;=posterize-blend)
Function: pointillism — Pointillism effect with saturated circular dots.
Arguments:
- Dot radius base (mod 8 + 2)
Function: circle-stamp — Stamp circular region from old image center onto current.
Arguments:
- Old image source
- X position (A=left, 7=center, ~=right)
- Y position (A=top, 7=center, ~=bottom)
- Circle size (A=tiny, ~=full)
- Blend mode (A=normal, B=xor, C=nand, D=and, E=or, F=multiply, G=screen, H=overlay, I=darken, J=lighten, K=difference, L=exclusion, M=add, N=subtract, O=hardlight, P=softlight)
Function: porthole — Circular window showing current image with old image as background.
Arguments:
- Old image for background
Function: semicircle-reflect — Top semicircle preserved, bottom reflected with wave distortion.
Function: shifted-stripes — Horizontal stripes with alternating shifts.
Arguments:
- Stripe height in pixels
Function: help — Display help text or image history table.
Arguments:
- Page number (A=intro, B+=reference, #=history)
Function: cond — Per-pixel conditional: extracts channel from condition image, outputs true-image pixel where value >= threshold, otherwise false-image pixel.
Arguments:
- Condition image sampled for threshold comparison
- Source image when condition >= threshold
- Source image when condition < threshold
- Color channel to extract from condition image (A=hue, B=saturation, C=lightness, D=red, E=green, F=blue)
- Threshold (A=0%, ~=100% of channel range)
Function: rotate — Rotate around center.
Arguments:
- Rotation amount (A=left, 7=none, ~=right)
Function: composite — Composite transformed region from old image onto current.
Arguments:
- Old image source
- Source X (normalized 0-1)
- Source Y (normalized 0-1)
- Source width (normalized 0-1)
- Source height (normalized 0-1)
- Dest X (normalized 0-1)
- Dest Y (normalized 0-1)
- Dest width (normalized 0-1)
- Dest height (normalized 0-1)
- Rotation (normalized 0-1 → 0-360°)
- Blend mode (mod 16: normal, xor, nand, and, or, multiply, screen, overlay, darken, lighten, diff, excl, add, sub, hard, soft)
Function: left-half-offset — Shift left half vertically by 20% with wraparound.
Function: scanlines — CRT scanline effect with darkening and displacement.
Function: rule110 — Rule 110 cellular automaton - a Turing-complete 1D CA applied horizontally to each row.
Arguments:
- Number of generations (×8)
Function: skew — Skew horizontal with wraparound.
Arguments:
- Skew amount (A=left, 7=none, ~=right)
Function: vertical-split — Vertical split with wavy blend zone using multiple blend modes.
Arguments:
- Old image for right half
Function: gradientify — Turns flat single-color areas into subtle gradients with hue shifts.
Function: wave-chromatic — Horizontal wave distortion with chromatic aberration.
Arguments:
- Wave amplitude and chromatic shift
MIT
Andreas Jansson (@andreasjansson)

















































































































































