Skip to content
dsh.fish
Bundle

dsh-persian-rtl

Persian (Farsi) RTL fix for DeepSeek Harness: automatic per-paragraph direction and mixed-language detection (Persian text starting with English words), thinking cells, tool cells, user bubbles and question boxes.

Source
ireza7
stars
1 stars
License
MIT
Updated
Updated yesterday

Readme

# dsh-persian-rtl

Persian (Farsi) RTL fix for [DeepSeek Harness](https://github.com/deepseek-ai/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-process` members and inline reasoning, reasoning flow nodes)
- **Tool-call / tool-result cells** — any `data-tool` row (including `ask_user_question` rendered 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:**

```bash
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 via `ctx.effect` providing 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

Install

dsh plugin --profile web add github:ireza7/dsh-persian-rtl

Profile: web

  • This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.
Source