Skip to content
dopejs
← All projects

doper

Early — not production ready

A Web Canvas rendering engine designed from scratch.

A high-performance TSX runtime with native virtual scrolling, a deterministic Rust/WASM core behind a versioned binary ABI, full text rendering and canvas-native editing. Milestones M0–M3 are complete; M4 brings the editing, event, hit-testing and accessibility chain.

Overview

doper is not yet a rendering engine you can drop into a product, and the repository says so plainly. P0/M0 through M3 are done; M4 — the editing, event, hit-testing and accessibility chain — is the next stage. Technical decisions are settled in `docs/design.md`, and delivery order and exit gates in `docs/plan.md`.

What runs today is `apps/platform-probe`: a measurement slice rather than a demo. It records worker rAF frame intervals, main-thread-to-worker latency through SharedArrayBuffer, worker self-drive while the main thread blocks for 200 ms, Canvas2D and scroll-copy throughput, WASM size and load cost, and the Canvas editing input path — EditContext first, with a centralized textarea proxy as fallback — including recorded IME sessions replayed for determinism.

The probe proves the local environment is viable — the dev server sends COOP/COEP headers for cross-origin isolation — not that a production deployment meets those conditions. Real-device performance and real IME behaviour are treated as a separate platform qualification: until a platform is qualified with `pnpm platform:qualify`, the project does not claim its numbers.

What it does

  • High-performance TSX runtime with virtual scrolling as a first-class primitive, not a userland add-on.
  • Deterministic Rust/WASM core behind a versioned binary ABI.
  • Canvas-native text editing: EditContext-first input with a centralized textarea proxy fallback, and deterministic IME record/replay.
  • Platform qualification is explicitly separate from milestone completion — unqualified platforms make no performance claims.

Get started

Requirements: Node.js 22.12+, pnpm 10.33.2, Rust 1.96.0 with the wasm32-unknown-unknown target.

Run the platform probe

pnpm install --frozen-lockfile && pnpm m0:check && pnpm probe:dev