Automatic when certain
Opt in to correction at a word boundary. Conservative policy keeps valid words, names, URLs, and technical tokens untouched.
Upyr instantly restores English and Ukrainian text typed on the wrong layout. Native Rust speed, local decisions, zero tracking.
Universal for Apple Silicon and Intel · macOS 11+ · current preview is ad-hoc signed and not Apple-notarized
You typed
ghbdsn
привіт
Same physical keys
[];'\,./
хїжєґбю.
Try it live
This runs the same Rust decision engine as the desktop app, compiled to WebAssembly and executed entirely in this page. Nothing typed here leaves your browser.
Stay in the flow
A small native tool for a very specific interruption—built to disappear when it has done its job.
Opt in to correction at a word boundary. Conservative policy keeps valid words, names, URLs, and technical tokens untouched.
Fix a selection or the previous word with a shortcut. By default, Upyr attempts to restore the input source and supported clipboard formats.
Upyr derives mappings from installed layouts and understands Shift, punctuation, apostrophes, ї, є, ґ, and fast mixed-language entry.
Optional language flags and three local sound packs add short event and key cues. Retro clicks and synthesized Anime Reactions are generated on-device without voice recordings.
Under the hood
No translation service and no generative model. Upyr remaps the exact physical keys, then asks whether the other-layout candidate is clearly more plausible.
The native hook keeps a bounded in-memory prefix for the current input boundary.
Installed EN and UK input sources produce the opposite-layout candidate, case and punctuation included.
Dictionaries, technical guards, exceptions, and the signed character n-gram index compare both readings.
Only a candidate above the selected confidence threshold replaces text and switches the input source.
Equal-size English and Ukrainian news corpora are filtered by alphabet and split into 2–5-character sequences. Each retained sequence becomes a packed key plus one signed confidence byte: negative for English, positive for Ukrainian.
The app embeds no corpus sentences and no word-frequency table—only 173,964 n-gram records in about 2.8 MiB. Lookup is local, deterministic, and immediate.
Read the frozen evaluation^th−96при+104ing$−121ість+117Privacy is architecture
Upyr has no account system, cloud inference, analytics SDK, telemetry endpoint, crash reporter, advertising, or automatic update ping.
Security and advisoriesOnly the bounded current input prefix is retained in memory. Boundaries and resets discard it; typed content is not written to logs or disk.
When restoration is enabled, Upyr attempts to restore supported formats and reports platform failures. macOS temporary data is marked concealed and Copy detection uses the native change counter.
Automatic correction, modifier gestures, key sounds, and the language flag start disabled. Sound feedback receives only physical-key categories and never stores typed characters.
Open source, reproducible model generation, RustSec reporting, CodeQL, dependency review, tests, and package smoke checks make claims inspectable.
Security tooling reduces risk; it cannot prove that software is vulnerability-free. The corpus generator is the sole intentional downloader and runs only when a developer invokes it. Desktop and WASM runtime paths implement no network client.
Delivery
The shared Rust engine already runs across native desktop and WebAssembly. Product polish is deliberately landing platform by platform.
Universal Apple Silicon + Intel app, native AppKit settings, input-source mapping, rich pasteboard snapshot/restore support, feedback, and launch at login.
Open releasesTray app, layout mapping, broad clipboard snapshot/restore support, installer, portable ZIP, and CI coverage. The settings screen-reader bridge is temporarily unavailable.
XKB-aware mapping, GTK tray, DEB and tar packages. The settings screen-reader bridge is temporarily unavailable; native Wayland global input awaits a portal-backed design.
DOM-independent core and generated TypeScript contracts are ready. A browser adapter, playground, and npm delivery are next.
About the name
Upyr takes its name from the Ukrainian «упир»—a shape-changing figure, one who turns. The app does the same small transformation for text typed in the wrong layout.
It is an independent Rust implementation inspired by Punto Switcher and TolikPylypchuk/KeyboardSwitch, with a narrower EN–UK focus and local-first architecture.
Public preview
The current macOS preview is ad-hoc signed and not Apple-notarized, so Gatekeeper may block it. You can also inspect and build every line yourself.