Moayyad Faris
Arabic Typography & Performance10 min readยท Published 2026-08-23

Best Arabic Web Fonts: A 20-Font Measured Performance Guide

Tajawal's Arabic-only WOFF2 is under 18KB. Harmattan's is nearly 15x larger for the same job, and more than half the variable-font options measured here are bigger than the static files they're meant to replace.

Moayyad Faris
VP of Engineering & Software Architect

This guide runs on the same reproducible benchmark script, `pnpm benchmark:arabic-fonts`, that powers this site's own font-performance comparison pages, re-run the day this guide published rather than sourced from vendor marketing pages.

Across 20 Arabic web fonts measured by real WOFF2 file size (Fontsource packages, Arabic subset, regular and bold, refreshed 2026-08-23), sizes span nearly 15x, from Tajawal at 17.5KB to Harmattan at 262KB. Naskh reading faces are systematically the largest, and roughly half the available variable-font versions are bigger than the static files they replace, not smaller.

How These 20 Fonts Were Measured

Every number in this guide comes from a script that reads the actual installed Fontsource npm packages on disk, not a spec sheet or a vendor's own size claims. For each of 20 Arabic font families it measures the Arabic-subset WOFF2 file at regular (400) and bold (700) weight, checks whether a Latin subset and a variable-weight file also ship, and runs a 7-point coverage test against each font's declared Unicode ranges.

ScenarioWhat's measured
Arabic, two weightsRegular + bold WOFF2, Arabic subset only
Arabic + Latin, two weightsThe above plus the matching Latin subset files
VariableA single variable-weight WOFF2, where the family ships one
CoverageArabic letter, Persian letter, Urdu letter, Arabic-Indic digit, Eastern Arabic digit, Arabic diacritic, Arabic punctuation

All 20 families passed all 7 coverage checks, every one declares full support for Arabic, Persian, and Urdu script ranges plus digits, diacritics, and punctuation. That's worth stating plainly: for this set, script coverage is not the differentiator. Every family here can render the same Unicode Arabic block content; what actually varies is byte size, and by how much depends heavily on which of the sections below applies to you.

The script is checked into this site's own repository and reproducible with one command: pnpm benchmark:arabic-fonts. Its own documented limitations are worth repeating here rather than glossing over: it measures file size, not network latency, cache behavior, render time, or layout shift, and coverage tests confirm declared Unicode ranges, not shaping quality or language-specific typographic correctness. Readability recommendations later in this guide are editorial judgment, not benchmark output.

The Full Ranking, Smallest to Largest

Two-weight Arabic size (regular + bold WOFF2) is the baseline column, since it's the minimum most products actually ship. The Latin column shows what the same family costs once you add a matching Latin subset, and the variable column shows the single variable-weight file where one exists.

FontClassificationArabic (2wt)+ LatinVariable
TajawalSans17.5KB37.3KBnone
Reem KufiKufi17.6KB40.9KB12.1KB (-32%)
ChangaDisplay21.7KB41.6KB22.5KB (+4%)
MadaSans22.6KB45.5KB26.7KB (+18%)
El MessiriDisplay23.7KB50.6KB21.8KB (-8%)
AlexandriaSans25.1KB50.5KB30.6KB (+22%)
CairoSans26.6KB56.2KB30.2KB (+13%)
RubikSans34.2KB71.4KB31.7KB (-7%)
VazirmatnSans41.8KB73.5KB45.2KB (+8%)
Markazi TextNaskh45.0KB75.5KB40.4KB (-10%)
AlmaraiSans63.1KB97.1KBnone
MirzaNaskh79.8KB106.0KBnone
IBM Plex Sans ArabicSans85.1KB122.8KBnone
Noto Kufi ArabicKufi85.8KB106.1KB120.8KB (+41%)
Noto Sans ArabicSans96.7KB117.6KB162.1KB (+68%)
Noto Naskh ArabicNaskh103.2KB126.2KB91.8KB (-11%)
LateefNaskh126.7KB152.1KBnone
Scheherazade NewNaskh164.8KB191.2KBnone
AmiriNaskh203.6KB242.6KBnone
HarmattanNaskh261.9KB282.7KBnone

Tajawal and Reem Kufi anchor the bottom of the table within 100 bytes of each other. Harmattan, at the other end, is nearly 15x Tajawal's size for the same two-weight Arabic job. That range alone is the reason "just pick a popular Arabic font" is bad advice: two families can serve visually similar UI roles and differ by an order of magnitude in delivery cost.

The Naskh Size Tax

Sort the table above by classification instead of size and a pattern shows up immediately: 7 of the 20 families measured are Naskh, the calligraphic, cursive-joined style built for long-form reading, and 6 of those 7 land in the largest half of the ranking. Only Markazi Text breaks the pattern, sitting at rank 10 of 20.

This isn't a flaw in any individual font. Naskh faces carry far more contextual glyph variants and ligature forms to render joined Arabic script correctly across a paragraph of body text, that's the entire point of the classification, and it costs bytes. Sans and Kufi faces, built for short UI strings rather than paragraphs, get away with a smaller glyph set.

The practical takeaway: if your use case is genuinely long-form reading (articles, documentation, e-books), budget for a Naskh face and accept the size, Markazi Text is the one exception that keeps the reading-appropriate joining behavior at UI-face pricing (45.0KB). If your use case is UI chrome, dashboards, or navigation, a Naskh face is usually the wrong choice on both size and legibility-at-small-sizes grounds, regardless of how it looks in a specimen at 48px.

