Effects
Derived output produced from ABX events and token state.
An effect is an offchain process that watches project events and writes derived output. Rendering a code project to a still image is the reference effect. Effects never hold source files.
Addressing
An effect declares a key, triggers, outputs, and an environment. ABX hashes the content, canonical
token data, and environment ID into inputsHash.
{chainId}/{address}/{tokenId}/{effectKey}/{inputsHash}/{outputKey}The address makes deterministic work idempotent. A restarted worker can ask storage what is missing.
Triggers
| Change | Event |
|---|---|
| Mint | Transfer from zero |
| Parameter value | TokenParamConfigured or ContractParamConfigured |
| Parameter schema | ParamSchemaConfigured |
| Owner-sensitive output | Transfer |
| Manual render | Operator request |
Metadata binding
render.image fills image only when the project did not set one. render.traits merges into
attributes, with onchain traits winning duplicate names. Other outputs appear in the artifact list.
A worker may post a hash or locator back to an authorized parameter and lock it later. Write-back is optional.
The reference worker loads the live document in Chromium, waits for abx.done() or a configured delay,
and captures the image and traits. Run it with abx effects, abx render, or abx deploy-effects.
Renderer capabilities are deployment properties, not protocol guarantees. A service may advertise
render.constraints.hardwareAcceleration and render.constraints.maxCaptureDelayMs in its service
descriptor. Inspect them with abx remote <name|url> before relying on a managed renderer.
The managed ABX renderer is CPU/headless and does not provide GPU/WebGL hardware acceleration. The
default abx deploy-effects Playwright container also does not guarantee a GPU merely because it is
self-hosted. Projects that require hardware acceleration need an effects worker deployed on tested,
GPU-capable infrastructure.
For software-compatible projects, call abx.done() only after the intended frame and traits are
ready. A bounded render.captureDelay can cover slow initialization, but cannot make unavailable GPU
features available. A current artifact confirms that bytes were published for the current state; it
does not prove the image is visually correct.
Checking currency directly
abx artifacts <address> --token <id> reads a token's artifact set without fetching and parsing the
whole served document. It reports the same entries the metadata would serve, plus every registered
effect row, current and stale, labeled against the token's active inputsHash. A stale row (a
parameter changed since it rendered) is silently absent from the served artifacts list, but stays
visible here so a param change that re-addressed a render is diagnosable rather than invisible.
--remote <name|url> reads the hosted resolver instead of this node's local projection. The report
identifies which service answered.