What should the screen look like at frame N?If a runtime can answer that, it can plug into Hyperframes.
The Adapter API is currently at v0 (experimental). Breaking changes are possible until v1. The core contract (seek-by-frame, deterministic output) is stable, but method signatures may evolve.
How It Works
The host application (the engine or producer) drives rendering by calling adapter methods in a strict sequence. The adapter never controls its own clock — it only responds to seek commands.Adapter API (v0)
adapters/types.ts
Required Semantics
getDurationFrames()must return a finite integer >= 0seekFrame(frame)must support arbitrary seek order (forward, backward, random)seekFrame(frame)must be idempotent for the same input frameseekFrame(frame)must clamp internal time to the adapter’s range- Adapters should be paused/seek-driven, not clock-driven
Host Orchestration
The host normalizes frames before calling the adapter:engine/render-loop.ts
engine/render-loop.ts
Determinism Contract
These rules are non-negotiable for any adapter. They are the foundation of Hyperframes’ deterministic rendering guarantee.- Canonical clock:
t = frame / fps - No wall-clock dependencies (
Date.now, drift-dependent logic) - No unseeded randomness
- No render-time network fetches
- Fixed output params (
fps,width,height) - Finite duration only
- Deterministic frame quantization before seek
Supported Runtimes
First-party adapters:| Runtime | Seek Method | Status |
|---|---|---|
| GSAP | timeline.seek(frame / fps) | Available |
| CSS/WAAPI | animation.currentTime | Planned |
| Lottie | Set animation frame/progress | Planned |
| Three.js/WebGL | Compute deterministic scene state | Planned |
| SVG/Anime | Implement seek + duration contract | Planned |
Conformance Tests
Every adapter should pass these minimum tests:- Repeatability — seek same frame twice, get identical output
- Random seek — seek order
[90, 10, 50, 10]produces deterministic results - Bounds — negative and overflow frame values do not break
- Duration — returned duration is a finite integer
- Cleanup — no leaked timers/listeners after
destroy
Next Steps
Deterministic Rendering
Understand the determinism guarantees adapters must uphold
GSAP Animation
See the first-party GSAP adapter in action
@hyperframes/engine
The capture engine that drives adapters during rendering
Contributing
Build and contribute your own adapter