JS Integrations
Use JavaScript to call an AI provider, control object presentation, and set GPU texture precision.
Virtual Filesystem
Load images, videos, fonts, and other files from the patch virtual filesystem:
const url = await vfs.getUrl("./my-image.png");
const img = loadImage(url); // works in p5, for example
List one folder level or search recursively:
const files = await vfs.list(".");
const samples = await vfs.search("kick", "./samples");
const folders = files.filter((entry) => entry.kind === "directory");
See Virtual Filesystem to add files to a patch.
Persistent Storage
Use kv to store data after the page reloads:
// Save a value
await kv.set("score", 100);
// Read it back later
const score = await kv.get("score"); // 100
// Namespaced stores
const settings = kv.store("settings");
await settings.set("theme", "dark");
See Data Storage for the full API.
Audio Reactivity
Connect an fft~ object to a js object. Then call fft() to read the audio analysis data:
const analysis = fft({ type: "freq" });
// returns normalized 0-1 float
const bass = analysis.getEnergy("bass");
const treble = analysis.getEnergy("treble");
const firstBin = analysis.f[0];
fft() returns an FFTAnalysis instance. See Audio Reactivity for waveforms, raw bins, normalized bins, and examples.
Primary Button
Each visual object has a primary button beside its overflow menu. The default button uses the <code> icon.
For a code-stable patch, you can show the settings panel or a run button. Call setPrimaryButton() in the object code:
setPrimaryButton('settings'); // gear icon — opens the settings panel
setPrimaryButton('run'); // play icon — re-runs the code
setPrimaryButton('code'); // default — opens the code editor
The previous button moves to the overflow menu. You can still select it with one click. The patch saves this choice. See Object Settings to set up the settings panel.
For glsl shaders, use the comment directive instead:
// @primaryButton settings
Output Resolution
By default, visual objects such as three, regl, canvas, and p5 render at the full window resolution. For data textures or light renders, reduce the texture size:
setResolution(256) // 256×256
setResolution(512, 256) // 512 wide, 256 tall
setResolution('1/2') // half resolution
setResolution('1/4') // quarter resolution
setResolution('1/8') // any 1/n divisor works
Downstream nodes use bilinear filtering to sample the smaller texture. Patchies automatically enlarges it. Use setTextureFormat('rgba32f') for GPGPU tasks such as texture-encoded geometry.
Note: GLSL and SwissGL nodes use the
// @resolution 256directive instead ofsetResolution(), see glsl.
Float Texture Format
By default, visual objects such as hydra, canvas, three, regl, swgl, and textmode output 8-bit RGBA textures. They limit values to 0–1. Call setTextureFormat() to use float precision:
setTextureFormat('rgba32f');
| Format | Precision | Range | Use case |
|---|---|---|---|
rgba8 |
8-bit | 0–1 | Default. Color, visual output |
rgba16f |
16-bit float | ±65504 | HDR, moderate-precision data |
rgba32f |
32-bit float | full float | GPGPU, physics, positions |
Call this function once when the object starts. Do not call it for each frame. Downstream nodes sample every texture in the same way.
Tip: For
glslandswglnodes, you can also use the// @format rgba32fcomment directive instead.
Clock & Beat Sync
The clock object gives you the global transport for beat-synced animation and scheduling:
// Read transport state at any time
clock.time // seconds elapsed
clock.beat // current beat (0 to beatsPerBar-1)
clock.phase // position within current beat (0.0 → 1.0)
clock.bpm // current tempo
// Run something on every downbeat
clock.onBeat(0, () => {
background(255); // flash white
});
// Run something every bar
clock.every('1:0:0', () => {
send({ type: 'bang' });
});
See Clock API for the full scheduling API.
AI
Call the configured AI provider from a patch:
const result = await llm("Generate a JSON list of 5 colors");
console.log(result);
// Include a visual object's current frame as context
const description = await llm("What's in this frame?", {
imageNodeId: "canvas-1",
});
// Override the model for a specific call
const haiku = await llm("Write a haiku about recursion", {
model: "anthropic/claude-haiku-4-5",
});
// Choose which LLM provider to use
// Must be configured in AI provider settings
const haiku = await llm("Write a haiku about recursion", {
provider: "openrouter"
// you can also specify the model for the provider here
});
An API key is required. Configure the provider with Ctrl/Cmd + K > AI Provider Settings.
Presentation
Control how other objects appear in the patch. Use Ctrl/Cmd + Shift + C to copy an object ID. Use Shift + Drag to select multiple objects.
// Pan and zoom the canvas to focus on specific objects
focusObjects({ nodes: [{ id: 'canvas-1' }], duration: 800, padding: 0.3 });
// Set a visual object as the fullscreen background output
setBackgroundOutput('canvas-1');
setBackgroundOutput(null); // clear it
// Pause / unpause objects by ID
pauseObject('p5-1');
unpauseObject('p5-1');
OpenCV
In js and worker objects, await opencv() lazy-loads OpenCV.js and resolves
when its WebAssembly runtime is ready. It is cached once per execution realm.
const cv = await opencv();
const gray = new cv.Mat();
// Use OpenCV, then release every OpenCV allocation.
gray.delete();
Use worker for CPU-intensive image processing. See the OpenCV Image Processing
preset pack for message-based examples.
See Also
- JavaScript — Use the core JS API for messages and timers.
- JS Modules — Import npm packages and share code between objects.
- Virtual Filesystem — Add and manage patch files.
- Data Storage — Use the full
kvAPI. - Audio Reactivity — Read the complete FFT guide.
- Clock API — Use beat-synced timing and scheduling.
- Enabling AI — Configure an AI provider.