{
  "schemaVersion": 1,
  "id": "kinetic-sand-slice",
  "version": "1.0.0",
  "status": "published",
  "kind": "effect",
  "title": "Kinetic Sand Slice",
  "summary": "A block of coloured kinetic sand is sliced by a steel scraper, and each slice topples onto a belt with its hidden pattern face up, looping forever.",
  "description": "The AI ASMR sand-cutting shot, built in code. A long block of soft, grainy kinetic sand nudges forward, a broad steel bench scraper presses down through it, and the slice leans off the blade and flops over onto a slow belt with a little squash and a scatter of crumbs. The cut face shows what is inside the block: pastel layers, a hidden heart or a marbled swirl. Choose the pattern and its four colours, how thick the slices are, how many cuts fit in the loop, how much it crumbles and how coarse the grain looks. The clip loops exactly.",
  "role": "Complete satisfying-video scene (Three.js); the sand slicer rig is reusable on its own.",
  "collections": [
    "satisfying",
    "hypnotic-loops"
  ],
  "tags": [
    "kinetic sand",
    "sand cutting",
    "asmr",
    "ai asmr",
    "satisfying",
    "slicing",
    "cutting",
    "cross section",
    "slice",
    "oddly satisfying",
    "pastel",
    "layers",
    "loop",
    "3d",
    "three.js"
  ],
  "synonyms": [
    "kinetic sand cutting",
    "sand slicing",
    "asmr cutting",
    "satisfying sand video",
    "oddly satisfying cutting",
    "sand cutting asmr",
    "cutting asmr loop",
    "slime cutting",
    "soap cutting",
    "what's inside reveal"
  ],
  "useCases": [
    "Faceless AI ASMR Shorts and Reels",
    "Satisfying background loop under a voice-over or captions",
    "Brand colours or a logo shape revealed inside each slice"
  ],
  "featured": null,
  "publishedAt": "2026-10-10",
  "implementation": {
    "target": "three",
    "runtime": "browser",
    "language": "javascript",
    "module": "esm",
    "entry": "src/kinetic-sand-slice.js",
    "exports": [
      {
        "name": "createKineticSandSlicer",
        "signature": "createKineticSandSlicer({ pattern?, colors?, thickness?, depth?, cycleSeconds?, cutsPerLoop?, crumbs?, grain?, seed?, boardColor?, beltColor?, handleColor?, showBelt? }) => { group, update(time), timeline, landingX, baseY, beltStep, dispose() }",
        "description": "The whole rig as a THREE.Group: sand block, slices, steel scraper, cutting board, belt and crumbs. update(time) poses everything for a time in seconds (pure function)."
      },
      {
        "name": "createSandPattern",
        "signature": "createSandPattern({ pattern?, colors?, seed?, size? }) => HTMLCanvasElement",
        "description": "The block's cross-section as a canvas: 'layers', 'heart' or 'swirl'."
      },
      {
        "name": "sliceTimeline",
        "signature": "sliceTimeline({ cycleSeconds, thickness, gravity? }) => (phase) => { feed, blade, angle, squash, landed, sinceLanding, landPhase }",
        "description": "The motion of one cut on its own, to drive your own models."
      }
    ],
    "reusable": [
      "src/kinetic-sand-slice.js"
    ],
    "demo": "demo.js",
    "harness": "index.html"
  },
  "dependencies": [
    {
      "id": "three",
      "version": "0.185.1",
      "reason": "WebGL rendering (src and demo)."
    },
    {
      "id": "chrome-material",
      "version": "1.1.0",
      "scope": "demo",
      "reason": "Studio environment, cove and floor for the demo scene. src/kinetic-sand-slice.js only needs three."
    },
    {
      "id": "apw-runtime",
      "version": "1.0.0",
      "scope": "demo",
      "reason": "Demo harness."
    }
  ],
  "params": [
    {
      "key": "pattern",
      "label": "Inside the block",
      "help": "What each cut reveals.",
      "type": "select",
      "default": "layers",
      "options": [
        {
          "value": "layers",
          "label": "Pastel layers"
        },
        {
          "value": "heart",
          "label": "Hidden heart"
        },
        {
          "value": "swirl",
          "label": "Marbled swirl"
        }
      ]
    },
    {
      "key": "colorA",
      "label": "Colour 1",
      "help": "Layers: bottom band. Heart: the sand around it. Swirl: first colour.",
      "type": "color",
      "default": "#c3b1ee"
    },
    {
      "key": "colorB",
      "label": "Colour 2",
      "help": "Layers: second band. Heart: the heart. Swirl: second colour.",
      "type": "color",
      "default": "#a3dfca"
    },
    {
      "key": "colorC",
      "label": "Colour 3",
      "help": "Layers: third band. Heart: its outline. Swirl: third colour.",
      "type": "color",
      "default": "#f6b8a2"
    },
    {
      "key": "colorD",
      "label": "Colour 4",
      "help": "Layers: top band (not used by heart or swirl).",
      "type": "color",
      "default": "#f6e7cb"
    },
    {
      "key": "thickness",
      "label": "Slice thickness",
      "help": "As a fraction of the block's height.",
      "type": "number",
      "min": 0.12,
      "max": 0.4,
      "step": 0.01,
      "default": 0.22
    },
    {
      "key": "cuts",
      "label": "Cuts per loop",
      "help": "More cuts make a faster rhythm in the same loop.",
      "type": "integer",
      "min": 2,
      "max": 5,
      "step": 1,
      "default": 3
    },
    {
      "key": "crumbs",
      "label": "Crumbs",
      "help": "How many crumbs break off when a slice lands.",
      "type": "integer",
      "min": 0,
      "max": 60,
      "step": 1,
      "default": 26
    },
    {
      "key": "grain",
      "label": "Sand grain",
      "help": "0 is smooth like soap, 2 is coarse.",
      "type": "number",
      "min": 0,
      "max": 2,
      "step": 0.05,
      "default": 1
    },
    {
      "key": "view",
      "label": "Camera",
      "type": "select",
      "default": "hero",
      "options": [
        {
          "value": "hero",
          "label": "Three-quarter"
        },
        {
          "value": "overhead",
          "label": "High (phone view)"
        }
      ]
    },
    {
      "key": "boardColor",
      "label": "Cutting board",
      "type": "color",
      "default": "#efe8df"
    },
    {
      "key": "background",
      "label": "Background",
      "type": "color",
      "default": "#e4d3c6"
    },
    {
      "key": "seed",
      "label": "Variation",
      "help": "Changes the crumbs, the grain and the wobble of the layers.",
      "type": "integer",
      "min": 1,
      "max": 9999,
      "step": 1,
      "default": 7
    }
  ],
  "presets": [
    {
      "id": "default",
      "label": "Pastel layers",
      "params": {}
    },
    {
      "id": "hidden-heart",
      "label": "Hidden heart",
      "params": {
        "pattern": "heart",
        "colorA": "#a9dcc9",
        "colorB": "#ee7f9f",
        "colorC": "#fff3e6",
        "thickness": 0.18,
        "view": "overhead",
        "background": "#e3d3d6",
        "boardColor": "#f6f1ec",
        "crumbs": 20
      }
    },
    {
      "id": "night-swirl",
      "label": "Night swirl",
      "params": {
        "pattern": "swirl",
        "colorA": "#363b86",
        "colorB": "#b4a3f1",
        "colorC": "#69d2c6",
        "thickness": 0.26,
        "cuts": 2,
        "grain": 1.35,
        "background": "#26232d",
        "boardColor": "#3a3740",
        "crumbs": 34,
        "seed": 21
      }
    }
  ],
  "output": {
    "width": 1080,
    "height": 1080,
    "fps": 30,
    "durationSeconds": 6,
    "posterSeconds": 1.55,
    "alpha": false,
    "motion": "procedural",
    "loop": {
      "seamless": true,
      "method": "A whole number of identical cuts per clip; the block feeds one slice and the belt moves one slot per cut, and the grain and belt ribs repeat on those distances, so the last frame leads straight into the first."
    },
    "seed": {
      "param": "seed",
      "behavior": "Seed sets the grain, the wobble or marbling of the pattern and every crumb. Same seed and settings give identical frames."
    }
  },
  "composition": {
    "inputs": "Options, then update(time) each frame with time in seconds.",
    "outputs": "A THREE.Group you add to your scene. It does not create lights, a camera or an environment.",
    "coordinates": "Y-up; block height 1 unit; board and belt top at y = 0, their underside at baseY (−0.1). The blade cuts in the plane x = 0, the block comes from −x and slices travel along +x one beltStep (1.32) per cut. Centred on z = 0, about 1.8 units deep with the belt.",
    "lighting": "Needs scene.environment (tuned with the chrome-material studio) plus one shadow-casting directional light; meshes cast and receive shadows.",
    "timing": "Pure function of time. One cut every cycleSeconds; set cycleSeconds = clip length / cuts for a seamless loop.",
    "compatibleWith": [
      "chrome-material",
      "kinetic-title",
      "lower-third",
      "orbit-camera"
    ],
    "notes": [
      "Cut faces show the whole pattern; the block's sides and top show only its edges, so a pattern placed in the middle (the heart) stays hidden until the cut.",
      "Everything is drawn with Three.js; there are no image files."
    ]
  },
  "reuse": [
    "Put a caption or a Lower Third over it for a faceless ASMR Short, and add your own crunch sounds on each cut (the blade bottoms out at 64% of each cycle).",
    "Paint your logo or brand colours into createSandPattern (it is a canvas) and every slice reveals it.",
    "Use sliceTimeline to drive your own models: a cake, a soap bar or a glass fruit with the same feed, press and topple timing."
  ],
  "integration": {
    "newProject": "Create the rig once with cycleSeconds = clipLength / cuts, add rig.group to a scene with an environment map and a shadow-casting light, and call rig.update(frame / fps) before each render.",
    "existingProject": "Copy src/kinetic-sand-slice.js, add rig.group where you want the slicer (scale the group to fit your scene) and call rig.update(time) in your frame loop."
  },
  "performance": {
    "notes": "About 20 meshes, two instanced meshes and a 2048 shadow map; light for any GPU. The pattern canvas is painted once at start (512 × 512).",
    "limits": "The slices are rigid boxes: the sand does not deform where the blade enters, and crumbs only fall on the belt."
  },
  "limitations": [
    "No sound: the ASMR crunch is most of the appeal, so add it in your editor.",
    "The pattern runs the full length of the block, so every slice reveals the same picture; it is a reveal, not a changing sequence.",
    "The blade cuts cleanly through rigid pieces. There is no smearing, bulging or tearing of the sand where the blade goes in."
  ],
  "license": {
    "spdx": "MIT",
    "notice": "Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.",
    "thirdParty": []
  },
  "provenance": "Original code written for AI Pixel Wizard on 2026-10-08 by an automated agent (the daily trend routine), inspired by the AI ASMR kinetic sand cutting trend (see content/trends/2026-10-08-kinetic-sand-slice.md). The motion (block fed one slice at a time, a bench scraper pressing down, the slice falling over cut face up) follows the shot as described in https://lovino.ai/blog/ai-asmr-videos-trending-2026 ('slabs of colored sand sliced by oversized blades') and https://knowyourmeme.com/memes/kinetic-sand-asmr-videos. The owner's earlier sketch threejs-sketches/objects-scenes/kinetic-sand explored the same subject; it was read for reference and none of its code was used. The falling slice is the standard rigid slab rotating about one edge under gravity. No code, images, models, fonts or shaders were copied.",
  "changelog": [
    {
      "version": "1.0.0",
      "date": "2026-10-08",
      "notes": "Initial release."
    }
  ]
}
