Walldye

Stripe circles

inspired by Zach Lieberman, Circle Stripe1

Discs of fine parallel stripes, turned a few degrees apart, make broad moiré bands where they overlap.

Made with Claude Opus 5.5

Technique
line art
Inspired by
op art, creative coding
Shape
Any screen
Added
27 September 2026

Export

Shape
cropped from 16:9
Crop
Size
Format

Colors

  • #1C1B1Abackground
  • #DAD8CEforeground
  • #CF6A4Caccent

Sources

  1. Zach Lieberman, Circle Stripe, 2024. ↑
  2. Moiré pattern.

Source code

wallpapers/stripe-circles/design.py, 32 lines

"""Three overlapping discs of fine parallel stripes, each turned a few degrees, so the overlap shimmers into moire."""

from shapely.geometry import Point

from walldye import ACCENT_1, BG, BG_ALT, UI, Canvas, P, design
from walldye.geom import hatch

PITCH, STRIPE = 10, 5  # stripe spacing across the lines, and stripe width
# Back to front: center offset from the largest disc, radius, stripe angle (deg), paint, and the
# width of the bare ring knocked out around the disc (0 for none).
DISCS = (
    ((0, 0), 270, 0, UI, 0),
    ((180, 130), 200, 8, BG_ALT, 0),
    ((-100, 235), 150, -4, ACCENT_1, 3),
)


@design(aspects="any")
def draw(s: Canvas) -> None:
    # the largest disc's center: right of center on a desktop, under the clock on a phone
    anchor = s.pick(landscape=(0.65, 0.435), portrait=(0.45, 0.55))
    for offset, r, deg, paint, gap in DISCS:
        c = anchor + offset
        if gap:
            s.fill(P().circle(c, r + gap), BG)
        with s.clip() as disc:
            disc.add(P().circle(c, r))
        lines = P()
        for seg in hatch(Point(c).buffer(r + STRIPE), PITCH, deg=deg):
            lines.poly(seg)
        with s.group(clip_path=disc.ref):
            s.stroke(lines, paint, STRIPE)

Run it yourself

$ git clone https://github.com/nickolaj-jepsen/walldye && cd walldye$ uv run walldye render stripe-circles --theme fireproof -o stripe-circles-fireproof-16x9.svg