{"id":"murmuration","title":"Murmuration","category":"Choreography","prompt":"Four hundred and sixty particles, each on its own six-keyframe timeline with a per-particle delay: they pour in from the canvas edges, assemble the word GRAPHS sampled from a letterform raster, hold, dissolve through a golden-angle vortex, and re-assemble as MOTION in a shifted palette. The caption states the point: no human writes four hundred and sixty coordinated timelines by hand.","designedBy":{"provider":"anthropic","model":"claude-fable-5","inference":{"inputTokens":0,"outputTokens":0,"costUsd":0,"inPerMTokUsd":10,"outPerMTokUsd":50,"interactive":true}},"render":{"jobId":"rnd_1788538081915_mcmldl","credits":8,"priceUsd":0.12,"format":"mp4","renderMs":27658,"frameCount":240,"bytes":2086923,"seed":1803738651,"engineVersion":"v0.5.6","width":1440,"height":1080,"fps":30,"durationSeconds":8},"howToReproduce":{"renderApi":"POST /v1/renders with `renderRequest` below as the body (Authorization: Bearer <your pp_sa_… key>).","editor":"/gallery/murmuration/editor opens this piece live in the studio.","codeConsole":"/gallery/murmuration.js is this piece as PinePaper code — paste it into the editor's AI code console."},"renderRequest":{"scene":{"canvas":{"width":800,"height":600},"items":[],"relations":[],"generators":[],"media":[],"skeletons":[],"background":"#05070f","engineOps":[{"tool":"execute_custom_code","args":{"description":"Murmuration: 460 particles, six keyframes each, two sampled letterforms and a vortex between them","code":"function prng(seed){var t=seed>>>0;return function(){t+=0x6D2B79F5;var r=Math.imul(t^(t>>>15),1|t);r^=r+Math.imul(r^(r>>>7),61|r);return((r^(r>>>14))>>>0)/4294967296;}}\nvar r = prng(48151623);\n// Sample a word's ink into points on an offscreen canvas.\nfunction sampleWord(word, fs) {\n  var c = document.createElement('canvas'); c.width = 800; c.height = 600;\n  var x = c.getContext('2d');\n  x.clearRect(0, 0, 800, 600); x.fillStyle = '#fff';\n  x.textAlign = 'center'; x.textBaseline = 'middle';\n  x.font = '900 ' + fs + 'px Inter, Arial, sans-serif';\n  var w = x.measureText(word).width;\n  if (w > 700) { fs = Math.round(fs * 700 / w); x.font = '900 ' + fs + 'px Inter, Arial, sans-serif'; }\n  x.fillText(word, 400, 290);\n  var d = x.getImageData(0, 0, 800, 600).data, pts = [];\n  for (var yy = 0; yy < 600; yy += 7) for (var xx = 0; xx < 800; xx += 7) {\n    if (d[(yy * 800 + xx) * 4 + 3] > 128) pts.push([xx, yy]);\n  }\n  return pts;\n}\nvar A = sampleWord('GRAPHS', 175);\nvar B = sampleWord('MOTION', 175);\nvar N = Math.min(460, Math.max(A.length, B.length));\n// Deterministic scatter so neighbouring particles do NOT share targets —\n// that is what makes the convergence read as a flock, not a scan.\nfunction pick(pts, i) { return pts[(i * 7919 + 13) % pts.length]; }\nvar PAL1 = ['#67e8f9', '#7dd3fc', '#a5b4fc', '#c4b5fd', '#f0abfc'];\nvar PAL2 = ['#fde68a', '#fcd34d', '#fbbf24', '#fb923c', '#fb7185'];\nfor (var i = 0; i < N; i++) {\n  var a = pick(A, i), b = pick(B, i);\n  var edge = (r() * 4) | 0;\n  var sx = edge === 0 ? -20 : edge === 1 ? 820 : r() * 800;\n  var sy = edge < 2 ? r() * 600 : (edge === 2 ? -20 : 620);\n  var va = i * 2.39996, vr = 26 + 210 * (i / N);\n  var vx = 400 + Math.cos(va) * vr, vy = 300 + Math.sin(va) * vr * 0.72;\n  var dly = (i % 97) / 97 * 0.55;\n  var c1 = PAL1[(a[0] / 160) | 0] || PAL1[4];\n  var c2 = PAL2[(b[0] / 160) | 0] || PAL2[4];\n  var id = PinePaper.create('circle', { x: sx, y: sy, radius: 1.7 + r() * 1.9, fillColor: c1, opacity: 0 });\n  PinePaper.modifyItem(id, { animationType: 'keyframe', duration: 8, keyframes: [\n    { time: 0, properties: { x: sx, y: sy, opacity: 0 } },\n    { time: 0.15 + dly, properties: { x: sx, y: sy, opacity: 0.9 }, easing: 'easeOut' },\n    { time: 1.5 + dly, properties: { x: a[0], y: a[1], fillColor: c1, opacity: 1 }, easing: 'easeInOut' },\n    { time: 3.1 + dly * 0.6, properties: { x: a[0], y: a[1] } },\n    { time: 4.3 + dly, properties: { x: vx, y: vy, fillColor: '#e2e8f0', opacity: 0.85 }, easing: 'easeInOut' },\n    { time: 5.9 + dly * 0.5, properties: { x: b[0], y: b[1], fillColor: c2, opacity: 1 }, easing: 'easeInOut' },\n    { time: 8, properties: { x: b[0], y: b[1], fillColor: c2 } }\n  ] });\n}\n// The claim, typed at the end — because it is literally true of this file.\nvar cap = PinePaper.create('text', { x: 400, y: 560, content: 'four hundred and sixty timelines. zero written by hand.', fontSize: 19, fillColor: '#94a3b8', opacity: 0 });\nPinePaper.modifyItem(cap, { animationType: 'keyframe', duration: 8, keyframes: [\n  { time: 0, properties: { opacity: 0 } }, { time: 6.2, properties: { opacity: 0 } },\n  { time: 7.0, properties: { opacity: 0.95 }, easing: 'easeOut' }, { time: 8, properties: { opacity: 0.95 } }\n] });"}}]},"exportProfile":{"format":"mp4","resolution":"1080p","fps":30,"durationSeconds":6},"source":{"prompt":"Four hundred and sixty particles, each on its own six-keyframe timeline with a per-particle delay: they pour in from the canvas edges, assemble the word GRAPHS sampled from a letterform raster, hold, dissolve through a golden-angle vortex, and re-assemble as MOTION in a shifted palette. The caption states the point: no human writes four hundred and sixty coordinated timelines by hand.","provider":"anthropic","model":"claude-fable-5","app":"gallery-reproduction"}},"ops":[{"tool":"pinepaper_set_background_color","args":{"color":"#05070f"}},{"tool":"pinepaper_execute_custom_code","args":{"description":"Murmuration: 460 particles, six keyframes each, two sampled letterforms and a vortex between them","code":"function prng(seed){var t=seed>>>0;return function(){t+=0x6D2B79F5;var r=Math.imul(t^(t>>>15),1|t);r^=r+Math.imul(r^(r>>>7),61|r);return((r^(r>>>14))>>>0)/4294967296;}}\nvar r = prng(48151623);\n// Sample a word's ink into points on an offscreen canvas.\nfunction sampleWord(word, fs) {\n  var c = document.createElement('canvas'); c.width = 800; c.height = 600;\n  var x = c.getContext('2d');\n  x.clearRect(0, 0, 800, 600); x.fillStyle = '#fff';\n  x.textAlign = 'center'; x.textBaseline = 'middle';\n  x.font = '900 ' + fs + 'px Inter, Arial, sans-serif';\n  var w = x.measureText(word).width;\n  if (w > 700) { fs = Math.round(fs * 700 / w); x.font = '900 ' + fs + 'px Inter, Arial, sans-serif'; }\n  x.fillText(word, 400, 290);\n  var d = x.getImageData(0, 0, 800, 600).data, pts = [];\n  for (var yy = 0; yy < 600; yy += 7) for (var xx = 0; xx < 800; xx += 7) {\n    if (d[(yy * 800 + xx) * 4 + 3] > 128) pts.push([xx, yy]);\n  }\n  return pts;\n}\nvar A = sampleWord('GRAPHS', 175);\nvar B = sampleWord('MOTION', 175);\nvar N = Math.min(460, Math.max(A.length, B.length));\n// Deterministic scatter so neighbouring particles do NOT share targets —\n// that is what makes the convergence read as a flock, not a scan.\nfunction pick(pts, i) { return pts[(i * 7919 + 13) % pts.length]; }\nvar PAL1 = ['#67e8f9', '#7dd3fc', '#a5b4fc', '#c4b5fd', '#f0abfc'];\nvar PAL2 = ['#fde68a', '#fcd34d', '#fbbf24', '#fb923c', '#fb7185'];\nfor (var i = 0; i < N; i++) {\n  var a = pick(A, i), b = pick(B, i);\n  var edge = (r() * 4) | 0;\n  var sx = edge === 0 ? -20 : edge === 1 ? 820 : r() * 800;\n  var sy = edge < 2 ? r() * 600 : (edge === 2 ? -20 : 620);\n  var va = i * 2.39996, vr = 26 + 210 * (i / N);\n  var vx = 400 + Math.cos(va) * vr, vy = 300 + Math.sin(va) * vr * 0.72;\n  var dly = (i % 97) / 97 * 0.55;\n  var c1 = PAL1[(a[0] / 160) | 0] || PAL1[4];\n  var c2 = PAL2[(b[0] / 160) | 0] || PAL2[4];\n  var id = PinePaper.create('circle', { x: sx, y: sy, radius: 1.7 + r() * 1.9, fillColor: c1, opacity: 0 });\n  PinePaper.modifyItem(id, { animationType: 'keyframe', duration: 8, keyframes: [\n    { time: 0, properties: { x: sx, y: sy, opacity: 0 } },\n    { time: 0.15 + dly, properties: { x: sx, y: sy, opacity: 0.9 }, easing: 'easeOut' },\n    { time: 1.5 + dly, properties: { x: a[0], y: a[1], fillColor: c1, opacity: 1 }, easing: 'easeInOut' },\n    { time: 3.1 + dly * 0.6, properties: { x: a[0], y: a[1] } },\n    { time: 4.3 + dly, properties: { x: vx, y: vy, fillColor: '#e2e8f0', opacity: 0.85 }, easing: 'easeInOut' },\n    { time: 5.9 + dly * 0.5, properties: { x: b[0], y: b[1], fillColor: c2, opacity: 1 }, easing: 'easeInOut' },\n    { time: 8, properties: { x: b[0], y: b[1], fillColor: c2 } }\n  ] });\n}\n// The claim, typed at the end — because it is literally true of this file.\nvar cap = PinePaper.create('text', { x: 400, y: 560, content: 'four hundred and sixty timelines. zero written by hand.', fontSize: 19, fillColor: '#94a3b8', opacity: 0 });\nPinePaper.modifyItem(cap, { animationType: 'keyframe', duration: 8, keyframes: [\n  { time: 0, properties: { opacity: 0 } }, { time: 6.2, properties: { opacity: 0 } },\n  { time: 7.0, properties: { opacity: 0.95 }, easing: 'easeOut' }, { time: 8, properties: { opacity: 0.95 } }\n] });"}}],"license":"CC0-1.0"}