A macOS menu-bar app that locks your keyboard input source. Whenever you (or another app) switch input methods, LockIME immediately switches back to the locked one — globally, or per-frontmost-app, or (with the optional enhanced mode) per browser URL.
macOS 14+ · Apple silicon & Intel — separate apps, download the
-arm64or-x86_64file matching your Mac · built with SwiftUI, Liquid Glass on macOS 26 (Tahoe).
Install with Homebrew (the cask picks the build matching your Mac's architecture):
brew install --cask oomol-lab/tap/lockimeOr download the .dmg matching your Mac (-arm64 for Apple silicon,
-x86_64 for Intel) from the
latest release.
Either way, the app keeps itself up to date via Sparkle.
- Instant re-lock — switches the active input source back the moment you (or another app) change it, globally or per-app.
- Lock or switch — per-app and per-URL rules can lock an input source (re-applied whenever it drifts) or just switch to it once when you focus the app or page, then step out of the way and let you change it freely.
- Lock globally, or just switch — give the global default input source one of three behaviors: lock to pin it everywhere; switch to switch you into it once whenever an app falls back to the global default (it has no rule of its own, or its rule is Use default), then leave you free; or None for no global behavior at all — LockIME then acts only through your per-app and per-URL rules. Switch actively switches you in whenever the default applies; None does nothing globally.
- Flexible URL matching — per-URL rules (enhanced mode) match by a domain and its subdomains, an exact domain, a domain keyword, or a regular expression over the full URL, and apply in a priority order you drag to arrange — first match wins.
- Menu-bar control — activate/deactivate, switch the locked input source, view the current source, and track the activation count from the menu bar.
- Keyboard shortcuts — configurable global shortcuts to toggle LockIME on or off and cycle the locked input source, plus per-app shortcuts to cycle or unbind the rule for whichever app is frontmost.
- Launch at login — starts automatically when you log in (off by default).
- Light & dark mode — a unified, system-native design language that adapts to light and dark appearance, plus a bespoke app icon. See docs/DESIGN.md.
- Live language switching — switch between 9 languages instantly, no restart: English, 简体中文, 繁體中文, 日本語, Français, Deutsch, Español, Português, Русский.
- 24-hour activation log — review what was switched, why, and for how long.
- Config backup — export your per-app and per-URL rules to a
.lockimefile and import them back, with a review step that previews additions, conflicts, and removals before anything is applied. - Auto-update — stable and beta channels via Sparkle, with a custom update window.
- Tiny download — the whole app ships in a
.dmgunder 3 MB. - No system permissions for core locking — an optional Accessibility-gated enhanced mode unlocks finer-grained per-URL and focused-field rules.
- Automation — a
lockime://URL scheme lets other apps, scripts, and Shortcuts drive LockIME (see below).
The two most widely-used alternatives to LockIME are Input Source Pro and KeyboardHolder, alongside a long tail of smaller open-source and CLI tools. They all switch the input source as you move between apps or sites; LockIME is built around a continuous lock that re-applies it the moment it drifts — while any rule can still fall back to a one-time switch.
| LockIME | Input Source Pro | KeyboardHolder | |
|---|---|---|---|
| Price | Free | Free | Free (donation) |
| Open source | GPL-3.0 | GPL-3.0 | ✗ (closed) |
| Minimum macOS | 14 | 11 | 10.15 |
| Download size | < 3 MB | ≈ 7.6 MB | ≈ 4.5 MB |
| Per-app rules | ✓ | ✓ | ✓ |
| Per-website / URL rules | ✓ | ✓ | ✓ |
| URL match types | subdomain · exact · keyword · regex | subdomain · exact · regex | domain (wildcard) |
| Address-bar (URL field) rule | ✓ (lock/switch/priority) | ✓ (default source) | — |
| Continuous re-lock | ✓ | ✗ | ✗ |
| Lock or one-time switch, per rule | ✓ | ✗ | ✗ |
| Global keyboard shortcuts | ✓ | ✓ | ✗ |
| Menu-bar control | ✓ | ✓ | ✓ |
| On-screen input hints | ✗ | ✓ | ✓ (optional) |
| 24-hour activation log | ✓ | ✗ | ✗ |
| Config backup / import | ✓ (.lockime, with review) |
✓ (export/import + CLI) | — |
| URL-scheme automation | ✓ (lockime://, x-callback-url) |
partial (inputsourcepro:// import) |
✗ |
| UI languages | 9 (live switch) | 6 | zh · en · ja |
| System permissions | none for core · Accessibility for per-URL | none for core · Accessibility for per-URL | Accessibility¹ |
| Auto-update | Sparkle (stable + beta) | ✓ | ✓ |
| Actively maintained (2026) | ✓ | ✓ | ✓ |
¹ KeyboardHolder does not document its permission requirements; reading the browser address bar for its per-website rules requires Accessibility access in practice. A "—" marks an undocumented capability, not a confirmed absence.
Choosing between them: Input Source Pro has the largest community and the richest on-screen input hints; KeyboardHolder is a polished, zero-config per-app memory. Reach for LockIME when you want an input source pinned — per app, per URL, or in the address bar, re-applied the instant anything changes it — rather than only switched when you arrive.
Other tools: SwitchKey (per-app only, no longer maintained), Kawa (manual, shortcut-driven), InputSwitcher (freemium, per-app only), and macism (a command-line building block, not a GUI switcher).
Compared against Input Source Pro 2.11.0 and KeyboardHolder 1.14.10, mid-2026 — details drift; corrections welcome.
LockIME exposes a lockime:// URL scheme so other apps, scripts, Shortcuts, and
launchers can drive it — turn it on or off, retarget the input source, manage
rules, and read state back with x-callback-url
callbacks. It is off by default — turn it on in Settings ▸ General ▸
Automation.
open "lockime://lock"
open "lockime://lock-to-source?id=com.apple.keylayout.ABC"
open "lockime://set-app-rule?bundle=com.apple.Terminal&mode=lock&source=com.apple.keylayout.ABC"Full reference: URL Scheme API.
LockIME follows a single design system (Sources/LockIME/UI/DesignSystem.swift):
semantic colors, system materials, and SF Symbols drive light/dark adaptation;
Liquid Glass is reserved for the floating/navigation layer only. The brand
"Lock Indigo" accent ships as an AccentColor asset. The full spec lives in
docs/DESIGN.md.
The app icon is generated programmatically (no design tool) — regenerate it with:
./scripts/make-appicon.sh # renders the master via SwiftUI and rebuilds the appiconsetRequires Xcode 26+ (the app itself targets macOS 14+), and XcodeGen
- xcbeautify (
brew install xcodegen xcbeautify).
make gen # generate LockIME.xcodeproj from project.yml
make build # build (Debug)
make run # build & launch
make test # run unit tests
make archive # Release archive (Developer ID)The Xcode project is generated from project.yml and is not checked in.
Hardware-touching integration tests (real TIS switching) are excluded from
make test; run them with make test-hw (briefly changes the input source).
Dispatch-driven, notarized Developer ID releases with Sparkle auto-update over stable and beta channels: run the Release workflow (Actions → Release) and it computes the version from git tags, builds, and creates the tag and GitHub Release automatically — never push a tag by hand. The beta channel is the nightly build. Every release ships separate Apple-silicon and Intel apps, each on its own update feed (no universal binary, no cross-arch updates). See docs/RELEASING.md.
- LockIMEKit (static library) — pure, fully unit-tested logic using only system frameworks: lock engine, app monitor, rules, enhanced (Accessibility) observer, logging model, localization.
- LockIME (app) —
@main, SwiftUI UI, the design system, and the thin integration shims for Sparkle, KeyboardShortcuts, and PermissionFlow.
Copyright © 2026 Hangzhou Wumou Software Co., Ltd.