Sensory body — instructions for AI agents What this page is A single-file, client-only prototype of sensory grounding. A 3D standing human figure is covered in about 1,060 skin sensors (touch/pressure and temperature) plus IMU sites and joint proprioception. The simulator runs at 60 Hz. A fast rule-based narrator batches frames into 1, 5, or 10 second windows (default 1 s) and writes one or two short English sentences per window, intended as context for a slower LLM. This page does not itself call a model unless a human enables the optional local OpenAI-compatible panel. There is no server, REST, or WebSocket API. The live site is https://sensory-body.pages.dev/. To drive the simulation yourself, open this page in a headless browser (Playwright or Puppeteer) and call window.SensoryBody. The project is strictly non-sexual. There are no breast, genital, buttocks, or other erogenous-zone sensors. The API rejects those region names. Data model Axes: Y-up, X-right, Z-forward. The figure is roughly 1.75 m tall. Sensor types: touch/pressure (0–1.5, typical useful range 0.12–0.95), temperature in °C (skin baseline 32.5; cold≈16, cool≈28, neutral≈32.8, warm≈36.2, hot≈39.5), IMU (internal), joint angles (used to detect walking). Named body parts include: head, neck, chest, abdomen, upper_back, lower_back, left/right_shoulder, left/right_upper_arm, left/right_forearm, left/right_wrist, left/right_hand, left/right_thumb, left/right_index_finger (and middle/ring/little), lips, forehead, left/right_cheek, left/right_periocular, left/right_ear, left/right_thigh, left/right_shin, left/right_foot, left/right_toes. Focus groups (camera): full, left_hand, right_hand, left_index_finger, right_index_finger, lips, face, left_ear, right_ear, neck, left_wrist, right_wrist, left_foot, right_foot. Alias: "back" = upper_back + lower_back. Call listRegions() for the authoritative list and sensor counts. Hands, face, lips, wrists, and feet are instrumented more densely than the torso. Narrator output Each flushed window becomes a line like: [sensory 00:01.0–00:02.0] a slow circular stroke of light, warm pressure moving around your left forearm Real phrasings produced by this page's rule-based narrator: a slow circular stroke of light, warm pressure moving around your left forearm the slow circular stroke of light, warm pressure continues around your left forearm the circular stroke on your left forearm lifts away a warm, moderate contact settling on your right shoulder a cold breeze drifting rightward across your back. The warm, moderate contact holds on your right shoulder. your legs begin stepping forward in a walking rhythm a brief, firm tap on the back of your right hand. Your legs continue stepping forward in a walking rhythm. the walking rhythm eases and your legs come back to rest a light trace across the pad of your left index finger a feather-light brush along your upper lip a soft press at … (light contact on a high-acuity site such as a palm or fingertip) no notable change (quiet windows; quiet=true) getNarration() returns {tStart, tEnd, text, quiet, line}. getMessages() returns the rolling LLM-ready chat buffer (system prompt, optional earlier-recap, recent timestamped lines). How to drive it (window.SensoryBody, version 1.0.0) listRegions() listFocusTargets() touch({region, pressure = 0.35, durationMs = 800, temperature = "warm", fadeMs}) stroke({region, direction | path, speedCmPerSec, durationMs = 800, pressure = 0.35, temperature = "neutral"}) direction: "leftward"|"rightward"|"upward"|"downward"|"forward"|"backward" path: array of [x,y,z] world-space meters setTemperature({region, temperature, durationMs = 2000}) // thermal field; often narrated as a breeze focus(region) // camera; "full" resets getNarration({since, includeQuiet}) // since = sim time in seconds; default drops quiet lines onNarration(cb) // cb({tStart,tEnd,text,quiet,line}); returns unsubscribe() getState() getMessages() playDemo() / stopDemo() // the built-in 22 s script reset({keepLog}) pause() / resume() setWindow(1 | 5 | 10) step(seconds) // fast-forward the 60 Hz sim and flush windows; returns new narratives Playwright example (there is no HTTP API): const { chromium } = require("playwright"); const browser = await chromium.launch(); const page = await browser.newPage(); await page.goto("https://sensory-body.pages.dev/"); await page.waitForFunction(() => window.SensoryBody && window.SensoryBody.version); await page.evaluate(() => { SensoryBody.touch({ region: "left_forearm", pressure: 0.35, temperature: "warm", durationMs: 2000 }); SensoryBody.step(2.2); }); const lines = await page.evaluate(() => SensoryBody.getNarration()); console.log(lines.map(n => n.line).join("\\n")); await browser.close(); URL parameters (also work for headless loads) ?focus=left_hand ?demo ?at=8.5 (fast-forward seconds, typically with ?demo) ?touch=left_forearm optional &pressure=0.35 &temp=warm &duration=2000 (ms) ?selftest Human UI (do not break): drag on the body to touch, scroll/pinch to zoom, double-click a region to focus, Focus dropdown, Play demo, Breeze, Walk, window 1/5/10 s, optional local LLM panel (off by default).

Sensory body live grounding prototype

Scroll or pinch to zoom · double-click a region to focus. Drag to apply a touch.
t = 00:00.0 · window 1s
Loading three.js…
Hover a body part
Drag to stroke · double-click to focus · scroll to zoom