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

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. Every cue is synthesized on-device; no recordings or pre-rendered audio files are bundled.

See it. Hear it.

Native controls, with feedback you can tune.

Searchable macOS settings keep automation, shortcuts, language flags, and every sound event understandable and optional.

Upyr Settings on macOS showing language indicator and sound feedback controls Open full size
Native AppKit settings on macOS Searchable tabs, per-event controls, previews, and one clear Save action.

Generated live

Try the sound packs

35%

Short browser-generated previews inspired by the app’s local Rust synthesizer.

Original

A soft, restrained conversion chime.

Arcade

A bright, short retro confirmation.

Anime Reactions

A synthesized vowel reaction for Enter—no voice recording.

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
LOCAL TRACE

Follow one correction

  1. 01Map the physical keys

    The same six key positions produce a candidate on the Ukrainian layout.

    gп hр bи dв sі nт
    ghbdsnпривіт
  2. 02Extract overlapping grams

    Add word boundaries and inspect every 2–5-character window. Longer grams receive more weight.

    ^привіт$22 overlapping grams
    n2^ппррииввіітт$
    n3^прприрививівітіт$
    n4^припривривіивітвіт$
    n5^привпривіривітивіт$
  3. 03Compare local evidence

    Packed signed records are found with binary search; longer grams are weighted before the sum is normalized.

    ^g−112 ghb−83 sn$−63 ^п+127 при+116 ивіт$+43
    ghbdsnEN · 0.209
    привітУК · 0.704
    Model coverage · not probability+0.495
  4. 04Make the guarded decision

    “привіт” is known; “ghbdsn” is not. The model agrees, and the policy permits correction.

    ghbdsnunknown привітknown word
    CORRECTпривіт

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.