The same db_resnet50 + crnn_vgg16_bn engine the CLI runs, loaded straight
out of src/ with no edits, no bundler and no npm packages. An import map remaps its
node:* imports onto shims; the weights arrive over fetch into a virtual filesystem.
1 · weights
int8 changes the output — it is not just faster.
Measured on the project's sample page (README, “The int8 trade”):
int8 detection emits 666 boxes instead of 660 and keeps only 564/660 box geometries
bit-exact; int8 recognition keeps every box and costs one character in one word,
but moves confidences — 290 of 660 words move by more than 1e-3.
Pick fp32 if you are comparing against the Node build.
not loaded
2 · execution path
f32 GEMM kernel
—
int8 GEMM kernel
—
compute backend
—
GPU self-check
—
recognition tier
—
threads
—
weights in workers
—
SharedArrayBuffer
—
crossOriginIsolated
—
hardwareConcurrency
—
The GPU tier runs vgg16_bn_r and the CRNN head on WebGPU and is used only
after selfCheck() has run the 64 fixture crops through BOTH paths on this machine and found every one of
260,096 logits bit-identical and all 64 strings equal. It is fp32-only and it replaces the worker pool, so
the worker count below does not apply to it. Detection stays on the CPU either way.
3 · image
Drop a PNG or JPEG here, or click to pick one.
PDF is not supported in the browser.
The Node build rasterises PDFs with pdftoppm; a page has no subprocesses,
and a JS PDF parser would be an npm dependency this project does not have.
Run pdftoppm -r 144 -png in.pdf page first and drop the PNGs.
stages
progress
idle
Single-threaded on the main thread.
Detection is one dependency chain of ~53 convolutions and runs there regardless —
the tab will stop repainting for the whole of it — but with no worker pool,
recognition (about 90% of a page) runs there too. See the reason above.