Walldye

Clock wall

inspired by Humans since 1982, ClockClock 241

A wave crosses a wall of 24 clocks as their hands turn in step. One clock breaks ranks to tell 11:22.

Made with Claude Opus 5.5

Technique
instrument displays
Shape
Any screen
Added
27 September 2026

Colours

  • #1C1B1Abackground
  • #DAD8CEforeground
  • #CF6A4Caccent

Export

Format
Shape
Size

Notes

After ClockClock 24 by Humans since 1982, a wall of 24 clocks that shows the time once a minute and runs choreographies of its hands in between. Here the wall is mid-wave, and one clock has already arrived at the time.

Sources

  1. Humans since 1982, ClockClock 24. ↑

Source code

wallpapers/clockclock/design.py, 52 lines

"""A wall of 24 two-handed clocks whose hand bars turn along the diagonals into one wave, while one clock breaks ranks to tell the time."""

import math

from walldye import ACCENT, BG_ALT, UI, UI_HI, Canvas, P, Path, Vec, design, polar

R, PITCH = 76, 172  # dial radius and clock spacing
HAND = 0.9 * R
TIME = (11, 22)  # hours, minutes
# Wall shapes: columns, rows, and the odd clock (row, col). It sits where the bars run at 135
# degrees, so its minute hand stays in line.
LANDSCAPE = (8, 3, (1, 5))
PORTRAIT = (4, 6, (4, 1))


def wave(i: int, j: int) -> float:
    """Bearing of the bar at column `i`, row `j`: constant along each i - j diagonal, so where it
    settles at 135 degrees the bars of one diagonal line up."""
    return 135 + 90 * math.exp(-(((i - j - 0.5) / 1.9) ** 2))


def hands(d: Path, c: Vec, a: float, b: float, reach: float = HAND) -> None:
    """Two hands from pivot `c` at bearings `a` (length `reach`) and `b`, as one stroke."""
    d.M(polar(c, reach, bearing=a)).L(c).L(polar(c, HAND, bearing=b))


@design(aspects="any")
def draw(s: Canvas) -> None:
    cols, rows, odd = LANDSCAPE if s.landscape else PORTRAIT
    # a little right of and above centre on a landscape screen, as in the 16:9 original
    c = s.pick(landscape=(25 / 48, 25 / 54), portrait=(0.5, 0.46))
    origin = c - ((cols - 1) * PITCH / 2, (rows - 1) * PITCH / 2)

    rims, ticks, bars, pins, odd_hands = P(), P(), P(), P(), P()
    for j in range(rows):
        for i in range(cols):
            o = origin + (i * PITCH, j * PITCH)
            rims.circle(o, R)
            for k in range(12):
                ticks.M(polar(o, R - 9, deg=k * 30)).L(polar(o, R - 5, deg=k * 30))
            if (j, i) == odd:
                h, m = TIME
                # the minute hand stays with its neighbours, the hour hand kinks off them
                hands(odd_hands, o, (h + m / 60) * 30, m * 6, 0.62 * R)
                continue
            pins.circle(o, 2.5)
            hands(bars, o, wave(i, j), wave(i, j) + 180)
    s.stroke(rims, UI, 1.5)
    s.stroke(ticks, UI, 1.5)
    s.stroke(bars, UI_HI, 6, cap="round", join="round")
    s.fill(pins, BG_ALT)
    s.stroke(odd_hands, ACCENT, 6, cap="round", join="round")

Run it yourself

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