{"id":50989130,"url":"https://github.com/oomol-lab/LockIME","last_synced_at":"2026-07-07T22:00:45.876Z","repository":{"id":363779623,"uuid":"1264875739","full_name":"oomol-lab/LockIME","owner":"oomol-lab","description":"A native macOS menu-bar app that keeps your keyboard input source locked — global, per-app, and per-URL.","archived":false,"fork":false,"pushed_at":"2026-07-06T03:00:12.000Z","size":27812,"stargazers_count":427,"open_issues_count":0,"forks_count":16,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-07-07T03:24:26.830Z","etag":null,"topics":["apple-silicon","input-method","input-source","keyboard","liquid-glass","macos","macos-app","menu-bar","producitivity","sparkle","swift","swiftui","tahoe"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oomol-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-10T08:59:10.000Z","updated_at":"2026-07-06T07:44:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oomol-lab/LockIME","commit_stats":null,"previous_names":["oomol-lab/lockime"],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/oomol-lab/LockIME","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oomol-lab%2FLockIME","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oomol-lab%2FLockIME/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oomol-lab%2FLockIME/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oomol-lab%2FLockIME/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oomol-lab","download_url":"https://codeload.github.com/oomol-lab/LockIME/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oomol-lab%2FLockIME/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35243953,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-07T02:00:07.222Z","response_time":90,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apple-silicon","input-method","input-source","keyboard","liquid-glass","macos","macos-app","menu-bar","producitivity","sparkle","swift","swiftui","tahoe"],"created_at":"2026-06-20T00:00:28.871Z","updated_at":"2026-07-07T22:00:45.845Z","avatar_url":"https://github.com/oomol-lab.png","language":"Swift","funding_links":[],"categories":["Keyboard"],"sub_categories":["Text"],"readme":"\u003cdiv align=\"center\"\u003e\n\n\u003cimg src=\"docs/images/appicon.png\" alt=\"LockIME\" width=\"128\"\u003e\n\n# LockIME\n\n**English** · [简体中文](docs/README/README.zh-CN.md) · [繁體中文](docs/README/README.zh-TW.md) · [日本語](docs/README/README.ja.md) · [Français](docs/README/README.fr.md) · [Deutsch](docs/README/README.de.md) · [Español](docs/README/README.es.md) · [Português](docs/README/README.pt.md) · [Русский](docs/README/README.ru.md)\n\n[![Latest release](https://img.shields.io/github/v/release/oomol-lab/LockIME?sort=semver\u0026color=3A5BD9)](https://github.com/oomol-lab/LockIME/releases/latest)\n[![CI](https://img.shields.io/github/actions/workflow/status/oomol-lab/LockIME/ci.yml?branch=main\u0026label=CI)](https://github.com/oomol-lab/LockIME/actions/workflows/ci.yml)\n[![License: GPL-3.0](https://img.shields.io/badge/license-GPL--3.0-3A5BD9)](LICENSE)\n[![macOS 14+](https://img.shields.io/badge/macOS-14%2B-000000?logo=apple\u0026logoColor=white)](https://www.apple.com/macos/)\n[![Swift 6.0](https://img.shields.io/badge/Swift-6.0-F05138?logo=swift\u0026logoColor=white)](https://swift.org)\n\n\u003c/div\u003e\n\nA macOS menu-bar app that **locks your keyboard input source**. Whenever you (or\nanother app) switch input methods, LockIME immediately switches back to the locked\none — globally, or per-frontmost-app, or (with the optional enhanced mode) per\nbrowser URL.\n\n\u003e macOS 14+ · Apple silicon \u0026 Intel — separate apps, download the `-arm64` or\n\u003e `-x86_64` file matching your Mac · built with SwiftUI, Liquid Glass on\n\u003e macOS 26 (Tahoe).\n\n## Screenshots\n\n\u003cp align=\"center\"\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/images/settings-general-en-dark.png\"\u003e\n    \u003cimg alt=\"General settings\" src=\"docs/images/settings-general-en-light.png\" width=\"32%\"\u003e\n  \u003c/picture\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/images/settings-app-rules-en-dark.png\"\u003e\n    \u003cimg alt=\"Per-app rules\" src=\"docs/images/settings-app-rules-en-light.png\" width=\"32%\"\u003e\n  \u003c/picture\u003e\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/images/settings-url-rules-en-dark.png\"\u003e\n    \u003cimg alt=\"Per-URL rules\" src=\"docs/images/settings-url-rules-en-light.png\" width=\"32%\"\u003e\n  \u003c/picture\u003e\n\u003c/p\u003e\n\n## Install\n\nInstall with [Homebrew](https://brew.sh) (the cask picks the build matching\nyour Mac's architecture):\n\n```sh\nbrew install --cask oomol-lab/tap/lockime\n```\n\nOr download the `.dmg` matching your Mac (`-arm64` for Apple silicon,\n`-x86_64` for Intel) from the\n[latest release](https://github.com/oomol-lab/LockIME/releases/latest).\nEither way, the app keeps itself up to date via Sparkle.\n\n## Features\n\n- **Instant re-lock** — switches the active input source back the moment you (or\n  another app) change it, globally or per-app.\n- **Lock or switch** — per-app and per-URL rules can *lock* an input source\n  (re-applied whenever it drifts) or just *switch* to it once when you focus the\n  app or page, then step out of the way and let you change it freely.\n- **Lock globally, or just switch** — set the global default to one input\n  source to pin it everywhere, or set it to **None** to use LockIME as a pure\n  per-app/per-site switcher — it switches you in, then leaves you free, pinning\n  nothing.\n- **Flexible URL matching** — per-URL rules (enhanced mode) match by a domain and\n  its subdomains, an exact domain, a domain keyword, or a regular expression over\n  the full URL, and apply in a priority order you drag to arrange — first match\n  wins.\n- **Menu-bar control** — activate/deactivate, switch the locked input source,\n  view the current source, and track the activation count from the menu bar.\n- **Keyboard shortcuts** — configurable global shortcuts to toggle LockIME on or\n  off and cycle the locked input source, plus per-app shortcuts to cycle or\n  unbind the rule for whichever app is frontmost.\n- **Launch at login** — starts automatically when you log in (off by default).\n- **Light \u0026 dark mode** — a unified, system-native design language that adapts to\n  light and dark appearance, plus a bespoke app icon. See\n  [docs/DESIGN.md](docs/DESIGN.md).\n- **Live language switching** — switch between 9 languages instantly, no\n  restart: English, 简体中文, 繁體中文, 日本語, Français, Deutsch, Español,\n  Português, Русский.\n- **24-hour activation log** — review what was switched, why, and for how long.\n- **Config backup** — export your per-app and per-URL rules to a `.lockime`\n  file and import them back, with a review step that previews additions,\n  conflicts, and removals before anything is applied.\n- **Auto-update** — stable and beta channels via Sparkle, with a custom update\n  window.\n- **Tiny download** — the whole app ships in a `.dmg` under 3 MB.\n- **No system permissions for core locking** — an optional Accessibility-gated\n  enhanced mode unlocks finer-grained per-URL and focused-field rules.\n- **Automation** — a `lockime://` URL scheme lets other apps, scripts, and\n  Shortcuts drive LockIME (see below).\n\n## Comparison\n\nThe two most widely-used alternatives to LockIME are\n**[Input Source Pro](https://github.com/runjuu/InputSourcePro)** and\n**[KeyboardHolder](https://github.com/leaves615/KeyboardHolder)**, alongside a\nlong tail of smaller open-source and CLI tools. They all *switch* the input\nsource as you move between apps or sites; LockIME is built around a continuous\n**lock** that re-applies it the moment it drifts — while any rule can still fall\nback to a one-time *switch*.\n\n| | LockIME | Input Source Pro | KeyboardHolder |\n|---|---|---|---|\n| Price | Free | Free | Free (donation) |\n| Open source | GPL-3.0 | GPL-3.0 | ✗ (closed) |\n| Minimum macOS | 14 | 11 | 10.15 |\n| Download size | \u003c 3 MB | ≈ 7.6 MB | ≈ 4.5 MB |\n| Per-app rules | ✓ | ✓ | ✓ |\n| Per-website / URL rules | ✓ | ✓ | ✓ |\n| URL match types | subdomain · exact · keyword · regex | subdomain · exact · regex | domain (wildcard) |\n| Address-bar (URL field) rule | ✓ (lock/switch/priority) | ✓ (default source) | — |\n| Continuous re-lock | ✓ | ✗ | ✗ |\n| Lock *or* one-time switch, per rule | ✓ | ✗ | ✗ |\n| Global keyboard shortcuts | ✓ | ✓ | ✗ |\n| Menu-bar control | ✓ | ✓ | ✓ |\n| On-screen input hints | ✗ | ✓ | ✓ (optional) |\n| 24-hour activation log | ✓ | ✗ | ✗ |\n| Config backup / import | ✓ (`.lockime`, with review) | ✓ (export/import + CLI) | — |\n| URL-scheme automation | ✓ (`lockime://`, x-callback-url) | partial (`inputsourcepro://` import) | ✗ |\n| UI languages | 9 (live switch) | 6 | zh · en · ja |\n| System permissions | none for core · Accessibility for per-URL | none for core · Accessibility for per-URL | Accessibility¹ |\n| Auto-update | Sparkle (stable + beta) | ✓ | ✓ |\n| Actively maintained (2026) | ✓ | ✓ | ✓ |\n\n¹ KeyboardHolder does not document its permission requirements; reading the\nbrowser address bar for its per-website rules requires Accessibility access in\npractice. A \"—\" marks an undocumented capability, not a confirmed absence.\n\n**Choosing between them:** Input Source Pro has the largest community and the\nrichest on-screen input hints; KeyboardHolder is a polished, zero-config per-app\nmemory. Reach for LockIME when you want an input source *pinned* — per app, per\nURL, or in the address bar, re-applied the instant anything changes it — rather\nthan only switched when you arrive.\n\n**Other tools:** [SwitchKey](https://github.com/itsuhane/SwitchKey) (per-app\nonly, no longer maintained), [Kawa](https://github.com/hatashiro/kawa) (manual,\nshortcut-driven), InputSwitcher (freemium, per-app only), and\n[macism](https://github.com/laishulu/macism) (a command-line building block, not\na GUI switcher).\n\n\u003e Compared against Input Source Pro 2.11.0 and KeyboardHolder 1.14.10, mid-2026 — details drift; corrections welcome.\n\n## Automation\n\nLockIME exposes a `lockime://` URL scheme so other apps, scripts, Shortcuts, and\nlaunchers can drive it — turn it on or off, retarget the input source, manage\nrules, and read state back with [x-callback-url](https://x-callback-url.com)\ncallbacks. It is off by default — turn it on in **Settings ▸ General ▸\nAutomation**.\n\n```sh\nopen \"lockime://lock\"\nopen \"lockime://lock-to-source?id=com.apple.keylayout.ABC\"\nopen \"lockime://set-app-rule?bundle=com.apple.Terminal\u0026mode=lock\u0026source=com.apple.keylayout.ABC\"\n```\n\nFull reference: **[URL Scheme API](docs/URL-Scheme-API/README.md)**.\n\n## Design\n\nLockIME follows a single design system (`Sources/LockIME/UI/DesignSystem.swift`):\nsemantic colors, system materials, and SF Symbols drive light/dark adaptation;\nLiquid Glass is reserved for the floating/navigation layer only. The brand\n\"Lock Indigo\" accent ships as an `AccentColor` asset. The full spec lives in\n[docs/DESIGN.md](docs/DESIGN.md).\n\nThe app icon is generated programmatically (no design tool) — regenerate it with:\n\n```sh\n./scripts/make-appicon.sh   # renders the master via SwiftUI and rebuilds the appiconset\n```\n\n## Development\n\nRequires Xcode 26+ (the app itself targets macOS 14+), and\n[XcodeGen](https://github.com/yonaskolb/XcodeGen)\n+ [xcbeautify](https://github.com/cpisciotta/xcbeautify) (`brew install xcodegen xcbeautify`).\n\n```sh\nmake gen     # generate LockIME.xcodeproj from project.yml\nmake build   # build (Debug)\nmake run     # build \u0026 launch\nmake test    # run unit tests\nmake archive # Release archive (Developer ID)\n```\n\nThe Xcode project is generated from `project.yml` and is not checked in.\n\nHardware-touching integration tests (real TIS switching) are excluded from\n`make test`; run them with `make test-hw` (briefly changes the input source).\n\n## Releasing\n\nDispatch-driven, notarized Developer ID releases with Sparkle auto-update over\n**stable** and **beta** channels: run the Release workflow (Actions → Release)\nand it computes the version from git tags, builds, and creates the tag and\nGitHub Release automatically — never push a tag by hand. The beta channel is\nthe nightly build. Every release ships separate Apple-silicon and Intel apps,\neach on its own update feed (no universal binary, no cross-arch updates). See\n[docs/RELEASING.md](docs/RELEASING.md).\n\n## Architecture\n\n- **LockIMEKit** (static library) — pure, fully unit-tested logic using only system\n  frameworks: lock engine, app monitor, rules, enhanced (Accessibility) observer,\n  logging model, localization.\n- **LockIME** (app) — `@main`, SwiftUI UI, the design system, and the thin\n  integration shims for Sparkle, KeyboardShortcuts, and PermissionFlow.\n\n## License\n\nCopyright © 2026 Hangzhou Wumou Software Co., Ltd.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foomol-lab%2FLockIME","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foomol-lab%2FLockIME","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foomol-lab%2FLockIME/lists"}