A script without a headline
Gujarati comes from the same family as Devanagari but dropped the horizontal bar that joins Devanagari letters along the top of a word. Its letters stand apart, which makes them easier to separate. The price is that many Gujarati letters look like Devanagari letters with the bar taken off, and script detection mistakes one for the other. So the pipeline does not trust the first guess. It reads a sample with each likely script and keeps whichever one actually lands in the Gujarati block of Unicode.
ર or ૨
The Gujarati letter ર (ra) and the digit ૨ (two) are drawn almost identically, and the live service once read the year ૨૦૨૬ as ર૦૨૬. That one can be decided safely: a token made of that single letter followed by Gujarati digits is a number, because no Gujarati word looks like that. An ordinary word that happens to stand before a figure is never touched. A short list of whole-word repairs follows the same rule. Each misreading on it, such as સુંધર for સુંદર, is a form that does not exist in Gujarati, and a Gujarati speaker confirmed each one before it was added.
Measured accuracy
On our ground-truth corpus — 1 Gujarati document, 3,067 characters of prose — this pipeline reads 95.7% of characters correctly (4.34% character error rate). It is one clean digital render, which is a small sample. Photocopies, exam papers and old print will do worse. A section of the test file that lists conjuncts on their own scores much lower and is kept out of this figure, because it is not prose.
Where it still goes wrong
The ra-kar ્ર under a conjunct is easy to drop, and when that produces a real word, as હ્રસ્વ becoming સ્વ does, no rule can safely put it back, so it is left for you to spot. દ, ધ and ઘ are confused at low resolution. Handwriting is not supported; this reads printed Gujarati.