How Arabic letters join together and why ligatures matter for typography and web development.

Amira Hassan
Linguist and typographer specializing in Arabic script history and evolution.
When Latin letters sit next to each other, they remain separate shapes: "fl" is just "f" followed by "l". In Arabic, letters don't merely sit together—they transform. The same letter can look completely different depending on its position and neighbors.
This system of connected, contextually-shaped letters is fundamental to Arabic script. For developers and designers, understanding ligatures is essential for proper text rendering, font selection, and debugging display issues.
A ligature is a single glyph created by joining two or more characters. In Arabic, ligatures are not optional typographic flourishes—they're required for correct rendering.
Latin scripts use ligatures optionally for aesthetic reasons:
fi → fi (prevents f's hook from colliding with i's dot)
fl → fl (smoother connection)
ff → ff (elegant alternative)These are purely stylistic. Text is readable without them.
Arabic ligatures are mandatory. Letters physically connect, and their shapes change based on position:
ب (ba) alone: ب
ب at start: بـ
ب in middle: ـبـ
ب at end: ـب
Combined: كتب (k-t-b) = ك + ت + ب → completely different shapesEvery Arabic letter has up to four forms:
| Position | Name | Description | Example (ب) |
|---|---|---|---|
| Isolated | مفرد | Standalone | ب |
| Initial | ابتدائي | Start of word | بـ |
| Medial | وسطي | Middle of word | ـبـ |
| Final | نهائي | End of word | ـب |
Six Arabic letters only connect from the right and have only two forms (isolated and final):
ا (alif)
د (dal)
ذ (dhal)
ر (ra)
ز (zayn)
و (waw)These letters break the connection, forcing the next letter into initial form:
دار (dar): د + ا + ر
Each letter is in isolated/final form because the connectors break the chain.These must be rendered correctly for text to be legible:
1. لا (lam-alif) The most famous Arabic ligature. When ل (lam) meets ا (alif), they form a special combined shape:
ل + ا → لا
Not: لـا (incorrect)2. Positional connections All contextual forms are technically ligatures—the letter shapes change when connected.
Some fonts include additional ligatures for aesthetic purposes:
لله (Allah) - special form in many fonts
لمـ (lam-meem combinations)
بسم (bismillah combinations)Some calligraphic fonts include elaborate ligatures:
ست → combined form
تج → joined variant
etc.Arabic text is stored in logical order (first letter typed = first in memory), not visual order:
Word: كتاب (kitab = book)
Unicode: U+0643 U+062A U+0627 U+0628
Stored: ك ت ا ب
Rendered: كتاب (letters connect and transform)Font rendering engines apply multiple shaping rules:
1. GSUB (Glyph Substitution)
2. GPOS (Glyph Positioning)
1. Analyze text direction and language
2. Determine connecting behavior of each letter
3. Select appropriate positional form
4. Apply mandatory ligatures (لا, etc.)
5. Apply optional ligatures (if enabled)
6. Position marks and diacritics
7. Final kerning adjustments/* Default: ligatures enabled */
.arabic-text {
font-feature-settings: "liga" 1, "rlig" 1;
}
/* Disable discretionary ligatures */
.no-fancy {
font-feature-settings: "dlig" 0;
}
/* Common ligature controls */
.text {
font-variant-ligatures: common-ligatures;
/* or: no-common-ligatures */
/* or: discretionary-ligatures */
}For proper Arabic rendering, fonts must include:
<!-- Test lam-alif ligature -->
<p lang="ar">لا إله إلا الله</p>
<!-- Test positional forms -->
<p lang="ar">ببب ككك ممم</p>
<!-- Test non-connecting letters -->
<p lang="ar">دادا رارا وووو</p>Problem 1: Letters not connecting
/* Wrong: disabling ligatures */
.broken {
font-feature-settings: "liga" 0;
}
/* Fix: ensure ligatures enabled */
.fixed {
font-feature-settings: "liga" 1, "rlig" 1;
}Problem 2: Wrong positional forms
Usually a font issue. Test with a known-good font:
.debug {
font-family: 'Noto Naskh Arabic', serif;
}Problem 3: Lam-alif not forming
Some fonts lack this ligature. Check font coverage:
// Test if font renders lam-alif correctly
const testEl = document.createElement('span');
testEl.style.fontFamily = 'YourFont';
testEl.textContent = 'لا';
document.body.appendChild(testEl);
// Check width - proper ligature should be narrower/* Standard Arabic web typography */
.arabic-article {
font-family: 'Noto Naskh Arabic', 'Traditional Arabic', serif;
font-feature-settings:
"liga" 1, /* Standard ligatures */
"rlig" 1, /* Required ligatures */
"calt" 1; /* Contextual alternates */
}/* Ensure proper rendering in forms */
input[lang="ar"],
textarea[lang="ar"] {
font-family: 'Noto Naskh Arabic', sans-serif;
/* Ligatures should work automatically */
}When rendering Arabic in SVG or Canvas, ensure:
// Canvas may not shape automatically
// Use a library for proper Arabic rendering
import opentype from 'opentype.js';
const font = await opentype.load('NotoNaskhArabic.ttf');
const path = font.getPath('لا إله إلا الله', 0, 50, 24);
// This handles shaping correctlyMany Arabic fonts include a special ligature for الله (Allah):
Standard: ا + ل + ل + ه = الله
Special form: ﷲ (single glyph U+FDF2)Some fonts automatically substitute this, while others require explicit input.
Arabic-Indic numerals don't ligate with letters, but pay attention to mixed text:
<p dir="rtl">السعر: ١٢٣ ريال</p>Diacritical marks interact with ligatures:
بَ + يْ + تُ = بَيْتُ
Diacritics position correctly on ligated formsArabic fonts with full ligature support are larger than Latin fonts:
Latin-only font: ~20KB
Arabic font (Naskh): ~100-300KB
Arabic font (Nastaliq): 1-5MB1. Subset fonts
# Create subset with only needed characters
pyftsubset font.ttf --text="your arabic text here" --output-file=subset.woff22. Use font-display
@font-face {
font-family: 'Arabic Font';
src: url('arabic-font.woff2') format('woff2');
font-display: swap; /* Show fallback while loading */
}3. Preload critical fonts
<link rel="preload" href="arabic-font.woff2" as="font" type="font/woff2" crossorigin>Ligatures are mandatory: Unlike Latin, Arabic ligatures are required for correct text display.
Positional forms are ligatures: Each letter's four forms are technically ligature substitutions.
Lam-alif is critical: The لا ligature must work for text to be acceptable.
OpenType handles complexity: Modern font technology manages thousands of shaping rules automatically.
Test with real fonts: Always verify Arabic rendering with proper Arabic fonts, not generic fallbacks.
How Arabic letters join together and why ligatures matter for typography and web development.

