Skip to content

The Whale Carries the Night

A humpback swims through a night sea carrying a crescent moon and four tiny houses whose windows light one by one, then breathes out a fountain of stars. Black-and-ivory linocut.

Background, V1 Effects3D163 lines of codev1.0.0

In Nature & weather, Art & illustration styles, Made for phones

Next: A Door Into Four SeasonsSurprise me

The Whale Carries the Night preview
Starting live preview…
00:00:00:00 / 00:00:00:01

Live, running the real source at reduced resolution.

Combine several clips and hand them over together from your sequence.

A finished film

It plays exactly as rendered and has nothing to adjust. The preview runs the same code your AI receives.

Info

What it is

A bold two-ink linocut poster in motion. A humpback with carved throat pleats, stippled bumps and a long pectoral fin swims over scalloped cloud-waves, carrying a crescent moon and a tiny village on its back. The windows of the four houses light in sequence, the flukes flex, and the whale breathes out a rising fountain of new stars into the night. It ends with every window lit and the fountain at full height. The film has no settings.

Reuse it in your own idea

  • Bedtime-story opener: the windows light up in order, which suits a slow narration.
  • Book trailer card: leave the moon-lit sky above the whale for the title.
  • Poster-style still: the last frame, with the full fountain of stars, makes a finished poster.

Which part is reusable

src/linocut-whale.js is the ingredient your AI reuses. demo.js is only the example scene around it, and uses the demo harness only for the demo.

Good to know

  • The film is finished: it has no settings. To change colours or timing, edit the shader.
  • It is composed for a 4:5 portrait frame.
  • The end does not return to the start, so repeating it is a hard cut.

Technical details

Technical details
Implementation
Three.js 0.185.1 (WebGL) · ES module src/linocut-whale.js
Exports
  • createLinocutWhale() => { scene, camera, setSize(width, height), update(time), dispose() }
Dependencies (exact)
  • three@0.185.1 (source) — Renderer and a full-screen shader material.
  • apw-runtime@1.0.0 (demo) — Demo harness.
How it fits a scene

Coordinates: Composed for a 4:5 portrait frame and measured by the frame height: in a wider frame the picture stays centred at full height and its background fills the sides; in a narrower one, such as 9:16, the sides are cropped.

Lighting: None: two flat inks, ivory on black, with a hand-printed edge.

Timing: The windows of the four houses light in turn and the flukes flex; from about 4 s the whale breathes out a fountain of stars that keeps rising to the end.

Output
1080×1350, 30 fps, 8 s · procedural (computed from the frame number) · not a loop — A one-shot film: it builds to a finished picture that holds to the last frame, so the end does not return to the start.
Tested
Rendered 240 frames on 2026-10-10 in Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0 (WebGL 2 via SwiftShader (software)). Same frame twice from fresh pages: identical.
Performance
One full-screen fragment shader. About 20 ms a frame at 1080 by 1350 on an integrated Intel GPU (Iris Xe), and about 2 to 4 s a frame with software WebGL. Plays at 30 frames a second at full size on an integrated GPU.
Export a video yourself
Download the source, then in the folder: npm install npm run render -- linocut-whale/1.0.0 --out my-video.mp4Needs Node 18+, ffmpeg and Chrome/Chromium. Add --params my-settings.json (from Copy settings) for your own settings.
Version
1.0.0 · sha256:bdc4f0535e6ee18f…
Files
License
MIT. Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder. License details
Provenance
From the owner's collection Twenty Impossible Worlds: the original GLSL ES 3.00 shader of the film “The Whale Carries the Night”, created with ChatGPT / Codex and used as published, wrapped for AI Pixel Wizard as a three.js full-screen shader in October 2026. The collection's synthesised soundtrack is not part of this ingredient.
BinMore like this