# How OCR differs from vision

*OCR reads the characters in a picture and returns them. A vision model looks at a picture and tells you what is in it. The two get confused, because a vision model can also read, and sometimes reads well. This guide says in plain words what each does, where they overlap and where each fails, then shows it: eight images of our own, each read once by two OCR engines and put to one vision model under two prompts, every output quoted exactly as it came back. It demonstrates the kinds of mistake each reader makes, not how often it makes them.*

*Published 2026-10-28 (UTC) · A small (human) team and a fleet of AI agents.*

**the short version:** OCR, optical character recognition, finds the lines of text in an image and writes out their characters. It returns nothing else, and it cannot make up a word it did not see, though it can misread one. A vision model, more fully a vision-language model, turns the picture into tokens a language model can read, then writes prose about it: the objects, the scene, the style and, if asked, the text. Its answers are fluent and often right, but composed, not copied. On our notice with small print it quoted a footer line that is not on the page, differently under each of two prompts, at temperature 0; on the same page Tesseract dropped the small print and Indra OCR misread it believably. Only the vision model saw the cup in the picture with the cup, and only it called our leafy seadragon a "seahorse". Searching scanned pages wants OCR. Asking what a picture shows wants vision. Anything you will quote or cite wants checking against the page, whichever reader produced it: the vision model invented a line, and Indra OCR turned "3 February" into "2 February".

4,408 words · about 20 minutes (at 220 words/min) · 5 tables · data kit: no

https://research.strata2signal.com/how-ocr-differs-from-vision/

---

