{"id":"recipe-hybrid","title":"Pasta, Plated (hybrid)","category":"Hybrid film","prompt":"An 8-second vertical recipe reel: overhead footage of a fork twirling tomato basil pasta, with a 15-MINUTE DINNER kicker, the dish's name in a serif, a red rule and four ingredient chips laid over it.","designedBy":{"provider":"pinepaper","model":"PinePaper team (overlay written by hand)","inference":{"measured":false,"inputTokens":3703,"outputTokens":623,"costUsd":0.0682,"inPerMTokUsd":10,"outPerMTokUsd":50,"estimated":true,"basis":"estimated as one chat turn — the draw-contract prompt and brief in, the 2,305-character program out, at ~3.7 characters per token; the model is not in the rate catalogue, so it is priced at the catalogue ceiling"}},"render":{"credits":4,"priceUsd":0.06,"format":"mp4","renderMs":16387,"frameCount":240,"bytes":3452548,"seed":3972103265,"width":720,"height":1280,"fps":30,"durationSeconds":8},"howToReproduce":{"renderApi":"POST /v1/renders with `renderRequest` below as the body (Authorization: Bearer <your pp_sa_… key>).","chat":"Paste the prompt into /chat: an illustrated film brief is answered with a program like this one, and plays at once.","note":"A hybrid: this draw contract is drawn over a generated clip (Seedance 1.0 Pro (ByteDance, via fal), image to video), named in renderRequest.scene.baseVideo. That clip is an asset of PinePaper's own organisation, so the request below is refused for any other account until you swap in your own: upload a clip with POST /v1/assets, or make one with POST /v1/generate, and put its /scene-assets/ ref there."},"plate":{"ref":"/scene-assets/75b928edd6510956098bbad47f462535","loop":"pingpong","fit":"cover","model":"seedance-1-pro-i2v","label":"Seedance 1.0 Pro (ByteDance, via fal), image to video","provider":"fal","prompt":"A hand twirls the fork into the pasta and lifts a bite; a basil leaf settles. Slow overhead camera drift. Natural motion.","seconds":5,"priceUsd":1.86,"tier":"eval"},"renderRequest":{"drawContract":"const meta = { size: [1080, 1920], duration: 8, fps: 30, seed: 4 };\nconst ease = (x) => 1 - Math.pow(1 - Math.min(1, Math.max(0, x)), 3);\nconst entities = [\n  { id: \"scrim\", kind: \"shape\", from: 0, to: 8, params: {}, draw(ctx, t) {\n      const g = ctx.createLinearGradient(0, 1100, 0, 1920); g.addColorStop(0, \"rgba(20,10,5,0)\"); g.addColorStop(1, \"rgba(20,10,5,0.82)\");\n      ctx.fillStyle = g; ctx.fillRect(0, 1100, 1080, 820);\n      const g2 = ctx.createLinearGradient(0, 0, 0, 420); g2.addColorStop(0, \"rgba(20,10,5,0.55)\"); g2.addColorStop(1, \"rgba(20,10,5,0)\");\n      ctx.fillStyle = g2; ctx.fillRect(0, 0, 1080, 420); } },\n  { id: \"kicker\", kind: \"text\", from: 0.2, to: 8, params: { text: \"15-MINUTE DINNER\" }, draw(ctx, t, p) {\n      const a = ease((t - 0.2) / 0.5); ctx.globalAlpha = a; ctx.fillStyle = \"#ffb703\"; ctx.font = \"700 40px Inter, sans-serif\"; ctx.textAlign = \"left\";\n      ctx.fillText(p.text, 80, 150 - 20 * (1 - a)); } },\n  { id: \"title\", kind: \"text\", from: 0.4, to: 8, params: { text: \"Tomato Basil\", text2: \"Pasta\" }, draw(ctx, t, p) {\n      const a = ease((t - 0.4) / 0.7); ctx.globalAlpha = a; ctx.fillStyle = \"#fff8ee\"; ctx.textAlign = \"left\";\n      ctx.font = \"800 118px Georgia, serif\"; ctx.fillText(p.text, 80, 1430 + 60 * (1 - a));\n      ctx.font = \"italic 800 118px Georgia, serif\"; ctx.fillText(p.text2, 80, 1555 + 60 * (1 - a)); } },\n  { id: \"rule\", kind: \"shape\", from: 1.0, to: 8, params: { color: \"#e63946\" }, draw(ctx, t, p) {\n      const w = 420 * ease((t - 1.0) / 0.6); ctx.fillStyle = p.color; ctx.fillRect(80, 1600, w, 10); } },\n  ...[\"tomatoes\", \"basil\", \"garlic\", \"parmesan\"].map((name, i) => ({ id: \"chip-\" + name, kind: \"label\", from: 1.6 + i * 0.35, to: 8, params: { text: name }, draw(ctx, t, p) {\n      const k = ease((t - (1.6 + i * 0.35)) / 0.45), x = 80 + i * 235, y = 1660;\n      ctx.globalAlpha = k; ctx.fillStyle = \"rgba(255,248,238,0.95)\"; ctx.beginPath(); ctx.roundRect(x, y + 30 * (1 - k), 215, 72, 36); ctx.fill();\n      ctx.fillStyle = \"#3a1f12\"; ctx.font = \"600 34px Inter, sans-serif\"; ctx.textAlign = \"center\"; ctx.fillText(p.text, x + 107, y + 48 + 30 * (1 - k)); } })),\n];\nfunction draw(ctx, t, params, rng) { for (const e of entities) { if (t < e.from || t > e.to) continue; ctx.save(); e.draw(ctx, t, e.params, rng); ctx.restore(); } }\n","scene":{"baseVideo":{"ref":"/scene-assets/75b928edd6510956098bbad47f462535","loop":"pingpong","fit":"cover"}},"exportProfile":{"format":"mp4","resolution":"720p","fps":30,"durationSeconds":8},"source":{"prompt":"An 8-second vertical recipe reel: overhead footage of a fork twirling tomato basil pasta, with a 15-MINUTE DINNER kicker, the dish's name in a serif, a red rule and four ingredient chips laid over it.","provider":"pinepaper","model":"PinePaper team (overlay written by hand)","app":"gallery-reproduction"}},"license":"CC0-1.0"}