The RTL systems implementer's Swiss army knife.

A spec document in Hebrew, a forty-thousand-row migration file checked before it breaks, a sketch for a client meeting, an architecture diagram, the project's config files, and a coding agent — in one window. And right-to-left that finally reads correctly, tables included.

Windows 10 & 11 No account No telemetry Hebrew & English interface Beta — below 1.0.0
Same Markdown, rendered by
The file on disk
| מוצר | מחיר | קטגוריה |
| --- | --- | --- |
| מקלדת אלחוטית | 249 | ציוד היקפי |
| מסך רחב | 1,190 | מסכים |
| لوحة مفاتيح لاسلكية | 249 | ملحقات |
| شاشة عريضة | 1,190 | شاشات |
What you see
מוצרמחירקטגוריה
מקלדת אלחוטית249ציוד היקפי
מסך רחב1,190מסכים
لوحة مفاتيح لاسلكية249ملحقات
شاشة عريضة1,190شاشات
The first column is on the left. A Hebrew or Arabic reader starts at קטגוריה — the last column — and reads the table backwards. Same failure in both scripts.
Nothing is swapped between these two views. The rows are in the order the file holds them, and the only thing that changes is how direction is decided.
What it replaces

An implementer's working day, and what opens for it.

None of these jobs needs a large application. They need seven small ones, and every switch between them is a file saved in somebody else's format.

The jobWhat opens todayIn Ktav
A spec document in Hebrew Word — and the tables come out backwards Formatted view, tables with real cells
A 40,000-row migration file Excel — which mangles encodings and truncates long ids A virtualised grid and an inspector that names what is broken
A payload that came back from an API Notepad++ and your own eyes Structure view, validation, and comparison against a reference
A screen sketch in a client meeting draw.io, or a whiteboard photographed into WhatsApp A drawing board that saves an ordinary SVG
An architecture diagram for the docs Visio, and a picture nobody can edit afterwards Mermaid from inside the document, exported to SVG or PNG
Glancing at .env or nginx.conf A whole IDE, opened for one line Opens immediately, as text, saved byte for byte
A coding agent working on the folder A separate terminal window beside everything else A panel next to the document, scoped to the open folder
The capabilities, in detail

Eight things, and why each one was built this way.

01 Text direction

Direction is resolved per block, not per document

Every paragraph, heading, list item and every individual table cell works out its own direction from the first strong character it contains. That is the difference between a table whose first column is on the right and a table that reads backwards.

  • Hebrew, Arabic, Syriac, Thaana, NKo, Samaritan and Mandaic
  • Not one physical CSS property in the stylesheets — the layout mirrors itself
  • Shortcuts match the physical key, so Ctrl+B survives a Hebrew keyboard layout
  • Interface language and document direction are independent axes
The part that is easy to miss: a great deal of real data contains no strong character at all. 249 ₪ is digits and a currency sign — both neutral — so the cell takes its direction from whatever surrounds it. That is precisely why the decision belongs to the cell and not to the table.
One document in Hebrew, English and Arabic, split between source and rendered result
One document, three scripts. Every paragraph, list item and cell resolved its own direction — and the table came out with the product on the right.Click to enlarge
02 Documents

Markdown in three views, and the file comes back as it was

Ctrl+1 formatted view, Ctrl+2 source, Ctrl+3 split with synchronised scrolling. Ctrl+E cycles between them.

  • Paste from Word, Google Docs, Excel and web pages becomes clean Markdown
  • YAML front matter is preserved; raw HTML passes through untouched
  • No linkify and no typographer — your text is not rewritten behind your back
  • Search ignores niqqud: שלום finds שָׁלוֹם
  • A pasted screenshot is saved to images/ beside the file, relatively linked
  • Tables are written with pipes aligned to real display width
Ktav with an English interface, editing a Hebrew document in split view with an agent panel
An English interface editing a Hebrew and Arabic document. Interface language and document direction are separate axes — neither one disturbs the other.Click to enlarge
03 CSV — the migration inspector

The file opens in a grid, and its defects sit underneath it

A 50,000-row file opens as fast as one with 30, because only the visible rows are drawn. Beneath the grid is a findings list; clicking a finding jumps to its cell.

  • Truncated row — almost always a separator that was never escaped
  • Duplicate key — and only in a column that behaves like an identifier
  • Hidden whitespace — the cause of half of all "the value wasn't found" reports
  • Unexpected blank and unexpected type in a column where everything else is filled
  • Mojibake — text that has been through an encoding twice
  • Empty column — reported once per column, not once per row

The dialect the file arrived in — separator, line ending, quoting — is kept exactly. A file opened and saved without editing comes back byte for byte. Two header rows are detected automatically, because an export often carries a Hebrew caption above the technical field names.

A CSV open in Ktav's grid with four findings listed below it
A hundred rows, fourteen columns, four findings: unexpected blank, duplicate key, unexpected type and hidden whitespace. The interface is English; the data is Hebrew and Arabic and still reads from the right.Click to enlarge
04 JSON

What actually arrived in the payload

