Skip to content

oomol-lab/LockIME

Repository files navigation

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 -arm64 or -x86_64 file matching your Mac · built with SwiftUI, Liquid Glass on macOS 26 (Tahoe).

Screenshots

General settings Per-app rules Per-URL rules

Install

Install with Homebrew (the cask picks the build matching your Mac's architecture):

brew install --cask oomol-lab/tap/lockime

Or 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.

Features

  • Instant re-lock — switches the active input source back the moment you (or another app) change it, globally or per-app.
  • 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 locking 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.
  • Auto-update — stable and beta channels via Sparkle, with a custom update window.
  • No system permissions for core locking — an optional Accessibility-gated enhanced mode unlocks finer-grained per-URL and focused-field rules.

Design

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 appiconset

Development

Requires Xcode 26+ (the app itself targets macOS 14+), and XcodeGen

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).

Releasing

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.

Architecture

  • 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, PermissionFlow, and MarkdownUI.

License

Copyright © 2026 Hangzhou Wumou Software Co., Ltd.