{"id":16174328,"url":"https://github.com/hellothisisflo/zmk-config","last_synced_at":"2026-01-20T18:56:00.691Z","repository":{"id":194210060,"uuid":"690441277","full_name":"HelloThisIsFlo/zmk-config","owner":"HelloThisIsFlo","description":null,"archived":false,"fork":false,"pushed_at":"2025-02-05T09:28:03.000Z","size":11504,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-13T12:54:03.292Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"HTML","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/HelloThisIsFlo.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":"2023-09-12T07:49:22.000Z","updated_at":"2025-02-05T09:28:07.000Z","dependencies_parsed_at":"2023-09-21T17:11:41.605Z","dependency_job_id":"2cfe708a-d42c-440a-9acd-5fa578955a20","html_url":"https://github.com/HelloThisIsFlo/zmk-config","commit_stats":{"total_commits":450,"total_committers":3,"mean_commits":150.0,"dds":"0.12888888888888894","last_synced_commit":"67d61e9033f116c28c9f77e95ce843599554db6d"},"previous_names":["hellothisisflo/zmk-config"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloThisIsFlo%2Fzmk-config","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloThisIsFlo%2Fzmk-config/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloThisIsFlo%2Fzmk-config/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloThisIsFlo%2Fzmk-config/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HelloThisIsFlo","download_url":"https://codeload.github.com/HelloThisIsFlo/zmk-config/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247631666,"owners_count":20970062,"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":[],"created_at":"2024-10-10T04:24:35.113Z","updated_at":"2026-01-20T18:56:00.676Z","avatar_url":"https://github.com/HelloThisIsFlo.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n# Flo's Magic ZMK Config\n\n## Structure\n- **`config`**: Contains almost everything\n  - See the `features` directory for a hierarchally organized list of features\n- **`Analysis`**: Bigram analysis used to find AKs (Adaptive Keys)\n\n## Alpha Layout: Naquadah\n\u003e **The driving question:** What if we built a layout that _required_ adaptive keys?\n\nNaquadah is a heavy variation of HandsDown Titanium, it's so modified as a matter of fact, it's practically unrecognizable.\nIts core principles are:\n- Adaptive Keys are **NOT** optional (this layout is useless without AKs)\n- It should feel like it \"flows\":\n  - Extremely low SFB: **0.082%** (See `sfb.py` in `Analysis/scripts`)\n  - Low Redirects (~\u003c2%)\n  - IN Rolls \u003e\u003e OUT Rolls\n  - The few SFBs left should ideally be on syllable breaks\n---\n### Naquadah and its 46 AKs\n_Note: This is designed for heavy colstag keyboards (Chocofi)_\n\n```\n\nNaquadah layout:\n================\n   w  m  p  k              /  .  -  =\nx                                      '\n   s  n  t  v              ,  a  e  i\nc                                      h\n   g  l  d  b              _  u  o  y\nf                                      j\n\n                r      ␣\n\nThe position of the special chars is still in flux (only . , ' are fixed)\n\nThe 46 accompanying AKs: (Note: This is RC2, it may evolve until the full release)\n============\n## SFB AKs ###################################\n\"A- =\u003e AU\" \n\"U- =\u003e UA\" \n\n\"E= =\u003e EO\" \n\"O= =\u003e OE\"  # Better than OH because of \"Oh! really?\"\n\n\"GF =\u003e GS\" \n\n\"LG =\u003e LL\" \n\"LX =\u003e LG\"  # To remove SFB caused by LG =\u003e LM (aLGorithm)\n\n\"NP =\u003e NN\"  # NP is rarely used in \"flow\", essentially mostly in \"input\". The rest is \"un-\" words\n\n\"MT =\u003e MN\" \n\"NX =\u003e NM\" \n\n\"PN =\u003e PD\"  # Essentially just for 'update'\n\n\"PC =\u003e PT\"  # Better that \"PN =\u003e PT\" because of 'M-\u003eP-\u003eT' (and 'P-\u003eT-\u003eS' remains doable relatively easily)\n\"CP =\u003e TP\"  # For 'ouTPut'\n\n\"SR =\u003e SW\" \n\"WX =\u003e WS\" \n\n\"YH =\u003e YI\"  # More comfortable than YJ =\u003e YI\n\"XS =\u003e XC\" \n\n\"WM =\u003e LM\" \n##############################################\n\n\n\n## IMPOSSIBLE Movements (on Chocofi) #########\n\"SX =\u003e SF\" \n\"MK =\u003e MB\" \n\"KM =\u003e BM\"  # Useful because of the \"MK =\u003e MB\" muscle memory\n\"PB =\u003e NB\"  # \u0026 Use alt-fingering\n##############################################\n\n\n## Comfort AKs ###############################\n\"DV =\u003e LV\" \n\"DK =\u003e LK\" \n\"VD =\u003e VL\" \n\"KD =\u003e KL\" \n\"DB =\u003e LB\" \n\"BD =\u003e BL\" \n\"DF =\u003e DV\"  # To remove SFB caused by DV =\u003e LV\n\n\n\"TV =\u003e NV\" \n\"VT =\u003e VN\" \n\n\"PG =\u003e PL\"  # For M-\u003eP-\u003eL, but also for regular P-\u003eL\n\"GP =\u003e LP\" \n\"KG =\u003e KL\" \n\"GK =\u003e LK\" \n\"BG =\u003e BL\"  # For M-\u003eB(k)-\u003eL\n##############################################\n\n\n## Repeat AKs ################################\n## Only for pinkies \u0026 ring fingers (skipped II because it's so rare)\n\"E. =\u003e EE\" \n\"FG =\u003e FF\" \n\"SD =\u003e SS\" \n\"BC =\u003e BB\" \n\"CG =\u003e CC\"  # CD would technically work, but it would make using the terminal a nightmare\n\"GC =\u003e GG\" \n\"PW =\u003e PP\"  # Not using PM because of 6PM, 7PM, ...\n\"MW =\u003e MM\" \n\"NW =\u003e NL\"  # On 'NW' instead of 'NP' to keep the more comfortable 'NP' move for 'NN' (and 'WNL' awkward for 'doWNLoad in one move anyway)\n\"O. =\u003e OO\"  # May need to increase the timing of adaptive keys to make this one more reliable\n\"RX =\u003e RR\" \n\"TG =\u003e TT\" \n\"DC =\u003e DD\" \n##############################################\n\n\n## Special Cases #############################\n\"hE. =\u003e hEI\"\n\"hEU =\u003e hEY\"\n##############################################\n```\n\n## Concepts\n_Many concepts are based on Alan's amazing work: [Hands Down Layouts](https://sites.google.com/alanreiser.com/handsdown/home/hands-down-neu)_\n\n\n### Adaptive Keys (Alan Reiser)\nKey behaving differently if pressed in quick successions. Virtually removes any remaining SFB\n- It works with a combination of layers, macros, and behaviors\n- It relies on the inner workings of the Macro queue implementation in ZMK\n  - Very reliable (no missed keys in more than a year), but\n    - It is sort of a hack\n    - There are some very minor caveats, [combo hack](config/features/hands_down/adaptive_keys/combos.dtsi), and some issues in very specific cases when using HRMs)\n    - Maintaining and debugging issues with this requires understading the inner workings of ZMK\n    - Eventually I'd may implement this in ZMK directly, but for now this has worked flawlessly so I'm keeping it as is.\n  - That being said, it works, and it works well (tested on burst words at 200wpm+)\n\n\u003cbr/\u003e\n\n### Callum Style Mods (Callum)\nAfter using HRMs for about a year, and tweaking everything I could tweak about it I felt it was a bottleneck. I had always looked down on Callum style mods until .... I actually tried it 😅. It's been love at first sight.\n- One shot mods\n- On tap, they chain and stack up\n- On hold, they act as regular mods. With a special feature in ZMK to enable the mod being pressed while tap/hold is decided (useful for mouse actions)\n- The mods layer (action layer) stay active for a few milliseconds after releasing\n  - This is to ensure the correct tap/hold resolution\n  - It guarantees we never have to think about the timing.\n  - As long as the order is correct, it will work as expected\n    - Correct order: \n      - Mod Layer Press -\u003e Mod 1 -\u003e Mod 2 -\u003e Mod Layer Release \n      - Mod Layer Press -\u003e Mod 1 -\u003e Mod 2 press -\u003e Mod Layer Release -\u003e Mod 2 release\n      - ...\n    - Incorrect order:\n      - Mod Layer Press -\u003e Mod 1 -\u003e Mod Layer Release -\u003e Mod 2 press \u0026 release\n      - ...\n        \n\u003cbr/\u003e\n\n### Other\n- **Switch Device**: Switch the device and uses the associated layer\n- **Linger Keys (Alan Reiser)**: Does 2 different action on short tap vs hold. Essentially a tap-hold.\n- **Magic parenthesis**: One combo does 4 different types of parenthesis\n  - Depends on how long it's held and whether or not it's shifted\n- And probably more ...\n\n\n# Layout\nTODO: Fix visualization\n![3x5 layout](./keymap-drawer/corne.svg)\n\n\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\u003cbr/\u003e\n\n---\n#### Note to self\n\n- Try urob's timeless HRMs (?): https://www.reddit.com/r/ErgoMechKeyboards/comments/11gejh3/lpt_try_urobs_zmk_timeless_homerow_mods_combos/  \n(and other small features)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhellothisisflo%2Fzmk-config","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhellothisisflo%2Fzmk-config","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhellothisisflo%2Fzmk-config/lists"}