<div align="right">
<span style="color:#999;">🇺🇸 English</span> ·
</div>
<h1 align="center"><code>keyhook</code></h1>
<p align="center">
⌨️ <strong>Global Hotkeys → Webhooks</strong> — one desktop app to trigger any HTTP request.
</p>
<div align="center">
[](https://crates.io/crates/keyhook)
[](https://github.com/lvillis/keyhook)
[](https://github.com/lvillis/keyhook/actions)
[](mailto:lvillis@outlook.com?subject=Thanks%20for%20keyhook!)
</div>
---
## ✨ Features
| 🔑 **Global shortcuts** | System-wide hotkeys registered via `tauri-plugin-global-shortcut`. |
| 🌐 **Webhook actions** | Fire `GET`, `POST`, `PUT`, `DELETE`, or `PATCH` requests (optional JSON body, 8 s timeout). |
| 🎛 **Live GUI** | Yew + Trunk single-page app for adding, editing, deleting rules. |
| 💾 **Persistent config** | Rules saved to a pretty-printed `keyhook.json` in the user-specific *app-config* directory. |
| 🪟 **Tray mode** | Runs in the system tray, auto-hides the main window, quit & show options. |
| 📜 **Structured logs** | `tracing` output to console with UTC timestamps and log-level filtering (`KEYHOOK_LOG`). |
| 📦 **Portable build** | One binary per OS (`tauri bundle`), no runtime dependencies apart from system webview. |
## 🕸 Architecture
```mermaid
graph LR
subgraph "KeyHook (Desktop App)"
GSL[Global Shortcut\nListener]
RE[Rule Engine]
HTTP[[HTTP Client]]
end
HTTP --> N8n[(n8n Workflow)]
HTTP --> Zapier[(Zapier)]
HTTP --> Script[(Custom Script)]
```