A file of fifteen thousand records reduces to six lines, and each one says what the field is called, which types appeared in it, and how often it was really there. Array members collapse together — without that, the "structure" of a large file is a second copy of it.

  • A syntax error with line and column — reported alone, because everything after it is derived from it
  • Duplicate key: the file parsed, but one value was silently overwritten
  • A number losing precision — an identifier too long for JavaScript
  • Comparison against a schema or a sample, and it works out which by itself
  • "Not always here" — a field present in every reference record and in 787 of 792 here
Both sides reduce to structure before the comparison, so the same payload pretty-printed and minified produces zero findings. That is the property that makes the rest of it trustworthy.
A JSON file beside its structure view, compared against a reference file
The structure shows products[].price arriving as both a number and a string — three records against one — while compared with catalog-v1.json.Click to enlarge
05 Drawing board

A sketch for a spec meeting that stays an ordinary image file

There is a moment in a requirements conversation that a diagram does not cover: where the button sits, what the screen looks like. An .svg file opens as an infinite surface with shapes, arrows, text and freehand.

The file stays an ordinary image — that is the whole design. Exactly the same bytes are the picture the client opens in a browser or in Word, the file that goes into the spec document by relative path, and the source you keep editing at the next meeting. There is no format here that only Ktav can open.

  • Ctrl+2 shows the SVG as text, like any other file
  • An SVG somebody else drew opens as an empty board, not as an error
  • Fonts are packaged with the application — the board works on a plane
  • Eight megabytes load only when a drawing opens; the main chunk grew by 248KB
Hebrew in handwriting. Excalidraw's hand-drawn face carries no Hebrew — an issue open with them since 2022 — so a Hebrew sentence came out printed beside drawn English. Ktav bundles Gveret Levin, a Hebrew handwriting face under the SIL Open Font License, so a Hebrew label is in the same hand as the one next to it.
An ERP product tree drawn on the board, beside the SVG source it loaded from
A sketch of an ERP product tree — and beside it, that same file as SVG text. Note the Hebrew: handwritten, like the English next to it.Click to enlarge
06 Diagrams

Mermaid from inside the document, without leaving it

A ```mermaid block inside a document is drawn as a diagram and stays an ordinary code block — the text is the document, the picture is a view of it. The file still opens as standard Markdown in any other editor, and GitHub and Notion will draw it too.

  • The code opens above the picture when the cursor enters, redrawing as you type
  • A diagram that will not parse shows the line it failed on instead of collapsing the editor
  • An .mmd file opens as a document of its own, in split view
  • Export to SVG, or PNG at 2×. No JPG, deliberately
A Mermaid diagram of a CRM customer journey beside its source
A CRM customer journey: identity resolution across sources, labelled in Hebrew, English and Arabic, drawn from the source beside it.Click to enlarge
07 Coding agent

The agent sits in the window, not in another window

The top toolbar carries a mark for each agent — Claude Code, Codex, Grok, and after them a quieter >_ for a plain shell. Clicking one starts it in the open folder, always and only there, and opens the panel. It is the real CLI: plan mode, / commands, permission prompts, MCP and subagents all work, because none of it was rebuilt here.

  • The card says which model is answering and at what effort, read from the tail of the transcript
  • An agent that is not installed is dimmed rather than missing
  • A Sessions tab lists what ran in this folder — read-only, never written to
  • Hebrew renders correctly in the terminal, which was an investigation of its own
A document with unsaved edits is never overwritten. An agent that touches the open file refreshes it immediately — except in that one case, where a line appears with both choices and the reader decides. There is a test that fails if the condition is removed.
Ktav's agent panel with tabs for Claude Code and Codex, beside a CSV grid
Two agents in the same window, each in its own tab, running on the open folder — beside the CSV file they are working on. The session identifier is redacted.Click to enlarge
08 Project files

The bytes decide what opens, not a list of extensions

.env, .ts, nginx.conf, a file with no extension at all. Formats that announce themselves in their first bytes are turned away by signature, and what is left gets measured: more than one per cent control bytes in the first 8KB, and it is not text.

  • Measured across 4,195 files in four real project folders
  • Zero binaries admitted, zero source files refused
  • Only two directories stay hidden: node_modules and .git
  • .claude, .github and .vscode are shown
Ktav's sidebar showing a project folder tree beside a document in split view
The project tree in the sidebar, config and build files sitting beside the documents — with the document open in split view next to it.Click to enlarge
Download

Free in every version below 1.0.0.

Beta means every version numbered below 1.0.0, and it is entirely free — every capability, no account, no time limit and no locked features. A paid version is planned from 1.0.0 onwards; what you installed during the beta keeps working.

Download for WindowsLatest release · free below 1.0.0
Windows 10 / 11 · 64-bit ~130 MB installed Installs per-user, no admin rights

Windows will warn you on first run

The installer is not code-signed yet, so SmartScreen shows a blue warning saying the publisher is unrecognised. Click More info, then Run anyway. We would rather you read that here than meet it unannounced — a certificate is on the list.

It sends nothing anywhere

No telemetry, no analytics, no automatic update check, no account. The only addresses in the program are menu items that hand a URL to your own browser. The one exception is the obvious one: the agent panel runs a coding-agent CLI you installed yourself, and it talks to its own provider.