{"id":16345446,"url":"https://github.com/unclechu/hakey","last_synced_at":"2026-04-24T12:05:04.543Z","repository":{"id":66006963,"uuid":"230644115","full_name":"unclechu/HaKey","owner":"unclechu","description":"Software-level advanced keyboard customization tool","archived":false,"fork":false,"pushed_at":"2020-01-01T03:49:09.000Z","size":68,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-05-18T15:44:39.670Z","etag":null,"topics":["dhall","evdev","haskell","keyboard","keyboard-emulation","keyboard-layout","linux"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/unclechu.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":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-12-28T17:56:53.000Z","updated_at":"2023-08-03T19:22:26.000Z","dependencies_parsed_at":"2023-03-10T23:28:02.897Z","dependency_job_id":null,"html_url":"https://github.com/unclechu/HaKey","commit_stats":{"total_commits":7,"total_committers":1,"mean_commits":7.0,"dds":0.0,"last_synced_commit":"f3335dd2712ffcae0342dfc43960477e479492b6"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/unclechu/HaKey","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unclechu%2FHaKey","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unclechu%2FHaKey/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unclechu%2FHaKey/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unclechu%2FHaKey/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unclechu","download_url":"https://codeload.github.com/unclechu/HaKey/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unclechu%2FHaKey/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261073297,"owners_count":23105637,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["dhall","evdev","haskell","keyboard","keyboard-emulation","keyboard-layout","linux"],"created_at":"2024-10-11T00:31:48.648Z","updated_at":"2026-04-24T12:05:04.482Z","avatar_url":"https://github.com/unclechu.png","language":null,"readme":"# HaKey\n\n![HaKey logo](artwork/logo.svg.png)\n\nSoftware-level advanced keyboard customization tool.\n\n---\n\n**WARNING!** This project is in very early development stage!\n             Mostly documenting stuff…\n\n**HaKey** is **Ha**skell + **Key**board.\nThe round key cap on the logo is an allusion to a hockey puck,\njust because _“HaKey”_ and _“hockey”_ seem to sound similar.\n\nThis program (or a set of programs) is a continuation of\n[my another project][xlib-keys-hack].\n\n## Goals \u0026 Motivation\n\nThe general goal is to fix some issues of [xlib-keys-hack] project and to add\nnew features. [xlib-keys-hack] is very tied to my own requirements and in some\nparts not flexible enough so I want this tool to satisfy almost everyone else’s\nneeds.\n\nThe goals are (to make it to be…):\n\n- Relatively easy to use for almost any advanced user\n- Very flexible and configurable\n- Robust and stable\n\nThe motivation is to satisfy my own needs and requirements in a customizable\ngeneric way so this would be useful not only for me (as [xlib-keys-hack] project\nseems to be) but for everyone else.\n\n## Features\n\nThese features this tool is supposed to provide for everyone:\n\n- [ ] Input\n  - [ ] GNU/Linux \u0026 FreeBSD [evdev] devices\n    - [ ] Automated disabling input devices for [X Window System][X11]\n          (those which attached to [evdev] devices we’re reading raw\n          events from)\n    - [ ] Automated enabling back those input [X11] devices which have\n          been occupied by **HaKey** after its termination\n- [ ] Output\n  - [ ] [X11] [XTEST]\n  - [ ] [Wayland] libinput? (I don’t know how to deal with [Wayland] yet)\n- [ ] Input layer configurable layout\n  - [ ] Customizable mapping between raw [evdev] key numbers to virtual\n        source keys (like `16` is a `Q` key)\n  - [ ] Independent input layer mappings for different keyboards/[evdev]\n        devices\n- [ ] Output configurable layout\n  - [ ] Mapping between source keys and [X11] keys (for [XTEST] output)\n  - [ ] Mapping between source keys and [Wayland] keys (for [Wayland]\n        output)\n  - [ ] Independent output mappings for different keyboards/[evdev]\n        devices\n- [ ] Switchable layers (switchable by modifiers, togglers, whatever, in\n      [xlib-keys-hack] you can see two additional layers of so called\n      _alternative mode_), any amount of layers you want or just a single main\n      one\n- [ ] Shifted modifiers (being able to type `!` for instance by pressing a\n      single key, the tool would automatically trigger `Shift`+`1`)\n- [ ] Basic predefined output layouts\n  - [ ] [QWERTY]\n  - [ ] [Dvorak]\n  - [ ] [Programmer Dvorak]\n- [ ] Layer switch modes\n  - [ ] Toggle: key shared between to layers, toggle from one to another\n  - [ ] Switch: when you press a key layer switches to another layer\n  - [ ] Hold: layer is on as long as you hold a modifier key\n  - [ ] Tap toggle: you either hold a key for temporary switch or tap it to\n                    switch to that layer permanently\n  - [ ] Hold/Tap: independently configure tap and hold behavior\n  - [ ] Single: trigger a key from another layer only once after you tap a layer\n                switch key and than go back to layer you switched from\n  - [ ] First * (first toggle, first hold, first etc.):\n        It it's a first key pressed after all keys being released then it do a\n        layer switch action, if it's pressed after some other modifier being\n        held it could trigger another key (consider holding alt key first for\n        temporarily switching to alternative mode in [xlib-keys-hack] otherwise\n        it triggers regular alt key)\n- [ ] Combo/tap key mode, probably _\"Layer switch modes\"_ can be generalized for\n      this too, like to trigger Ctrl when you press Caps Lock with some another\n      key (when you press a key while holding Caps Lock) but when you tap Caps\n      Lock it may trigger Escape key or even original Caps Lock but until this\n      resolves to either combo or tap it triggers nothing, and when it resolves\n      to tap it immediately triggers _press_ and _release_ events sequently\n- [ ] Writing and playing macroses\n  - [ ] Play with intervals as you really typed\n  - [ ] Play with fixed interval\n  - [ ] Play without intervals (as fast as possible)\n- [ ] Store state of some modes\n  - [ ] Store _Num Lock_ state\n  - [ ] Store _Caps Lock_ state\n  - [ ] Store _Scroll Lock_ state\n  - [ ] Store _[XKB]_ layout state\n- [ ] Reset modes to _default state_\n  - [ ] Reset _Num Lock_ state\n  - [ ] Reset _Caps Lock_ state\n  - [ ] Reset _Scroll Lock_ state\n  - [ ] Reset _[XKB]_ layout state\n- [ ] DBus IPC\n  - [ ] Notify other clients about some modes\n    - [ ] _Num Lock_ state\n    - [ ] _Caps Lock_ state\n    - [ ] _Scroll Lock_ state\n    - [ ] _[XKB]_ layout state\n  - [ ] Reset modes (incoming API)\n  - [ ] Switch output layout layer to specific one (incoming API)\n  - [ ] Switch some modes to specific state (incoming API)\n    - [ ] _Num Lock_\n    - [ ] _Caps Lock_\n    - [ ] _Scroll Lock_\n    - [ ] _[XKB]_ layout\n- [ ] Send and receive events over network\n  - [ ] Support encryption to prevent key-logger attacks\n  - [ ] Warn user about unencrypted connection\n  - [ ] Hot connect/reconnect interface\n  - [ ] Deliver raw [evdev] events (map on receiver side)\n  - [ ] Deliver premapped keys (map on sender side)\n- [ ] Safe hot plug/unplug of devices\n- [ ] Automatically (re)connect to just plugged in device\n- [ ] Web-interface for configuring layouts and other parameters\n  - [ ] Optional export of your **HaKey** config as a [QMK] firmware setup\n        (to apply that config on hardware/firmware level, at least what's\n        possible, like layout with layers and modifiers/togglers)\n    - [ ] Test on ErgoDox EZ\n\n**WARNING!** This list is incomplete yet,\n             there will be more features described here!\n\n[evdev]: https://en.wikipedia.org/wiki/Evdev\n[X11]: https://en.wikipedia.org/wiki/X_Window_System\n[XTEST]: https://www.x.org/releases/X11R7.7/doc/libXtst/xtestlib.html\n[XKB]: https://en.wikipedia.org/wiki/X_keyboard_extension\n[Wayland]: https://en.wikipedia.org/wiki/Wayland_(display_server_protocol)\n[QWERTY]: https://en.wikipedia.org/wiki/QWERTY\n[Dvorak]: https://en.wikipedia.org/wiki/Dvorak_keyboard_layout\n[Programmer Dvorak]: https://en.wikipedia.org/wiki/Dvorak_keyboard_layout#Programmer_Dvorak\n[QMK]: https://github.com/qmk/qmk_firmware\n\n## Author\n\nViacheslav Lotsmanov\n\n### Creator of the logo\n\nViacheslav Lotsmanov\n\n## License\n\n### License for the code\n\n[GNU AGPLv3](LICENSE)\n\nGNU Affero General Public License  \nVersion 3, 19 November 2007\n\n#### Why this one\n\nUsing **AGPLv3** instead of just **GPLv3** because this tool may have web\ninterface for configuring keyboard layout in the future.\n\n### License for the logo\n\n[CC BY-SA 4.0]\n\nCreative Commons — Attribution-ShareAlike 4.0 International\n\n[CC BY-SA 4.0]: https://creativecommons.org/licenses/by-sa/4.0/\n[xlib-keys-hack]: https://github.com/unclechu/xlib-keys-hack\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funclechu%2Fhakey","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funclechu%2Fhakey","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funclechu%2Fhakey/lists"}