Copper Current
A 12-second silent loop of copper strands, drawn by code you can open. Change the geometry; the timing and palette hold.
MP4, 12 secondsEditable sourceMIT
Demo downloads are open to everyone. Editing and rendering happen in your own tools.
Every file in the source
The source holds the procedural renderer and its checks. project_graph.json addresses each part by its content digest.
| File | What it holds | Size | SHA-256 |
|---|---|---|---|
project_graph.json | Every part of the project and its content digest | 1.9 KB | 4adb56ff…6109 |
import-map.json | Pinned versions of each ES module | 0.6 KB | 1fddb711…6dd0 |
src/curves.js | The strands: count, weave and thickness | 3.4 KB | 6c96a346…d36e |
src/timing.js | The 12-second loop and its easing | 1.1 KB | 46512f6c…9bc6 |
src/palette.js | Five copper tones | 0.7 KB | bf341f35…d090 |
src/render.js | Canvas renderer with a fixed seed | 2.8 KB | 1c12cba8…6dde |
checks/reopen.test.js | The reopen check, run after each revision | 2.2 KB | aa6eb236…d0c2 |
README.md | How to open, change and render it | 1.6 KB | f7b6a180…8d9f |
LICENSE | MIT | 1.1 KB | 8925c4a7…7f25 |
Revision history
Each revision changes one part and records which parts stayed byte for byte.
Revision 3, current: Geometry revision Strands go from 6 to 9, woven tighter.
6 of 6 checks passedChangedsrc/curves.jsSame byte for bytesrc/timing.js, src/palette.js, src/render.jsRevision 2: Palette set Five copper tones replace the first two.
6 of 6 checks passedChangedsrc/palette.jsSame byte for bytesrc/curves.js, src/timing.js, src/render.jsRevision 1: First render The loop, its timing and its checks.
6 of 6 checks passedCreatedevery file in the source
Same palette and timing in both. Only the strands changed.
The reopen check
After every revision the project opens in a fresh browser profile from its files alone, and renders the same frames.
- Digests lock each part.
project_graph.json addresses every part by its content digest, so a change to one part leaves the rest byte for byte.
- The whole suite runs after each edit.
Frame times, loop length and palette are checked again, beyond the part that changed.
- It reopens clean.
A pinned import map, asset digests and a fixed seed reopen it in a clean browser profile or on a workstation.
| Check on revision 3 | Expected | Result |
|---|---|---|
| Kept parts match their digests | 3 of 3 match | Passed |
| Loop length | 12.00 s | Passed |
| Palette digest | Same as revision 2 | Passed |
| Frame time at 1080p | Under 16.7 ms | Passed |
| Frames 0 and 180 | Match the recorded frames | Passed |
| Fresh browser profile | Opens and renders | Passed |