Local-first. Realtime. Deterministic. The document engine that renders, edits and replays entirely in the browser.
Pointer (1024, 768)
Local-first by design
No white-mask hacks
Every operation tracked
WebGL → WebGPU roadmap
45/45 tests passing
Every edit flows through a deterministic, local-first pipeline.
Zero roundtrips for preview. Full fidelity. Realtime.
Active PDF bytes enter the browser runtime as the source of truth.
What this solvesFeeds PDFium, workers and textless rendering from the same byte source.
Restored documents can rehydrate bytes from backend export into local cache.
✓Active PDF bytes helper returns memory-hit / indexeddb-hit / indexeddb-miss
✓Restored documents can hydrate bytes from backend export into browser cache
✓Worker requests receive a transferable ArrayBuffer copy
✓Debug exposes pdfBytesAvailable and pdfByteLength
Document bytes, session metadata, rasters, textless tiles and operation logs persist locally.
What this solvesRefresh can restore page raster and operation replay without waiting for backend preview.
Cache misses are visible instead of silently degrading the runtime.
✓Document/session metadata opens during browser core bootstrap
✓pageRasterBitmaps persists PNG Blob page rasters for refresh restore
✓textlessTileBitmaps persists dirty tile PNG Blobs
✓documentOperationLogs stores replayable local edits
PDFium renders page rasters in-browser through the provider pipeline.
What this solvesMoves page raster production into the browser runtime.
Keeps Python core and preview-image as explicit fallbacks.
✓WASM asset served locally from /vendor/pdfium/pdfium.wasm
✓Renderer URL can be npm:pdfium using @embedpdf/pdfium
✓Lifecycle states: disabled, missing-url, loading, loaded, load-failed
✓PdfPageRasterRenderer.renderPageRaster(input) is the binding boundary
Worker opens PDFium page/textPage and builds char and text object indexes.
What this solvesTextless tiles can match dirty rects to actual PDF text objects.
Warm page/text cache avoids rescanning the same page on later tiles.
✓Progress waits for PDFium runtime, document, page and text page readiness
✓Char index and text object index are counted in toolbar status
✓Worker keeps PDFium document/page/textPage session warm per PDF fingerprint and page
✓Provider debug reports matched chars and matched text objects
Operations compile into dirty nodes, dirty regions and command buffers.
What this solvesReact sends commands; Browser Core decides what invalidates and redraws.
Debug snapshots expose dirty/final buffers instead of hiding render state.
✓Render graph forms dirty nodes and dirty regions from setTextStyle/moveLayer ops
✓Dirty command buffer is separate from graph command buffer
✓Final composite command buffer is the production draw path
✓Frame Debug exports status, operation log, render graph and command buffers
Worker renders dirty tiles without original PDF text using the provider fallback policy.
What this solvesRemoves original PDF text without white-mask overlays.
Fallback reasons and quality metadata stay visible in debug.
✓Worker request type is render:textless-tile
✓Fallback policy: pdfium-wasm -> pdf-layer -> synthetic-background
✓PDFium toggles matched text objects inactive before rasterizing the tile
✓Quality metadata includes provider, method, attempts, timings and matched char count
Production preview composites base raster tiles and replacement text into the final frame.
What this solvesSuccessful preview path no longer depends on drawRect masking.
Operation replay rebuilds the same final composite after refresh.
✓Final composite uses drawBaseRasterTile and drawTextRun
✓drawSelection stays out of production composite
✓drawRect remains graph/dirty debug only, not final output
✓Replay rebuilds render graph, pending textless tile requests and final composite
Active PDF bytes enter the browser runtime as the source of truth.
What this solvesFeeds PDFium, workers and textless rendering from the same byte source.
Restored documents can rehydrate bytes from backend export into local cache.
type ActivePdfBytesResult = {
status: 'memory-hit' | 'indexeddb-hit' | 'indexeddb-miss';
pdfBytes?: ArrayBuffer;
byteLength?: number;
}Document bytes, session metadata, rasters, textless tiles and operation logs persist locally.
What this solvesRefresh can restore page raster and operation replay without waiting for backend preview.
Cache misses are visible instead of silently degrading the runtime.
IndexedDB stores: documentSessions pageRasterBitmaps textlessTileBitmaps documentOperationLogs
PDFium renders page rasters in-browser through the provider pipeline.
What this solvesMoves page raster production into the browser runtime.
Keeps Python core and preview-image as explicit fallbacks.
resolvePageRaster(input) -> memory -> indexeddb -> pdfium-wasm -> python-core -> worker -> preview-image
Worker opens PDFium page/textPage and builds char and text object indexes.
What this solvesTextless tiles can match dirty rects to actual PDF text objects.
Warm page/text cache avoids rescanning the same page on later tiles.
PDFium text layer readiness: runtime loaded document opened page loaded text page loaded char index built text object index counted
Operations compile into dirty nodes, dirty regions and command buffers.
What this solvesReact sends commands; Browser Core decides what invalidates and redraws.
Debug snapshots expose dirty/final buffers instead of hiding render state.
Render Graph -> Render Nodes -> Render Commands -> Command Buffer -> Canvas/WebGL/WebGPU Surface
Worker renders dirty tiles without original PDF text using the provider fallback policy.
What this solvesRemoves original PDF text without white-mask overlays.
Fallback reasons and quality metadata stay visible in debug.
type BrowserCoreWorkerRequest =
| { type: 'render:textless-tile';
tileId: string;
rect: RenderRect;
}Production preview composites base raster tiles and replacement text into the final frame.
What this solvesSuccessful preview path no longer depends on drawRect masking.
Operation replay rebuilds the same final composite after refresh.
finalCompositeBuffer = [ drawBaseRasterTile(tileBitmap), drawTextRun(replacementSpan) ];
No backend roundtrips for preview or edits.
Same inputs, same outputs. Every time.
60 FPS target with predictable frame times.
Source-level text suppression for perfect selection.
Every edit is logged and replayable.
Your documents never leave your device.
The local runtime previews text style and move operations before authoritative save/export.
The core is moving toward real textless tile composition with PDFium WASM and provider fallbacks.
Operation replay, compaction and committed state make the preview feel recoverable instead of temporary.
Purpose-built runtime technology, not legacy editor layers. Engineered for performance, determinism and full control in the browser.
Layer and node based rendering with deterministic dirty invalidations.
PDFium-powered source suppression instead of error-prone overlay hacks.
Local edits can survive refresh and compact into committed state.
Layer focus, spatial index, ownership and worker resolve path.
Canvas now, WebGL compositor next, WebGPU-ready structure.
A possible runtime layer for document SaaS, legal tools and e-signature products.
Preview locally. Commit authoritatively.
Make the unfinished parts visible. That is stronger than pretending this is a finished generic SaaS.
Show operation log, compacted ops, committed ops and replay source in a dedicated view.
Measure warm-cache PDFium textless rendering and optimize matching / encode path.
Move final composite toward GPU layer pipeline and texture cache.
Better text rendering path for speed, clarity and consistent previews.
Compare optimistic preview against final authoritative PDF export.
Embed low-latency PDF interaction into web products.
Contract editing, review and annotation workflows.
Faster flows with realtime visual feedback.
Document transformations with deterministic operations.
Potential SDK/runtime layer for custom tools.
Position it honestly as an early technology preview and collect serious interest from people who understand document runtimes.