📖 A book on the story behind awase's development is now available → "Turning Unreliable Windows API Responses into Correct Input: Designing a Thumb-Shift Emulator"

awase(合わせ)

Thumb-Shift (NICOLA) Keyboard Emulator

Thumb-shift typing, made more comfortable.

A fast, rock-solid thumb-shift emulator written in Rust. It works flawlessly even in apps that traditional tools have struggled with, such as Chrome, Zoom, and LINE.

Windows support Full Chrome / Edge support Zoom support Optimized for Google Japanese Input MS-IME support

Features

Meticulously built with capabilities that other thumb-shift tools don't offer.

Rock-Solid Operation

  • A unique relay mode designed so the OS is unlikely to forcibly uninstall the keyboard hook
  • If it ever is removed, the auto-recovery feature re-registers it instantly
  • Automatically recovers on wake from sleep and on screen unlock
  • Accurately preserves IME state even when switching windows with ALT+TAB
  • No DLL injection — won't trigger false positives in antivirus software

Fast and Accurate

  • Written in Rust with 1–5ms processing time, so you never feel input lag
  • An n-gram statistical model predicts "the reading that fits the context," judging chords intelligently
  • Choose from five confirmation modes to match your typing style
  • Coexists with other hook-based software such as AutoHotKey

Freely Customizable

  • Freely edit layout definitions in the .yab format
  • Supports both JIS and US keyboards
  • Fine-tune thumb-key assignments, chord thresholds, and more
  • Change settings intuitively through the GUI settings screen

Open Source

  • Dual-licensed under MIT / Apache 2.0
  • Source code published on GitHub
  • One-command installation via Scoop
  • Easy setup with the MSI installer

App Compatibility

Thoroughly supports the apps that traditional thumb-shift tools have struggled with.

Hard for traditional tools

Chrome / Edge

Solves TSF composition timing problems with a unique approach that monitors Google Japanese Input I/O. It works reliably even while the candidate window is showing.

Hard for traditional tools

Zoom

Full support for Zoom, which runs as a TSF application. Chat input during video meetings is comfortable too.

Hard for traditional tools

TSF apps in general

Even in TSF-native apps like Windows Terminal, it solves the cold-start problem and works accurately.

Full support

Google Japanese Input

Using a dedicated control method tailored to how Google Japanese Input works internally, it toggles the IME ON/OFF reliably and without side effects.

Full support

LINE / Qt apps

It infers the IME state transitions that LINE performs internally, achieving IME ON/OFF switching exactly as intended. Misbehavior when switching apps via ALT+TAB is eliminated as well. It supports Qt-based apps in general.

Full support

Microsoft IME

Supports the Microsoft IME that ships with Windows.

Why awase Works

The fundamental difference from traditional tools lies in an architecture that "infers internal state from the outside."

IMM32 applications — no problem (any tool works)

Apps that use the IMM32 API, such as Sakura Editor and Hidemaru, integrate with the IME in a simple way, and they work correctly just by sending keys. Most thumb-shift software has worked fine here.

TSF apps (Zoom, LINE, etc.) — internal state is invisible

TSF (Text Services Framework) apps such as Zoom, LINE, and Windows Terminal communicate with the IME through a sophisticated internal protocol, and an external program has no way to directly ask "is the IME ready to accept characters right now?"

awase monitors Google Japanese Input's I/O activity in the background and infers, from when that activity goes quiet, whether "the TSF composition context has finished getting ready." It's an approach that estimates internal state purely through external observation, without invasive techniques like DLL injection.

Chrome / Microsoft Edge — cross-process control

Chrome and Edge coordinate multiple processes, so the usual IMM32 cross-process APIs cannot be used. This is why traditional thumb-shift tools tend to misbehave when toggling the IME ON/OFF.

awase has a dedicated control strategy for Chrome/Edge. It tracks the IME's actual state internally as a shadow model, and continuously verifies whether "the IME really did switch" from the difference between the keys it sent to the OS and the observed results.

Windows Store apps (UWP) — a different input path

UWP apps handle focus differently from Win32 and use their own input path. Every time focus changes, awase automatically detects the type of app and switches to the input strategy best suited to UWP, TSF, or Win32.

The detailed mechanics of the keyboard hook, chord detection, n-gram model, and IME control strategies are explained in the Internals guide.

Smart Chord Detection with n-grams

A statistical model judges not just timing but "whether it's natural Japanese."

When typing fast, does the in "よかった" combine with the right thumb to become , or does it stay ? Judging by timing alone makes misconversions likely.

awase includes a built-in statistical model learned from a Japanese n-gram corpus, and judges "which is the natural Japanese" from the surrounding context. Even when you type fast there are few misconversions, and long-form input stays comfortable.

Five Confirmation Modes

ngram_predictive Context prediction with an n-gram statistical model. The best balance of speed and accuracy (recommended)
adaptive_timing Automatically adjusts the threshold based on your recent typing speed
two_phase Uses speculative output to keep speed, then replaces it if a thumb key arrives
speculative Outputs single keystrokes immediately. Fastest, but misconversions may increase during fast typing
wait Waits until the timer fires before committing. Most accurate, and suited to those who type at a relaxed pace

Installation

MSI installer (recommended)

Double-click to finish setup. It registers itself to start up automatically, too.

Download the latest version (MSI)

If the download doesn't work, download it manually from GitHub Releases.

ZIP version (portable)

