You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Kickoff: Persian parity in the terminal — root causes & where the finish line is
#1
Make Persian — and every Arabic-script language (Arabic, Urdu, Pashto, Sorani Kurdish) — first-class in the terminal, on par with English: reading, typing, letter joining, fonts, search, cursor, copy/paste.
Not a config tweak for one setup. The daily stack (WezTerm → Zellij → Neovim / Claude Code) breaks Persian at every layer, and the breakage shares one root cause, so it gets treated as one problem and fixed from the bottom up.
Root cause: the cell grid
A terminal is a grid of equal-width cells filled left-to-right; the application decides where everything goes. Persian violates three of that model's assumptions:
Terminal assumes
Persian reality
Symptom
Each cell is independent
Shaping — a letter's form depends on its neighbours
Disconnected letters
Text runs left-to-right
BiDi — visual order depends on the whole line (esp. mixed Persian / English / digits)
Reversed words, swapped numbers, flipped brackets
1 character = 1 cell
Width — «لا» is two chars, one glyph; ZWNJ and diacritics are zero-width
Cursor drifts from its real position
The deepest knot is ownership: nobody has settled whether the terminal or the application does RTL reordering. Both do it → double-reversed. Neither does → stays reversed. Egmont Koblinger's 2019 draft BiDi in Terminal Emulators addresses exactly this; VTE implements part of it, adoption is otherwise thin. Its current status is a research item.
The nine layers
Encoding & normalisation (Arabic ي/ك vs Persian ی/ک; three digit families)
Input (layout, ZWNJ typing, key delivery)
Character width ← foundation
Shaping ← foundation
BiDi ← foundation
Cursor, selection, copy
Fonts (very few Persian monospace fonts; fallback sizing)
Torture-test suite — reproducible mixed text (ZWNJ, «لا», digits, brackets, diacritics) that scores any terminal × app combination. The ruler every fix is measured against.
Fixes — font + terminal config first, then multiplexer / editor / apps (or upstream patches), finally pushing the ownership standard. Bottom-up, in dependency order.
Open decision — where's the finish line?
This sets how deep phase 1 goes and what gets built after:
Recommendation: do the map + torture suite regardless (they have standalone value), and decide upstream fixes vs. our own tooling only after we know where the upstream projects actually stand. Building our own layer before that is likely duplicate work — and until RTL ownership is settled, any fix just moves the bug around.
Discuss here; the resolved answer folds into a spec under docs/superpowers/specs/.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
Mission
Make Persian — and every Arabic-script language (Arabic, Urdu, Pashto, Sorani Kurdish) — first-class in the terminal, on par with English: reading, typing, letter joining, fonts, search, cursor, copy/paste.
Not a config tweak for one setup. The daily stack (WezTerm → Zellij → Neovim / Claude Code) breaks Persian at every layer, and the breakage shares one root cause, so it gets treated as one problem and fixed from the bottom up.
Root cause: the cell grid
A terminal is a grid of equal-width cells filled left-to-right; the application decides where everything goes. Persian violates three of that model's assumptions:
The deepest knot is ownership: nobody has settled whether the terminal or the application does RTL reordering. Both do it → double-reversed. Neither does → stays reversed. Egmont Koblinger's 2019 draft BiDi in Terminal Emulators addresses exactly this; VTE implements part of it, adoption is otherwise thin. Its current status is a research item.
The nine layers
Layers 3–5 come first — everything else rides on them.
Roadmap
Open decision — where's the finish line?
This sets how deep phase 1 goes and what gets built after:
Discuss here; the resolved answer folds into a spec under
docs/superpowers/specs/.All reactions