Wing Font

Wing Font

Show pronunciation annotations right above Chinese characters in plain text — works in Word, Pages, Canva, Adobe, and browsers, across every OS, with no HTML markup or plugins. Generate one for Jyutping, Pinyin, Tâi-lô, or your own custom scheme.
各有各唱自己歌
各找自我
Plain UTF-8 text above, rendered by Wing Font itself.

Works everywhere you do

Standard TTF and WOFF files. Drop them anywhere a custom font goes — no plug-ins, no special integration. Even on e-readers.

Canva
Affinity
Adobe
Microsoft Word
Pages
Keynote
Chrome
Firefox
Safari
Windows
macOS
Linux
Kindle
Kobo
Boox

✓ And it's 100% free, no signup.

Using it on your platform

Pick the app or operating system you use most and see what to do.

  1. Open a design and click any text element.
  2. In the font picker, choose “Upload a font” and select the .ttf you downloaded.
  3. The font is ready to use immediately — no extra settings.

Free accounts may need a Canva Pro upgrade to upload custom fonts.

What it is

Wing Font is a font-generation tool. Give it two TTFs (one for the base characters, one for the annotation glyphs) plus a CSV mapping characters to annotations, and it produces a new OpenType font whose glyphs have those annotations baked in. The output works anywhere a custom font can be loaded — websites, Word, Telegram, email, you name it.

How it works

The whole pipeline runs in your browser via Pyodide (WebAssembly). No Python install, no uploads to a server, no fees, no data leaves your machine.

Features

Annotations in plain text

Romanization is baked into the glyph itself — no HTML <ruby> markup needed. Copy the text anywhere and the annotations travel with it.

Context-aware

Polyphonic characters auto-switch based on the surrounding word — e.g. 銀行 vs 行人 — via an OpenType Chain Contextual Substitution under the `ccmp` feature.

Manual variant picker

1-indexed digit suffix to override the automatic reading: - `字0` → bare kanji, no annotation on top - `字1` → 1st reading (= default; same as typing `字` alone) - `字2` → 2nd reading - `字10` → 10th reading (use the full decimal for readings beyond the 9th) **In Microsoft Word**: half-width ASCII digits get split into a separate shaping run by DirectWrite, so the ligature can't fire across the boundary — use **fullwidth digits** `字0`, `字1`, `字2` (or the IME-friendly `字丅零`, `字丅一`, `字丅二`) instead. Fullwidth digits are East-Asian-Width=F, which keeps them in the surrounding CJK run, and the override fires correctly.

Fully local

Your fonts and mapping never leave your browser. Everything runs client-side.