Insights · Engineering
Nepali-language websites: fonts, Unicode and search
The short version
If you want a Nepali-language website that people can read, copy, and find on Google, the text has to be real Unicode Devanagari, served with a web font that is subset and loaded carefully, with each language on its own URL. Pages built on legacy fonts like Preeti look right on screen but are gibberish to search engines, screen readers and anyone who pastes the text into a chat.
That sounds obvious. It isn't, judging by how many Nepali PDFs and notices still copy out as strings like "g]kfn" instead of नेपाल. This guide covers the font problem, the performance cost of Devanagari web fonts, the rendering traps, and how Google decides which language version to show. It also covers a few Nepal-specific details that trip up otherwise good sites.
Why does Preeti text look fine but break everything else?
Preeti, Kantipur and similar fonts date from before Unicode was usable for Nepali. They work by drawing Devanagari shapes on top of ordinary English keyboard codes. So the file really stores Latin letters and punctuation, and only the font makes them look Nepali. Take the font away and you get the raw letters back. A 2026 conversion guide from Merokalam lists the usual suspects: ward notices, school question papers, cooperative minutes and land agreement drafts that look fine on screen but copy as broken text.
Unicode fixes this by giving every Devanagari letter, vowel sign and virama its own code point, so the meaning lives in the text, not the font. Google can index it, a screen reader can speak it, and a phone with no special fonts installed can still show it. Converting old content is mostly mechanical, since tools map Preeti characters to Unicode, but it is never fully automatic. Merokalam's guide warns that names, dates, money amounts and land parcel numbers need a human proofread, and scanned PDFs need OCR first.
Preeti (legacy) vs Unicode Devanagari on the web
What happens to the same Nepali sentence under each approach
| Criterion | Preeti / Kantipurlegacy, ASCII-mapped | Unicode DevanagariU+0900 block |
|---|---|---|
| Google can index the words | ✕indexes the Latin letters underneath | ✓ |
| Screen readers speak it correctly | ✕ | ✓ |
| Copy-paste into chat or email stays readable | ✕only if the reader has Preeti installed | ✓ |
| Shows correctly on a phone with no extra fonts | ✕ | ✓ |
| AI assistants can quote and summarise it | ✕ | ✓ |
| Still common in older office documents and PDFs | ✓ | growingdefault on modern keyboards |
Unicode wins on every reader-facing row. Preeti's only remaining advantage is habit. Merokalam, Preeti to Unicode guide (May 2026); W3C WCAG 2.1 Understanding SC 3.1.1. As of 2026-09-18.
Preeti vs Unicode across search, accessibility, copy-paste and mobile.
Which web font should a Nepali site use, and what does it cost?
Phones in Nepal already ship a Devanagari system font, so you could skip web fonts entirely. Most brands don't, because they want consistent letterforms across Android, iPhone and Windows. The safe free choices are on Google Fonts under the SIL Open Font License: Noto Sans Devanagari, Mukta and Hind are the ones we see most. The catch is weight. Devanagari needs hundreds of glyphs for conjuncts and vowel-sign combinations, so the files are several times bigger than a Latin-only font.
We checked the regular (400) WOFF2 files served by Fontsource on jsDelivr. The Devanagari subset of Noto Sans Devanagari is about 49 KB. Mukta's is about 97 KB, nearly double. Add a bold weight and the Latin subset for English words, and a Mukta page can pull over 200 KB of fonts before any image. On a budget Android over mobile data, that is exactly the kind of weight we flagged in our post on website speed on Nepal's phones.
Free Devanagari web fonts: weights, file size, licence
WOFF2 files, one subset per column. Tap a header to sort.
| Licence | ||||
|---|---|---|---|---|
| Noto Sans Devanagari | 9 | 49.2 KB | 10.3 KB | OFL 1.1 (variable version too) |
| Hind | 5 | 73.2 KB | 15.8 KB | OFL 1.1 |
| Mukta | 7 | 97 KB | 20 KB | OFL 1.1 |
Bold (700) Devanagari subsets measured 52.7 KB for Noto and 102.6 KB for Mukta. Pick one family, two weights at most. File sizes measured from @fontsource WOFF2 files on cdn.jsdelivr.net, September 2026; weights and licences from Fontsource (packages updated Sep 2025).
Devanagari font files are several times the size of their Latin subsets.
A few rules keep that cost down:
- Serve WOFF2 only. Google's web.dev guide says it compresses about 30% better than WOFF.
- Split by script with unicode-range, so an English-only page never downloads the Devanagari file.
- Use one family and two weights. Every extra weight is another 50-100 KB file.
- Set font-display: swap so text shows in the system font straight away, or optional if speed matters most.
- Self-host the files on your own domain or CDN rather than adding a third-party connection on first load.
What goes wrong when Devanagari renders?
Devanagari is not a letter-per-box script. Consonants join into conjuncts, the short i sign is typed after its consonant but drawn before it, and the reph (the r that sits on top as a hook) moves to the end of a cluster. A font that lacks the right OpenType tables, or a shaping step that gets skipped, gives you dotted circles and loose half-letters. The usual culprits are a decorative Latin font used as the first choice for Nepali text, text baked into images, or a PDF tool that flattens shaping.
Line height is the other common bug. Vowel signs sit above the headline and below the baseline, so a line-height tuned for English at 1.2 will clip matras or collide lines. Something around 1.6 to 1.8 for Nepali body text is a sensible start, then check real sentences, not lorem ipsum. Finally, write your font stack so the fallback is a Devanagari font too, not a generic serif that the phone may map oddly.
How does a browser turn Unicode into readable Nepali?
Here is the pipeline in plain terms. The page arrives as UTF-8 code points. The browser splits the text into runs by script and picks a font for each run from your CSS stack, falling back to a system font if a glyph is missing. Each run then goes to a text shaper. Chrome, Firefox and Android use HarfBuzz, which applies its Indic shaping model: it reorders the short i sign, forms the reph, then applies the font's OpenType features such as nukt, akhn, rphf, half, blwf and pres to build conjuncts. Only then are glyphs positioned and painted.
Search follows a separate path. Googlebot fetches each URL, and Google says it works out a page's language from the visible text. It doesn't use the lang attribute or the URL for that. It then groups language versions using hreflang annotations, which must point both ways, and shows the version that fits the searcher. That is why Preeti text fails twice: the browser draws it as Nepali only because of a special font, and Google's language detection sees English-looking letters.
From code point to screen, and from page to search result
Tap a component for what it does
Tap any component above for its role and the real tech.
Two separate pipelines read the same Unicode text: the browser's shaper and Google's crawler.
- Page text (Data, UTF-8 Unicode, U+0900-U+097F): The meaning lives in code points: न is U+0928, the e-sign is U+0947, and so on. This is what search engines, screen readers and AI tools read.
- Web font file (CDN / Edge, WOFF2 + unicode-range): A Devanagari subset (about 49 KB for Noto Sans Devanagari regular) served only to pages that contain Devanagari characters.
- hreflang tags (Service, ne, en, x-default): Each language version lists every other version and itself. If two pages don't point to each other, Google ignores the tags.
- Script runs + font fallback (Client, CSS font stack): Text is split into runs by script. Each run gets the first font in your stack that has the glyphs, else a system Devanagari font.
- Text shaper (Service, HarfBuzz, Indic model): Reorders the short i sign, forms the reph, and applies OpenType features (nukt, akhn, rphf, half, blwf, pres) to build conjuncts.
- Layout + paint (Client, line-height, glyph positioning): Shaped glyphs are positioned and drawn. Too-tight line-height clips vowel signs above and below the line.
- Googlebot (External, crawl + render): Fetches each language URL separately. A version reachable only by cookie or auto-redirect may never be seen.
- Language detection (Model / AI, visible text, not lang attr): Google says it uses the visible content to decide a page's language, not code-level hints like the lang attribute.
- Result shown (Client, matched to searcher): Google shows the language version that best fits the user, using the hreflang cluster.
How Devanagari is rendered and how Google chooses a language version.
How should a bilingual Nepali and English site be structured?
Google's multi-regional guidance is short and clear. Give each language its own URL, for example /ne/ and /en/, rather than switching language with a cookie or the browser setting. Link the versions with hreflang. Don't auto-redirect visitors by language, because Googlebot may never reach the other version. Hreflang codes follow ISO 639-1, so Nepali is ne, and you can add x-default for a language picker.
Set lang="ne" on Nepali pages anyway. Google may not use it to detect language, but screen readers do. WCAG success criterion 3.1.1 requires the page language to be set in code so assistive tech uses the right pronunciation. We covered the wider accessibility work in our WCAG 2.1 AA remediation case study. Translate the title, meta description and structured data too, not just the body. A Nepali page with an English title looks half-finished in results.
How do Nepalis actually search?
Here we have to be careful. It is widely observed that Nepalis type Nepali in Roman letters on phones, as in "ghar bhada kathmandu" rather than the Devanagari spelling. A March 2026 arXiv paper from researchers at Nepal Engineering College and Tribhuvan University calls Romanized Nepali the de facto language of Nepali social media. But it offers no usage figures, and we could not find a public survey that measures search behaviour by script. So treat this as a strong pattern to test, not a statistic.
The practical answer is to cover all three. Write the Nepali page in Devanagari. Put the English terms people use for your service, such as loan, visa or admission, in headings where they fit naturally. Answer common Romanized phrasings in an FAQ, but don't stuff keyword variants. Then check Search Console to see which queries actually bring people in, and adjust.
What else trips up Nepali sites: dates and AI answers?
Dates are the quiet one. Bikram Sambat is one of Nepal's two official calendars. It runs about 56.7 years ahead of the Gregorian calendar, the year turns in mid-April, and month lengths change from year to year, so you can't convert with a fixed formula. Store dates as Gregorian ISO dates in your database and in structured data, and show the BS date beside them using a tested lookup-table library. Never make BS the only date a machine sees.
AI answers are the newer reason all this matters. Assistants and Google's AI features can only quote text they can read, and Preeti text reads as nonsense to them. We wrote about staying visible now that Google answers instead of listing, and about the harder problem of AI that actually understands Nepali. Both start with clean Unicode.
What should you fix first?
- Search your site and PDFs for Preeti or Kantipur text, convert it to Unicode, and proofread names, dates and amounts.
- Pick one Devanagari font family, two weights, WOFF2, split by unicode-range, with font-display: swap.
- Raise Nepali line-height to about 1.6 to 1.8 and test with real sentences on a cheap Android phone.
- Give each language its own URL, add reciprocal hreflang plus x-default, and set lang="ne".
- Store Gregorian dates and display Bikram Sambat alongside them.
None of this is exotic. It is the unglamorous plumbing that decides whether a Nepali page is read by people, by machines, or by neither. If you want a second pair of eyes on a bilingual build, our Studio Engineering team does this work, and you can get in touch with a link to your site.
Sources
Frequently asked
Is Preeti font bad for SEO?
Yes. Preeti stores Latin letters and punctuation that only look like Nepali when the Preeti font is installed. Google indexes the underlying characters, so your page is read as meaningless English-like strings. Screen readers and AI assistants read it the same way. Convert Preeti content to Unicode Devanagari, then proofread names, dates and amounts, because converters are not perfect.
Which font is best for a Nepali website?
Noto Sans Devanagari, Mukta and Hind are free under the SIL Open Font License and cover Nepali well. Noto Sans Devanagari is the lightest of the three: its regular Devanagari WOFF2 subset is about 49 KB against about 97 KB for Mukta. Whatever you pick, use one family, two weights, unicode-range subsetting and font-display: swap.
Does Google use lang="ne" to rank Nepali pages?
Google says it detects a page's language from its visible text, not from the lang attribute or the URL. You should still set lang="ne", because screen readers rely on it and WCAG 3.1.1 requires it. To help Google show the right version, give each language its own URL and link them with reciprocal hreflang annotations.
Want this run on your numbers?
We'll do the same analysis on one of your workflows in the two-week Automation Sprint.
Related service · Studio Engineering