Immanuel Löw’s Die Flora der Juden (Vienna and Leipzig, 1924–34; four volumes in five) is still a standard scholarly reference on plants in Jewish literature. Its scholarship is formidable, and its pages are quite hard to use: A typical paragraph moves from German prose to Hebrew, Aramaic, Syriac in Estrangela, Arabic and Greek, with transliterations, bracketed variants, and footnotes, and almost every reference is abbreviated.1
There is no English translation and, as far as I can find, no usable digital text. The Frankfurt University Library scan (public domain) is images only: I checked the IIIF manifests, the METS record and the PDF, and none of them has a text layer.
I wanted to know how far current tools get with such a page, and what it costs. So I built a small test pipeline and ran it on a number of pages: five consecutive pages from vol. 1 on the terebinth and the mastic tree, one page each from vol. 2 (olive) and vol. 3 (citron, the etrog), and, earlier, a few index and abbreviation pages from vol. 4. The final is available here:2 https://ezrabrand.github.io/low-flora/
What I did before, and what is different now
This is my fourth attempt at this kind of work:
Krauss, 2023: My first translation of Samuel Krauss’s rules for transcribing Greek and Latin loanwords (from his Griechische und lateinische Lehnwörter im Talmud, Midrasch und Targum, 1898–99) started from Google Drive’s OCR of the archive.org scan. I gave the German to ChatGPT-4 to translate and correct, and typed the Hebrew in by hand. I left the OCR errors in the Latin, Greek, Syriac and Arabic, because I could not check them.
Krauss, 2026: The second version gave Gemini 3 Pro one page image at a time, with a prompt that asked it to keep non-Latin words in their script, add transliterations in brackets, keep italics and expand a short list of Krauss’s abbreviations. The result was much better, especially in the non-Latin scripts. I still had to fix Hebrew letters by hand (נ/ג, ב/כ), and the process was manual: one chat, one page, about three minutes each.
Yeriah Gedolah, 2026: For Reuven Tzarfati’s kabbalistic commentary in JTS MS 2367, a manuscript, I used Kraken with medieval-Hebrew manuscript models for line segmentation, and LLMs for transcription and translation, with two AI systems checking each other against the images.
Jastrow and BDB in Bekiut: For the dictionaries in my Talmud reader, the problem was not OCR but abbreviations (the digital text is pulled from Sefaria, via API). There the expansion is deterministic: a reviewed mapping built from the dictionary’s own printed list, longest match first, conservative with ambiguous short forms, and covered by tests.
The Löw pipeline combines these, and it changes four things:
Measurements: I ran the same page through Tesseract and seven multimodal models (Claude Opus 5.5 and Sonnet 5.5, Gemini 3.1 Pro and 3.8 Flash, GPT-5.6, Qwen 3.8), with the same prompt and image, and scored them against a hand-checked page, separately for each script. On German and Latin text, every model is now close to perfect (0–1% character error rate). The differences are all in the right-to-left scripts.
Several models wrote fluent Syriac that is a different word from the one printed, sometimes a word that fits the sense (a word for “resin” where the page has another). One model reversed the order of entries in Hebrew index lines, so page numbers ended up attached to the wrong headword. Another returned five lines of a full index page, with no error message. Only Claude Opus 5.5 read most of the Estrangela correctly, and even it is not reliable there (three runs gave three readings for some words).
Structure: Each page comes back as typed blocks (body, footnote, heading, running head), with each block split into runs by language, footnote marks kept apart, and italics marked. That makes the later steps possible: scoring per script, translating block by block, and keeping the footnotes as footnotes.
The author’s own abbreviation list. Löw printed ten pages of abbreviations at the end of vol. 4. I OCR’d them and used them to build a table of every abbreviation on my sample pages: 220 entries, most expanded from Löw’s own list, the rest marked as general knowledge or as unknown. The English translation opens each abbreviation at its first use, e.g. “
BB.[=Bar Bahlūl, Lexicon syriacum]”.
The translation follows rules I set after reading the first results: German and French are translated; Hebrew-script words stay as they are; Syriac gets a letter-for-letter rendering in Hebrew characters, done deterministically by code, similar to how I do it in Bekiut for Jastrow and BDB. Arabic and Greek get a Latin transliteration; Roman numerals become Arabic (”Robinson 1, 346”); and a page that has been checked by hand is translated from the checked text, not from the OCR.
Screenshots
Original scan, of p. 199,
https://sammlungen.ub.uni-frankfurt.de/freimann/content/pageview/104486 :
Transcription, with side-by-side Translation (with abbreviations opened),
https://ezrabrand.github.io/low-flora/pistacia.html#de-r18 :
What it costs
With Claude Opus 5.5 through OpenRouter, OCR costs about $0.10 a page and translation about $0.08. The whole experiment, including the model comparison, cost about $7. A full run of the four volumes (about 2,700 scanned pages) would be a few hundred dollars, and less with batch pricing.
Note: I have only one hand-checked page, so the error rates are rough signals. The Syriac in that page is not verified: I need a Syriac reader for that. The abbreviation expansions in the translation are inserted by the model, guided by the table; the Bekiut approach, a deterministic replacement from a reviewed list, is the better model, and the next step. And the pages are still translated one at a time, so a paragraph that runs over a page break is split.
What has changed since 2023 is less the quality of any single step than the ability to see where a step fails. A year ago I would have read a fluent English page and trusted it. Now the pipeline shows me which Syriac word three runs disagree on, which index line was reordered, and what each page cost, and that is what makes a larger project on Löw, or on Krauss, look possible.
Appendix - Technical
Source. Frankfurt UB, Freimann collection, IIIF Presentation 2.0 manifests for the four scan records; images from the IIIF Image API at full resolution (about 3,850 × 5,750 px, grayscale JPG). The HTML pages are behind a bot check; the IIIF endpoints are not. No OCR layer exists (checked: IIIF annotations, METS file groups, full-text URLs, and the PDF, whose single font is generator boilerplate with no text).
Image preparation. The APIs downscale images to 2,576 px on the long edge and 3.75 MP. I crop each page to the text block (removing the scan borders) and cut it in two at a blank line, so each half reaches the model at about 68% of scan resolution instead of about 48% for a whole page.
OCR prompt and output. One request per page, both halves as images, with a JSON schema for the output: blocks of type heading / body / footnote / index_entry / furniture, each with a footnote mark and a list of language runs (deu, lat, fra, grc, heb, arc, syc, ara, fas, translit). Rules: transcribe exactly, keep line breaks and end-of-line hyphens, subscripts as _{14}, superscripts as ^{a}, italics as <i>…</i>, unreadable text as [?]. Reasoning effort “low”: at the default effort one model spent 26,000 reasoning tokens on a single page.
Engines compared (one page, Bd. I p. 194). Character error rate against the hand-checked page, after Unicode normalization, removal of bidi marks and italic tags, and whitespace collapsing:

