Most transcription tools hand you clean text and let you assume it is right. Verbatim does the opposite: it preserves the spelling exactly as written, shows you every preprocessing stage it applied, and marks the words its recogniser was not confident about, so a human knows precisely where to look.
Every stage below is computed on the server from your image. Nothing is pre rendered, and the transcript you get is whatever the engine actually produced, including its mistakes.
JPEG or PNG, up to 8 MB. A photograph of a handwritten page works best.
Both samples are synthetic, rendered from a handwriting style font. Your upload is processed in memory and never stored.
Two changes moved the needle: removing the printed rules of lined paper, which survive thresholding as solid ink and fuse with the letters above them, and upscaling small phone photographs so strokes are more than a pixel wide. Both were adopted because the numbers moved, not because they sounded right.
First party measurement on a private three page corpus of real handwriting, scored against a manual transcription. A character error rate near 0.70 means roughly seven characters in ten are wrong, so the output is not usable as a transcript at any setting.
Once the rules are gone and the resolution is adequate, preprocessing has given the engine everything it can. What remains is that Tesseract's models are trained on printed text, and irregular handwriting sits outside that distribution. No threshold tuning closes that gap.
On those same pages mean confidence sat between 23 and 32, and the engine flagged most of its own output. A pipeline that fails loudly is operationally useful. One that returns fluent, confident, wrong text is not.
Handwriting is irregular in stroke thickness, slant and ink quality, so the image has to be repaired before any recogniser sees it. Each stage below addresses a specific artifact.
A phone photograph of a page is often only a few hundred pixels across, which leaves strokes one or two pixels thick and far below what the recogniser expects. Small images are upscaled before anything else runs.
Pressure varies within a single word, so light pencil can sit a few grey levels above the paper. Adaptive histogram equalisation lifts it locally, and a median filter removes scanner grain while preserving the thin stroke edges a blur would destroy.
Pages are photographed under uneven light, so a single global threshold loses whole regions to shadow. A separate threshold is computed per neighbourhood, scaled to the size of the image.
On lined paper the printed rules survive thresholding as solid ink and fuse with the letters resting on them. Opening the ink mask with a long horizontal kernel isolates the rules, a long vertical kernel isolates the margin, and both are subtracted before recognition.
Residual dots read as punctuation, so anything thinner than a real stroke is opened away. The page tilt is then estimated from the ink distribution and rotated out, because line segmentation degrades quickly once baselines stop being horizontal.
Because the engine marks its own uncertain regions, the obvious extension is selective escalation: send only the flagged regions to a vision capable model, keep the rest on the cheap local path, and never let the expensive model rewrite text the traditional engine already read correctly.
The confidence threshold is fitted on a labelled set by sweeping it and watching accuracy below the line against routed volume, rather than picked as a round number. Calibration is rechecked whenever the engine is upgraded.
The merge is positional, so a model asked about one region structurally cannot overwrite another. Any escalated reading that quietly turns a non standard spelling into a dictionary word is quarantined rather than accepted, because preserving what was written is the whole point.