han · geul · jeom · di · beu — hangul.dev
A typographic specimen book of 한글 — King Sejong's 1443 invention, re-read through the eyes of a developer who has spent years thinking about ligatures, vertical metrics, OpenType features, and the geometry of consonant-vowel composition. Nine leaves follow.
chosŏng · initial ㅎ 중성
jungsŏng · medial ㅏ 종성
jongsŏng · final ㄴ
A hangul syllable is a square: an initial consonant atop or beside a medial vowel, optionally closed by a final consonant below. The block is the unit of meaning; the jamo are the unit of letter. Every syllable obeys this geometry — there are no ligature surprises, only twenty-eight rules of arrangement.
function decompose(syllable) {
const code = syllable.charCodeAt(0) - 0xAC00;
if (code < 0 || code > 11171) return [syllable];
const initial = Math.floor(code / (21 * 28));
const medial = Math.floor((code % (21 * 28)) / 28);
const final = code % 28;
return [
INITIALS[initial],
MEDIALS[medial],
final ? FINALS[final] : null,
].filter(Boolean);
}
// decompose("한") → ["ㅎ", "ㅏ", "ㄴ"]
The Unicode block U+AC00 .. U+D7A3 contains every modern
hangul syllable — eleven thousand one hundred seventy-two of them — and
each codepoint encodes its three jamo by a deterministic arithmetic.
Sejong's geometry, in three lines of integer math.
개발 · develop · twenty-eight specimens, the same word in twenty-eight voices.
The fourteen basic consonants, drawn one stroke at a time. Each is a brush movement before it is a letter — hover any glyph to retrace it.
try: hangul · gaebal · seojonghan
const INI = ['ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
const MED = ['ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ','ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ','ㅣ'];
const FIN = ['', 'ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'];
function compose(ini, med, fin = 0) {
const code = 0xAC00
+ INI.indexOf(ini) * 21 * 28
+ MED.indexOf(med) * 28
+ fin;
return String.fromCharCode(code);
}
// compose('ㅎ','ㅏ','ㄴ') → '한'
// 0xAC00 + 18·588 + 0·28 + 4 = 0xD55C
「The round one — empty, like the throat at rest, like a pebble dropped in still water — was made first because the mouth, before it speaks, is silent.」
— after Sejong, Hunminjeongeum Haerye, 1446
Two paths to the same square. The first composes the syllable from
conjoining jamo at typesetting time, governed by the OpenType
liga and ccmp tables. The second arrives
pre-composed, a single Hangul Syllable codepoint. Most fonts ship both —
the renderer chooses, and the reader never knows.
A good hangul font hints the vertical metrics of 중성 and
종성 independently, so the syllable block stays optically square
across 한, 흙, 뷁. This is the
quiet, mathematical beauty Sejong's geometry inherits.
간기 colophon
- Display
- Gowun Batang · contemporary myeongjo
- Body
- Noto Serif KR · tuned to hangul x-height
- Latin
- EB Garamond · oldstyle figures, italic epigraphs
- Code
- JetBrains Mono · 0.875rem, 1.6 leading
- Built
- 2026 · 04 · 30 · 단기 4359 · 윤2월 13일
- Place
- Seoul · at a wide oak desk, late evening
The wise can learn this in a morning;
even the foolish in ten days.
— 訓民正音, 1446
han · geul · gae · bal
∎