Variable Fonts Aren't Always Smaller

Of the 20 families measured, 12 ship a variable-weight WOFF2 alongside their static files. The assumption going in is usually that a single variable file beats loading two static weights separately. Measured, that assumption holds for only 5 of the 12:

FontStatic (2wt)VariableChange
Reem Kufi17.6KB12.1KB-32%
Noto Naskh Arabic103.2KB91.8KB-11%
Markazi Text45.0KB40.4KB-10%
El Messiri23.7KB21.8KB-8%
Rubik34.2KB31.7KB-7%
Changa21.7KB22.5KB+4%
Vazirmatn41.8KB45.2KB+8%
Cairo26.6KB30.2KB+13%
Mada22.6KB26.7KB+18%
Alexandria25.1KB30.6KB+22%
Noto Kufi Arabic85.8KB120.8KB+41%
Noto Sans Arabic96.7KB162.1KB+68%

Noto Sans Arabic, likely the single most commonly reached-for Arabic web font by default, is the worst case in this set: its variable file measures 68% larger than just loading the two static weights most products actually use. A variable axis is only worth its weight when a product genuinely needs a continuous weight range (animated weight transitions, several distinct weights in one view). If you need exactly two weights, check the static two-weight total against the variable file before assuming the variable version is the efficient choice, this table shows it frequently isn't.

Choosing an Arabic Font by Use Case

With script coverage equal across all 20 and size behaving unevenly across classification and variable-vs-static, the decision comes down to matching classification and weight strategy to what the font actually has to do.

UI, dashboards, forms, navigation

Stay in Sans or Kufi. Tajawal, Cairo, Mada, Vazirmatn, and Noto Sans Arabic cover this role; among them, Tajawal and Reem Kufi are the cheapest starting points, and Noto Sans Arabic is the most expensive by a wide margin once you account for its variable file.

Long-form reading, articles, documentation

Budget for Naskh. Amiri, Noto Naskh Arabic, Markazi Text, Scheherazade New, and Lateef cover this role; Markazi Text is the size-conscious pick among them, the rest cost considerably more but are built for sustained paragraph reading.

Headings and branding

Kufi and Display faces (Reem Kufi, Changa, El Messiri, Noto Kufi Arabic) give geometric or expressive character at a size cost closer to Sans than Naskh, reasonable for a headings-only role where you're not loading body text weight.

Just want the smallest starting point

The 8 smallest measured families are Tajawal, Reem Kufi, Changa, Mada, El Messiri, Alexandria, Cairo, and Rubik, all under 35KB for two weights. Start there, then confirm visual fit before committing.

For a deeper, system-level treatment of Arabic and bilingual web development beyond fonts, direction, forms, and SEO, see the Arabic Web Development guide.

Loading a Font Without Paying for Latin You Don't Use

The "+ Latin" column in the ranking table isn't a rounding error. For Tajawal, the Latin subset alone adds 19.8KB on top of a 17.5KB Arabic file, more than doubling the cost. For Noto Sans Arabic, it's a smaller relative jump (+21KB on 96.7KB) but still real weight for characters a primarily-Arabic interface may barely use.

Import only the subset you need

Fontsource ships subsets as separate files specifically so you can import {family}-arabic-{weight}-normal.woff2 without pulling in {family}-latin-{weight}-normal.woff2. If your product is Arabic-primary with only occasional Latin (brand names, numerals in some locales), importing the Latin file for every visitor is pure waste.

Preload only the weight the first paint needs

Two weights measured together is the baseline this guide uses for comparability, but most pages only need regular weight for first paint, with bold loaded for whatever triggers it (headings, emphasis). Preload the regular weight; let bold load on demand.

Set font-display: swap

Arabic text has no fallback font that renders anywhere close to correctly, an unstyled-text flash is far less costly to user experience than a blocked paint waiting on a font file, regardless of which of the 20 families you choose.

Verify the real rendering before shipping

File size tells you delivery cost, not whether the font actually looks right in your layout, at your sizes, mixed with your Latin content. Check the result with the RTL Preview tool before committing to a choice this guide's numbers alone can't make for you.

Frequently Asked Questions

What's the smallest Arabic web font by measured file size?

Tajawal, at 17.5KB for a two-weight (regular and bold) Arabic-subset WOFF2 bundle, measured directly from the installed Fontsource package. Reem Kufi is close behind at 17.6KB static, and actually drops below Tajawal if you use its variable file instead, at 12.1KB.

Are variable Arabic web fonts always smaller than static files?

No. Of the 12 measured families that ship a variable-weight file, only 5 are smaller than loading the two static weights (regular and bold) separately. The other 7 are larger, in the worst case Noto Sans Arabic's variable file measures 68% bigger than its two static weights combined. Always compare the actual file sizes rather than assuming variable is the efficient default.

Which Arabic font classification costs the most in file size?

Naskh, the cursive-joined style built for long-form reading. Of the 7 Naskh-classified fonts in this measured set, 6 land in the largest half of the 20-font ranking, led by Harmattan at 261.9KB for two weights, nearly 15x the smallest font measured. The extra size comes from the larger contextual glyph and ligature set Naskh needs to join Arabic script correctly across body text.

Is this Arabic font benchmark reproducible?

Yes. It's a script checked into this site's repository (`pnpm benchmark:arabic-fonts`) that reads the actual installed Fontsource package files on disk and hashes them, rather than relying on vendor-stated sizes. Its documented limitation is that it measures file size only, not network latency, render time, layout shift, or shaping and typographic quality, those require separate, visual evaluation.

References