* The Syriac reference is not verified, and the page has only 127 Syriac and 21 Hebrew characters. The reference was drafted from an earlier Opus run, which favors Opus. Kraken’s model repository has models for medieval Hebrew manuscripts (which I used for the Yeriah Gedolah manuscript) but none for printed Hebrew; its experimental printed-Syriac model scored 80% on the Syriac and cannot read the Latin script at all.
Abbreviations: abbrev.py sends each page with the OCR of Löw’s list (vol. 4 pp. 731–740) to the model, which returns each abbreviation with its expansion and its basis (Löw’s list, general knowledge, or unknown). The table is kept in a JSON file; hand-checked rows are never overwritten.
Translation: One request per page, the blocks in and the same number of blocks out, with a JSON schema. Syriac to Hebrew letters is a fixed character mapping in code, with final forms.
Cost: About $0.10 per page for OCR and $0.06–0.13 per page for translation (Opus 5.5 via OpenRouter); $7 for all experiments.
Examples, taken at random:
BB. 274. 790. 829₁₈jKil. I 27ᵃHg. 58
I wrote the code with Claude Code; the code, the outputs and the notes are in a public repository: https://github.com/EzraBrand/low-flora.




Great project!
Did you try Argon?
You can also create a custom OCR using weighted scores optimized for the each text-type, and then have low-confidence areas adjudicated by vlm.
I've had success with that workflow.