# Keyhac 2 English \| [日本語](README.ja.md) Python-scriptable keyboard customization for **Windows and macOS**. Keyhac installs a system-wide keyboard hook and lets you script what your keys do in Python. You write one file, `~/.keyhac/config.py`, and it runs unchanged on both OSes — remapping keys, binding keys to Python functions, and driving windows, applications and the clipboard from the keyboard. It can also write the harder scripts for you. Connect an AI assistant and it reads the screen in front of you, generates a plain-Python action against the real UI, and tests it — then the action runs on its own, with no AI in the loop.
Keyhac 2 replaces the two previous-generation products, Keyhac for Windows (1.x) and Keyhac for macOS (1.x), rebuilt as one shared codebase. Those older versions are no longer developed — if you are coming from one of them, see the migration guides in [Documentation](#documentation) below. Keyhac 2's UI is built on [PuiKit](https://github.com/crftwr/puikit). ## Features - **Key remapping**: key → key, key → key sequence, key → Python function. - **Per-application key tables**: match by app name, window title, Win32 window class, or the full accessibility focus path (AX on macOS, UI Automation on Windows) — down to "only in this app's text editor pane". - **User modifiers**: turn any key into a modifier of your own (User0–User3), invisible to applications. - **One-shot modifiers**: tap a modifier alone for one action, hold it to modify. - **Multi-stroke key tables**: Emacs-style prefix keys, with a balloon showing the armed prefix. - **Clipboard history**: persistent history in a popup chooser — type to filter, Enter pastes into the app you came from, with its formatting, image or files; Option/Alt-Enter pastes plain text. Plus fixed snippets and scriptable clipboard-transform tools. - **Window control**: move, snap/tile, minimize, activate and launch applications, multi-monitor aware. - **Keyboard macros**: record and replay keys. - **Mouse output**: send clicks, wheel scrolls and pointer moves from key bindings. - **Extra Python libraries**: list them in `~/.keyhac/requirements.txt` and choose Advanced > Sync Python Packages in the tray menu — the app bundles included. - **Console window**: live log, last-key and focus-path inspector — see exactly what to bind. Runs from the system tray (Windows) / menu-bar extra (macOS). - **AI-authored actions**: let an AI assistant read the screen and write the automation for you, then bind it to a key — see [AI integration](#ai-integration) below. ## AI integration Keyhac can be driven by an AI assistant while you *write* your automation, and by nothing but Python once you run it. Connect Claude Desktop — or any MCP client — to Keyhac's local endpoint, and it can read the accessibility tree of the application in front of you, write an `Action` against the real element names it finds there, run it, read its own traceback, and fix it. No copy-pasting between a chat window and an editor. What you are left with is an ordinary Python class on a key: ```python import translate_clipboard def configure(keymap): kt = keymap.define_keytable(focus_path_pattern="*") kt["Fn-T"] = translate_clipboard.TranslateClipboard() ``` From then on it runs in milliseconds, offline, with no tokens and no model — the AI was the author, not the runtime. That matters most for applications with no API at all: walking pagination to the end, filling a form from each row of a CSV, reading tables out of an internal web app, capturing every settings screen to JSON. **It is off unless you turn it on** — a checkbox in the console window. The endpoint listens on loopback only, behind a token generated at startup, and closes itself an hour after you open it. [AI integration](doc/ai-integration.md) covers setup, which clients have been tried, what it can reach, and the security model. ## Screenshots | Console (macOS) | Console (Windows) | |---|---| |  |  | | Menu-bar extra (macOS) | Task tray (Windows) | |---|---| |  |  | ## Install - **macOS 12+** — download `Keyhac-