Every parametric asset here is a factory, not a frozen mesh: the ES module exports createAsset(params) plus a typed schema of its knobs (colors, choices, toggles, ranges) and curated presets. Call it with no arguments and you get the exact published asset; pass params and you get your variant, at the same triangle budget. The schema is public JSON, so coding assistants can read the knobs and generate variants for you.
The module is a factory: no arguments reproduces the published asset, params make it yours. This is Toy Rocket:
import { createAsset } from './toy-rocket-e51241.mjs';
scene.add(createAsset()); // the published asset, exactly
scene.add(createAsset({ colorway: 'red-white' })); // a curated preset
scene.add(createAsset({ colorway: 'mint-cream', /* any knob */ }));
// every knob, typed and described, public for you and your AI:
// https://polyfork.dev/cdn/toy-rocket-e51241-params.json
Every remixable asset publishes its knobs as JSON, and each knob carries a plain-language description written for a machine reader. An agent can fetch the schema, understand what the asset can change, and produce the variant your scene needs without a human touching a slider.
// 1. ask what this asset can change
const schema = await (await fetch(
'https://polyfork.dev/cdn/toy-rocket-e51241-params.json')).json();
// schema.params -> { tallness: { type: 'range', min: .., max: .., describe: '..' }, ... }
// schema.presets -> curated colourways, each a map of zone -> hex
// 2. build the variant
import { createAsset } from 'https://polyfork.dev/cdn/toy-rocket-e51241.mjs';
scene.add(createAsset({ colorway: 'mint-cream', tallness: 1.15 }));
Two guarantees worth relying on: a no-argument call always reproduces the published asset exactly, and every knob value stays inside the same triangle budget, so a variant never quietly costs more than what you bought. The full agent guide lives at /agents.
A model defined by a function plus typed parameters instead of a single baked mesh. Here that function is a three.js ES module exporting createAsset(params); the default call reproduces the published asset exactly, and any knob change produces a coherent variant.
Each knob is declared with a type (color, choice, toggle or range), a default, a label and a description written for both people and machines. Curated presets bundle knob values into ready-made looks.
No meaningful one: variants rebuild the same low-poly geometry with different values, so triangle counts and draw calls stay at the published budget.
Yes, that is the point of the public schema: an assistant can fetch /cdn/{id}-params.json, understand every knob from its description, and write the createAsset call for the variant you asked for.