Zerkalo (Зеркало - Mirror) is a lightweight macOS daemon written in Rust that provides system-wide real-time phonetic transliteration from Latin to Cyrillic.
- System-wide: Works in all macOS applications (Browsers, IDEs, Messaging apps).
- Zero Latency: Direct interception via Quartz Event Tap for maximum responsiveness.
- Intelligent Phonetic Mapping: Supports single characters and complex sequences (e.g.,
sh->ш,shch->щ). - Full Control: Instantly enable or disable transliteration with a keyboard shortcut.
- Lightweight: Minimal CPU and memory usage.
- Ensure you have Rust installed on your Mac.
- Clone the repository and enter the directory.
- Run the installation script:
./install.sh
- The installer compiles Zerkalo, installs a macOS
LaunchAgentfor automatic startup at login, and configures the optionalzerkaloshell alias.
To function, Zerkalo may require both Accessibility and Input Monitoring access:
- Go to System Settings > Privacy & Security > Accessibility.
- Add and enable this installed binary:
~/Applications/Zerkalo.app - Go to System Settings > Privacy & Security > Input Monitoring.
- Add and enable the same app there too if macOS prompts for it:
~/Applications/Zerkalo.app - After granting the permission, relaunch Zerkalo without reinstalling first.
- Reinstalling can make macOS ask for the permission again for the installed app bundle.
- If you also run Zerkalo manually from Trae/Terminal, keep your terminal app enabled too.
Zerkalo is designed to run automatically in the background after installation through a macOS LaunchAgent, and the app manager listens for the global shortcut at all times.
You can also launch it manually via the run script:
./run.sh- Start / Stop transliteration:
Alt+Esc - Close and relaunch Zerkalo: press
Esc5 times in a row, then useAlt+Escto launch it again - Background behavior: the manager stays loaded in the background so the shortcut can launch the transliteration worker whenever you need it
The mapping follows standard phonetic logic. For more details, see TRANSLATION_TABLE.md.
Examples:
p->пr->рi->иv->вe->еt->т- Result:
privet->привет