No installation needed. Unzip and use it right away.

Download the latest version (ZIP)
  1. Download awase-x.x.x-x64.zip from GitHub Releases and unzip it
  2. Run install.ps1 from the unzipped folder in PowerShell (registers startup)
  3. Run awase.exe (it lives in the tray)

Build from source

cargo build -p awase-windows --release

Usage

Basic operations

  • Press the Hankaku/Zenkaku key to turn the IME ON → thumb-shift input becomes active
  • The Henkan (変換) and Muhenkan (無変換) keys act as thumb-shift keys
  • Ctrl+Shift+Henkan turns the engine ON, Ctrl+Shift+Muhenkan turns the engine OFF
  • Check the status via the tray icon; right-click for settings and to quit

Key config.toml settings

confirm_mode Selects the confirmation mode. ngram_predictive (recommended), wait (favors accuracy), speculative (favors speed), and more
output_mode The output method. unicode is the default
hook_mode How the hook operates. relay is the default, designed to prioritize stability

Frequently Asked Questions

Does it really work in Chrome and Edge?

Yes. Chrome and Edge have tricky TSF composition timing, and traditional tools tended to garble characters or introduce delays. awase solves this with a unique method that monitors Google Japanese Input's I/O to detect when composition is ready.

Can I use it in Zoom chat?

Yes. Zoom runs as a TSF application, but awase optimizes input to TSF-native apps, so it works without issues.

Won't antivirus software flag it as a false positive?

Because awase never uses DLL injection, it's designed to be unlikely to trigger false positives in security software. It uses only standard Windows APIs — keyboard hooks and SendInput.

Which IMEs are supported?

It supports Microsoft IME and Google Japanese Input. Many traditional tools switch the IME with a "toggle key," so unless they know the current state precisely, they can end up in the opposite state from what was intended — a fundamental problem. Google Japanese Input in particular does not let external programs correctly read the current IME state, so it was an IME especially prone to this issue. awase controls the IME with idempotent operations — "turn the IME ON" and "turn the IME OFF" (running them any number of times gives the same result) — so even if the state has drifted, you always get the intended result.

Can I use it alongside other key remappers (AutoHotKey, etc.)?

Yes. In relay mode all keys are re-injected, so keys reach other hook-based software as well.

Won't it stop working after waking from sleep?

It automatically re-registers the hook on wake from sleep and on screen unlock. It also detects anomalies with periodic health checks and recovers automatically. It's designed to be resilient after Windows Update, using an implementation that doesn't depend on internal changes to the OS's character-output method.

Won't it misbehave on password entry screens?

When the IME is OFF, the engine is automatically disabled and you get normal key input.

Can I use layouts other than NICOLA?

By creating a layout definition file in the .yab format, you can define any layout you like.

Sometimes when I typed in Chrome, only the first character came out as a Latin letter.

This is the TSF cold-start problem. Chrome can take a few hundred milliseconds to initialize the IME's composition context, and if romaji arrives before that finishes, characters get garbled, e.g. "こ → ko" or "か → kあ". awase monitors Google Japanese Input's I/O activity to detect when composition is ready, and automatically times its output to match.

When I typed fast, the shift would bleed into the neighboring key and add a dakuten.

This is a problem widely reported with traditional tools like YamabukiR and Benisara. If the moment you release the thumb-shift key overlaps with the next keystroke, it's judged as an unintended chord and a voiced sound or a different character comes out — creating a situation where "it only works if you type slowly." awase uses an n-gram statistical model to judge "whether it's natural Japanese," so it can decide correctly even if the timing is slightly off. You can also choose from five confirmation modes to tune it to your own typing speed.

During fast typing, the character order sometimes came out wrong.

This is a bug where keys pile up while awaiting completion of TSF output processing, then get output in the wrong order once processing resumes. For example, typing "というのは" was known to sometimes come out as "とはいうの". awase solves this by strictly identifying each timer-event instance, so no matter how fast you type, output stays in the correct order.

In terminals like Windows Terminal, only the first character sometimes came out as a Latin letter.

In TSF-native apps, the composition context is reset right after you press a confirmation key (Enter or Space). awase detects this reset and performs warmup, ensuring TSF is in a ready state before the next character input. Even the first character after a long idle period is entered correctly.

Sometimes IME ON/OFF switching stopped working from the second time on.

This happens when awase's internal "IME state" drifts from the OS's actual state and it wrongly decides "already switched." awase re-observes the IME's real state on every focus change and app switch, and continuously corrects the drift by reconciling against the shadow model.

When I switched to another app with ALT+TAB, the engine sometimes turned OFF in LINE.

While the ALT+TAB task switcher is displayed, the OS temporarily moves focus to the switcher's window. If the IME state is read at that instant, it can be wrongly judged as "IME OFF" and the engine stops. awase updates an internal counter (an epoch) on every focus change, automatically invalidating stale observations that occurred during the switch animation. This keeps IME state correct even after ALT+TAB.

Origin of the Name

a w a s e

Typed on a QWERTY keyboard, "awase" flows left pinky → left ring → left pinky → left ring → left middle, gliding from the outside inward using only the left hand.

The name of a keyboard program makes a beautiful motion on the keyboard itself — we named it that way out of playfulness, along with the meaning of "awase" (合わせ: bringing chords together in a simultaneous keystroke).

A
pinky
W
ring
A
pinky
S
ring
E
middle