Nuqta: open-source Arabic OCR
Nuqta turns Arabic scans, photos and PDFs into text you can copy and search. It writes the tashkeel that is printed on the page and adds none of its own. Its two models have the best published scores on KITAB-Bench and Misraj-DocOCR, and the smaller one runs on a phone.
Nuqta 4B output, uneditedWhat it reads
- Books and scanned documentsPrinted pages and old books, in reading order.
- PDFsEvery page, with headings, lists and tables kept as Markdown and HTML.
- TashkeelVocalized text keeps its marks. Unmarked text stays unmarked.
- TablesArabic and English tables, with columns in the order they are drawn.
- IDs and passportsMRZ fields with their ICAO check digits. A failed check is flagged, not guessed.
- On your own hardwareA GPU server, a laptop, Android or iPhone. Documents stay with you.
Two models
| Model | Size | KITAB-Bench CER ↓ | Misraj MARS ↑ | Runs on |
|---|---|---|---|---|
| Nuqta-Arabic-OCR 4B | 4.75B | 0.106 | 82.8 | 16 GB GPU, or laptop (GGUF) |
| Nuqta-Arabic-OCR 0.8B | 0.89B | 0.117 | 77.1 | any GPU, CPU, phone (GGUF) |
GGUF builds for llama.cpp, LM Studio and other local apps: 4B GGUF (2.9 GB) · 0.8B GGUF (560 MB). Full comparison with Gemini, GPT, Azure, Mistral, Baseer, Tesseract and others: Arabic OCR benchmarks.
Use it in Python
pip install "nuqta-ocr[vllm]" # Linux + NVIDIA GPU, fastest
pip install "nuqta-ocr[fast]" # transformers with fast kernels
pip install nuqta-ocr # transformers only
from nuqta import OCR
if __name__ == "__main__":
ocr = OCR("nuqta-4b") # or "nuqta-0.8b" for small GPUs
print(ocr.read("page.jpg").text) # tashkeel only where printed
print(ocr.read("scan.pdf", mode="markdown").text) # headings, lists, HTML tables
print(ocr.read("passport.jpg", mode="id").fields) # MRZ fields with check digits
Command line: nuqta read scan.pdf --mode markdown. More in the guides.
Questions
What is the best Arabic OCR model?
On the two public Arabic OCR benchmarks, Nuqta-Arabic-OCR 4B has the best published results: character error rate 0.106 on KITAB-Bench (Gemini-2.0-Flash 0.13, GPT-4o 0.31) and MARS 82.8 on Misraj-DocOCR (Baseer v2 77.8, Gemini-2.5-Pro 70.8). It is open source under Apache-2.0. The smaller Nuqta-Arabic-OCR 0.8B is second on KITAB-Bench and runs on a phone.
What is the best open-source Arabic OCR?
Nuqta OCR. Both models are open weights under Apache-2.0, and both score better on KITAB-Bench than every other published result, open or closed. Tesseract and EasyOCR score 0.54 and 0.58 character error rate on the same benchmark.
Does Nuqta OCR keep tashkeel (Arabic diacritics)?
Yes. It copies the diacritics printed on the page and almost never adds any: 0.08 to 0.16 invented marks per 100 letters on undiacritized text. Fully vocalized text such as Quran or children's books keeps its marks.
Can it convert Arabic PDFs to text?
Yes. The nuqta-ocr Python library renders every PDF page and returns plain text or Markdown with HTML tables, in reading order.
Does it read Arabic handwriting?
It reads handwritten lines and paragraphs (KHATT character error rate 0.07 to 0.11), but it is built for printed documents, where it is most accurate.
Can it run without a GPU?
Yes. The GGUF builds run on CPU with llama.cpp, LM Studio and similar apps, and the 0.8B runs offline on Android and iPhone. On a laptop CPU a dense book page takes about a minute; on a 24 GB GPU about 3 seconds.
Is Nuqta OCR free for commercial use?
Yes. The models and the library are released under Apache-2.0.
Which languages does it read?
Arabic, and English mixed into Arabic documents (for example bilingual tables and IDs).
Cite
@misc{nuqta_ocr_2026,
title = {Nuqta OCR: Accurate Arabic Document OCR with Faithful Tashkeel},
author = {Salah AlHaismawi and Mohamed Saleh Tulib and Ahmed ElSayed Mohamed Ibrahim},
year = {2026},
url = {https://github.com/SalahAlHaismawi/nuqta-ocr}
}