dsh-rtl
Right-to-left, right-aligned text for DeepSeek Harness chat — built for Persian and Arabic conversations that the default LTR transcript renders badly.
فارسی · English
A small DSH profile bundle: a Host half that does nothing, plus a Client module that registers one stylesheet and removes it on dispose. No fork of the harness, no patched artifacts, no DOM rewriting.
What it changes
| Surface | Before | After |
|---|---|---|
| Assistant messages (Markdown) | LTR, left-aligned | RTL, right-aligned |
| User message bubble | LTR, left-aligned | RTL, right-aligned |
| Lists inside messages | marker on the left, indent on the left | marker on the right, mirrored indent |
| Code blocks, inline code, KaTeX | LTR | LTR, and unicode-bidi: isolate so their punctuation cannot reorder the sentence |
| Composer | LTR | RTL while typing |
The sidebar, tab strip, toolbars, and Settings keep their own direction; the stylesheet is scoped to the transcript and the composer.
Install
The bundle is installed the same way as any other DSH plugin — no build step.
From this repository
- Plugins in the left sidebar → Add plugin.
- Paste the repository address:
https://github.com/hami-ashraafi/dsh-rtl - Install, then switch Right-to-left Chat on.
From a local checkout
- Plugins → Add plugin.
- Paste the absolute path of this directory.
- Install, then switch Right-to-left Chat on.
Restart DeepSeek Harness if the manager reports restart-required.
Uninstall
Plugins → Right-to-left Chat → Remove.
How it works
package.json declares three things the Harness reads without running any code:
"dsh": {
"bundle": { "patch": "./cordis.patch.yml" },
"client": { "platform": "web", "immediately": true, "inject": ["@deepseek-ai/dsh-client-ui-chat"] }
}
dsh.bundle.patchmakes this package a bundle:cordis.patch.ymlinserts thedsh-rtlrow into the profile composition.dsh.clientmakes the Client module load with the Web UI at boot.
client.js is a lazy factory registered into window.__ModuleLoader__.load — the same
contract every shipped DSH client plugin uses:
window.__ModuleLoader__.load({
id: '@local/dsh-rtl',
factory(require) {
return {
apply(ctx) {
const style = document.createElement('style');
style.setAttribute('data-dsh-rtl', '');
style.textContent = CSS;
document.head.append(style);
ctx.effect(() => () => style.remove());
},
};
},
});
Selectors
DSH class names are CSS-module hashes, so the stylesheet matches the stable parts instead:
the data-slot="conversation.chat.flow" transcript anchor, the data-chat-turn rows, the
data-conversation-scroll container, class names that contain markdown or bubble, and
[data-composer-seat] for the editor. If a future Harness release renames one of them, the
fix is a one-line selector change in client.js.
Compatibility
Written against DSH 0.2.1-rc.3 (Desktop and Web). It touches only presentation, so a
release that changes no chat DOM keeps working.
Connecting it to the Harness project
The harness repository ships no RTL or bidi handling of its own — this repository exists to fill that gap. It follows the project's documented path for community plugins:
- the repository carries the
dsh-plugintopic, which the Harness README names as the discoverability mechanism; - it is announced in DeepSeek Harness Discussions #11672, which the project uses instead of issues.
The upstream repository has issues and pull requests disabled, so this is distributed as a
standalone bundle rather than a patch to the harness sources. The same plugin is also staged
in the upstream package shape under upstream/ — packages/client/ui-rtl
with the repository's TypeScript, tsconfig, and ?inline CSS conventions — ready to apply if
that repository starts accepting contributions.
License
MIT © 2026 hami masoud
فارسی: توضیح کامل فارسی — نصب، حذف، سازگاری و عیبیابی — در README.fa.md است.
No comments yet. Be the first to write one.