community · build story
one step closer to the ilm of aale mohammed. alishraaq.com ↗
I grew up in a tradition with centuries of scholarship written in low-resource languages, and almost none of it is easy to search. Everything exists, it's just scattered across separate systems, in different scripts, all over the place. Every time I have a question about a philosophical concept, I can't find the answer, and I certainly can't find it fast. If I want to place a religious event on the scale of world history, there's no timeline to place it on. If I'm curious who someone was, there's no canonical source of truth.
Alishraaq is my attempt to fix that: one reading platform where the whole corpus is cross-searchable, in the language you think in, with a click-to-define dictionary and a timeline that sets our history inside the wider world's.
The first version was built with an offshore team, and it showed. It ran Angular, .NET, SQL Server, and Elasticsearch all crammed onto one 15GB server that ran out of memory and crashed constantly, Elasticsearch alone eating two-thirds of the box. At some point I stopped trying to patch it and said the quiet thing out loud: I'll just redo the whole thing myself.
So I did. I kicked off an overnight rebuild on Cloudflare, working alongside AI agents, with a hard rule never to touch the live site or its DNS until the replacement was real. By the end of the first day it was a deployed site carrying all 62,000 migrated documents, with search, a reader, a dictionary, and login. The hard part was everything after.
"The corpus" is a polite word for a dozen unrelated systems that had to be pried open one at a time: an old Elasticsearch dump (313,000 rows), two Android apps, databases decrypted, a Windows .exe with an Access database inside, a WordPress blog, 1,236 reflection posts, scanned print booklets, a published history book, and, still on my list, an internal archive locked behind its own separate login. Each one spoke a different format, and several had to be reverse- engineered before a single row was searchable.
A big share of it only existed as scanned print, in a mixed Arabic and Lisan al-Dawat script
that no off-the-shelf OCR reads well. So I ran a real bake-off instead of trusting one tool.
A vision model landed near-perfect, two errors across 179 scanned pages; a lesser model
averaged almost four errors a page, including confident hallucinations, and got benched. On
the hardest booklets, five more models each failed the bar in their own way. The best
lesson came from two "OCR errors" I flagged in review that turned out to be font bugs, not
transcription bugs, one broken glyph in the legacy font was literally named
newNunGunnaReplacemet. New rule: check the font before you "fix" the data. I
even rebuilt a lost historical typeface from outlines buried inside old PDFs to get there.
The corpus lives in four languages, Arabic, Lisan al-Dawat (Gujarati written in Arabic script, with extra letters you must never fold away), Urdu, and English. The hard problem isn't matching within one script, it's the mixed query: someone types husain in Latin letters and expects Arabic-script results that share not a single character, or searches "patience" in English and should find a devotional poem about صبر.
So the engine runs three lanes at once: classic keyword search, automatic transliteration of romanized queries into Arabic script, and cross-lingual semantic search over embeddings that run free, inside the edge worker. That last lane took English-to-Arabic hit rate from about 5% to 40% on queries that share no characters with their answers. Then all three lanes are merged with reciprocal rank fusion, which combines them by rank instead of trying to calibrate incomparable scores against each other. Fused, it beats every single lane on its own, because it carries both kinds of query at once.
Live and growing at alishraaq.com, with new sources, a canonical wiki, and the world-history timeline still landing. It's the most technically demanding thing I've built, and the one that matters most to me.