{"id":"three-thousand","title":"Three thousand","category":"Scale","prompt":"Three thousand points assemble into a sphere. Each one enters from its own edge of the frame, on its own clock, travels to its own position on a Fibonacci sphere, and settles at a brightness and size set by its depth — so the cloud reads as a solid rather than a disc. Roughly half of them breathe at individually varied tempos once they arrive. A thin ring fades in behind the finished form, and a count states plainly how many timelines are running: 3,000, each with its own arrival, position and tempo.","designedBy":{"provider":"anthropic","model":"claude-fable-5","inference":{"inputTokens":0,"outputTokens":0,"costUsd":0,"inPerMTokUsd":10,"outPerMTokUsd":50,"interactive":true}},"render":{"jobId":"rnd_1788538329607_yngy3n","credits":10,"priceUsd":0.15,"format":"mp4","renderMs":94281,"frameCount":300,"bytes":2230069,"seed":2283086661,"engineVersion":"v0.5.6","width":1440,"height":1080,"fps":30,"durationSeconds":10},"howToReproduce":{"renderApi":"POST /v1/renders with `renderRequest` below as the body (Authorization: Bearer <your pp_sa_… key>).","editor":"/gallery/three-thousand/editor opens this piece live in the studio.","codeConsole":"/gallery/three-thousand.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":"Three thousand: a Fibonacci sphere assembled from 3,000 individually-timed points","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(20260821);\nvar N = 3000, DUR = 10, CX = 400, CY = 285, R = 205;\n// Destinations: a Fibonacci sphere, projected. Even coverage without\n// clumping, which is what makes 3,000 points read as a form rather than\n// as noise.\nvar GOLD = Math.PI * (3 - Math.sqrt(5));\nfor (var i = 0; i < N; i++) {\n  var y = 1 - (i / (N - 1)) * 2;\n  var rad = Math.sqrt(Math.max(0, 1 - y * y));\n  var th = GOLD * i;\n  var px = Math.cos(th) * rad, pz = Math.sin(th) * rad;\n  // Orthographic projection; depth drives size and brightness so the\n  // sphere reads as a solid rather than a disc.\n  var depth = (pz + 1) / 2;\n  var dx = CX + px * R, dy = CY + y * R * 0.92;\n  // Each point starts somewhere off its own edge and arrives on its own\n  // clock — the stagger is per-item, not a global sweep.\n  var edge = r();\n  var sx = edge < 0.25 ? -60 : edge < 0.5 ? 860 : CX + (r() - 0.5) * 900;\n  var sy = edge < 0.5 ? CY + (r() - 0.5) * 700 : (edge < 0.75 ? -60 : 660);\n  var t0 = 0.15 + r() * 3.2;\n  var t1 = t0 + 1.1 + r() * 1.5;\n  var size = 0.7 + depth * 2.1;\n  var col = depth > 0.72 ? '#e9f2ff' : (depth > 0.42 ? '#7cc4f5' : '#4a63b8');\n  var id = PinePaper.create('circle', {\n    x: sx, y: sy, radius: size,\n    fillColor: col, opacity: 0\n  });\n  PinePaper.modifyItem(id, { animationType: 'keyframe', duration: DUR, keyframes: [\n    { time: 0, properties: { x: sx, y: sy, opacity: 0 } },\n    { time: t0, properties: { x: sx, y: sy, opacity: 0 } },\n    { time: t1, properties: { x: dx, y: dy, opacity: 0.25 + depth * 0.7 }, easing: 'easeOut' },\n    { time: DUR, properties: { x: dx, y: dy, opacity: 0.25 + depth * 0.7 } }\n  ] });\n  // Its own breathing tempo on top of its own arrival.\n  if (r() < 0.45) PinePaper.animate(id, { animationType: 'fade', speed: 0.25 + r() * 1.5 });\n}\n// A ring to give the form an edge to sit against.\nvar ring = PinePaper.create('circle', { x: CX, y: CY, radius: R + 26, fillColor: null, strokeColor: '#22304f', strokeWidth: 1.2, opacity: 0 });\nPinePaper.modifyItem(ring, { animationType: 'keyframe', duration: DUR, keyframes: [\n  { time: 0, properties: { opacity: 0 } }, { time: 4.2, properties: { opacity: 0 } },\n  { time: 5.2, properties: { opacity: 0.85 } }, { time: DUR, properties: { opacity: 0.85 } }\n] });\nvar count = PinePaper.create('text', { x: CX, y: 540, content: '', fontSize: 40, fontWeight: '700', fillColor: '#f1f6ff' });\nvar sub = PinePaper.create('text', { x: CX, y: 575, content: '', fontSize: 16, fillColor: '#8fa6c9' });\nPinePaper.modifyItem(count, { animationType: 'keyframe', duration: 10, keyframes: [{ time: 0, properties: { content: '' } }, { time: 5.40, properties: { content: '' } }, { time: 5.460, properties: { content: '3' } }, { time: 5.520, properties: { content: '3,' } }, { time: 5.580, properties: { content: '3,0' } }, { time: 5.640, properties: { content: '3,00' } }, { time: 5.700, properties: { content: '3,000' } }, { time: 5.760, properties: { content: '3,000 ' } }, { time: 5.820, properties: { content: '3,000 e' } }, { time: 5.880, properties: { content: '3,000 el' } }, { time: 5.940, properties: { content: '3,000 ele' } }, { time: 6.000, properties: { content: '3,000 elem' } }, { time: 6.060, properties: { content: '3,000 eleme' } }, { time: 6.120, properties: { content: '3,000 elemen' } }, { time: 6.180, properties: { content: '3,000 element' } }, { time: 6.240, properties: { content: '3,000 elements' } }, { time: 10.00, properties: { content: '3,000 elements' } }] });\nPinePaper.modifyItem(sub, { animationType: 'keyframe', duration: 10, keyframes: [{ time: 0, properties: { content: '' } }, { time: 6.20, properties: { content: '' } }, { time: 6.228, properties: { content: 'e' } }, { time: 6.256, properties: { content: 'ea' } }, { time: 6.284, properties: { content: 'eac' } }, { time: 6.312, properties: { content: 'each' } }, { time: 6.340, properties: { content: 'each ' } }, { time: 6.368, properties: { content: 'each w' } }, { time: 6.396, properties: { content: 'each wi' } }, { time: 6.424, properties: { content: 'each wit' } }, { time: 6.452, properties: { content: 'each with' } }, { time: 6.480, properties: { content: 'each with ' } }, { time: 6.508, properties: { content: 'each with i' } }, { time: 6.536, properties: { content: 'each with it' } }, { time: 6.564, properties: { content: 'each with its' } }, { time: 6.592, properties: { content: 'each with its ' } }, { time: 6.620, properties: { content: 'each with its o' } }, { time: 6.648, properties: { content: 'each with its ow' } }, { time: 6.676, properties: { content: 'each with its own' } }, { time: 6.704, properties: { content: 'each with its own ' } }, { time: 6.732, properties: { content: 'each with its own a' } }, { time: 6.760, properties: { content: 'each with its own ar' } }, { time: 6.788, properties: { content: 'each with its own arr' } }, { time: 6.816, properties: { content: 'each with its own arri' } }, { time: 6.844, properties: { content: 'each with its own arriv' } }, { time: 6.872, properties: { content: 'each with its own arriva' } }, { time: 6.900, properties: { content: 'each with its own arrival' } }, { time: 6.928, properties: { content: 'each with its own arrival,' } }, { time: 6.956, properties: { content: 'each with its own arrival, ' } }, { time: 6.984, properties: { content: 'each with its own arrival, p' } }, { time: 7.012, properties: { content: 'each with its own arrival, po' } }, { time: 7.040, properties: { content: 'each with its own arrival, pos' } }, { time: 7.068, properties: { content: 'each with its own arrival, posi' } }, { time: 7.096, properties: { content: 'each with its own arrival, posit' } }, { time: 7.124, properties: { content: 'each with its own arrival, positi' } }, { time: 7.152, properties: { content: 'each with its own arrival, positio' } }, { time: 7.180, properties: { content: 'each with its own arrival, position' } }, { time: 7.208, properties: { content: 'each with its own arrival, position ' } }, { time: 7.236, properties: { content: 'each with its own arrival, position a' } }, { time: 7.264, properties: { content: 'each with its own arrival, position an' } }, { time: 7.292, properties: { content: 'each with its own arrival, position and' } }, { time: 7.320, properties: { content: 'each with its own arrival, position and ' } }, { time: 7.348, properties: { content: 'each with its own arrival, position and t' } }, { time: 7.376, properties: { content: 'each with its own arrival, position and te' } }, { time: 7.404, properties: { content: 'each with its own arrival, position and tem' } }, { time: 7.432, properties: { content: 'each with its own arrival, position and temp' } }, { time: 7.460, properties: { content: 'each with its own arrival, position and tempo' } }, { time: 10.00, properties: { content: 'each with its own arrival, position and tempo' } }] });"}}]},"exportProfile":{"format":"mp4","resolution":"1080p","fps":30,"durationSeconds":6},"source":{"prompt":"Three thousand points assemble into a sphere. Each one enters from its own edge of the frame, on its own clock, travels to its own position on a Fibonacci sphere, and settles at a brightness and size set by its depth — so the cloud reads as a solid rather than a disc. Roughly half of them breathe at individually varied tempos once they arrive. A thin ring fades in behind the finished form, and a count states plainly how many timelines are running: 3,000, each with its own arrival, position and tempo.","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":"Three thousand: a Fibonacci sphere assembled from 3,000 individually-timed points","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(20260821);\nvar N = 3000, DUR = 10, CX = 400, CY = 285, R = 205;\n// Destinations: a Fibonacci sphere, projected. Even coverage without\n// clumping, which is what makes 3,000 points read as a form rather than\n// as noise.\nvar GOLD = Math.PI * (3 - Math.sqrt(5));\nfor (var i = 0; i < N; i++) {\n  var y = 1 - (i / (N - 1)) * 2;\n  var rad = Math.sqrt(Math.max(0, 1 - y * y));\n  var th = GOLD * i;\n  var px = Math.cos(th) * rad, pz = Math.sin(th) * rad;\n  // Orthographic projection; depth drives size and brightness so the\n  // sphere reads as a solid rather than a disc.\n  var depth = (pz + 1) / 2;\n  var dx = CX + px * R, dy = CY + y * R * 0.92;\n  // Each point starts somewhere off its own edge and arrives on its own\n  // clock — the stagger is per-item, not a global sweep.\n  var edge = r();\n  var sx = edge < 0.25 ? -60 : edge < 0.5 ? 860 : CX + (r() - 0.5) * 900;\n  var sy = edge < 0.5 ? CY + (r() - 0.5) * 700 : (edge < 0.75 ? -60 : 660);\n  var t0 = 0.15 + r() * 3.2;\n  var t1 = t0 + 1.1 + r() * 1.5;\n  var size = 0.7 + depth * 2.1;\n  var col = depth > 0.72 ? '#e9f2ff' : (depth > 0.42 ? '#7cc4f5' : '#4a63b8');\n  var id = PinePaper.create('circle', {\n    x: sx, y: sy, radius: size,\n    fillColor: col, opacity: 0\n  });\n  PinePaper.modifyItem(id, { animationType: 'keyframe', duration: DUR, keyframes: [\n    { time: 0, properties: { x: sx, y: sy, opacity: 0 } },\n    { time: t0, properties: { x: sx, y: sy, opacity: 0 } },\n    { time: t1, properties: { x: dx, y: dy, opacity: 0.25 + depth * 0.7 }, easing: 'easeOut' },\n    { time: DUR, properties: { x: dx, y: dy, opacity: 0.25 + depth * 0.7 } }\n  ] });\n  // Its own breathing tempo on top of its own arrival.\n  if (r() < 0.45) PinePaper.animate(id, { animationType: 'fade', speed: 0.25 + r() * 1.5 });\n}\n// A ring to give the form an edge to sit against.\nvar ring = PinePaper.create('circle', { x: CX, y: CY, radius: R + 26, fillColor: null, strokeColor: '#22304f', strokeWidth: 1.2, opacity: 0 });\nPinePaper.modifyItem(ring, { animationType: 'keyframe', duration: DUR, keyframes: [\n  { time: 0, properties: { opacity: 0 } }, { time: 4.2, properties: { opacity: 0 } },\n  { time: 5.2, properties: { opacity: 0.85 } }, { time: DUR, properties: { opacity: 0.85 } }\n] });\nvar count = PinePaper.create('text', { x: CX, y: 540, content: '', fontSize: 40, fontWeight: '700', fillColor: '#f1f6ff' });\nvar sub = PinePaper.create('text', { x: CX, y: 575, content: '', fontSize: 16, fillColor: '#8fa6c9' });\nPinePaper.modifyItem(count, { animationType: 'keyframe', duration: 10, keyframes: [{ time: 0, properties: { content: '' } }, { time: 5.40, properties: { content: '' } }, { time: 5.460, properties: { content: '3' } }, { time: 5.520, properties: { content: '3,' } }, { time: 5.580, properties: { content: '3,0' } }, { time: 5.640, properties: { content: '3,00' } }, { time: 5.700, properties: { content: '3,000' } }, { time: 5.760, properties: { content: '3,000 ' } }, { time: 5.820, properties: { content: '3,000 e' } }, { time: 5.880, properties: { content: '3,000 el' } }, { time: 5.940, properties: { content: '3,000 ele' } }, { time: 6.000, properties: { content: '3,000 elem' } }, { time: 6.060, properties: { content: '3,000 eleme' } }, { time: 6.120, properties: { content: '3,000 elemen' } }, { time: 6.180, properties: { content: '3,000 element' } }, { time: 6.240, properties: { content: '3,000 elements' } }, { time: 10.00, properties: { content: '3,000 elements' } }] });\nPinePaper.modifyItem(sub, { animationType: 'keyframe', duration: 10, keyframes: [{ time: 0, properties: { content: '' } }, { time: 6.20, properties: { content: '' } }, { time: 6.228, properties: { content: 'e' } }, { time: 6.256, properties: { content: 'ea' } }, { time: 6.284, properties: { content: 'eac' } }, { time: 6.312, properties: { content: 'each' } }, { time: 6.340, properties: { content: 'each ' } }, { time: 6.368, properties: { content: 'each w' } }, { time: 6.396, properties: { content: 'each wi' } }, { time: 6.424, properties: { content: 'each wit' } }, { time: 6.452, properties: { content: 'each with' } }, { time: 6.480, properties: { content: 'each with ' } }, { time: 6.508, properties: { content: 'each with i' } }, { time: 6.536, properties: { content: 'each with it' } }, { time: 6.564, properties: { content: 'each with its' } }, { time: 6.592, properties: { content: 'each with its ' } }, { time: 6.620, properties: { content: 'each with its o' } }, { time: 6.648, properties: { content: 'each with its ow' } }, { time: 6.676, properties: { content: 'each with its own' } }, { time: 6.704, properties: { content: 'each with its own ' } }, { time: 6.732, properties: { content: 'each with its own a' } }, { time: 6.760, properties: { content: 'each with its own ar' } }, { time: 6.788, properties: { content: 'each with its own arr' } }, { time: 6.816, properties: { content: 'each with its own arri' } }, { time: 6.844, properties: { content: 'each with its own arriv' } }, { time: 6.872, properties: { content: 'each with its own arriva' } }, { time: 6.900, properties: { content: 'each with its own arrival' } }, { time: 6.928, properties: { content: 'each with its own arrival,' } }, { time: 6.956, properties: { content: 'each with its own arrival, ' } }, { time: 6.984, properties: { content: 'each with its own arrival, p' } }, { time: 7.012, properties: { content: 'each with its own arrival, po' } }, { time: 7.040, properties: { content: 'each with its own arrival, pos' } }, { time: 7.068, properties: { content: 'each with its own arrival, posi' } }, { time: 7.096, properties: { content: 'each with its own arrival, posit' } }, { time: 7.124, properties: { content: 'each with its own arrival, positi' } }, { time: 7.152, properties: { content: 'each with its own arrival, positio' } }, { time: 7.180, properties: { content: 'each with its own arrival, position' } }, { time: 7.208, properties: { content: 'each with its own arrival, position ' } }, { time: 7.236, properties: { content: 'each with its own arrival, position a' } }, { time: 7.264, properties: { content: 'each with its own arrival, position an' } }, { time: 7.292, properties: { content: 'each with its own arrival, position and' } }, { time: 7.320, properties: { content: 'each with its own arrival, position and ' } }, { time: 7.348, properties: { content: 'each with its own arrival, position and t' } }, { time: 7.376, properties: { content: 'each with its own arrival, position and te' } }, { time: 7.404, properties: { content: 'each with its own arrival, position and tem' } }, { time: 7.432, properties: { content: 'each with its own arrival, position and temp' } }, { time: 7.460, properties: { content: 'each with its own arrival, position and tempo' } }, { time: 10.00, properties: { content: 'each with its own arrival, position and tempo' } }] });"}}],"license":"CC0-1.0"}