Repository navigation
Releases
Keytide v0.1.9
Changed
- A typo fix must be a slip of the finger. The spell checker's suggestion used to be taken whenever it was one edit away, so a far-off letter brought in an unrelated word. Now a replaced letter must sit on a key next to the right one (
приыет-> "привет",hwllo-> "hello"), and an extra letter must be a neighbouring or the same key as the letter before or after it (hrello,helllo). A missed letter or two swapped letters (teh-> "the") are fixed as before.преветandмалокоstay as typed. - Key positions come from the enabled layouts themselves (the key each layout types a letter with), so Dvorak and both Russian layouts use their own neighbours. The keyboard in use is read for each word: on ISO keyboards "ё" of Apple Russian sits next to "э", and an external ANSI keyboard on an ISO MacBook is handled too. Without both an English and a Russian layout there are no typo fixes (Keytide then already shows "Add the Russian and English layouts in macOS" and dims its icon).
- Only the spell checker's own correction is used. When it had none, its first guess was taken, and that guess was not reliable:
преветbecame "пресет", and the same typo got a different word from one call to the next. Its other guesses are not tried either: they hold more wrong words that are still neighbouring-key slips. - All-caps words of up to four letters are acronyms and are no longer fixed as typos (
VRAM,UDP,ПКМ). A longer word in capitals is fixed as before (ПРИЫЕТ-> "ПРИВЕТ"). - Measured with the real dictionaries against 0.1.8, both Russian layouts. On 327,082 words of correct text: 689 false typo fixes instead of 4,319, and 0.1.8 made every one of them too. On synthetic slips onto neighbouring keys in 1,500 words per language: 6,044 fixes in English (6,078 before) and 5,649 in Russian (5,701 before), with 385 wrong words instead of 1,139 and 317 instead of 945. Layout corrections are unchanged, word for word.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.8
Added
- Reading a word through the clipboard where a field shows its caret but hides its text from accessibility (apps that draw text themselves). Only for a word started after an edit (caret moved, Backspace, focus change), and only when the focused element reports an empty caret (
AXSelectedTextRange) without a text role: no keys go to a focus that shows no caret, such as a game, an AX error or a timeout. Where the probe sends no key, the typed word is corrected from the keys as before. Not where macOS asks before or denies clipboard access (NSPasteboard.accessBehavior). Keytide first reads every clipboard item and type in full (refused for more than 16 items or 8 MB, or data its owner does not provide, so the clipboard is never put back incomplete; that clipboard is not read again until it changes), checks once the user's keys are held that neither the clipboard nor the caret moved, writes a host-only marker, selects up to the word's length plus 32 characters with Shift+Left, sends Command+C with the key the current layout uses for it (Dvorak moves it), reads the text, puts the clipboard back at once and collapses the selection with Right; keys pressed meanwhile are held and replayed. The caret must be back where it was, and the copy must end with the typed space, or nothing is corrected. The marker and the restored contents carryorg.nspasteboard.TransientType, so history apps that honor it skip them; the copied text itself is written by the app and stayed on the clipboard for 4 to 23 ms in our measurements, so a clipboard history app may still catch it. A clipboard the app cleared but has not written yet is waited for (it holds nothing to leak); a copy that arrives after the 0.4 s wait is put back within 1.5 s unless the user presses a key or clicks, and macOS itself refuses a write by an app whose clear came before the restore. Never done over a copy markedorg.nspasteboard.ConcealedType(password managers, whose clear timer would otherwise stop), and a concealed copy made during the probe is kept. An app that copies nothing is not probed again while it runs. Settings > General > "Read words through the clipboard where an app hides its text", on by default (owner decision: Keytide sends nothing and keeps data only as long as the job needs it); a malformed value in an imported profile turns it off. - The event tap refuses a second holder of its input gate instead of stopping the app.
- A selected word for manual conversion is read through
AXSelectedTextwhen the field cannot give its range.
Changed
- A field that does not answer for a range of its text (
AXStringForRange) is read throughAXValuewhen it holds at most 4,000 characters (measured first withAXNumberOfCharacters); the needed part is cut out and nothing is kept or logged. Such fields used to fall back to the blind keystroke path. Not after a timeout, which would wait twice. - When the system-wide query for the focused element fails, the app holding keyboard focus (
AXFocusedApplication) is asked for its focused element instead of giving up on the field. Not the frontmost app: a hotkey panel takes the keys without becoming frontmost. - Both fallbacks were checked live by forcing them on in TextEdit (the field transaction) and Script Editor (the keystroke path): the same results as the normal path.
- The clipboard read was checked live in a test window that draws its text itself: with only its caret exposed,
ghbdtnbecame "привет" andb["их", and the clipboard was byte-identical afterwards (the same with an app that writes its copy 30 ms after clearing); with no caret no key was sent and the word was corrected from the keys as in 0.1.7; an app that ignores Command+C was probed once and then left to the keys. Script Editor and TextEdit, whose fields answer, never used it.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.7
Fixed
- 0.1.6 turned English one-letter tokens before a full stop or comma into Russian words (
p.became "зю",T."Ею",c,"сб"). A one-letter word now converts only when the keys around it are letters in the other layout (b[is "их",e;is "уж",,sis "бы"), not with.,,or a Shift character after it. - A quote or bracket typed as such in the current layout stays around the corrected word:
"дуеэыbecomes"let's, not@let's, andеуф"becomestea"(#2). A key that is punctuation only in the other layout still converts (&is the Apple Russian full stop). A known word after a quote is not converted:"нуstays. ghbdtn,andghbdtn.typed with the US comma and full stop keys become "привет," and "привет." again: when the whole run converts to no word, the word alone is converted and its punctuation kept, as before 0.1.6.- A letter that comes from a punctuation key must fit the case of the word:
rhs:no longer becomes "крыЖ",LF.not "ДАю". CamelCase from letter keys (шЗрщту-> "iPhone") converts as before. - Typo fixes only for a plain word with sentence punctuation after it, as before 0.1.6: not in code spans, quotes or markup (
ECC**stays). - A run opening with a backtick, a slash or a tilde, or closing with a backtick, is a code span, a command or a path and is left as typed (
`rg`,/gh,~/ws). With Russian - PC on an ANSI keyboard, where "ё" is on the backtick key, words starting or ending with "ё" are not corrected there. - Markdown
**after a word stays**in both directions (Apple Russian has no*key; its Shift+8 is;). - Words with punctuation keys inside are judged by the bundled lexicon, not by the macOS checker, which split
k.,kinto two known "k": "люблю" (and "бы", "жук") typed in the wrong layout are now corrected, although the 0.1.6 notes already said so. A known part of three or more letters still keeps the run as typed ([the,,then). - Undo of a field correction restores a word with the editor's smart quotes.
- macOS autocorrect rewriting a word inside a field correction (TextEdit) no longer stops Keytide: a same-length rewrite, with the selection still where Keytide left it, puts the caret and the layout back and counts as a skipped word. Text that moved meanwhile still stops it.
Changed
- A character the target layout has no key for (a kept
*after a Russian word) is typed on the other layout's key, its text exact. - The decision logic moved to
Decision.swiftandEdges.swift, the rollback check toRollback.swift(covered by tests), the field transaction's readbacks toFocusedText+Readback.swift. - Measured against 0.1.5 on the same 305,000 tokens of Russian and English notes, docs and code, with the bundled lexicon and the macOS checker: 7 more false layout corrections (abbreviations next to quotes or punctuation, such as
"ИИ"orСПб,), 2 fewer false typo fixes; of the same words typed in the wrong layout 75.6% come out exactly right against 59.0%, and wrong outputs fall from 915 to 474 (Apple Russian) and from 5,036 to 503 (Russian - PC).
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.6
Fixed
- Words with letters on punctuation keys are corrected: "Юлить" typed as
>kbnm, "Эхом" as"[jv(#1). - Punctuation keys at the end of a word are converted with it:
yj;becomes "нож", not "но;", andgj.becomes "пою", not "по.". - Sentence punctuation follows the layout: "привет." typed with the other layout's keys (
ghbdtn&with Apple Russian,ghbdtn/with Russian - PC) comes out as "привет.", andруддщюas "hello.". - Smart quotes that Notes and TextEdit put in place of the
'and"keys no longer stop the correction of a word starting with э or Э.
Changed
- The keystroke path and the field path replace the whole run typed since the last space, punctuation included. A word already known as typed ("hello," or "no;") stays as it is; a typo correction keeps the punctuation as typed.
- The decision for a typed run (
Decision.analyze) lives in KeytideCore and is covered by tests for both Russian layouts.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.5
Changed
- A single Option press undoes a correction only within 10 seconds of it, time asleep included. Control+D still undoes and protects the word at any time, as before.
- The menu bar icon is dimmed while Keytide is not correcting: paused, without the Accessibility permission, stopped after a failure or without a layout it needs.
- Scroll events no longer pass through Keytide's event tap; each one cost about 0.23 ms of CPU. Option held while scrolling still does not count as a lone Option, and a scroll after a correction still voids its Option undo.
- The keystroke path's word choice, the role of each key and the undo window are decided in KeytideCore and covered by tests.
Fixed
- Layouts added or removed in System Settings are picked up without restarting Keytide.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.4
Changed
- The bug report is anonymous: apps appear as app1, app2 for the current run, diagnostic steps are numbered instead of timed, and word lengths are recorded only for corrected words.
- Save Report shows the whole report before saving it. It names the two layouts Keytide works with and only counts the others.
- Detailed diagnostics turn themselves off after 30 minutes.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.3
Added
- English interface. Keytide follows the macOS language (English or Russian); a different one can be set for Keytide in System Settings > General > Language & Region > Applications.
- About tab, also opened by About Keytide in the menu: version, signature, links, a diagnostics switch, Save Report and Report a Bug, which opens a GitHub issue form with the version and macOS filled in.
Changed
- Check for Updates answers in a window: your version is up to date (with the version on GitHub), or a newer one is out, with Update and Later.
- Settings are split into toolbar tabs: General, Words, About.
- Diagnostics stay in memory and are no longer written to the system log. Save Report holds counts, never typed text.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.2
Added
- Hotkey panels such as Raycast: Keytide corrects in the app that owns the input field, not the frontmost app.
- Electron apps such as Claude desktop: Keytide turns on their accessibility tree at the first key typed there, never in password managers, and turns it off again when Keytide quits or is paused or the app is excluded. This costs such an app about 20 MB.
- English contractions typed in the Russian layout are corrected (
дуеэы->let's, don't, I'm). - After an update, Settings shows what changed in plain words once; also under What's New in the menu.
Changed
- Where the field can be read, a word is corrected whole wherever it stands, also when you finish an existing word. Word fragments are never learned.
- Where the field cannot be read, undoing a word that started after a click, an arrow key or a Backspace past its start teaches Keytide nothing.
Fixed
- TextEdit: the first word of a sentence waits for autocapitalization instead of racing it.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.1
Added
- Self-update. Once a day Keytide asks GitHub for the latest release (can be turned off; Check for Updates works anyway) and updates on one click from the menu. An update is installed only if the dmg and the app inside it are signed with the same certificate as the running app. This is Keytide's first network access.
- Designed dmg window.
Changed
- Releases are signed with the
Keytide Code Signingcertificate instead of ad-hoc, so updates keep the Accessibility permission. - First launch: macOS 15 and later need Open Anyway in System Settings > Privacy & Security; right-click > Open no longer works for this.
Upgrade notes
- Coming from 0.1.0, macOS keeps an old Accessibility entry that no longer matches: remove Keytide in System Settings > Privacy & Security > Accessibility with
-, add the app with+and turn it on. Once; later updates keep it.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.
Keytide v0.1.0
Added
- Menu bar app. Words typed in the wrong layout are corrected after a space in both directions from two letters (
ghbdtn->привет,lf->да), case kept, and the system layout is switched for what you type next. - Obvious typos corrected from three letters, only when the fix is one edit away.
- Single Option undoes the last correction and restores the previous layout. Control+D protects a word from corrections. Both shortcuts are configurable.
- Protected words also work as layout targets: protect
локиandkjrbbecomesлоки. - Optional learning: two undos of the same word stop correcting it. Learned words can be reviewed and forgotten in Settings.
- Excluded apps (terminals and code editors by default), pause, launch at login, profile export and import.
- In TextEdit, Safari, Chrome, Helium and Codex the field is read and the word replaced in a verified transaction; elsewhere the word being typed is deleted with Backspace and retyped.
- Bundled RU/EN dictionary of about 1.5 million word forms in a 1.4 MB index; the macOS spell checker handles everything else.
- No network access, no text history, no clipboard, no telemetry.
Install
Open the dmg and drag Keytide to Applications. The app is not notarized: if macOS refuses to open it, click Open Anyway in System Settings > Privacy & Security, then allow it in System Settings > Privacy & Security > Accessibility. Keytide 0.1.1 and later update themselves from the menu and keep that permission. Coming from 0.1.0: remove the old Keytide entry there with - and add the app again, once.