Amira Hassan
Linguist and typographer specializing in Arabic script history and evolution.
When Latin letters sit next to each other, they remain separate shapes: "fl" is just "f" followed by "l". In Arabic, letters don't merely sit together—they transform. The same letter can look completely different depending on its position and neighbors.
This system of connected, contextually-shaped letters is fundamental to Arabic script. For developers and designers, understanding ligatures is essential for proper text rendering, font selection, and debugging display issues.
A ligature is a single glyph created by joining two or more characters. In Arabic, ligatures are not optional typographic flourishes—they're required for correct rendering.
Latin scripts use ligatures optionally for aesthetic reasons:
fi → fi (prevents f's hook from colliding with i's dot)
fl → fl (smoother connection)
ff → ff (elegant alternative)These are purely stylistic. Text is readable without them.
Arabic ligatures are mandatory. Letters physically connect, and their shapes change based on position:
ب (ba) alone: ب
ب at start: بـ
ب in middle: ـبـ
ب at end: ـب
Combined: كتب (k-t-b) = ك + ت + ب → completely different shapesEvery Arabic letter has up to four forms:
| Position | Name | Description | Example (ب) |
|---|---|---|---|
| Isolated | مفرد | Standalone | ب |
| Initial | ابتدائي | Start of word | بـ |
| Medial | وسطي | Middle of word | ـبـ |
| Final | نهائي | End of word | ـب |
Six Arabic letters only connect from the right and have only two forms (isolated and final):
ا (alif)
د (dal)
ذ (dhal)
ر (ra)
ز (zayn)
و (waw)These letters break the connection, forcing the next letter into initial form:
دار (dar): د + ا + ر
Each letter is in isolated/final form because the connectors break the chain.These must be rendered correctly for text to be legible:
1. لا (lam-alif) The most famous Arabic ligature. When ل (lam) meets ا (alif), they form a special combined shape:
ل + ا → لا
Not: لـا (incorrect)2. Positional connections All contextual forms are technically ligatures—the letter shapes change when connected.
Some fonts include additional ligatures for aesthetic purposes:
لله (Allah) - special form in many fonts
لمـ (lam-meem combinations)
بسم (bismillah combinations)Some calligraphic fonts include elaborate ligatures:
ست → combined form
تج → joined variant
etc.Arabic text is stored in logical order (first letter typed = first in memory), not visual order:
Word: كتاب (kitab = book)
Unicode: U+0643 U+062A U+0627 U+0628
Stored: ك ت ا ب
Rendered: كتاب (letters connect and transform)Font rendering engines apply multiple shaping rules:
1. GSUB (Glyph Substitution)
2. GPOS (Glyph Positioning)
1. Analyze text direction and language
2. Determine connecting behavior of each letter
3. Select appropriate positional form
4. Apply mandatory ligatures (لا, etc.)
5. Apply optional ligatures (if enabled)
6. Position marks and diacritics
7. Final kerning adjustments/* Default: ligatures enabled */
.arabic-text {
font-feature-settings: "liga" 1, "rlig" 1;
}
/* Disable discretionary ligatures */
.no-fancy {
font-feature-settings: "dlig" 0;
}
/* Common ligature controls */
.text {
font-variant-ligatures: common-ligatures;
/* or: no-common-ligatures */
/* or: discretionary-ligatures */
}For proper Arabic rendering, fonts must include:
<!-- Test lam-alif ligature -->
<p lang="ar">لا إله إلا الله</p>
<!-- Test positional forms -->
<p lang="ar">ببب ككك ممم</p>
<!-- Test non-connecting letters -->
<p lang="ar">دادا رارا وووو</p>Problem 1: Letters not connecting
/* Wrong: disabling ligatures */
.broken {
font-feature-settings: "liga" 0;
}
/* Fix: ensure ligatures enabled */
.fixed {
font-feature-settings: "liga" 1, "rlig" 1;
}Problem 2: Wrong positional forms
Usually a font issue. Test with a known-good font:
.debug {
font-family: 'Noto Naskh Arabic', serif;
}Problem 3: Lam-alif not forming
Some fonts lack this ligature. Check font coverage:
// Test if font renders lam-alif correctly
const testEl = document.createElement('span');
testEl.style.fontFamily = 'YourFont';
testEl.textContent = 'لا';
document.body.appendChild(testEl);
// Check width - proper ligature should be narrower/* Standard Arabic web typography */
.arabic-article {
font-family: 'Noto Naskh Arabic', 'Traditional Arabic', serif;
font-feature-settings:
"liga" 1, /* Standard ligatures */
"rlig" 1, /* Required ligatures */
"calt" 1; /* Contextual alternates */
}/* Ensure proper rendering in forms */
input[lang="ar"],
textarea[lang="ar"] {
font-family: 'Noto Naskh Arabic', sans-serif;
/* Ligatures should work automatically */
}When rendering Arabic in SVG or Canvas, ensure:
// Canvas may not shape automatically
// Use a library for proper Arabic rendering
import opentype from 'opentype.js';
const font = await opentype.load('NotoNaskhArabic.ttf');
const path = font.getPath('لا إله إلا الله', 0, 50, 24);
// This handles shaping correctlyMany Arabic fonts include a special ligature for الله (Allah):
Standard: ا + ل + ل + ه = الله
Special form: ﷲ (single glyph U+FDF2)Some fonts automatically substitute this, while others require explicit input.
Arabic-Indic numerals don't ligate with letters, but pay attention to mixed text:
<p dir="rtl">السعر: ١٢٣ ريال</p>Diacritical marks interact with ligatures:
بَ + يْ + تُ = بَيْتُ
Diacritics position correctly on ligated formsArabic fonts with full ligature support are larger than Latin fonts:
Latin-only font: ~20KB
Arabic font (Naskh): ~100-300KB
Arabic font (Nastaliq): 1-5MB1. Subset fonts
# Create subset with only needed characters
pyftsubset font.ttf --text="your arabic text here" --output-file=subset.woff22. Use font-display
@font-face {
font-family: 'Arabic Font';
src: url('arabic-font.woff2') format('woff2');
font-display: swap; /* Show fallback while loading */
}3. Preload critical fonts
<link rel="preload" href="arabic-font.woff2" as="font" type="font/woff2" crossorigin>Ligatures are mandatory: Unlike Latin, Arabic ligatures are required for correct text display.
Positional forms are ligatures: Each letter's four forms are technically ligature substitutions.
Lam-alif is critical: The لا ligature must work for text to be acceptable.
OpenType handles complexity: Modern font technology manages thousands of shaping rules automatically.
Test with real fonts: Always verify Arabic rendering with proper Arabic fonts, not generic fallbacks.