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.
Move over the figure to light it. Leave and it settles back. Keyboard: Tab to it, arrows move the lamp, Esc rests.
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.
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.
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.
The videos are not here yet. Render them with node film/render.mjs --film <name>.
The kernel enforces some, the checkers fail you on others, and the rest are for whoever draws the next figure.
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.
src/figures/name.js with one define() call.node look.mjs name renders eight lamps, checks the rules and writes a sheet.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],
});