Typed it in the wrong layout?
Tilqos fixes it.

ghbdtn becomes привет, с2леметс3з becomes сәлеметсіз. A native Mac menu-bar app for English, Russian and Kazakh that rewrites the word and switches the layout for you. Free, open source, and everything stays on your Mac.

macOS 14+ (tested on macOS 27) · Apple silicon DMG · MIT license · no network, no telemetry
Illustration of suggest mode, not a screen recording. In Auto mode confident words are replaced without a card.

The animation illustrates the flow; it is not a screen recording.

Three languages, one of them done properly

Tilqos was built for people who switch between English, Russian and Kazakh. On a Mac, the Russian and Kazakh layouts agree on all 33 Russian letters and differ only on the number row, where Kazakh puts its nine extra letters and Russian puts digits. That one fact shapes the whole design.

English EN

Russian typed on the English layout is the classic mistake.

ghbdtn → привет
,skj → было

Русский РУ

And the other way round. Real words such as еще or тот are never rewritten.

руддщ → hello
где ↔ ult

Қазақша ҚАЗ

The nine Kazakh letters turn into digits on the Russian layout. A digit inside a Cyrillic word is a very strong signal.

с2леметс3з → сәлеметсіз
0аза0 → қазақ

Where the Kazakh letters live (real macOS layouts)

Key2345=9-80
ABC / Russian2345=9-80
Kazakhәіңғһұөүқ

Russian typed on the Kazakh layout looks right, so there is nothing to fix: that removes the biggest source of false corrections. And because the Kazakh layout puts its digits on Option, Tilqos remembers key presses, not characters. It also decodes Latin Kazakh back to Cyrillic (qalaisyz becomes қалайсыз) with vowel harmony and Kazakh morphology. More on Kazakh.

What it does

Quiet when you type correctly, helpful when you do not.

Fixes it, or offers

When it is sure, it replaces the word as you finish it. When it is not, a small card at the cursor shows было → стало: Tab accepts, any other key dismisses.

Switches the layout

After a fix the layout follows, so the next word is right. Russian or Kazakh? Your setting, or the Cyrillic layout you last used in that app.

Never touches real words

It checks word forms from hunspell dictionaries, not just headwords. URLs, paths, e-mail, code identifiers and acronyms are left alone.

Cautious, Balanced, Bold

Three presets, or tune both thresholds. Undo with ⌥⇧Z; undoing right away teaches it to leave that word alone.

Per-app control

Auto, suggest-only or off per app. Password managers are always off; terminals are suggest-only by default.

Learns from you

Undone fixes, hints you accept, words you keep: remembered as salted hashes, switchable off, and you can forget it all.

Kazakh transliteration

Latin ⇄ Cyrillic with the official 2021 alphabet or the ASCII chat spelling, including mixed Kazakh and Russian text.

In three languages

The interface and the documentation are in English, Russian and Kazakh. Menu-bar icon: EN, РУ, ҚАЗ.

On the project's own corpus it rewrote 0 of 1,858 correctly typed words and fixed 240 of 249 (96.4 %) wrong-layout words by itself. Those figures are in-sample: the corpus was written and tuned by the author, and the Kazakh part is small. How to reproduce them, and what they are not.

Download

The builds are ad-hoc signed and not notarized. That has two consequences, both explained below.

PlatformGet itNotes
macOS 14+ (Apple silicon)DMG from Releases · brew install --cask elapen/tap/tilqosDrag to Applications. Developed and tested on macOS 27; macOS 14 to 26 are unverified.
From sourcegit clone https://github.com/elapen/tilqos && cd tilqos && ./build.sh installSwift 6.0+ (Xcode 16+). Intel is untested.
Windows 10/11, x64 and ARM64zip from ReleasesExperimental: never run on real Windows by its author. Unsigned, so SmartScreen warns.
First launch. macOS blocks apps that are not notarized. On macOS 14: Control-click the app, then Open. On macOS 15 and later: System Settings → Privacy & Security → Open Anyway. Or build from source.
Grant Accessibility, and again after every update. Tilqos needs the Accessibility permission to see keys and replace text. macOS ties it to the app's code identity, and an ad-hoc signature differs for every build, so after an update remove the old Tilqos entry (or run tccutil reset Accessibility io.github.elapen.tilqos) and grant it again. Input Monitoring is an optional read-only fallback. Details.

Each release lists SHA-256 checksums. There is no updater, so watch the Releases page.

Privacy: exactly what it does with your keys

Tilqos has to watch every key you press to notice a wrong layout. So here is what it keeps, for how long, and where the promises stop.

  • The typed-word buffer lives only in memory. It is cleared after 5 seconds without typing (a timer), on app switch, on Return, Tab and Escape-type boundaries, in password fields, and on lock or sleep.
  • Undo keeps only the most recent correction(s), in memory, for at most 2 minutes; wiped on lock, sleep, quit and app switch.
  • The clipboard is touched only by actions that need it, then restored. Content flagged concealed or transient (password managers) is never read; text over 10,000 characters is ignored.
  • No typed text, clipboard content or window titles are ever logged.
  • Stored locally: settings, per-app exclusions, exception words you add (plain text), and learned vocabulary as salted 64-bit FNV-1a hashes. Those hashes are not cryptographically irreversible: someone who can read the file could guess short common words. Settings can clear exception words and reset learned words.
  • No network access, no telemetry, no updater.
  • Nothing is read or logged while secure input is active. Fields that do not enable it are not protected by that mechanism.

Limits: other software with the same permission sees what Tilqos sees; the OS can write crash dumps; the builds are not notarized. Read the full privacy document. Privacy bugs are security bugs: report them privately.

Questions

Is it a keylogger?

It has to read every key in order to do its job, which is why the source and a precise privacy document are public. The buffer is in memory only, no text is logged, and the app contains no network code.

Why does it ask for Accessibility?

To create the keyboard tap that can swallow the key that accepts a hint, to read the text before the caret, and to replace the wrong text. Input Monitoring alone lets it detect and offer, not apply.

It stopped working after an update.

Expected with ad-hoc signed builds: remove the old entry in Privacy & Security → Accessibility (or run tccutil reset Accessibility io.github.elapen.tilqos), open Tilqos and grant it again.

Is this Punto Switcher?

No. It is similar in purpose and is independent: not affiliated with, or endorsed by, Yandex or Punto Switcher. Kazakh as a first-class language, open source and a local-only design are what Tilqos adds.

Does it work on Windows?

There is an experimental Go port of the same engine. It has never been run on real Windows by its author, is unsigned, and does not recognise password fields in browsers. Testers are very welcome.

Can you add my language?

Maybe. It needs a dictionary we can ship, the keyboard-layout facts and a test corpus. Open a Language request on GitHub.