Proper Hebrew & Arabic (right-to-left) support for Claude Desktop on Windows.
Auto-detects RTL text and aligns direction where it should, without breaking English or code blocks.
Important
Update (July 2026): Claude now ships official RTL support — and the patch has been redesigned to build on top of it.
Anthropic added native RTL rendering to the Code tab, and the code for the regular Chat tab is already present (currently disabled, likely rolling out soon). This is genuinely good news, and hopefully this patch will become unnecessary altogether before long.
For now, though, the native logic still has real gaps: no per-cell table direction, no handling of mixed-language lines, mixed lists judged by their first item only, no math/LaTeX isolation, and nothing at all for user messages, the input box, or the rest of the UI. The broken window UI on RTL systems is also still not fixed natively — including the preview window it pushes off to the far left.
The patch has therefore been comprehensively reworked to merge with Claude's native RTL instead of fighting it: wherever native support exists it is left untouched, and the patch's detection engine fills in everything native still misses. When Anthropic enables native RTL in the Chat tab, the patch will step back there automatically — no update needed.
- Auto-detects RTL text in Claude's responses and the input box, and aligns the direction in real time, even while a reply is still streaming.
- Handles code, math formulas, and tables — code blocks and LaTeX (
$x^2$,$$…$$) stay left-to-right inside Hebrew, and Hebrew tables read right-to-left. - Fixes the broken window UI on RTL systems (see the note below).
- Backs up every file it touches, with one-click restore and automatic rollback if anything goes wrong.
- Stays applied across updates (optional), via a desktop shortcut or a background auto-updater.
Note
On a Windows system whose display language is set to Hebrew/Arabic, Claude Desktop's entire window UI flips to RTL on its own. This is a pre-existing bug, not caused by the patch. It pushes the title-bar window controls (minimize / maximize / close) on top of Claude's own settings and navigation buttons, hiding them, and sends the preview window to the far left. The patch fixes this by forcing the window chrome back to LTR, without affecting the direction of the chat text itself.
Open Windows PowerShell and run:
irm https://raw.githubusercontent.com/shraga100/claude-desktop-rtl-patch/main/install.ps1 | iexA UAC prompt will appear. Click Yes to grant administrator privileges, then choose 1. Install from the menu.
Tip
Prefer not to pipe to iex? Download patch.ps1 from the repo, right-click it, and choose Run with PowerShell.
| Requirement | Notes |
|---|---|
| Windows 10 / 11 | With Claude Desktop installed (download) |
| Node.js | npx must be on your PATH (nodejs.org), used to repack the app archive |
| Administrator | The installer elevates automatically via UAC |
Important
Windows only. On macOS, use soguy's Mac patch instead. (I haven't personally tested the Mac version, use at your own risk.)
When you run the script, you get an interactive menu:
| # | Option | What it does |
|---|---|---|
| 1 | Install Smart RTL Patch | Backs up the originals and injects RTL support |
| 2 | Restore Original State | Reverts every change the patch made |
| 3 | Create 'Quick Update' Shortcut | Adds a desktop shortcut for one-click re-patching |
| 4 | Enable Auto Re-Patch | Installs a background watcher that re-patches after each Claude update |
| 5 | Disable Auto Re-Patch | Removes that background watcher |
| 6 | Set a Custom Text Font | Renders all text — or only Hebrew, or only Arabic/Persian — in an installed font of your choice |
| 7 | Exit | Close the patcher |
Claude Desktop updates often, and each update overwrites the patch. Two optional features keep it effortless:
- Quick Update shortcut (option 3): a desktop shortcut named "Update Claude RTL". Double-click it to silently fetch and re-apply the latest patch.
- Auto-updater (option 4): a lightweight Windows scheduled task that detects when a new
claude.exeversion launches, re-applies the patch automatically, and shows a notification when it's done.
Prefer reading in a different typeface? The patch can render Claude's text in any font that is already installed on your machine, and you choose which text it applies to:
| Scope | What changes | Example fonts |
|---|---|---|
| All text | Every non-code glyph the font covers | Rubik, Open Sans |
| Hebrew only | Hebrew letters; Latin/Arabic untouched | Heebo, Rubik, Assistant |
| Arabic/Persian only (default) | Arabic-script letters; Latin/Hebrew untouched | Vazirmatn, Noto Naskh Arabic |
- Install the font (one time, no admin needed): download it, extract, select all the
.ttffiles, right-click → Install.- Persian/Arabic — Vazirmatn: the latest
vazirmatn-vXX.XXX.zipfrom the official releases page (the.ttffiles are underfonts/ttf). - Hebrew — Heebo / Rubik / Assistant: download from Google Fonts.
- Persian/Arabic — Vazirmatn: the latest
- Run the patcher (see Quick install above) and choose 6. Set a Custom Text Font from the menu.
- Type the font's family name — e.g.
VazirmatnorHeebo— and press Enter. If the name doesn't look installed, the patcher asks you to re-type it (or confirm using it anyway). - Pick the scope: 1 Arabic/Persian only, 2 Hebrew only, or 3 all text.
- Answer Y when asked "Apply the patch now?" (this closes Claude Desktop and re-applies the patch with the font enabled).
- Open Claude Desktop again. The chosen text now renders in your font; everything else is unchanged.
For scripting/automation, the same setting is available as parameters:
.\patch.ps1 -CustomFont "Vazirmatn" -CustomFontScope arabic-CustomFontScope accepts all, hebrew or arabic (default: arabic). The pre-scope alias -ArabicScriptFont still works.
- The patch never bundles or downloads fonts — it only references an installed one via CSS
local(). If the font isn't installed, nothing changes. - Scoped by
unicode-range: with the Hebrew or Arabic scope, no other script is touched. Code blocks, math and monospace stacks are never overridden in any scope — even in "all text" mode. - Glyphs the font doesn't include automatically fall back to Claude's regular fonts, so a Hebrew-only font in "all text" mode is harmless.
- Persistent: the choice is saved (in
ProgramData\ClaudeRtlPatch) and survives auto re-patches after Claude updates — set it once and forget it. - Disable: menu option 6 → type
none(or.\patch.ps1 -CustomFont none), then re-apply the patch. - Any family name of letters/digits/spaces/hyphens works, e.g.
"Noto Naskh Arabic".
Run the script and choose 2. Restore Original State. This restores all original files from backup and removes the self-signed certificate from your Windows certificate store. If you enabled the auto-updater, choose 5. Disable Auto Re-Patch as well.
"Node.js (npx) is required": Install Node.js from nodejs.org and reopen PowerShell.
Claude won't start after patching: Run the script again, choose 2 (Restore), then 1 (Install).
Claude updated and the patch broke: Run the "Update Claude RTL" shortcut, or use the auto-updater. To fix it manually, delete any .bak files in the Claude app directory and run the installer again.
Import-Module … The member AuditToString is already present: You ran the command in PowerShell 7 (pwsh), which has a known bug that breaks the patch. Use the built-in Windows PowerShell instead:
- Press Win + R, type
powershell, and press Enter. This opens the classic blue Windows PowerShell window (not the blackpwshone). - Paste the install command and run it.
🔍 How it works (technical)
Claude Desktop is a digitally signed Electron app, so editing its UI code breaks the integrity checks. The patch works around this in three phases, all atomic, with automatic rollback on failure:
Phase 1, ASAR injection. Claude's UI lives inside app.asar. The script extracts it with npx @electron/asar, prepends the RTL-detection payload to the renderer files (and forces the window UI to LTR in the main process), repacks the archive, and computes its new SHA-256 header hash. The payload's detection logic lives in src/rtl-core.js (pure, unit-tested) plus src/rtl-payload.js (DOM layer); tools/build-payload.ps1 assembles them into patch.ps1.
Phase 2, hash replacement in claude.exe. The original ASAR hash is stored as an ASCII string inside claude.exe. The script does a byte-level search-and-replace to update it. If the format ever changes, it falls back to disabling the Electron integrity fuse.
Phase 3, certificate swap in cowork-svc.exe. This service verifies claude.exe against Anthropic's embedded certificate. The script locates that certificate (by pattern-matching around the "Anthropic, PBC" string), replaces it in-place with a self-signed one (padded with 0x00 to keep the file size), re-signs both binaries, adds the new certificate to the Windows trusted root store, and then wipes the private key.
All original files are backed up as .bak next to the originals before anything changes.
🔐 Security & verification
install.ps1 verifies an RSA-4096 signature over patch.ps1 before running it. A compromised GitHub repo alone is not enough to ship malicious code; the attacker would also need the maintainer's offline private key.
Public-key fingerprint (SHA-256):
6e:f4:c2:a6:c2:42:34:a1:5f:e5:cd:e5:5d:a5:b0:3c:94:64:b4:56:7f:81:04:7c:83:9a:50:1c:7c:6f:07:c9
To double-check, recompute the fingerprint of the key embedded in install.ps1 and confirm it matches:
$content = Invoke-RestMethod "https://raw.githubusercontent.com/shraga100/claude-desktop-rtl-patch/main/install.ps1"
if ($content -match "ExpectedPubKey\s*=\s*'([A-Za-z0-9+/=]+)'") {
$bytes = [Convert]::FromBase64String($matches[1])
$hash = [System.Security.Cryptography.SHA256]::Create().ComputeHash($bytes)
([BitConverter]::ToString($hash)).Replace('-', ':').ToLower()
}A mismatch means the embedded key was swapped. Do not proceed, and report it as a security issue.
To audit a release without installing:
git clone https://github.com/shraga100/claude-desktop-rtl-patch
cd claude-desktop-rtl-patch
powershell -ExecutionPolicy Bypass -File tools\verify-signature.ps1Caution
This patch modifies Claude Desktop's binaries. It replaces Anthropic's code-signing certificate inside cowork-svc.exe with a self-signed one, adds that certificate to your Windows trusted root store, and bypasses the app's integrity verification.
By installing, you accept that:
- You use it at your own risk. The authors take no responsibility for system damage, data loss, or instability.
- Modifying the app may not align with Anthropic's Terms of Service. It's worth reviewing them and using your own judgment.
- You trust this repository. Running
irm | iexas Administrator executes code with full privileges, so always verify the source. - It's temporary. Claude updates overwrite the patched files, so re-run the installer (or use the auto-updater) after each update.
- It's a stopgap until Anthropic adds native RTL support. Please request that feature through official channels.
This project is open source under the MIT license. Contributions that improve RTL accuracy are very welcome, and PRs are open. 🙏
The math-formula isolation approach is credited to Claude-UniMath by Davidi Bellaire.