dsh-persian-rtl
Persian (Farsi) RTL fix for DeepSeek Harness — until RTL is handled officially.
What it does
Fully automatic per-paragraph text direction (unicode-bidi: plaintext): every paragraph follows its own first strong character — Persian paragraphs render right-to-left, English ones stay left-to-right. No buttons, no settings.
Covered surfaces:
- Assistant answers — including while streaming
- User + steering message bubbles — including composer submit echoes
- Thinking / reasoning cells (
turn-processmembers and inline reasoning, reasoning flow nodes) - Tool-call / tool-result cells — any
data-toolrow (includingask_user_questionrendered inside the chat flow) - Question boxes + plan-review cards (composer-takeover cards)
Intelligent mixed-language detection — When a Persian sentence begins with an English word, technical term, or inline code (e.g. React یک کتابخانه است or 1. Node.js را نصب کنید), standard browser first-strong-character heuristics mistakenly classify it as LTR. The plugin dynamically analyzes character composition and enforces RTL base direction with full streaming support.
Latin runs stay intact — code, pre, kbd, and links are isolated LTR, so English words and numbers keep their order inside Persian text instead of jumping around.
Logical geometry fixed — lists, blockquotes, and task checkboxes use inline-start padding/borders, so RTL paragraphs get correctly-sided bullets, quote bars, and gaps.
The composer, sidebar, and settings are left alone, and no shipped renderer is replaced — the plugin only adds CSS.
Install
Pick whichever is easiest — no local clone needed in any of them.
Web UI: open Plugins in the sidebar → install → enter the spec:
github:ireza7/dsh-persian-rtl
Agent tool (Creator mode session):
install_bundle with target = github:ireza7/dsh-persian-rtl
CLI:
dsh plugin --profile web add github:ireza7/dsh-persian-rtl
The bundle takes effect immediately in live profiles (no restart).
Alternatives:
- Full repo URL:
https://github.com/ireza7/dsh-persian-rtl - From a local clone:
install_bundle with target = /path/to/dsh-persian-rtl - From npm (if published):
install_bundle with target = dsh-persian-rtl
To remove it later: remove_bundle with the bundle name.
How it works
- A
<style>element is mounted viactx.effectproviding per-paragraph direction and logical geometry fixes. - A high-performance, batched
MutationObserver(requestAnimationFrame) monitors chat surfaces in real time to identify and correct mixed paragraphs starting with Latin runs, ensuring seamless streaming support without UI flicker. - Clean lifecycle management: unmounting clears the observer, timers, and removes all applied attributes leaving zero residue.
License
MIT
No comments yet. Be the first to write one.