ampixa
// read · document ocr · devanagari-ft-v3

The newspaper already knew how to read itself

An isometric pixel newspaper page, cropped off all four edges. Dense Devanagari print at top glitches into scrambled Latin letters and boxes lower down; a bright purple seam converts the garbled row back to clean glyphs and a crooked crown lands on the fix. A small handwritten word in the margin stays untouched — then, for one frame, the same repair sweep hits it and it comes out more scrambled, struck through in crimson, before reverting unread.
Synthetic illustration — no real Gorkhapatra page, crop or masthead. The repair sweep converting junk → clean print is this page's own mechanism, drawn invented.
// demo · recognise a devanagari page

This model reads a Gorkhapatra-style newspaper page better than the model it started from — and reads handwriting worse, because none of its 125,000 newspaper-derived labels came from a human hand.

liveHTTP 200, checked 2026-11-05/06 — pick "Devanagari" ("auto" defaults to Sirijonga). Its sample crop is a real Gorkhapatra page; redistribution is unresolved (receipts, below).
0.57%codepoint CER, held-out print chunks (n=3,000) — official base: 5.13%
2.57%codepoint CER, held-out full lines (n=1,500) — official base: 7.69%
68.86%codepoint CER, handwritten Nepali words (n=871) — official base wins: 40.75%

These are heterogeneous diagnostic slices against machine-derived silver references — not one pooled score, and not human-graded accuracy. No real citizenship certificate has ever been tested, on either model.

Open a Gorkhapatra e-paper PDF from a few years back and copy a line of text out of it. Paste it anywhere else and you get garbage — boxes, Latin letters, nothing that looks like Nepali. The PDF has a text layer, but it was written in a legacy 8-bit font encoding that maps Devanagari onto ordinary Latin character codes — the same trick Nepali desktop fonts have used for decades. To anyone trying to reuse the archive, the page is illegible. It has been illegible for years. But a wrong label is not the same as no information: convert it back, line by line, and a scanned newspaper page quietly hands you a free, machine-made transcript of exactly what it says.

That's the trick behind this project. Take PaddleOCR's official Devanagari model — already decent at reading printed Nepali — and fine-tune it on these image-and-converted-text pairs: 125,017 lines pulled from 19 editions of Gorkhapatra. The labels are "silver," not gold — a font conversion, not a human transcription, with its own manual fix for conjuncts that still come out wrong. But there's a lot of them, and the training ran not on Paddle's own trainer but on a PyTorch port of the same architecture, on a Mac, because getting Paddle itself to train on Apple's GPUs didn't work. The resulting checkpoint got exported back out to ONNX and served through the normal PaddleX pipeline, so from the outside it looks exactly like any other Paddle model. Only the training machinery is borrowed.

The result on held-out newspaper print: a character error rate of 0.57%, against 5.13% for the unmodified official model, on the same 3,000 held-out chunks. On full lines instead of smaller chunks, 2.57% against 7.69%. The gap barely closes when the test set is a synthetic page of English printed in an unfamiliar font: 2.84% against 10.62%. That's a newspaper-reading model that genuinely reads this particular newspaper better than the general-purpose one it started from — because it has, in effect, seen the answer key.

Then the surprise. Run the same two models on handwriting, and the fine-tune loses — badly. 40.75% error for the official model on a set of handwritten Nepali words; 68.86% for the one fine-tuned on newspaper print. It loses on handwritten Hindi too, by similarly wide margins. The model learned to read a specific newspaper's typefaces and a specific conversion script's quirks so well that it got worse at the general task of reading human handwriting it had never seen a style of. Specializing has a price, and here you can put a number on it.

Two more things didn't make it past the newspaper. A separate attempt at reading Newar language text written in Devanagari script looked promising once — a diagnostic score in the single digits — until an audit found the training and test sets overlapped: real lines appeared in both, so the number meant nothing and the whole pack is now marked not admitted. And a different attempt to teach a model the actual Newa script, not Devanagari standing in for it, failed to even fit its own training data — the wrong kind of mismatch between a model built for machine print and reams of centuries-old handwritten manuscript. Both are documented as closed, not quietly dropped.

None of this data belongs to Ampixa. Gorkhapatra's publisher cleared internal training and derived statistics, by the project owner's own decision — not by a verified legal determination of the newspaper's copyright status, which the documentation itself still calls unverified — and that clearance explicitly does not extend to handing out the underlying page images or crops. A separate, much smaller research checkpoint trained differently was published openly, but under a non-commercial research licence, with no training images attached, and it still falls short of its own 4% handwriting target.

What's next: closing the gap between a model that reads one newspaper well and one that reads handwriting at all, without losing the first to get the second; resolving whether Newar can be read as its own script instead of borrowed Devanagari; and tying every number above to one specific, checksummed training run, instead of a recipe file nobody has pinned down yet.

// how it works · training-data-to-served-model, one chain · dashed = unverified input
newspaper pdf19 of 24 editions legacy text layerdeva → latin codes npttf2utf 0.3.7+ manual conjunct fix silver label125,017 / 15,570 / 21,821 paddleocr basePP-OCRv5, apache-2.0 pytorch / mps ftv1b → v2 → v3 (6,198) synthetic + nvidia1 input set missing onnx exportout of pytorch paddlex servinglive demo, since 2026-09-24

The dashed edge is the one input the audit could not locate at its recorded path — a synthetic/NVIDIA file set the training recipe names but that was missing when captured. Page detection, script routing and reading-order reconstruction are real parts of the wider pipeline but are not part of this recognizer's own training chain and are left off deliberately.

// limits & what's missing
// receipts · every number on this page is in facts.md