Workberk.bozProjects
Bitlight 0.1 · 22 figures · MIT · GitHub · Photo & video
Sundial

Lab

Ink
Screen
Lamp

Bitlight

Objects drawn in one bit, lit by your pointer.

Each figure is a still object on a plate. Your cursor is a lamp hanging over it. Every dot is paper or ink, ordered by an 8×8 Bayer matrix, so the shading holds still while the light moves.

Figure
Dot size

Move over the figure to light it. Leave and it settles back. Keyboard: Tab to it, arrows move the lamp, Esc rests.

Twenty-two figures

The frame you see at rest is the thumbnail, so each figure has a designed lamp position. Nothing in a figure moves except the light. Some read-outs say more than angles: the sundial tells the time, the moon names its phase, the dice name the brightest face.

Objects

Scenes

Whole set-ups built from shared props: a computer with guarded fans, a desk, racks of servers, a café table, a cloud. Same kernel, same budget.

Films, same look

The film renderer runs the figures' lighting code but lets geometry, cameras and lights move every frame. Words are drawn on the same dot grid. Shots cut hard; the score is square waves. The square ones are made for feeds.

Move the light · 13 s
One light · 8 s loop
A day, fast · 11 s
Twenty-two · 14 s
Scenes · 35 s · the props in motion

The ten rules

The kernel enforces some, the checkers fail you on others, and the rest are for whoever draws the next figure.

  1. 01Two inksPaper and ink. No grey, no alpha, no anti-aliasing.
  2. 02One lightThe pointer is the only input. Geometry is marched once and cached.
  3. 03ReachThe lamp is clamped to the plate. At the far edge the figure is still composed.
  4. 04OrderBayer, never error diffusion. Diffused dots crawl when the light moves.
  5. 05EdgeA one-dot paper gap separates a near silhouette from what is behind it.
  6. 06RangeEvery lamp position leaves both inks on the plate.
  7. 07RestThe rest frame is the thumbnail. Light the faces the camera sees.
  8. 08ClockA stiff spring follows the pointer; a soft one carries the lamp home.
  9. 09CostOne frame loop for the page. Settled figures sleep. Re-light under 16 ms.
  10. 10QuietNo text inside a figure. Words live in the read-out.

Make your own

A figure is one signed-distance function and a lamp position. The repo ships an agent skill, so Claude Code or Codex can pitch, build and check a figure, then show you its frame sheet.

  1. Pitch it in one line: the object, what the light reveals, what the read-out says.
  2. Write src/figures/name.js with one define() call.
  3. node look.mjs name renders eight lamps, checks the rules and writes a sheet.
  4. Look at the sheet. Fix the figure until it passes and reads at rest.
import { define, sd } from "bitlight";

export default define({
  name: "Orb",
  means: "A ball on a plate.",
  sdf: (x, y, z) =>
    sd.sphere(x, y - 0.62, z, 0.62),
  bound: [0, 0.62, 0, 0.64],
  rest: [-0.25, 1.5, 1.35],
});