{"id":26222244,"url":"https://github.com/walles/keystats-collector","last_synced_at":"2026-04-19T21:37:52.666Z","repository":{"id":149403342,"uuid":"111110949","full_name":"walles/keystats-collector","owner":"walles","description":"Store keystrokes count in a file","archived":false,"fork":false,"pushed_at":"2019-01-23T14:44:41.000Z","size":27,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-12-28T09:53:33.766Z","etag":null,"topics":["ergonomics","keylogger","keylogger-analysis"],"latest_commit_sha":null,"homepage":null,"language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/walles.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2017-11-17T14:13:09.000Z","updated_at":"2022-02-23T01:29:48.000Z","dependencies_parsed_at":"2023-09-03T22:02:40.002Z","dependency_job_id":null,"html_url":"https://github.com/walles/keystats-collector","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/walles/keystats-collector","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fkeystats-collector","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fkeystats-collector/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fkeystats-collector/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fkeystats-collector/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/walles","download_url":"https://codeload.github.com/walles/keystats-collector/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walles%2Fkeystats-collector/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32024245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"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":["ergonomics","keylogger","keylogger-analysis"],"created_at":"2025-03-12T16:51:38.608Z","updated_at":"2026-04-19T21:37:52.651Z","avatar_url":"https://github.com/walles.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Keystats Collector\nStore keystrokes count in `~/.keystats.json`.\n\nThe point is that I want to know which keys I type the most, to draw conclusions\nabout which kind of keyboard I should have and what layout would be useful or\nnot.\n\n[See below](#instructions) for how to conduct this experiment for yourself.\n\n# Conclusions\n**TL;DR:** Get yourself [an ErgoDox EZ keyboard](https://ergodox-ez.com/) with\n[silent switches](https://www.cherrymx.de/en/products/mx-silent-red.html). I got\none for myself, and I'm using [this\nconfiguration](http://configure.ergodox-ez.com/keyboard_layouts/kpxxya/edit).\n\nThis is based on two criteria:\n* **I want to reach all of my top 50% keys (not keystrokes) without moving /\nrotating my hands.**\n* **I want a keyboard that is quiet enough not to annoy my peers when I'm\nworking.**\n\nAccording to my collected stats from work I press 70 different keys.\n\nThe below table lists my top 50% keystrokes excluding letters (because all\nletters are reachable on all keyboards, so including them would just make the\ntable larger). It also lists whether I can comfortably type these keys without\nmoving or rotating my hands on different keyboards:\n\n | | [MacBook keyboard](https://www.replacementlaptopkeys.com/product_images/uploaded_images/touchbar-macbook-pro-2nd-gen-butterfly-keyboard-keys.jpg) | [Kinesis Advantage2](https://www.kinesis-ergo.com/shop/advantage2/) / [ErgoDox](https://www.ergodox.io/) |\n |--------------|--------------------|--------------------------------|\n | Space        | :white_check_mark: | :white_check_mark:             |\n | Backspace    | :arrows_counterclockwise: Needs rotation | :white_check_mark:             |\n | Return       | :arrows_counterclockwise: Needs rotation | :white_check_mark:             |\n | Shift        | :white_check_mark: | :white_check_mark:             |\n | Arrow keys   | :x:                | :white_check_mark:             |\n | Command      | :white_check_mark: | :white_check_mark:             |\n | Period       | :white_check_mark: | :white_check_mark:             |\n | Tab          | :white_check_mark: | :white_check_mark:             |\n\nErgoDox and the Kinesis Advantage2 get to share a column since their layouts are\nalmost identical.\n\nSo the choice is between the ErgoDox and the Kinesis Advantage2.\n\n## Kinesis Advantage2\nI have used the Kinesis Advantage2 and its predecessor the Ergo Elan for 10+\nyears and I really love them. However, my colleagues have noted the keyboard's\nnoisiness.\n\nWhen I asked Kinesis (November 2017) whether I could get one with silent switches, they said that:\n\u003e At this point we do not plan to start offering any other type of key switch. If we were to start seeing a high demand for these new switches, we may reconsider at that time.\n\nSo no silent Kinesis Advantage2 for me.\n\n## ErgoDox\n\"ErgoDox\" is just [a keyboard spec](https://www.ergodox.io/), but I want to\n*buy* a keyboard, not build one.\n\nI found two suppliers of pre-built ErgoDox keyboards, and in December 2017 here\nare their offerings:\n\n|                      | [ErgoDox EZ](https://ergodox-ez.com/pages/customize) | [FalbaTech](https://falba.tech/product-category/shop-by-category/) |\n|----------------------|------------|-----------|\n| Nordic Keycaps       | :x:        | :x:       |\n| English Keycaps      | :white_check_mark: | :x: |\n| Silent Switches      | :white_check_mark: | :x: |\n| Built-in Wrist Rests | :x:        | :white_check_mark: |\n\nAnd since the silencing part is why I got into this in the first place, the\n[ErgoDox EZ](https://ergodox-ez.com/) is my only option.\n\nThat said, if the\n[FalbaTech](https://falba.tech/product-category/shop-by-category/) offering had\ncome with silent switches and at least English keycaps (they only offered blank\nones when I checked) I would have preferred them; I really do like their options\nfor cases with built in wrist support.\n\nWith the ErgoDox EZ I can [pick my own\nswitches](https://ergodox-ez.com/pages/customize), and one of the options is\nthe [Silent Red](https://www.cherrymx.de/en/products/mx-silent-red.html). This\nshould make my peers happier.\n\nThe downside for me with the ErgoDox EZ is that it's currently (November 2017)\nnot available with Nordic keycaps, so I may have to get the keycaps elsewhere,\nor just steal them from my to-be-replaced Advantage2.\n\n[The ErgoDox seems to be popular in Sweden\nthough](https://trends.google.se/trends/explore?date=all\u0026q=ergodox#GEO_MAP), and\nI did mention that to the ErgoDox EZ people so we'll see what happens :).\n\n## Conclusion\nThe conclusion given the above data is that the ErgoDox EZ keyboard is my only\noption.\n\n# Instructions\nIf you want to try for yourself.\n\nOnce you're up and running it works really well, but getting there isn't\namazingly simple, patches welcome.\n* `git clone git@github.com:walles/keystats-collector.git`\n* `cd keystats-collector`\n* `open \"Keystats Collector.xcodeproj/\"`\n* In Xcode, press `shift`-`command`-`R` to build without launching\n* Quit Xcode\n* `open ~/Library/Developer/Xcode/DerivedData/Keystats_Collector-*/Build/Products/Debug/Keystats\\ Collector.app`\n* Give the Keystats Collector Universal Access in the security questionnaire\n* Quit the Keystats Collector\n* Start the Keystats Collector again\n\nKeyboard statistics should now be available in `~/keystats.json`. As long as the\napp is running, this file will be continuously updated.\n\nFor a toplist, run `./toplist.sh`, or `watch ./toplist.sh`.\n\n## Future\n* Add chords to the JSON file. This could help you figure out if you're commonly\nusing the wrong SHIFT key for example, or how to configure your ErgoDox layout.\n* Visualize the contents of that JSON file using \u003chttps://github.com/pa7/Keyboard-Heatmap\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalles%2Fkeystats-collector","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwalles%2Fkeystats-collector","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalles%2Fkeystats-collector/lists"}