camera (400, 300) · zoom 0.90

An infinite canvas runtime for AI‑generated web artifacts.

Keeping hundreds of generated pages alive as iframes doesn't scale. Flattening them to images loses selection and events. Deckle keeps the space in between: cached paint you can still reach into.

Lifecycle

Resources follow the viewport, not the document count

Every artifact moves through an explicit state machine. Live DOM, runtimes, and GPU textures are budgeted resources granted by visibility and interaction — never ambient.

  • Transitions are transactions. Allocation happens before publication; a fault leaves the previous committed scene usable.
  • Snapshots stay selectable. A texture is one revision of paint output — the interaction tree keeps internal hit testing alive without live DOM.
  • Stale runtimes can't write. Revision and epoch checks reject late messages from replaced runtimes before they touch the store.

Streaming

Built for content that is still being written

An agent emits an artifact token by token. Every kind commits at its own boundary — a grapheme, a line, a closed markdown construct, a JSON value, a decided HTML tag — and that boundary only ever moves forward, so a reader never sees an interpretation get retracted.

  • Nothing half-parsed reaches the screen. A partial tag, an unterminated raw-text element, or an open code fence stays outside the boundary until the stream proves what it is.
  • Provisional paint is not authoritative. A streaming artifact is pinned against eviction, shows provisional frames, and commits exactly one source revision when it finishes.
  • The scene streams too. Frames appear and join the spatial index while their content is still arriving, so hit testing and visibility sets work mid-generation.
  • Every kind has three presentations. Content, loading, and failed. An artifact is loading until its first character commits, media is atomic and only ever loads or fails, and a failure shows its reason beside the code you would quote in a bug report.

Packages

Backend-independent contracts, tested against oracles

Optimized implementations ship next to naive reference implementations and are differentially tested against them — the oracle stays available as a rollback path.

@dopejs/deckle

camera, scene store transactions, lifecycle, visibility, budgets

@dopejs/deckle-spatial

grid spatial index plus the naive differential oracle

@dopejs/deckle-artifact

revisions, interaction tree, canonical serialization

@dopejs/deckle-security

static-profile sanitizer, URL policy, quotas, capabilities

@dopejs/deckle-runtime

runtime message protocol, epochs, capability-guarded bridge

@dopejs/deckle-renderer

retained pictures, canvas-native content rendering, LOD, texture budget

@dopejs/deckle-editor

internal hit testing, selection model, virtual event paths

@dopejs/deckle-protocol

shared pre-release vocabulary

@dopejs/deckle-platform-probe

HTML-in-Canvas capability probes, evidence manifests

Status

Honest scope

The engine contracts are implemented and tested. The browser-evidence gates are not exited: support for the experimental HTML-in-Canvas APIs is a capability we detect, not a claim we make. No open-source license has been selected yet.