*If you're new here: [strata→signal](https://strata2signal.com) is a small workshop that runs its own machines and writes up what it finds. This page follows our bench of one OCR model, [Indra OCR, measured on RuleSage's rulebook pages](https://research.strata2signal.com/indra-ocr-on-rulesage-rulebook-pages/), which read rulebook pages for [RuleSage](https://rulesage.strata2signal.com/), our board-game rules helper, under bars frozen before the run. That page is a bench, with a verdict. This one is a field guide, with a demonstration: eight images, one run each, nothing scored.*

## The three readers, named {#the-readers}

- **Indra OCR 1.1.2**, Datalab's small open OCR model, on a laptop CPU at the settings our bench registered, through the same wrapper and weights.
- **Tesseract 5.5.0 with tessdata\_best**, the long-standing open-source OCR engine with its full-precision English model, on the same laptop CPU at its default page layout analysis.
- **gemma4:26b**, a Gemma 4 model with 26 billion parameters (a mixture of experts), in its 4-bit Q4\_K\_M build, served by ollama on our inference server, where it was already loaded and was not changed for this page. It is a vision-language model: it takes a picture and a question together and answers in prose. Each image went to it twice, with the same two prompts every time: **read**, "Read any text in this image exactly as written. If there is no text, say so."; and **describe**, "Describe what is in this image." Both ran at temperature 0, the setting that makes a model take its single most likely next token every time, so a repeat of the same request should give the same answer (this demo sent each once); it does not make two different prompts agree, and here they do not. Its thinking mode, in which it writes out reasoning before it answers, was off.

## What OCR is and does {#what-ocr-does}

OCR, optical character recognition, has three steps and one job. It finds the lines of text in an image, drawing a box around each run of characters; it reads the characters inside each box, turning the pixels into a string; and it outputs the strings in a reading order worked out from where the boxes sit. Some engines, Indra among them, first decide which way up the page is.

Its strength is the exact character. An OCR engine has no idea what a menu or a caption is, so it has no opinion about what the text should say; it reports the glyphs, the drawn shapes of characters, it resolved, and when it is wrong it is wrong one character or one line at a time: a dropped line, a split word, a letter swapped for a look-alike. The first two show; the last can pass for the real thing. Its blind spots are everything that is not text, which it never reports; small print, with too few pixels per character; stylised lettering, far from the fonts it learned on; and rotation, where the lines are not where its detector expects them.

## What a vision model is and does {#what-a-vision-model-does}

A vision-language model is a language model with an image encoder in front of it. The encoder cuts the picture into patches and turns each into a token, the same unit of input the model uses for words; our page [How a Vision Model Sees](https://research.strata2signal.com/how-a-vision-model-sees/) walks through that bridge. The language model then reads the image tokens and the prompt together and writes an answer, one token at a time, as it writes any answer.

Its strength is everything OCR cannot do: it names the objects in a scene, the medium and the style, the mood, the layout of a page, and it answers questions. Its blind spot is exactness. The answer is generated from what the image tokens suggest and from what the model knows about pictures like this one, so where the image tokens carry little, as they may for a line of 6-pixel type, what the model expects can fill the gap. The result reads like a transcription, has no gaps, and may contain words that are not on the page. It paraphrases, it invents plausible text, and nothing marks which words were seen and which were supplied.

## Where they overlap {#where-they-overlap}

Vision-language models read text, and on clean text at a normal size they can read it exactly. On this page's menu card and caption, gemma4:26b returned every drawn word, in order, with the right punctuation, and on the script sign it returned every word, where Indra turned the ampersand into a letter and Tesseract broke the lines apart. So "which one reads better?" has no general answer here.

The difference is in the kind of failure. An OCR engine is a reader that cannot make up a word: it returns the characters it resolved, or nothing. A vision model is a describer that can: it returns the text that best fits what it saw and what it expects, and when those disagree, the output is fluent and wrong in the same breath. That is the whole guide in one sentence; the tables show it happening.

## The demo: eight images, one run each {#the-demo}

The images are ours. Three are plates from our [print lab](https://printlab.strata2signal.com)'s style bake-off, the same leafy seadragon painted in oil, picture-book and cut-paper styles, each from a prompt that ends "no lettering, no text". Three are pages drawn for this demo in open-licence fonts, with words written for it: a menu card at a normal size; a notice whose last two lines are set at 7 and 6 pixels; a sign in a script face, turned 8 degrees. Two are mixed: the oil plate with a two-line caption across its foot, and a cup drawn from shapes beside one line of text. Everything ran on 2026-10-28 (UTC).

Each table is one image: the header row names the readers, and the row under it holds the image, then each reader's output exactly as it came back, trailing blank lines trimmed, with the drawn words it differs from noted beneath. Select an image for full size; "empty" means no characters came back. Five images are shown and three are described after them. Indra OCR's outputs, in the tables and quoted in the text, are the output of Datalab's model and are shared under that model's own licence, not this page's: see [the licences](#the-images-and-the-licences).

### A painting with no text {#table-plate}

The oil plate. There is nothing to read, and all three readers said so: both OCR engines returned nothing, and the vision model, asked to read, said "There is no text in this image." Asked to describe, it named the medium and the weather correctly and called the animal a seahorse; the subject is a leafy seadragon, prompted as "a seahorse-like fish covered in leaf-shaped golden-green fronds", so it named the nearest common animal. Its last sentence, about resilience, is not in the picture. Neither OCR engine can say a word about any of this: OCR has no way to report a thing, only characters.

| Image | Indra OCR 1.1.2 | Tesseract 5.5.0 · tessdata\_best | gemma4:26b · "read" | gemma4:26b · "describe" |
| --- | --- | --- | --- | --- |
| [![An oil-painted leafy seadragon in green and gold, upright among dark rocks and white-capped waves under a grey-gold sky with a low sun, with rain streaking the whole picture](/how-ocr-differs-from-vision/thumbs/01-plate-oil.jpg)](/how-ocr-differs-from-vision/images/01-plate-oil.png) 512 × 512 px · no text drawn | (empty) right: nothing was drawn | (empty) right: nothing was drawn | There is no text in this image. right | An oil painting of a large, detailed seahorse amidst a stormy sea. The seahorse is the central focus, depicted in shades of green and gold, with intricate textures on its skin and prominent fins. It appears to be navigating through turbulent, white-capped waves that crash against dark, jagged rocks in the foreground. The sea is a deep, dark color, contrasting with the white foam of the waves. In the background, the sky is filled with heavy, grey clouds, with a pale sun struggling to break through the overcast. Rain streaks are visible across the entire scene, adding to the sense of a stormy, atmospheric environment. The overall mood is dramatic and powerful, emphasizing the resilience of the creature against the elements. "seahorse": the subject is a leafy seadragon · the last sentence is interpretation |

### A clean menu card {#table-menu}

Eight lines of serif type at a normal size, with five prices: the easy case. Tesseract returned every item and dropped every price: 6.50, 4.25, 9.75, 2.90 and 3.80 are nowhere in its output, and the two middle dots became hyphens. Indra read every item and price, each price on its own line under its item; its one slip is a lost space, "14· ask". The vision model, asked to read, returned all 47 drawn words; asked to describe, it reproduced the whole menu, prices included, as a bulleted list, though its "thin black border" is a dark-brown double frame. On clean text, the description is also a transcription.

| Image | Indra OCR 1.1.2 | Tesseract 5.5.0 · tessdata\_best | gemma4:26b · "read" | gemma4:26b · "describe" |
| --- | --- | --- | --- | --- |
| [![A cream menu card in a dark-brown double frame: the title THE SALT LANTERN, an italic subtitle, five dishes with prices, and an italic footer line](/how-ocr-differs-from-vision/thumbs/04-text-menu.jpg)](/how-ocr-differs-from-vision/images/04-text-menu.png) 800 × 1000 px · drawn: THE SALT LANTERN / harbour café · breakfast until noon / Kelp-smoked oat porridge 6.50 / Harbour toast with plum butter 4.25 / Three-bean skillet, one fried egg 9.75 / Cardamom bun 2.90 / Lantern tea, pot for two 3.80 / Open daily 7 to 14 · ask about the soup of the day | THE SALT LANTERN harbour café · breakfast until noon Kelp-smoked oat porridge 6.50 Harbour toast with plum butter 4.25 Three-bean skillet, one fried egg 9.75 Cardamom bun 2.90 Lantern tea, pot for two 3.80 Open daily 7 to 14· ask about the soup of the day "14 ·" read as "14·"; every price present | THE SALT LANTERN  harbour café - breakfast until noon  Kelp-smoked oat porridge  Harbour toast with plum butter  Three-bean skillet, one fried egg  Cardamom bun  Lantern tea, pot for two  Open daily 7 to 14 - ask about the soup of the day all five prices missing: 6.50, 4.25, 9.75, 2.90, 3.80 · "·" read as "-", twice | THE SALT LANTERN harbour café · breakfast until noon  Kelp-smoked oat porridge 6.50 Harbour toast with plum butter 4.25 Three-bean skillet, one fried egg 9.75 Cardamom bun 2.90 Lantern tea, pot for two 3.80  Open daily 7 to 14 · ask about the soup of the day every drawn word, in order | A vertical, rectangular menu for "THE SALT LANTERN" harbour café, featuring a cream-colored background with a thin black border. The text is in a black, serif font.  At the top, the restaurant name, "THE SALT LANTERN," is centered in a large, bold, all-caps font. Below it, in a smaller, italicized font, is "harbour café · breakfast until noon." A horizontal line separates the header from the menu items.  The menu items are listed on the left, with their prices aligned on the right: \* Kelp-smoked oat porridge: 6.50 \* Harbour toast with plum butter: 4.25 \* Three-bean skillet, one fried egg: 9.75 \* Cardamom bun: 2.90 \* Lantern tea, pot for two: 3.80  A second horizontal line is positioned below the menu items. At the bottom, the text "Open daily 7 to 14 · ask about the soup of the day" is centered in a small, italicized font. the words and prices are all there · "thin black border": the frame is a dark-brown double rule |

### A notice with small print {#table-small-print}

A heading, six lines of body text at 22 pixels, then two footer lines at 7 and 6 pixels. Both OCR engines, and the vision model asked to read, got the body text exact; the footer is where the three kinds of failure show at once.

Tesseract dropped both footer lines: its output ends at "unlabelled seed goes to the compost heap.", and the 34 words after it are absent, as our bench found on small print too. Indra read both lines and changed four details: two into something that looks right, "committee desk 45." for "committee desk 4B," and "dated 2 February" for "dated 3 February"; and two into visible garbles, "lostiproperty crate" for "lost-property crate" and "Tuesday eveninge." for "Tuesday evenings."

The vision model, asked to read, got the first footer line right apart from a dropped hyphen, then rewrote the start of the second line: "Queries submitted after 15 Tuesday evening." for "Queries: committee desk 4B, Tuesday evenings." Asked to describe, it invented the same line a second, different way, "Quotes submitted 4/8. Tuesday evening.", and changed a word in the normal-size body, "close the lamp" for "close the tap", which it had read correctly under the other prompt. Same image, same model, temperature 0, two prompts, two different footers, and neither answer marks any doubt.

Why the footer and not the body, this demo did not test. One reading, labelled as such: under the describe prompt the whole 900 by 1200 page, with the prompt, came to 288 input tokens, against 143 for a 512-pixel plate under the same prompt, so a 6-pixel line was a very small share of what it had to read from, and its expectation of what a footer says may have done the rest.

| Image | Indra OCR 1.1.2 | Tesseract 5.5.0 · tessdata\_best | gemma4:26b · "read" | gemma4:26b · "describe" |
| --- | --- | --- | --- | --- |
| [![A white notice headed Wrenfield Allotment Notice with a rule under the heading, six lines of sans-serif body text in three paragraphs, and two lines of very small print at the foot](/how-ocr-differs-from-vision/thumbs/05-text-smallprint.jpg)](/how-ocr-differs-from-vision/images/05-text-smallprint.png) 900 × 1200 px · the footer as drawn: "Plot fees are refundable until 14 March. Tools left outside the shed overnight may be moved to the lost-property crate." / "Queries: committee desk 4B, Tuesday evenings. This notice replaces the version dated 3 February." | Wrenfield Allotment Notice Plots 1 to 40 will be ploughed on the first dry Saturday of spring. Please clear canes, netting and loose stones from your beds before then. Water butts by the north gate are for shared use. Fill a can, close the tap, and leave the lid on to keep the midges out. The seed swap table returns in April. Bring labelled envelopes; unlabelled seed goes to the compost heap. Plot fees are refundable until 14 March. Tools left outside the shed overnight may be moved to the lostiproperty crate. Queries: committee desk 45. Tuesday eveninge. This notice replaces the version dated 2 February. "lost-property" → "lostiproperty" · "4B," → "45." · "evenings." → "eveninge." · "3 February" → "2 February" | Wrenfield Allotment Notice  Plots 1 to 40 will be ploughed on the first dry Saturday of spring. Please clear canes, netting and loose stones from your beds before then.  Water butts by the north gate are for shared use. Fill a can, close the tap, and leave the lid on to keep the midges out.  The seed swap table returns in April. Bring labelled envelopes; unlabelled seed goes to the compost heap. both footer lines missing, 34 words | Wrenfield Allotment Notice  Plots 1 to 40 will be ploughed on the first dry Saturday of spring. Please clear canes, netting and loose stones from your beds before then.  Water butts by the north gate are for shared use. Fill a can, close the tap, and leave the lid on to keep the midges out.  The seed swap table returns in April. Bring labelled envelopes; unlabelled seed goes to the compost heap.  Plot fees are refundable until 14 March. Tools left outside the shed overnight may be moved to the lost property crate. Queries submitted after 15 Tuesday evening. This notice replaces the version dated 3 February. "lost-property" → "lost property" · "Queries: committee desk 4B, Tuesday evenings." → "Queries submitted after 15 Tuesday evening.": not on the page | A black and white digital image of a notice for Wrenfield Allotment. The notice is written in a black sans-serif font on a white background. The title, "Wrenfield Allotment Notice," is at the top of the page, underlined by a thick black line. Below the title, there are three paragraphs of text. The first paragraph says, "Plots 1 to 40 will be ploughed on the first dry Saturday of spring. Please clear canes, netting and loose stones from your beds before then." The second paragraph says, "Water butts by the north gate are for shared use. Fill a can, close the lamp, and leave the lid on to keep the midges out." The third paragraph says, "The seed swap table returns in April. Bring labelled envelopes; unlabelled seed goes to the compost heap." At the bottom of the page, there is a small line of text that says, "Plot fees are refundable until 14 March. Tools left outside the shed overnight may be moved to the lost property crate. Quotes submitted 4/8. Tuesday evening. This notice replaces the version dated 3 February." "close the tap" → "close the lamp" · "lost-property" → "lost property" · "Queries: committee desk 4B, Tuesday evenings." → "Quotes submitted 4/8. Tuesday evening.": not on the page, and not what the "read" prompt invented |

### A painting with a caption {#table-caption}

The oil plate again, with two lines drawn across its foot: "KELP DRIFTER AT LOW TIDE" and "plate 21 · study in oil". The picture is mostly painting, and Indra's orientation step decided it was upside down: its run record says rotation 180, and its output is the two caption lines read the wrong way up, "110 uj Apris : 12 areid" and "301 MOT IV 83180 d". That is the rotation failure, and OCR nonsense looks like this: visibly nonsense. Tesseract read both lines, with its usual hyphen for the dot. The vision model read both exactly. Asked to describe, it took the caption for the painting's title, still called the animal a seahorse, and lit the scene differently from the uncaptioned plate above: here "a hint of a setting or rising sun peeking through the clouds, casting a warm, golden light", there "a pale sun struggling to break through the overcast". Same painting, a band added.

| Image | Indra OCR 1.1.2 | Tesseract 5.5.0 · tessdata\_best | gemma4:26b · "read" | gemma4:26b · "describe" |
| --- | --- | --- | --- | --- |
| [![The oil-painted leafy seadragon among rocks and waves, with a dark band across the foot carrying the white caption KELP DRIFTER AT LOW TIDE and, smaller, plate 21 · study in oil](/how-ocr-differs-from-vision/thumbs/07-mixed-plate-caption.jpg)](/how-ocr-differs-from-vision/images/07-mixed-plate-caption.png) 512 × 512 px · drawn: KELP DRIFTER AT LOW TIDE / plate 21 · study in oil | 110 uj Apris : 12 areid 301 MOT IV 83180 d page read as rotated 180°; no drawn word returned | KELP DRIFTER AT LOW TIDE  plate 21 - study in oil "·" → "-" | KELP DRIFTER AT LOW TIDE plate 21 · study in oil every drawn word, in order | An oil painting of a seahorse, titled "KELP DRIFTER AT LOW TIDE," is shown in this image. The seahorse is the central focus, and it is depicted in shades of green and gold, with a textured, almost scaly appearance. It is positioned in the middle of the frame, facing right, and appears to be swimming through turbulent, white-capped waves. The background features a cloudy, overcast sky with a hint of a setting or rising sun peeking through the clouds, casting a warm, golden light on the scene. The water is dark and choppy, with white foam from the waves crashing against dark, rocky outcrops in the foreground. The overall mood of the painting is dramatic and somewhat melancholic, emphasized by the muted colors and the sense of movement in the water. The text "KELP DRIFTER AT LOW TIDE" and "plate 21 · study in oil" is written in white at the bottom of the image. the caption taken as a title · "seahorse" again · the light described differently from the same painting uncaptioned |

### A cup beside one line {#table-cup}

A cup on a saucer with three lines of steam, drawn from plain shapes, and one sentence of serif type beside it. All three readers returned the sentence exactly, and the OCR engines returned nothing else, because there is nothing else they can return. The vision model's description is the only output on this page, from any reader, that mentions the cup. Its "coffee" is an inference from a brown fill; nothing in the image says what the drink is.

| Image | Indra OCR 1.1.2 | Tesseract 5.5.0 · tessdata\_best | gemma4:26b · "read" | gemma4:26b · "describe" |
| --- | --- | --- | --- | --- |
| [![A simply drawn brown-filled cup on a saucer with three wavy lines of steam, and to its right one line of serif text reading Refills are free before ten o'clock.](/how-ocr-differs-from-vision/thumbs/08-mixed-cup-and-line.jpg)](/how-ocr-differs-from-vision/images/08-mixed-cup-and-line.png) 1000 × 460 px · drawn: Refills are free before ten o'clock. | Refills are free before ten o'clock. every drawn word; nothing about the cup | Refills are free before ten o'clock. every drawn word; nothing about the cup | Refills are free before ten o'clock. every drawn word | An illustration of a steaming cup of coffee on a saucer, with the text "Refills are free before ten o'clock" to the right. the only output that names the cup · "coffee" is an inference |

### The three images not shown {#the-rest}

The picture-book and cut-paper plates went as the oil plate did, with one difference: on the picture-book plate Indra returned a single character, "7", from a painting with no writing on it. That is an OCR phantom, the other way an OCR engine can be wrong: not a made-up word, but a mark mistaken for a glyph. The vision model called both plates a seahorse and named the cut-paper style exactly: "A digital, paper-cut style illustration of a seahorse amidst a stormy sea." The script sign, three lines in a flowing face turned 8 degrees, is the stylised-lettering case. Tesseract returned the words in pieces and out of order: "or Moth", "a room est. 1911", "Marrow", "te", "roasted crumpers all day". Indra read all three lines in order and turned the script ampersand into a letter: "Marrow e Moth". The vision model, asked to read, got every word and swapped one character, the middle dot for a bullet: "tea room • est. 1911"; asked to describe, it got the words right and the lettering wrong, calling pale-gold script "white" and finding two faces, "cursive" and "serif", where there is one.

## Which to use when {#which-to-use-when}

- **Searching scanned pages, or anything where the words must be findable later: OCR.** It returns the characters it resolved and never composes a sentence, so most of its failures are gaps or garbles you can see; a misread digit is the exception, and here Indra's "2 February" for "3 February" looked right.
- **Asking what a picture shows, what style it is in, or anything about an object: vision.** OCR returned nothing about a seadragon, a storm, a cut-paper style or a cup.
- **Exact numbers, quotations, dates, anything you will cite: never trust a vision model's transcription unchecked.** Here it read a menu and a caption perfectly and invented a footer twice, and its output does not say which is which. Run OCR as well and compare, or check the words against the page by eye.
- **Small print is hard for all three**, and a page that is mostly picture can confuse an OCR engine's orientation step. If the small print or the caption matters, give the reader more pixels: a sharper scan, or a crop of that part alone.

## What this cannot say {#what-this-cannot-say}

- **How often any of this happens.** Eight images, one run each. The page shows the kinds of failure, not their frequency, and licenses no claim about how these readers do in general.
- **Anything about other readers or settings.** One vision model at temperature 0 with one pair of prompts; two OCR engines at one set of settings each. Indra's upside-down call and the invented footer are what one run produced; a second run, with different settings, could differ.
- **Anything about real scans.** The pages were drawn clean, by a program, in named fonts; a photograph of a page adds blur, skew and lighting that none of these images has.
- **Why the vision model invented the footer**, beyond the one labelled reading above; and **anything about speed**: no timings were recorded, and none are claimed.

## The images, the fonts and the licences {#the-images-and-the-licences}

Every image is ours. The three plates were painted by FLUX.2 \[klein\] 4B (Apache 2.0) for our print lab's style bake-off. The five pages were drawn with Pillow 12.1.1 (MIT-CMU licence), with words written for this demo, in fonts under open licences: Liberation Serif and Liberation Sans (SIL Open Font License 1.1), DejaVu Sans and DejaVu Serif (the Bitstream Vera licence, with DejaVu's own changes in the public domain), Noto Sans (SIL Open Font License 1.1) and Z003 (AGPL-3 with the font exception). The full-size images are the files the readers read; the small copies in the tables are reduced from them.

The readers' licences: Indra OCR is Datalab's. Its code is under Apache-2.0; its weights, which we ran unmodified at revision a1283c4b of [datalab-to/indra-ocr](https://huggingface.co/datalab-to/indra-ocr), are under the "AI PUBS OPEN RAIL-M LICENSE (MODIFIED)", version 0.1 of 2 March 2023 ([a copy](/how-ocr-differs-from-vision/indra-ocr-LICENSE.txt)). That licence applies to the model's output as well, so every Indra OCR output on this page, in the tables and in the text, is shared under it and under no other licence; this page's own licence, CC BY 4.0, does not reach those outputs. They come from our own images, in an evaluation. Datalab has not reviewed or endorsed this page. Tesseract 5.5.0 and tessdata\_best are under Apache-2.0. gemma4:26b, a Gemma 4 model, declares the Apache License, Version 2.0, in the model information our server reports; it was served by ollama (MIT License), and its outputs are quoted as the demo produced them. ONNX Runtime 1.31.0 (MIT) ran Indra on the CPU.

## Who ran this, and thanks {#who-ran-this-and-thanks}

Thanks to Datalab for Indra OCR, to the Tesseract project, to Google for the Gemma models and to the ollama project. The OCR engines ran on one laptop's CPU, each inside a sandbox with no network access; the vision model ran on our inference server, already loaded, its state read before and after the run and unchanged. A small human team asked the question and will approve this page; a fleet of AI agents made the pages, ran the readers, kept the records and drafted this page under that team's rulings.

## Sources {#sources}

Read 2026-10-28 (UTC) unless dated otherwise.

- **Our records:** the eight images and their provenance (how each was made, the drawn words, the fonts and their licences), every reader's raw output, the two run records and a diff of each output against the drawn words. No data kit ships, because the records name our machines; the images, prompts and settings on this page are what a repeat needs.
- **Indra OCR, measured on RuleSage's rulebook pages**, our bench of the same OCR model. https://research.strata2signal.com/indra-ocr-on-rulesage-rulebook-pages/
- **Indra OCR**, code and README: https://github.com/datalab-to/indra · weights, model card and licence: https://huggingface.co/datalab-to/indra-ocr
- **Tesseract 5** and tessdata\_best: https://github.com/tesseract-ocr/tesseract · https://github.com/tesseract-ocr/tessdata\_best
- **ollama** (MIT License): https://github.com/ollama/ollama
- **gemma4:26b**: its licence as the model declares it, the Apache License, Version 2.0, read from our server's model information, 2026-10-28.

*Eight images, one run each, 2026-10-28 (UTC): two OCR engines on a laptop CPU, one vision model on our inference server, every output quoted as returned. A demonstration, not a bench.*

Corrections and later readings will be added below, each dated (UTC), saying in plain words what they show.

<!-- derived 2026-10-28 (UTC) by tools/derive_md.py from the served page.
     source html sha256: d647a0092372e47391f49241b1c7fe9e1e2aea1c7cbf76e35b895a4a98aa6ba8
     derivation sha256:  6d74c174d846450a790ac619ef65bb7bda21046ea09497a4cc2ec0a8f6dc8474
     the {#id} on each heading is the anchor that heading carries on the page. -->
