Public preview · v0.2.0

Your keyboard can be wrong. Your words don’t have to be.

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

Local only

You typed

ghbdsn привіт
EN УК

Same physical keys

[];'\,./ хїжєґбю.
Confident matchreplaced in milliseconds
No runtime network
No account
No telemetry
Open source · MIT

Try it live

An on-screen Apple keyboard, running real WebAssembly

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

Fix the layout. Keep the thought.

A small native tool for a very specific interruption—built to disappear when it has done its job.

Automatic when certain

Opt in to correction at a word boundary. Conservative policy keeps valid words, names, URLs, and technical tokens untouched.

Manual when you choose

Fix a selection or the previous word with a shortcut. By default, Upyr attempts to restore the input source and supported clipboard formats.

Physical-key truth

Upyr derives mappings from installed layouts and understands Shift, punctuation, apostrophes, ї, є, ґ, and fast mixed-language entry.

Quiet feedback

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

A tiny local decision path

No translation service and no generative model. Upyr remaps the exact physical keys, then asks whether the other-layout candidate is clearly more plausible.

  1. 01

    Capture positions

    The native hook keeps a bounded in-memory prefix for the current input boundary.

  2. 02

    Remap keys

    Installed EN and UK input sources produce the opposite-layout candidate, case and punctuation included.

  3. 03

    Score evidence

    Dictionaries, technical guards, exceptions, and the signed character n-gram index compare both readings.

  4. 04

    Apply carefully

    Only a candidate above the selected confidence threshold replaces text and switches the input source.

SIGNED N-GRAM v1

Character patterns, packed small

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
EN −1270+127 УК
^th−96
при+104
ing$−121
ість+117
16-byte keysigned byte

Privacy is architecture

Your typing never needs to leave your Mac.

Upyr has no account system, cloud inference, analytics SDK, telemetry endpoint, crash reporter, advertising, or automatic update ping.

Security and advisories

Short-lived memory

Only the bounded current input prefix is retained in memory. Boundaries and resets discard it; typed content is not written to logs or disk.

Guarded clipboard

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.

Opt-in automation

Automatic correction, modifier gestures, key sounds, and the language flag start disabled. Sound feedback receives only physical-key categories and never stores typed characters.

Verifiable controls

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

macOS first. One portable core.

The shared Rust engine already runs across native desktop and WebAssembly. Product polish is deliberately landing platform by platform.

PRIMARY

macOS 11+

Universal Apple Silicon + Intel app, native AppKit settings, input-source mapping, rich pasteboard snapshot/restore support, feedback, and launch at login.

Open releases
PREVIEW

Windows

Tray app, layout mapping, broad clipboard snapshot/restore support, installer, portable ZIP, and CI coverage. The settings screen-reader bridge is temporarily unavailable.

PREVIEW

Linux / X11

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.

ENGINE

WebAssembly

DOM-independent core and generated TypeScript contracts are ready. A browser adapter, playground, and npm delivery are next.

About the name

Made to switch.

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

Keep typing. Upyr will flip the rest.

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.