macos utility · local by design · open source

typed in the wrong layout? don't retype it.

double shift turns ghbdtn into привет right where you typed it. language relay repairs the last word by default, keeps phrase repair explicit, switches the input source and leaves the cursor ready.

double shift or clean option · last word by default · one window contract · v2.4.0

npx github:aPoWall/language-relay install
relay voxel character
two alphabets · one bridge · click to mirror itrelay
Language Relay 2.4.0 panel: live mark, name, version, settings and close in the header, keys and esc close in the footer
the real panel · 2.4.0 · 420×488
live browser demo · same key mapu.s. → russian–pc
alex@mac ~ % relay
scope
case
cue
examples
ready · type · relay / ⌘↩local

this browser demo uses relay or ⌘↩. the installed app uses clean double shift or option.

local onlyno accountno adsno telemetrymit · open source

ghbdtn? vbh becomes привет? мир. one gesture repairs the tail of the thought.

01 · typefinish the thought

keep writing when the active keyboard source is wrong. the text stays exactly where you typed it.

02 · relaytap a clean gesture

double shift or a clean option tap converts the latest word without opening a window. phrase repair is a visible setting.

03 · continuestay at the cursor

the app verifies the write, switches the layout and leaves the insertion point ready for the next word.

small surface. explicit behavior. a contract for agents.

01 · scopeword or phrase

the last word is repaired by default. phrase repair is a visible setting in the panel.

02 · gesturesclean double shift or option

two system gestures, both optional, both without opening a window. the menu bar shows the active alphabet.

03 · case + cuesfour case modes, eight cues

preserve, sentence, upper or lower. short sound cues 75–200 ms with four volume levels.

04 · live markthe character lives in the app

the relay arch sits in the panel header, the menu bar carries the same mark as a line glyph; the character follows the cursor and mirrors on click. reduce motion keeps it still.

small surface. explicit behavior.

the menu bar shows the active alphabet. every setting names the exact part of the correction it changes.

Language Relay 2.4.0 native panel with the shared window contract
native control surfaceswift · appkit
language relay / settingschanges sync to the demo ↑
scope
capitalization
triggers
feedback

a keyboard tool with a machine-readable contract.

agents get deterministic conversion, readiness checks, stable capabilities and useful exit status. conversion returns the requested text; diagnostic receipts contain no typed content.

deterministicthe same key map produces the same output on every run.
inspectabledoctor and capabilities report readiness before automation starts.
composablejson fits shell scripts, launch agents and local agent workflows.
privateconversion happens on the mac. diagnostics retain no typed text.
language-relay · schema 1■ ready
$ language-relay convert ghbdtn
{"sourceID":"…US","targetID":"…RussianWin","text":"привет"}

$ language-relay doctor
{"accessibilityTrusted":true,"ready":true}

$ language-relay capabilities
{"scopes":["word","phrase"],"localOnly":true}

eight short signals. one clear receipt.

one command. ready for the next word.

npx github:aPoWall/language-relay install
  1. run the command above. it builds the app from source and installs it into ~/Applications with a launch agent.
  2. approve accessibility access when macos asks. the app needs it to repair the focused field.
  3. type ghbdtn anywhere and tap double shift. the menu bar mark shows the active alphabet.
2026-09-16 · 587 KB · apple siliconsha-256 e80c292a290ee9b5b13a6e2ccec43a24341b01703dbe9fc5278f9c4ce29f62eb · SHA256SUMS.txt
macos 13+ · swift / appkit · mit · u.s. ⇄ russian–pc · v2.4.0 · update an existing install: make test && ./install-runtime.sh update-background

what's new

release-notes.txt · five latest entries load here

your text stays on your mac.

language relay runs as a small native menu bar app. it needs accessibility access to repair the focused field. there is no account, advertising surface, analytics sdk or cloud processing path.

on your macconversion + settings
0 accountsinstall and start writing
0 adsno promotional runtime surface
0 telemetryno analytics sdk or text log
open sourceinspect the app and bridge
u.s. ⇄ ru–pccurrent deterministic pair

current release: u.s. ⇄ russian–pc. the engine uses explicit verified layout pairs, so every future language pair can ship with its own deterministic map and tests.