An open screen reader that keeps your JAWS muscle memory.
Okur ("reader" in Turkish) is an open-source screen reader written in Rust. It speaks, navigates and behaves like JAWS 2025: the same keystrokes, the same phrasing, the same reading of web pages and Windows applications. It is built by AI agents in a clean room: they never see JAWS's code, only what JAWS says when keys are pressed on a separate lab machine, and nothing they build counts until it matches recorded JAWS speech.
Why re-implement JAWS?
Blind people use the computer with the keyboard. With daily use, the keystrokes become instant: Insert+F7 for the list of links, H for the next heading, Insert+T for the window title. Nobody thinks about them, just as sighted people don't think about using the mouse.
Now suppose someone changed your mouse overnight, and it behaved differently from what you were used to. That is how changing screen readers feels after years, often decades, of daily use. The alternatives are good, but they use other keys, other phrasing and other ideas of where the cursor is. So people stay with what they know, and for many that is JAWS: a commercial product, three decades old, that runs only on Windows.
Okur keeps the muscle memory and replaces everything underneath:
- Open source, under the Apache License 2.0.
- Memory-safe and fast, written in Rust.
- Built to run on Windows and macOS as first-class platforms, with Linux as a second tier.
The keystrokes, the announcements and the navigation model are the interface people rely on, so they follow JAWS, checked step by step against recordings of it. Everything behind them is our own.
Where to go from here:
- If you use a screen reader and want to try Okur, go to For screen reader users.
- If you are a developer and want to contribute, go to For developers.
- If you are curious how AI agents can build a screen reader, read How AI agents build it further down.
Where it stands
Status (October 2026): a preview on Windows. Web pages in Chrome (the Virtual PC Cursor, the lists of links, headings and other elements, tables, selecting and copying), Microsoft Word's documents, dialog boxes and menus, Notepad, File Explorer, Windows Settings, Windows Terminal, the desktop, Alt+Tab and Windows search are read as JAWS reads them, and the Okur cursor reads any window's screen, pictures included, recognized with Windows' own OCR. It is not yet a replacement for your screen reader: Outlook and Excel are the largest part still missing (see Not yet). Those everyday gaps on Windows are being closed first; macOS, whose accessibility layer is in place, comes after them.
Okur speaks in its own name. Where JAWS names itself, Okur says Okur: the Okur key (JAWS's JAWS key), the Okur cursor, Okur Find. The words around the name stay the ones you know.
Every figure is tool output, rerun for this README at commit a4dc7bf6 (2026-10-29).
| Measure | Result | Command |
|---|---|---|
| Steps matching JAWS's speech history, word for word | 9212 of 9776 | okur-lab parity |
| Steps matching what JAWS sent its synthesizer, pitch included | 9116 of 9837 | okur-lab parity |
| Steps left out on purpose (accepted divergences, each a written decision) | 270 | okur-lab parity |
| Recorded JAWS scenarios, trials | 695, 2091 (2074 trials succeeded) | corpus/CORPUS_MANIFEST.json |
| Tests | 1531 passed, 0 failed (200 ignored: they need a live desktop, or assert a known gap) | cargo test --workspace |
| Virtual buffer invariant violations | 0 | okur-lab invariants |
unwrap, expect, panic! in the screen reader's own crates |
0, tests included | the commit gate and CI |
The 251 steps left out are where Okur differs from JAWS on purpose. Some are JAWS's own accidents, which Okur does not copy: in a data grid, JAWS adds "Column 65535, Row 65535", a place it failed to find. Others are JAWS's help texts, which are Freedom Scientific's writing; Okur says its help in its own words. Each one is listed, with the reason and who decided it, in accepted divergences.
For screen reader users
What works today (Windows)
- Web pages in browse mode with the Virtual PC Cursor:
- reading by character, word, line, sentence and paragraph; Home, End, PageUp and PageDown; Say All by line, sentence or paragraph (Say All Reads, in Okur Settings), where Right and Left skip and go back by that unit, PageUp and PageDown change the rate, and the cursor stays where you stopped it; skim reading (Ctrl+Insert+Down), each paragraph by its first line or its first sentence, the lines, sentences or paragraphs a text rule finds, or the lines with bold, italic, underlined, struck, raised or lowered text or text in a color, as chosen in Skim Reading (Ctrl+Shift+Insert+Down), whose Create Summary lists them, each a link to its place;
- deleted text said between "Deletion" and "end Deletion", and a raised or lowered number after a number between "superscript" or "subscript" and their end ("10 superscript 23");
- the Word List (Ctrl+Insert+W): the page's words, most used first, W and Shift+W to the next and prior line with the word chosen, and its Summary: the sentences holding the word, each a link to its place;
- quick navigation keys: headings and their levels, links, form fields, edits, buttons, check boxes, radio buttons, combo boxes, lists and list items, tables, graphics, regions, articles, divisions, separators, tabs and mail links; N past a run of links; the first and last heading or form field; V and U to the next visited and unvisited link; a temporary PlaceMarker (Ctrl+Windows+K) and saved ones to come back to with K and Shift+K, and 7 to 0 for the first four; Shift+Comma and Shift+Period to the start and end of a list, table or region; Equals to where the page says reading goes next (aria-flowto); S and D to the next element of the same or of another type (and Ctrl+Insert with Up, Right and Left); Jump to Line (J, and Shift+J back);
- the lists of links, headings and form fields (Insert+F7, Insert+F6, Insert+F5), Virtual HTML Features (Insert+F3), the element lists on Ctrl+Insert and a letter (buttons, edits, check boxes, radio buttons, combo boxes, graphics, lists, articles, paragraphs, block quotes, tables, divisions and tabs), and Document Regions (Insert+Ctrl+R);
- the PlaceMarker List (Ctrl+Shift+K): PlaceMarkers added with the line at the cursor as their name, kept for the page (or every page of its site) from one visit to the next, moved to, renamed and removed; custom labels (Insert+Ctrl+Tab): a name of your own for a field, button, link or graphic, read in its place on the site's pages;
- tables: Ctrl+Alt and the arrows, a whole row or column with Windows+Alt and the arrows, and the table layer (Insert+Space, then T);
- selecting with Shift and the arrows, Ctrl+A or F8, and copying with Ctrl+C;
- Okur Find (Ctrl+F or Insert+Ctrl+F, then F3 and Shift+F3), with its history kept per site, as JAWS Find keeps it;
- forms mode, turned on by Tab or the arrows (Auto Forms Mode), by Tab only (Semi-Auto) or with Enter (Manual), as Okur Settings chooses, and off with Escape or Numpad Plus; Space clicks the control at the cursor, as JAWS does;
- routing the cursors (Insert+Delete, Ctrl+Insert+Delete), a click with Numpad Slash, a link's address (Ctrl+Insert+F7), and the virtual cursor and the quick keys turned off and on (Insert+Z, Insert+N);
- a page that loads says its title and a summary of its regions, headings and links, then is read from the top, as JAWS does by default (Document and Web Pages Automatically Read When Loaded, in Okur Settings, turns that reading off);
- frames, and single-page apps changing route; Tab moves on from where you are reading.
- Web apps: autocompletes and command palettes read their suggestions ("Apple, 1 of 3"); regions with role "application" (such as VS Code's) get every key; GitHub's code view reads line by line; Google Docs (with its braille support turned on) reads as a document, Google Sheets by cell, and WhatsApp Web's chat list and messages as lists.
- Live regions announced as JAWS announces them. A streamed chat reply is read once, as
it arrives, not again from the start on every update;
--live-region-whole-textgives JAWS's own behavior. - Windows applications:
- dialog boxes: Say Window (Insert+B) with their group boxes, the default button (Insert+E), a control's hot key (Shift+Numpad 5), a property sheet's page on Ctrl+Tab;
- menus, the menu bar and context menus; lists, list views and their columns (Ctrl+Insert and a number), trees, combo boxes and data grids;
- Notepad and its dialogs, WordPad's and Paint's ribbons (Alt to the tabs, their places and the lower ribbon's groups, as JAWS reads them), File Explorer, Windows Settings, Windows Terminal, the desktop, the Alt+Tab switcher and Windows search;
- the Window List (Insert+F10), to switch to another window, and the system tray list (Insert+F11), to open or click an icon.
- Editing in text fields: characters, words, lines, sentences and paragraphs; selections said as JAWS says them, and Say Selected Text (Insert+Shift+Down); cut, paste and undo; a field of several lines read as a document; the window's top and bottom line (Insert+End, Insert+PageDown); Say Font; misspelled words marked; and text analysis on Insert+Tab, as JAWS does it (runs of spaces, stray or unspaced punctuation, a missing capital, brackets and quotes left open, each with its column).
- Microsoft Word: a document read as JAWS reads it: each line as Word lays it out, a heading with its level ("heading level 1 Library Hours"), a list entered and left ("Entering List", "exit list"), a table entered, its cells and left ("table 1, uniform Table, new cell"). In a table, JAWS's table keys (Ctrl+Alt+arrows, Home and End) go from cell to cell and say its column's or row's title, Tab moves and selects as Word does, and Ctrl+Alt+Numpad 5 and Insert+Tab say the cell and where it is. A table's column titles come from its first row, its row titles from its first column where the table marks it ("Row 1 no title" where not). Say All (Insert+Down) reads the document paragraph by paragraph and says what changes as it goes: a heading's level, "Entering List", "exit list", "table 1, uniform Table", "Row 2", "out of table". Insert+F6 lists the document's headings to move to; Say Font gives bold, italic and underline ("bolded", "italicized"), the size, colors, font, style, alignment, outline level and line spacing ("Line spacing: Double"); Ctrl+Alt+N, O and P say the view they switch to ("Draft View"), and Insert+T the title and the view; Read Mode is named with JAWS's warning, in Okur's name, and Insert+F1 there says how to leave it. A line marks its links ("See the link opening hours"). Form fields are read as controls named by the text before them ("Name: Edit", "Member: check box not checked", "Branch: Combo box, Central, 1 of 3"), by the arrows and by Tab in a protected form; Space toggles a check box, Alt+Down opens a drop-down's list. Its ribbon is read as JAWS reads it: Alt to its tabs ("Upper Ribbon, Ribbon, Home Tab"), Down into a tab's commands with their group's name, each command's ScreenTip where it says more than the name ("Grow Font Button, Increase Font Size"), toggle buttons and check boxes with their state ("Format Painter Button not checked"), the Quick Access Toolbar and the buttons beside the tabs with their hints ("Leaving menus, Can't Repeat Button Unavailable"), and Escape back ("Leaving ribbons, Edit"). The Styles gallery says each style with its place ("Heading 2, Button, 2 of 17"), and the Font and Font Size boxes' lists the font or size the arrows choose. Its own dialogs (Font, Paragraph, Find and Replace) read their fields as edit combos ("Font:, edit combo, Calibri"); back from Find and Replace, which stays open beside the document, the window is named again. Ctrl+Shift+E says whether Track Changes is on, and Ctrl+E, R, J and L the alignment they leave ("Centered", "Aligned left"). The Links List (Insert+F7) lists the document's hyperlinks, Move To Link moves to one and Activate Link follows it; List Fields (Insert+F5) lists its fields ("HYPERLINK opening hours", "FORMTEXT") and OK moves to one; with none, each says so in Word's words. The line spacing and the fields come from Word's own object model.
- The cursors: Numpad Minus to the Okur cursor at the mouse, Numpad Plus back to the PC cursor, Insert+Numpad Minus to bring the Okur cursor to the PC cursor, Insert+Numpad Plus the other way, Insert+R for where the Okur cursor may go, and Alt+Delete for where the active cursor is. The Okur cursor reads a page as its screen shows it, a dialog's rows, and any other window by its screen rows, where UI Automation places its text. In WPF, UWP and WinUI windows it is the Okur scan cursor, one element a line with its role and state, as JAWS's Scan Cursor reads them. It moves by line, word and character, with Page Up and Page Down to the window's top and bottom, and the mouse goes with it.
- The screen's pictures, recognized (Convenient OCR): Insert+Space, O, then W, S or C recognizes the window, the screen or the focused control with Windows' own OCR. Okur says "OCR started using Microsoft OCR.", "finished." and "Okur Cursor". The recognized words then stand among the window's lines where they are drawn, Numpad Slash clicks them, and they go when the PC cursor comes back. B keeps recognizing the window as it changes (Background OCR), and Q stops it.
- Pictures and scanned PDFs, recognized: in File Explorer, Insert+Space, O, F (or Enter) reads the selected picture or PDF, page by page, into the Results Viewer, titled by the file; nothing selected, or a file that is neither, gets JAWS's message box. ? lists the layer's keys.
- The mouse: Numpad Slash and Numpad Star click the left and right buttons, with Ctrl, Shift or Alt for a click with that key held; Insert+Numpad Slash and Star hold a button down and let it go; Ctrl+Insert+Numpad Slash drags and drops; Alt+Shift and the arrows move the mouse a little. Mouse echo says what the mouse rests on, by character, word, line or paragraph, set in Okur Settings or with Insert+Space, E (O turns it on and off, C, W, L and P choose the unit).
- Information keys: the time and date (Insert+F12), the settings in use (Insert+Q), the application's version (Ctrl+Insert+V), and the colors of a page's text or a text field by the names JAWS gives them (Insert+5: "blue2 on white").
- Help in Okur's own words: Insert+F1 for the control or the page element you are on, Insert+H for Okur's keys there, Insert+W for Windows' keys, and Keyboard Help (Insert+1), where each key is named and described instead of run.
- The classic console (Command Prompt, PowerShell): a command's output is read as the console writes it (Screen Echo, Insert+S, as JAWS reads it); Windows Terminal's not yet.
- The Virtual Viewer (Insert+Alt+W) on screen as JAWS shows it, for windows, controls and consoles, Windows Terminal included; the Speech History (Insert+Space, then H; Ctrl+H copies it and Shift+H clears it).
- The clipboard keys: Windows+Insert+X says the clipboard's text, Insert+Space, then C shows it in a viewer, and Insert+Windows+C adds the selection to it; Ctrl+C or Ctrl+X after that asks before overwriting it, as JAWS does.
- Windows' notifications (toasts), and applications' own (as Teams sends them), said as they come, whatever is in front; Insert+Space, then Shift+N says the last one again, Insert+Space, then Ctrl+N stops and starts saying toasts, and Insert+Space, then N opens the Notification History, each listed with the program it came from, with the rules that mute a notification, say a shorter text or play a sound in its place, or leave it out of the history (Create Rule..., Manage Rules...).
- Okur's own dialogs are real Windows dialogs: the lists above, Okur Find and the Window List, with the same controls and labels as JAWS's, and Okur's settings, below.
- Settings, as JAWS's:
- Settings Center (Insert+6) and Quick Settings (Insert+V) are trees of JAWS's groups with a search box (Ctrl+E); what a search finds is a list in the tree's place, each setting with its value and its group ("Typing Echo Off, User"). Space changes a setting and says its new value. F6 goes to the setting's control in the pane beside the tree ("User Page"). Changes are kept for all applications, the application in front or the page's site. Settings Center asks before Cancel drops a change; Quick Settings can keep one only until Okur exits or the focus moves (Shift+F10). Their last group, Last Changed Settings, holds the latest changes from one run to the next (Shift+F10: Remove, Remove All).
- Okur's window (Insert+J) has JAWS's menus: Options for Basics, Voices, Manage Application Settings (an application's settings turned off or removed) and Restore to Factory Settings; Utilities for Settings Center and the Notification History; Help for the Startup Wizard, the most common settings a page at a time, which also opens the first time Okur starts.
- Speech: punctuation levels and symbol names as JAWS has them (Insert+Shift+2); typing echo by characters, words, both or none (Insert+2); a reading key pressed twice quickly spells, with capitals at a higher pitch; the rate on the fly (Ctrl+Alt+PageUp and PageDown); Speech On Demand (Insert+Space, then S), where only the reading commands speak, and muted speech (Insert+Space, then Shift+S), as JAWS has them, what is not spoken still written to the Speech History.
- Settings declared in one table, so the settings dialog, the command line (
okur run --set <setting>=<value>) and the import of JAWS's own settings files offer the same values. Among them, as JAWS has them: Caps Indicate, mixed case, numbers read as digits, dollar amounts left to the voice, same page links, graphics shown or not, how a heading is said, and which parts of a control verbosity says (its type, its state, its position, its hints). - Flexible Web (Insert+Space, then X): JAWS's wizard, page for page, hides an element of a page (a region, a heading, a list) found by its kind, its text, its id or its place; Undo takes it back. Customizations are saved as named rules for the page, its site or every site, and hold whenever such a page loads; leaving a page with unsaved ones asks first. View or Change Where Rules are Applied turns each rule on or off for an area and deletes rules. Starting the reading at an element, and renaming a rule, are not done yet.
- Verbosity levels: Beginner, Intermediate and Advanced, as JAWS has them. Above Beginner Okur says the short messages JAWS says there ("Last row", "3 columns and 3 rows", "virtual PC", "Copied", "Appended", "Off", "No more headings at level2 in section", the page's summary without "Page has"); at Advanced it leaves out what JAWS leaves out, such as a list's positions, a field's description, a group box's name and JAWS's own messages ("Copied", "Screen updated"). Recorded at both levels on the web, in desktop dialogs, with the Okur cursor, in Notepad and in the Notification History. Each level's spoken items and message length are chosen in Okur Settings' Verbosity Levels, as JAWS's Settings Center customizes a l
