-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcatalog.json
More file actions
1258 lines (1258 loc) · 329 KB
/
Copy pathcatalog.json
File metadata and controls
1258 lines (1258 loc) · 329 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
[
{
"uid": "Fn_combos",
"title": "Function keys on Go60",
"subtitle": "Adds Fn Key Combos",
"description": "Adds easy-to-reach F1–F12 keys to your Go60 using simple vertical key combos.\nPress a number key together with the key directly below it to trigger function keys instantly.\nKeeps your layout compact while giving you fast access to shortcuts, media controls, IDE commands, and more.\nPerfect for users who want full function-row power without sacrificing desk space or portability.\n\n⚠️ Image does not match for F12. see F12 combo in the MoErgo Layout Editor",
"script": "# Moosy’s Playground Marketplace\n# AUTOMATION: Go60 Vertical Function Row (F1-F12) Combos\n# VERSION: 1.0 (01/01/2026)\n# TARGET: [v] Go60 [X] Glove80\n#\n# DESCRIPTION:\n# Injects 12 vertical combos for the Go60 hardware matrix.\n# Chords the Number Row (1-12) with the QWERTY Row (13-24).\n#\n# VISUAL MAPPING (Go60 Physical Indices):\n#\n# [01][02][03][04][05][06][07][08][09][10][11][12] <-- Number Row\n# + + + + + + + + + + + +\n# [13][14][15][16][17][18][19][20][21][22][23][24] <-- QWERTY Row\n# || || || || || || || || || || || ||\n# [F1][F2][F3][F4][F5][F6][F7][F8][F9][F10][F11][F12]\n###############################################################################\n\n# 1. ROOT-AGNOSTIC ENTRY\n# Ensures compatibility whether the JSON is raw or wrapped in a .keymap object.\n(if .keymap then .keymap else . end) |= (\n\n # 2. HARDWARE VALIDATION\n # Prevents index corruption if run against a Glove80 or unknown board.\n if .keyboard == \"go60\" then\n\n # 3. PRE-FLIGHT CHECK\n # Ensure .combos array exists to avoid null-addition errors.\n .combos //= [] |\n\n # 4. ATOMIC COMBO GENERATION\n .combos += [\n range(1; 13) | . as $idx |\n {\n \"name\": \"F\\($idx)_vertical_combo\",\n \"description\": \"Auto-generated: F\\($idx) via Col \\($idx) vertical chord\",\n\n # UI-COMPLIANT BINDING (Recursive Object Pattern)\n \"binding\": {\n \"value\": \"&kp\",\n \"params\": [\n {\n \"value\": \"F\\($idx)\",\n \"params\": []\n }\n ]\n },\n\n # HARDWARE COORDINATES\n \"keyPositions\": [$idx, ($idx + 12)],\n\n # REASONABLE DEFAULTS\n \"timeoutMs\": 50,\n \"layers\": [-1] # Global availability\n }\n ]\n\n else\n\n # 5. GRACEFUL EXIT\n # Provide feedback if this script is run on the wrong hardware.\n stderr\n | \"Warning: Automation skipped. Hardware '\\(.keyboard)' is not supported.\"\n\n end\n)",
"category": "Special keys",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60"
],
"icon": "🎹"
},
"config": {
"category": "Special keys",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/Fn_combos.png"
},
{
"uid": "os_remap",
"title": "🍏 Remap to/from macOS",
"subtitle": "Swap modifier: macOS/Win",
"description": "Seamlessly switch your keyboard between macOS and Windows by making shortcuts behave the way you expect on both systems.\n\nRemaps all Ctrl and Cmd/GUI modifiers across your entire keyboard layout.\nThis includes LCTRL ↔ LGUI, RCTRL ↔ RGUI, as well as LC() ↔ LG() and RC() ↔ RG() style bindings, including nested behaviors.\nKeeps familiar shortcuts like Copy, Paste, Undo, and Redo working naturally across both operating systems.\nApplies globally to all layers and custom key behaviors, so you can switch platforms without relearning muscle memory.",
"script": "# 1. The Bi-directional Swap Map\ndef get_replacements: {\n \"LCTRL\": \"LGUI\",\n \"RCTRL\": \"RGUI\",\n \"LGUI\": \"LCTRL\",\n \"RGUI\": \"RCTRL\",\n \"LC\": \"LG\",\n \"RC\": \"RG\",\n \"LG\": \"LC\",\n \"RG\": \"RC\"\n};\n\n# 2. The Universal Walker\n# This targets every object with a 'value' key anywhere in the file\ndef for_every_binding(f):\n (.. | objects | select(has(\"value\"))) |= f;\n\n# PASS 1: The Specific LC(Y) Exception\n# Using a structural check to catch nested LC -> Y\ndef pass_1_exception:\n if .value == \"LC\" and (.params[0].value == \"Y\") then\n .value = \"LG\"\n | .params[0] = {\n \"value\": \"LS\",\n \"params\": [{ \"value\": \"Z\", \"params\": [] }]\n }\n else . end;\n\n# PASS 2: The Global Recursive Modifier Swap\ndef pass_2_swap($r):\n\n # Protect the result of Pass 1 from being swapped back\n if .value == \"LG\"\n and .params[0].value == \"LS\"\n and .params[0].params[0].value == \"Z\"\n then\n .\n\n else\n .value |= (\n if type == \"string\" then\n if startswith(\"LC(\") then sub(\"LC\\\\(\"; \"LG(\")\n elif startswith(\"LG(\") then sub(\"LG\\\\(\"; \"LC(\")\n elif startswith(\"RC(\") then sub(\"RC\\\\(\"; \"RG(\")\n elif startswith(\"RG(\") then sub(\"RG\\\\(\"; \"RC(\")\n else ($r[.] // .)\n end\n else .\n end\n )\n end;\n\n# --- EXECUTION ---\nget_replacements as $r |\nfor_every_binding(pass_1_exception) |\nfor_every_binding(pass_2_swap($r))",
"category": "macOS",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🍎",
"theme": "green"
},
"config": {
"category": "macOS",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/OS_remap.png"
},
{
"uid": "alt_layout",
"title": "Alternative Layouts",
"subtitle": "Pre-selected list",
"description": "This will change your keyboard layout to an alternative to the QWERTY layout.\n\n- Easily switch to another alt.layouts such as Colemak-DH, Aptmak Blue, and Enthium or other.\n\n- Keeps these layers out of scope: Gaming, Numbers, Navigation, Media, Keypad, Mouse, and Magic.\n\n⚠️ **Notes:**\n\n- Thumb-letter mappings are left for manual setup so you can keep full control of your thumb keys.\n\n- If you use Bilateral HRM, please use the preferred [QWERTY Swap tool](https://sites.google.com/view/tailorkey/moergo/qwerty_swap), It is **proven and thoroughly tested.**",
"script": "# ==========================================\n# SETTINGS\n# ==========================================\n\ntrue as $all_layers |\n[\"Gaming\",\"Numbers\",\"Navigation\",\"Media\",\"Keypad\",\"Mouse\",\"Magic\"] as $excluded |\n\n############################################\n# 1. DATA DEFINITIONS\n############################################\n\ndef layouts: \n{\n \"aptmak\": [\"\", \"V\", \"W\", \"F\", \"P\", \"B\", \"J\", \"L\", \"U\", \"Y\", \"SQT\", \"\", \"\", \"R\", \"S\", \"T\", \"H\", \"K\", \"X\", \"N\", \"A\", \"I\", \"O\", \"\", \"\", \"C\", \"G\", \"D\", \"M\", \"COMMA\", \"DOT\", \"FSLH\", \"SEMI\", \"Z\", \"Q\", \"\"],\n \"aptmak_blue\": [\"\", \"Q\", \"J\", \"U\", \"L\", \"SEMI\", \"B\", \"P\", \"F\", \"W\", \"X\", \"BSLH\", \"ESC\", \"A\", \"O\", \"I\", \"N\", \"Y\", \"K\", \"H\", \"T\", \"S\", \"R\", \"SQT\", \"\", \"Z\", \"DOT\", \"COMMA\", \"M\", \"E\", \"V\", \"D\", \"G\", \"C\", \"FSLH\", \"\"],\n \"azerty\": [\"\", \"A\", \"Z\", \"E\", \"R\", \"T\", \"Y\", \"U\", \"I\", \"O\", \"P\", \"\", \"\", \"Q\", \"S\", \"D\", \"F\", \"G\", \"H\", \"J\", \"K\", \"L\", \"M\", \"\", \"\", \"W\", \"X\", \"C\", \"V\", \"B\", \"N\", \"M\", \"COMMA\", \"DOT\", \"FSLH\", \"\"],\n \"canary\": [\"\", \"W\", \"L\", \"Y\", \"P\", \"B\", \"Z\", \"F\", \"O\", \"U\", \"SQT\", \"\", \"\", \"C\", \"R\", \"S\", \"T\", \"G\", \"M\", \"N\", \"E\", \"I\", \"A\", \"\", \"\", \"Q\", \"J\", \"V\", \"D\", \"K\", \"X\", \"H\", \"FSLH\", \"COMMA\", \"DOT\", \"\"],\n \"colemak-dh\": [\"\", \"Q\", \"W\", \"F\", \"P\", \"B\", \"J\", \"L\", \"U\", \"Y\", \"SEMI\", \"\", \"\", \"A\", \"R\", \"S\", \"T\", \"G\", \"M\", \"N\", \"E\", \"I\", \"O\", \"\", \"\", \"Z\", \"X\", \"C\", \"D\", \"V\", \"K\", \"H\", \"COMMA\", \"DOT\", \"FSLH\", \"\"],\n \"dvorak\": [\"\", \"SQT\", \"COMMA\", \"DOT\", \"P\", \"Y\", \"F\", \"G\", \"C\", \"R\", \"L\", \"\", \"\", \"A\", \"O\", \"E\", \"U\", \"I\", \"D\", \"H\", \"T\", \"N\", \"S\", \"\", \"\", \"SEMI\", \"Q\", \"J\", \"K\", \"X\", \"B\", \"M\", \"W\", \"V\", \"Z\", \"\"],\n \"engram\": [\"\", \"B\", \"Y\", \"O\", \"U\", \"SQT\", \"DQT\", \"L\", \"D\", \"W\", \"V\", \"Z\", \"\", \"C\", \"I\", \"E\", \"A\", \"COMMA\", \"DOT\", \"H\", \"T\", \"S\", \"N\", \"Q\", \"\", \"G\", \"X\", \"J\", \"K\", \"MINUS\", \"QMARK\", \"R\", \"M\", \"F\", \"P\", \"\"],\n \"engrammer\": [\"\", \"B\", \"Y\", \"O\", \"U\", \"SQT\", \"SEMI\", \"L\", \"D\", \"W\", \"V\", \"Z\", \"\", \"C\", \"I\", \"E\", \"A\", \"COMMA\", \"DOT\", \"H\", \"T\", \"S\", \"N\", \"Q\", \"\", \"G\", \"X\", \"J\", \"K\", \"MINUS\", \"FSLH\", \"R\", \"M\", \"F\", \"P\", \"\"],\n \"enthium_v13\": [\"\", \"Q\", \"Y\", \"O\", \"U\", \"EQUAL\", \"X\", \"L\", \"D\", \"P\", \"Z\", \"\", \"B\", \"C\", \"I\", \"E\", \"A\", \"MINUS\", \"K\", \"H\", \"T\", \"N\", \"S\", \"W\", \"\", \"SQT\", \"COMMA\", \"DOT\", \"FSLH\", \"SEMI\", \"J\", \"M\", \"G\", \"F\", \"V\", \"\"],\n \"enthium_v14\": [\"\", \"Q\", \"Y\", \"O\", \"U\", \"EQUAL\", \"X\", \"L\", \"D\", \"P\", \"Z\", \"\", \"B\", \"C\", \"I\", \"A\", \"E\", \"MINUS\", \"K\", \"H\", \"T\", \"N\", \"S\", \"W\", \"\", \"SQT\", \"COMMA\", \"DOT\", \"SEMI\", \"FSLH\", \"J\", \"M\", \"G\", \"F\", \"V\", \"\"],\n \"gallium\": [\"\", \"B\", \"L\", \"D\", \"C\", \"V\", \"J\", \"F\", \"O\", \"U\", \"COMMA\", \"\", \"\", \"N\", \"R\", \"T\", \"S\", \"G\", \"Y\", \"H\", \"A\", \"E\", \"I\", \"\", \"\", \"X\", \"Q\", \"M\", \"W\", \"Z\", \"K\", \"P\", \"SQT\", \"SEMI\", \"DOT\", \"\"],\n \"graphite\": [\"\", \"B\", \"L\", \"D\", \"W\", \"Z\", \"SQT\", \"F\", \"O\", \"U\", \"J\", \"\", \"\", \"N\", \"R\", \"T\", \"S\", \"G\", \"Y\", \"H\", \"A\", \"E\", \"I\", \"\", \"\", \"Q\", \"X\", \"M\", \"C\", \"V\", \"K\", \"P\", \"DOT\", \"COMMA\", \"FSLH\", \"\"],\n \"hands-down-neu\": [\"\", \"W\", \"F\", \"M\", \"P\", \"V\", \"FSLH\", \"DOT\", \"Q\", \"DQT\", \"SQT\", \"Z\", \"\", \"R\", \"S\", \"N\", \"T\", \"B\", \"COMMA\", \"A\", \"E\", \"I\", \"H\", \"J\", \"\", \"X\", \"C\", \"L\", \"D\", \"G\", \"MINUS\", \"U\", \"O\", \"Y\", \"K\", \"\"],\n \"maltron\": [\"\", \"Q\", \"P\", \"Y\", \"C\", \"B\", \"V\", \"M\", \"U\", \"Z\", \"L\", \"\", \"\", \"A\", \"N\", \"S\", \"I\", \"F\", \"D\", \"T\", \"H\", \"O\", \"R\", \"\", \"\", \"COMMA\", \"DOT\", \"J\", \"G\", \"SEMI\", \"FSLH\", \"W\", \"K\", \"MINUS\", \"X\", \"\"],\n \"qwerty\": [\"\", \"Q\", \"W\", \"E\", \"R\", \"T\", \"Y\", \"U\", \"I\", \"O\", \"P\", \"\", \"\", \"A\", \"S\", \"D\", \"F\", \"G\", \"H\", \"J\", \"K\", \"L\", \"SEMI\", \"\", \"\", \"Z\", \"X\", \"C\", \"V\", \"B\", \"N\", \"M\", \"COMMA\", \"DOT\", \"FSLH\", \"\"],\n \"workman\": [\"\", \"Q\", \"D\", \"R\", \"W\", \"B\", \"J\", \"F\", \"U\", \"P\", \"SEMI\", \"\", \"\", \"A\", \"S\", \"H\", \"T\", \"G\", \"Y\", \"N\", \"E\", \"O\", \"I\", \"\", \"\", \"Z\", \"X\", \"M\", \"C\", \"V\", \"K\", \"L\", \"COMMA\", \"DOT\", \"FSLH\", \"\"]\n};\n\ndef keyboards: {\n \"glove80\": {\n \"ids\": [\n \"22\",\"23\",\"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\n \"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\n \"46\",\"47\",\"48\",\"49\",\"50\",\"51\",\"58\",\"59\",\"60\",\"61\",\"62\",\"63\"\n ],\n \"hrm\": [\"34\",\"35\",\"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\"]\n },\n\n \"go60\": {\n \"ids\": [\n \"12\",\"13\",\"14\",\"15\",\"16\",\"17\",\"18\",\"19\",\"20\",\"21\",\"22\",\"23\",\n \"24\",\"25\",\"26\",\"27\",\"28\",\"29\",\"30\",\"31\",\"32\",\"33\",\"34\",\"35\",\n \"36\",\"37\",\"38\",\"39\",\"40\",\"41\",\"42\",\"43\",\"44\",\"45\",\"46\",\"47\"\n ],\n \"hrm\": [\"25\",\"26\",\"27\",\"28\",\"31\",\"32\",\"33\",\"34\"]\n }\n};\n\n############################################\n# 2. PREPARATION\n############################################\n\n# Determine Keyboard Type\n((.keymap.layers[0] // .layers[0]) | if type == \"array\" then length else .bindings | length end) as $count |\n(if .keyboard then .keyboard elif $count > 70 then \"glove80\" else \"go60\" end) as $kb_type |\n(keyboards[$kb_type]) as $cfg |\n\n# Load Selected Layout\n(layouts[$layout_name]) as $layout |\n\n# Build the Remap Dictionary (ID -> New Key)\n(\n reduce range(0;36) as $i (\n {};\n if ($layout[$i] != \"\" and $cfg.ids[$i] != null)\n then . + {($cfg.ids[$i]): $layout[$i]}\n else . end\n )\n) as $remap |\n\n# Identify layers to skip based on $excluded list\n(\n (.layer_names // .keymap.layer_names // []) |\n to_entries |\n map(select(.value as $v | $excluded | map(ascii_downcase) | contains([$v | ascii_downcase]))) |\n map(.key)\n) as $skip_list |\n\n############################################\n# 3. PROCESSING\n############################################\n\n(.keymap.layers // .layers) |= (\n to_entries | map(\n .key as $idx | .value as $layer |\n\n # Check if layer is eligible for remapping\n ($idx == 0 or ($all_layers and ([$skip_list[] == $idx] | any | not))) as $eligible |\n\n if $eligible then\n\n ($layer | if type == \"array\" then . else .bindings end) as $bindings |\n\n # Determine if layer is Alpha-Heavy (2+ alphas on HRM positions)\n ([\n $bindings | to_entries[] |\n select(.key|tostring as $k | $cfg.hrm | contains([$k])) |\n .value | .. | strings? | select(test(\"^[A-Z]$\"))\n ] | length >= 2) as $is_alpha_layer |\n\n if ($idx == 0 or $is_alpha_layer) then\n\n # Internal function to perform the swap per key position\n def do_swap($pos):\n $remap[$pos|tostring] as $new_val |\n if $new_val then\n walk(\n if type == \"string\" and\n (test(\"^[A-Z]$\") or test(\"EQUAL|MINUS|SQT|FSLH|SEMI|COMMA|DOT|LBKT|RBKT|GRAVE|BSLH\")) and\n (test(\"LSHIFT|RSHIFT|LCTRL|RCTRL|LALT|RALT|LGUI|RGUI\") | not)\n then $new_val\n else .\n end\n )\n else .\n end;\n\n # Apply swap to array or object-based bindings\n if ($layer | type == \"array\") then\n [ range(0;$layer|length) as $i | $layer[$i] | do_swap($i) ]\n else\n $layer | .bindings |= [ range(0;. | length) as $i | .[$i] | do_swap($i) ]\n end\n\n else $layer end\n else $layer end\n )\n)",
"category": "QWERTY Alternatives",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🔠",
"theme": "yellow"
},
"config": {
"script": "\""
},
"param": [
{
"id": "layout_name",
"label": "Target Layout",
"type": "select",
"options": [
"aptmak",
"aptmak_blue",
"azerty",
"canary",
"colemak-dh",
"dvorak",
"engram",
"engrammer",
"enthium_v13",
"enthium_v14",
"gallium",
"graphite",
"hands-down-neu",
"maltron",
"qwerty",
"workman"
],
"default": "colemak-dh"
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/alt_layout.png"
},
{
"uid": "autoshift",
"title": "Autoshift",
"subtitle": "Adds the Autoshift Layer",
"description": "Autoshift lets one key type two characters based on how long you press it.\nTap the key to type the normal character (like a).\nHold the key a bit longer to type the shifted character (like A). [Watch video](https://youtu.be/S9MSCUjT1MA)\n\nHow it works:\nAutoshift does nothing until you switch to the Autoshift layer. \n1. Generates an AutoShift layer based on your Base Layer0, so it works with any layout, not just QWERTY.\n2. Create Behaviors &AS_v1_TKZ, &AS_Shifted_v1_TKZ, and &AS_HT_v2_TKZ\n\n🚩 **To enable the Autoshift layer:** add a layer switch key (&to, &tog, or &layer), or set the Autoshift layer as the base layer (layer 0).",
"script": "# ==============================================================================\n# 1. HELPERS & SAFETY SHIELDS\n# ==============================================================================\n\n# Check if a key is a valid candidate for AutoShift (A-Z or N0-N9)\ndef is_autoshift_candidate($val):\n ($val | type == \"string\") and (\n ($val | test(\"^[A-Z]$\")) or # Alpha keys\n ($val | test(\"^N[0-9]$\")) # Number row (N1, N2, etc.)\n );\n\n# Safely extracts the base key code regardless of nesting depth\ndef get_char_node:\n if type == \"object\" then\n (.params[1] // .params[0] // { \"value\": \"NONE\", \"params\": [] })\n elif type == \"string\" then\n { \"value\": ., \"params\": [] }\n else\n { \"value\": \"NONE\", \"params\": [] }\n end;\n\n# ==============================================================================\n# 2. BEHAVIOR DEFINITIONS\n# ==============================================================================\n\ndef get_as_macros: [\n {\n \"name\": \"&AS_Shifted_v1_TKZ\",\n \"description\": \"AutoShift: Shifted State\",\n \"bindings\": [\n {\"value\":\"¯o_press\",\"params\":[]},\n {\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\",\"params\":[]}]},\n {\"value\":\"¯o_tap\",\"params\":[]},\n {\"value\":\"¯o_param_1to1\",\"params\":[]},\n {\"value\":\"&kp\",\"params\":[{\"value\":\"N1\",\"params\":[]}]},\n {\"value\":\"¯o_release\",\"params\":[]},\n {\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\",\"params\":[]}]}\n ],\n \"params\": [\"code\"]\n },\n {\n \"name\": \"&AS_v1_TKZ\",\n \"description\": \"AutoShift: Main Entry\",\n \"waitMs\": 10, \"tapMs\": 10,\n \"bindings\": [\n {\"value\":\"¯o_press\",\"params\":[]},\n {\"value\":\"¯o_param_1to1\",\"params\":[]},\n {\"value\":\"¯o_param_1to2\",\"params\":[]},\n {\"value\":\"&AS_HT_v2_TKZ\",\"params\":[{\"value\":\"A\",\"params\":[]},{\"value\":\"A\",\"params\":[]}]},\n {\"value\":\"¯o_pause_for_release\",\"params\":[]},\n {\"value\":\"¯o_release\",\"params\":[]},\n {\"value\":\"¯o_param_1to1\",\"params\":[]},\n {\"value\":\"¯o_param_1to2\",\"params\":[]},\n {\"value\":\"&AS_HT_v2_TKZ\",\"params\":[{\"value\":\"A\",\"params\":[]},{\"value\":\"A\",\"params\":[]}]}\n ],\n \"params\": [\"code\"]\n }\n];\n\ndef get_as_holdtap: {\n \"name\": \"&AS_HT_v2_TKZ\",\n \"description\": \"AutoShift: Engine\",\n \"bindings\": [\"&AS_Shifted_v1_TKZ\", \"&kp\"],\n \"tappingTermMs\": 190,\n \"flavor\": \"tap-preferred\"\n};\n\n# ==============================================================================\n# 3. MAIN ENGINE (Root Object Context)\n# ==============================================================================\n\n# Step 1: Capture base layer info from the root\n(.keymap.layers[0] // .layers[0]) as $base_layer |\n($base_layer | length) as $key_count |\n\n# Step 2: Perform transformation on the keymap branch\n(.keymap // .) |= (\n \n # Inject Behaviors\n .macros = ([.macros // [], get_as_macros] | flatten | unique_by(.name)) |\n .holdTaps = ([.holdTaps // [], [get_as_holdtap]] | flatten | unique_by(.name)) |\n\n # Identify/Create Autoshift Layer\n (.layer_names | index(\"Autoshift\") // (. | length)) as $as_idx |\n .layer_names[$as_idx] = \"Autoshift\" |\n .creator = \"moosy\" |\n\n # Build the layer mapping\n .layers[$as_idx] = [\n range($key_count) as $i |\n $base_layer[$i] as $k |\n (if ($k | type == \"object\") then ($k.params[0].value // \"\") else ($k | tostring) end) as $val |\n\n if ($k.value == \"&kp\" or ($k | type == \"string\" and startswith(\"&kp \"))) and is_autoshift_candidate($val) then\n {\n \"value\": \"&AS_v1_TKZ\",\n \"params\": [\n {\n \"value\": $val, \n \"params\": (if ($k | type == \"object\") then ($k.params[0].params // []) else [] end)\n }\n ]\n }\n else\n {\"value\": \"&trans\", \"params\": []}\n end\n ]\n) \n# The final result is the modified root object, containing layout, env, and config.",
"category": "Autoshift",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "⇧",
"theme": "yellow"
},
"config": {
"category": "Autoshift",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/autoshift.png"
},
{
"uid": "colors_createRGBscheme",
"title": "PR36 RGB Scheme",
"subtitle": "Generate from key decorators",
"description": "PR36 is community firmware that adds support for per key RGB. [Learn more](https://sites.google.com/view/tailorkey/how-to/rgb)\n\nThis package automatically generates the RGB scheme for PR36 based on your Layout Editor key decorations.\n\nIt effectively does the same job as [Kiilix Studio](https://sites.google.com/view/kiilix/), but in a lightweight flow package.\n\n\n⚠️ **WARNING:** THIS OVERWRITES THE COMPLETE DEVICE TREE CONTENT",
"script": "(if .keymap then .keymap else . end) |= (\n\n # --- VALIDATION: Check basic structure ---\n if type != \"object\" then error(\"Invalid input: Expected a JSON object.\") else . end |\n if .layers == null then error(\"Invalid input: Missing '.layers' array.\") else . end |\n\n .keyboard as $kb |\n .layer_names as $names |\n\n # --- VALIDATION: Supported Keyboard Check ---\n (if ($kb != \"glove80\" and $kb != \"go60\") then\n error(\"Unsupported keyboard: '\\($kb // \"null\")'. Supported keyboards are 'glove80' and 'go60'.\")\n else . end) |\n\n # 1. Extract Unique Colors (with Safe Hex Validation)\n ([ .layers[][].decoration?.background? // empty\n | select(type == \"string\" and . != \"\")\n | ascii_upcase\n | sub(\"^#\"; \"\")\n | select(length >= 6)\n | .[0:6]\n | select(. != \"000000\")\n ] | unique) as $colors |\n\n # 2. Map Colors to Macros\n (reduce range(0; $colors | length) as $i ({}; \n .[$colors[$i]] = \"C\\( ($i+1) | tostring | if length == 1 then \"0\"+. else . end )\"\n )) as $color_map |\n\n # 3. Build Palette and Undef blocks\n ( ($colors | map($color_map[.] as $m | \" #define \\($m)_RGB 0x\\(.)\\n #define \\($m) &ug \\($m)_RGB\") | join(\"\\n\"))\n + \"\\n #define ___ &ug 0x000000\"\n ) as $palette |\n\n ( ($colors | map($color_map[.] as $m | \" #undef \\($m)\\n #undef \\($m)_RGB\") | join(\"\\n\"))\n + \"\\n #undef ___\"\n ) as $undef |\n\n # 4. Generate Layers with correct Row Logic\n (.layers | to_entries | map(\n .key as $idx |\n\n (($names // [])[$idx] // \"Layer_\\($idx)\") as $layerName |\n\n # STRICT Key Count Check\n (.value | length) as $keyCount |\n (if ($kb == \"glove80\" and $keyCount != 80) then\n error(\"Error in layer '\\($layerName)': Glove80 expects 80 keys, but found \\($keyCount).\")\n elif ($kb == \"go60\" and $keyCount != 60) then\n error(\"Error in layer '\\($layerName)': Go60 expects 60 keys, but found \\($keyCount).\")\n else . end) |\n\n # Map keys safely\n (.value | map(\n (.decoration?.background? // \"\" | ascii_upcase | sub(\"^#\"; \"\") |\n if length >= 6 then .[0:6] else \"\" end\n ) as $hex |\n if $color_map[$hex] then $color_map[$hex] else \"___\" end\n )) as $m |\n\n # Physical Grid Construction\n (if $kb == \"glove80\" then\n \" \\($m[0:5]|join(\" \")) \\($m[5:10]|join(\" \"))\\n\" +\n \" \\($m[10:16]|join(\" \")) \\($m[16:22]|join(\" \"))\\n\" +\n \" \\($m[22:28]|join(\" \")) \\($m[28:34]|join(\" \"))\\n\" +\n \" \\($m[34:40]|join(\" \")) \\($m[40:46]|join(\" \"))\\n\" +\n \" \\($m[46:52]|join(\" \")) \\($m[52:55]|join(\" \")) \\($m[55:58]|join(\" \")) \\($m[58:64]|join(\" \"))\\n\" +\n \" \\($m[64:69]|join(\" \")) \\($m[69:72]|join(\" \")) \\($m[72:75]|join(\" \")) \\($m[75:80]|join(\" \"))\"\n elif $kb == \"go60\" then\n \" \\($m[0:6]|join(\" \")) \\($m[6:12]|join(\" \"))\\n\" +\n \" \\($m[12:18]|join(\" \")) \\($m[18:24]|join(\" \"))\\n\" +\n \" \\($m[24:30]|join(\" \")) \\($m[30:36]|join(\" \"))\\n\" +\n \" \\($m[36:42]|join(\" \")) \\($m[42:48]|join(\" \"))\\n\" +\n \" \\($m[48:51]|join(\" \")) \\($m[51:54]|join(\" \"))\\n\" +\n \" \\($m[54:57]|join(\" \")) \\($m[57:60]|join(\" \"))\"\n else \"\" end) as $grid |\n\n \" #ifdef LAYER_\\($layerName)\\n \\($layerName) {\\n bindings = <\\n\\($grid)\\n >;\\n layer-id = <LAYER_\\($layerName)>;\\n fade-delay = <15>;\\n };\\n #endif\"\n ) | join(\"\\n\\n\")) as $layersOutput |\n\n # 5. Injection\n .custom_devicetree = (\n \"#if __has_include(<dt-bindings/zmk/rgb_colors.h>)\\n\" +\n \" // --- RGB Palette ---\\n\" + $palette + \"\\n\\n\" +\n \" / {\\n underglow-layer {\\n compatible = \\\"zmk,underglow-layer\\\";\\n\\n\" +\n $layersOutput + \"\\n\" +\n \" };\\n };\\n\\n\" +\n \" // --- Cleanup ---\\n\" + $undef + \"\\n\" +\n \"#endif\"\n )\n)",
"category": "Decorations & RGB",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🎨",
"theme": "green"
},
"config": {
"category": "Decorations & RGB",
"num": "124"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/colors_createRGBscheme.png"
},
{
"uid": "s_theme_colors",
"title": "Smart Theme Colorizer",
"subtitle": "Visual Themes, Macros & OS Swaps",
"description": "Automatically assigns key decorators based on key values, selected visual theme, and your operating system.\r\n\r\n* **Home Row** styles apply exclusively to Layer 0.\r\n* **Smart Shortcuts** (like Copy, Paste, Search, and Navigation) are automatically detected across *all* layers and assigned matching colors, labels, and icons.\r\n* **OS Aware:** Automatically adjusts logical shortcuts for macOS (Command) vs. Windows (Control).\r\n* Includes a **Clean Slate** mode to instantly remove all applied decorators from your layout.",
"script": "# =========================================================\r\n# 🛠️ USER CONFIGURATION ZONE \r\n# =========================================================\r\n\r\n# --- 1. COLOR PALETTE CLASS ---\r\n(if $theme == \"engrammer\" then {\r\n pinky: \"#ffcdd2\", ring: \"#bbdefb\", middy: \"#dcedc8\", index: \"#ffecb3\",\r\n clipboard: \"#ffecb3\", app: \"#ffcdd2\", system: \"#dcedc8\", nav: \"#bbdefb\", select: \"#e0ebf6\", browser: \"#fbe6fe\"\r\n} elif $theme == \"tailorkey\" then {\r\n pinky: \"#fbe6fe\", ring: \"#e5feff\", middy: \"#d9f9c9\", index: \"#fffec9\",\r\n clipboard: \"#fffec9\", app: \"#fbe6fe\", system: \"#f8e6d7\", nav: \"#d9f9c9\", select: \"#e0ebf6\", browser: \"#fbe6fe\"\r\n} elif $theme == \"nordic\" then {\r\n pinky: \"#eceff4\", ring: \"#d8dee9\", middy: \"#b3d4e0\", index: \"#a3c9c6\",\r\n clipboard: \"#f0e2b6\", app: \"#e8b4b8\", system: \"#c4d7b2\", nav: \"#b3d4e0\", select: \"#a3c9c6\", browser: \"#d2c4d4\"\r\n} elif $theme == \"sunset\" then {\r\n pinky: \"#ffc8a2\", ring: \"#ffb7b2\", middy: \"#e2f0cb\", index: \"#b5ead7\",\r\n clipboard: \"#fff2b2\", app: \"#ff9aa2\", system: \"#ffd3b6\", nav: \"#c7ceea\", select: \"#b5ead7\", browser: \"#e2b6cf\"\r\n} else {} end) as $pal |\r\n\r\n# --- 2. DYNAMIC OS MODIFIER ---\r\n(if $os == \"mac\" then \"LG\" else \"LC\" end) as $mod |\r\n\r\n# --- 3. CATEGORIZED SEARCH MAP ---\r\n# Use `os: \"mac\"` or `os: \"win\"` to restrict a shortcut. If omitted, it applies to both!\r\n(\r\n [\r\n {\r\n bg: $pal.clipboard,\r\n items: {\r\n \"&kp(__MOD__(C))\": { icon: \"fa-copy\", label: \"Copy\" },\r\n \"&kp(__MOD__(V))\": { icon: \"fa-paste\", label: \"Paste\" },\r\n \"&kp(__MOD__(X))\": { icon: \"fa-cut\", label: \"Cut\" },\r\n \"&kp(__MOD__(A))\": { label: \"Select All\" },\r\n \"&kp(__MOD__(Z))\": { icon: \"fa-undo\", label: \"Undo\" },\r\n \"&kp(__MOD__(Y))\": { icon: \"fa-redo\", label: \"Redo\", os: \"win\" },\r\n \"&kp(LS(__MOD__(Z)))\": { icon: \"fa-redo\", label: \"Redo\" },\r\n \"&kp(__MOD__(LS(Z)))\": { icon: \"fa-redo\", label: \"Redo\" }\r\n }\r\n },\r\n {\r\n bg: $pal.app,\r\n items: {\r\n \"&kp(__MOD__(S))\": { icon: \"fa-save\", label: \"Save\" },\r\n \"&kp(__MOD__(N))\": { icon: \"fa-plus\", label: \"New\" },\r\n \"&kp(__MOD__(O))\": { icon: \"fa-folder-open\", label: \"Open\" },\r\n \"&kp(__MOD__(P))\": { icon: \"fa-print\", label: \"Print\" },\r\n \"&kp(__MOD__(W))\": { icon: \"fa-times\", label: \"Close\" },\r\n \"&kp(LG(Q))\": { icon: \"fa-power-off\", label: \"Quit App\", os: \"mac\" },\r\n \"&kp(LA(F4))\": { icon: \"fa-power-off\", label: \"Quit App\", os: \"win\" },\r\n \"&kp(LG(H))\": { icon: \"fa-eye-slash\", label: \"Hide App\", os: \"mac\" },\r\n \"&kp(LG(DOWN))\": { icon: \"fa-eye-slash\", label: \"Min App\", os: \"win\" },\r\n \"&kp(LG(E))\": { icon: \"fa-folder\", label: \"Explorer\", os: \"win\" }\r\n }\r\n },\r\n {\r\n bg: $pal.system,\r\n items: {\r\n \"&kp(__MOD__(F))\": { icon: \"fa-search\", label: \"Find\" },\r\n \"&kp(__MOD__(G))\": { icon: \"fa-search-plus\", label: \"Next\" },\r\n \"&kp(__MOD__(LS(G)))\": { icon: \"fa-search-minus\", label: \"Prev\" },\r\n \r\n \"&kp(LG(SPACE))\": { icon: \"fa-search\", label: \"Spotlight\", os: \"mac\" },\r\n \"&kp(LG(S))\": { icon: \"fa-search\", label: \"Search\", os: \"win\" },\r\n \"&kp(LG(D))\": { icon: \"fa-desktop\", label: \"Desktop\", os: \"win\" },\r\n \r\n \"&kp(LA(TAB))\": { icon: \"fa-exchange-alt\", label: \"Switch App\", os: \"win\" },\r\n \"&kp(LG(TAB))\": { icon: \"fa-tasks\", label: \"Switch / Tasks\" },\r\n \"&kp(LC(UP))\": { icon: \"fa-th-large\", label: \"Mission Ctrl\", os: \"mac\" },\r\n \r\n \"&kp(LG(GRAVE))\": { icon: \"fa-window-restore\", label: \"Next Win\", os: \"mac\" },\r\n \"&kp(LA(ESC))\": { icon: \"fa-window-restore\", label: \"Next Win\", os: \"win\" },\r\n \r\n \"&kp(LG(L))\": { icon: \"fa-lock\", label: \"Lock\", os: \"win\" },\r\n \"&kp(LC(LG(Q)))\": { icon: \"fa-lock\", label: \"Lock\", os: \"mac\" },\r\n \r\n \"&kp(PRINTSCREEN)\": { icon: \"fa-camera\", label: \"Screenshot\", os: \"win\" },\r\n \"&kp(LS(LG(S)))\": { icon: \"fa-crop\", label: \"Snip Tool\", os: \"win\" },\r\n \"&kp(LS(LG(N4)))\": { icon: \"fa-crop\", label: \"Screenshot\", os: \"mac\" },\r\n \r\n \"&kp(LG(DOT))\": { icon: \"fa-smile\", label: \"Emoji\", os: \"win\" },\r\n \"&kp(LC(LG(SPACE)))\": { icon: \"fa-smile\", label: \"Emoji\", os: \"mac\" },\r\n\r\n \"&kp(RET)\": { },\r\n \"&kp(ESC)\": { },\r\n \"&kp(BSPC))\": { icon: \"fa-backspace\" },\r\n \"&kp(SPACE))\": { icon: \"fa-space\" }\r\n }\r\n },\r\n {\r\n bg: $pal.nav,\r\n items: {\r\n \"&kp(HOME)\": { label: \"\" },\r\n \"&kp(END)\": { label: \"\" },\r\n \"&kp(UP)\": { label: \"\" },\r\n \"&kp(DOWN)\": { label: \"\" },\r\n \"&kp(LEFT)\": { label: \"\" },\r\n \"&kp(RIGHT)\": { label: \"\" },\r\n \"&kp(PG_UP)\": { description: \"Page Up\" },\r\n \"&kp(PG_DN)\": { description: \"Page Down\" },\r\n\r\n \"&kp(LG(LEFT))\": { icon: \"fa-step-backward\", label: \"Line Start\", os: \"mac\" },\r\n \"&kp(LG(RIGHT))\": { icon: \"fa-step-forward\", label: \"Line End\", os: \"mac\" },\r\n \r\n \"&kp(LC(HOME))\": { icon: \"fa-fast-backward\", label: \"Doc Top\", os: \"win\" },\r\n \"&kp(LG(UP))\": { icon: \"fa-fast-backward\", label: \"Doc Top\", os: \"mac\" },\r\n \"&kp(LC(END))\": { icon: \"fa-fast-forward\", label: \"Doc Bottom\", os: \"win\" },\r\n \"&kp(LG(DOWN))\": { icon: \"fa-fast-forward\", label: \"Doc Bottom\", os: \"mac\" },\r\n \r\n \"&kp(LC(LEFT))\": { icon: \"fa-angle-double-left\", label: \"Prev Word\", os: \"win\" },\r\n \"&kp(LA(LEFT))\": { icon: \"fa-angle-double-left\", label: \"Prev Word\", os: \"mac\" },\r\n \"&kp(LC(RIGHT))\": { icon: \"fa-angle-double-right\", label: \"Next Word\", os: \"win\" },\r\n \"&kp(LA(RIGHT))\": { icon: \"fa-angle-double-right\", label: \"Next Word\", os: \"mac\" },\r\n\r\n \"&kp(LC(BSPC))\": { label: \"Del Word\", os: \"win\" },\r\n \"&kp(LA(BSPC))\": { label: \"Del Word\", os: \"mac\" },\r\n \"&kp(LG(BSPC))\": { label: \"Del Line\", os: \"mac\" }\r\n }\r\n },\r\n {\r\n bg: $pal.select,\r\n items: {\r\n \"&kp(LS(HOME))\": { icon: \"fa-outdent\", label: \"Sel Start\", os: \"win\" },\r\n \"&kp(LS(LG(LEFT)))\": { icon: \"fa-outdent\", label: \"Sel Start\", os: \"mac\" },\r\n \"&kp(LS(END))\": { icon: \"fa-indent\", label: \"Sel End\", os: \"win\" },\r\n \"&kp(LS(LG(RIGHT)))\": { icon: \"fa-indent\", label: \"Sel End\", os: \"mac\" },\r\n \r\n \"&kp(LS(LC(HOME)))\": { icon: \"fa-level-up-alt\", label: \"Sel Top\", os: \"win\" },\r\n \"&kp(LS(LG(UP)))\": { icon: \"fa-level-up-alt\", label: \"Sel Top\", os: \"mac\" },\r\n \"&kp(LS(LC(END)))\": { icon: \"fa-level-down-alt\", label: \"Sel Bottom\", os: \"win\" },\r\n \"&kp(LS(LG(DOWN)))\": { icon: \"fa-level-down-alt\", label: \"Sel Bottom\", os: \"mac\" },\r\n\r\n \"&kp(LS(LC(LEFT)))\": { icon: \"fa-angle-left\", label: \"Sel Prev\", os: \"win\" },\r\n \"&kp(LS(LA(LEFT)))\": { icon: \"fa-angle-left\", label: \"Sel Prev\", os: \"mac\" },\r\n \"&kp(LS(LC(RIGHT)))\": { icon: \"fa-angle-right\", label: \"Sel Next\", os: \"win\" },\r\n \"&kp(LS(LA(RIGHT)))\": { icon: \"fa-angle-right\", label: \"Sel Next\", os: \"mac\" }\r\n }\r\n },\r\n {\r\n bg: $pal.browser,\r\n items: {\r\n \"&kp(__MOD__(L))\": { icon: \"fa-link\", label: \"Focus URL\" },\r\n \"&kp(__MOD__(T))\": { icon: \"fa-plus-square\", label: \"New Tab\" },\r\n \"&kp(LS(__MOD__(T)))\": { icon: \"fa-history\", label: \"Reopen Tab\" },\r\n \"&kp(LC(TAB))\": { icon: \"fa-chevron-right\", label: \"Next Tab\" },\r\n \"&kp(LS(LC(TAB)))\": { icon: \"fa-chevron-left\", label: \"Prev Tab\" },\r\n \"&kp(__MOD__(R))\": { icon: \"fa-sync\", label: \"Refresh\" },\r\n \"&kp(LS(__MOD__(R)))\": { icon: \"fa-sync-alt\", label: \"Hard Refresh\" },\r\n \"&kp(LC(F5))\": { icon: \"fa-sync-alt\", label: \"Hard Refresh\", os: \"win\" }\r\n }\r\n }\r\n ] \r\n | map(.bg as $bg | .items | with_entries(\r\n select(.value.os == null or .value.os == \"both\" or .value.os == $os) |\r\n .key |= gsub(\"__MOD__\"; $mod) | \r\n .value.background = $bg |\r\n .value |= del(.os)\r\n )) \r\n | add\r\n) as $logical_map |\r\n\r\n\r\n# =========================================================\r\n# ⚙️ INTERNAL ENGINE \r\n# =========================================================\r\n\r\n(.keyboard? | if type == \"string\" then ascii_downcase else \"glove80\" end) as $kb |\r\n\r\n# --- HARDWARE INDEX MAP ---\r\n(if $kb == \"glove80\" then {\r\n \"35\": \"left.pinky\", \"36\": \"left.ring\", \"37\": \"left.middy\", \"38\": \"left.index\",\r\n \"41\": \"right.index\", \"42\": \"right.middy\", \"43\": \"right.ring\", \"44\": \"right.pinky\"\r\n} elif $kb == \"go60\" then {\r\n \"25\": \"left.pinky\", \"26\": \"left.ring\", \"27\": \"left.middy\", \"28\": \"left.index\",\r\n \"31\": \"right.index\", \"32\": \"right.middy\", \"33\": \"right.ring\", \"34\": \"right.pinky\"\r\n} else {} end) as $hw_map |\r\n\r\n# --- HOME ROW THEME ASSIGNMENTS (WITH OS SWAP) ---\r\n(if $os == \"mac\" then\r\n {\r\n left: { pinky: {background: $pal.middy, icon: \"fa-align-left\"}, ring: {background: $pal.ring, icon: \"fa-align-left\"}, middy: {background: $pal.pinky, icon: \"fa-align-left\"}, index: {background: $pal.index, icon: \"fa-align-left\"} },\r\n right: { pinky: {background: $pal.middy, icon: \"fa-align-right\"}, ring: {background: $pal.ring, icon: \"fa-align-right\"}, middy: {background: $pal.pinky, icon: \"fa-align-right\"}, index: {background: $pal.index, icon: \"fa-align-right\"} }\r\n }\r\nelse\r\n {\r\n left: { pinky: {background: $pal.pinky, icon: \"fa-align-left\"}, ring: {background: $pal.ring, icon: \"fa-align-left\"}, middy: {background: $pal.middy, icon: \"fa-align-left\"}, index: {background: $pal.index, icon: \"fa-align-left\"} },\r\n right: { pinky: {background: $pal.pinky, icon: \"fa-align-right\"}, ring: {background: $pal.ring, icon: \"fa-align-right\"}, middy: {background: $pal.middy, icon: \"fa-align-right\"}, index: {background: $pal.index, icon: \"fa-align-right\"} }\r\n }\r\nend) as $homerow_theme |\r\n\r\n# --- MUTATION ENGINE ---\r\n(.keymap // .) |= (\r\n \r\n # --- DEEP SEARCH FLATTENER (Completely Type-Safe & Null-Proof) ---\r\n def GetSignature:\r\n if type == \"object\" and .value != null then\r\n (.params // []) as $p |\r\n if ($p | length > 0) then\r\n (.value | tostring) + \"(\" + ($p | map(GetSignature) | join(\",\")) + \")\"\r\n else\r\n (.value | tostring)\r\n end\r\n else\r\n (. | tostring)\r\n end;\r\n\r\n if $mode == \"delete\" then\r\n # OVERRIDE: Strip ALL decorators from EVERY key on ALL layers\r\n if .layers then\r\n .layers |= map(map(if type == \"object\" then del(.decoration) else . end))\r\n else . end\r\n else\r\n # --- APPLY STYLES ---\r\n if .layers then\r\n .layers |= [\r\n range(length) as $layerIdx | .[$layerIdx] |\r\n [\r\n range(length) as $keyIdx | .[$keyIdx] |\r\n \r\n # A. Resolve Physical Home Row Style (Layer 0 ONLY)\r\n (if $layerIdx == 0 then $hw_map[$keyIdx | tostring] else null end) as $finger_path |\r\n (if $finger_path then ($homerow_theme | getpath($finger_path | split(\".\"))) else null end) as $physical_style |\r\n \r\n # B. Resolve Logical Search Style (ALL Layers)\r\n (GetSignature) as $sig |\r\n ($logical_map[$sig]) as $logical_style |\r\n \r\n # C. Priority logic (Logical Macros override Home Row colors)\r\n (if $logical_style then $logical_style\r\n elif $physical_style then $physical_style\r\n else null end) as $target_style |\r\n \r\n if $target_style then\r\n \r\n # Smart Label Extraction: Only if icon exists AND label is null/blank\r\n (\r\n if ($target_style.icon != null and ($target_style.label == null or $target_style.label == \"\")) and type == \"object\" then\r\n (.params // []) as $p |\r\n if ($p | length > 1) then\r\n (if ($p[1] | type == \"object\") then ($p[1].value // $p[1]) else $p[1] end | tostring)\r\n elif ($p | length > 0) then\r\n (if ($p[0] | type == \"object\") then ($p[0].value // $p[0]) else $p[0] end | tostring)\r\n else\r\n $target_style.label\r\n end\r\n else\r\n $target_style.label\r\n end\r\n ) as $final_label |\r\n\r\n # Compile the decoration payload, explicitly stripping missing properties\r\n # ONLY strips nulls now. Allows \"\" (empty string) through to blank out labels!\r\n (\r\n {\r\n background: $target_style.background,\r\n color: $target_style.color,\r\n icon: $target_style.icon,\r\n description: $target_style.description,\r\n label: $final_label\r\n } | with_entries(select(.value != null))\r\n ) as $new_dec |\r\n \r\n # Apply the dynamic payload securely\r\n if type == \"object\" then\r\n .decoration = ((.decoration // {}) + $new_dec)\r\n else\r\n { \"value\": ., \"params\": [], \"decoration\": $new_dec }\r\n end\r\n else\r\n .\r\n end\r\n ]\r\n ]\r\n else . end\r\n end\r\n)",
"category": "Decorations & RGB",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🌈",
"theme": "purple"
},
"config": {
"category": "Decorations & RGB"
},
"param": [
{
"id": "mode",
"label": "Execution Mode",
"type": "select",
"options": [
"apply",
"delete"
],
"labels": [
"🎨 Apply Theme Colors",
"🗑️ DELETE APPLIED Decorators"
],
"default": "apply"
},
{
"id": "os",
"label": "Operating System",
"type": "select",
"options": [
"win",
"mac"
],
"labels": [
"Windows / Linux",
"macOS (Swaps Pinky & Middle)"
],
"default": "win"
},
{
"id": "theme",
"label": "Color Theme",
"type": "select",
"options": [
"engrammer",
"tailorkey",
"nordic",
"sunset"
],
"labels": [
"Glorious Engrammer",
"TailorKey",
"Nordic Frost",
"Sunset Horizon"
],
"default": "tailorkey"
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/colors_decorations.png"
},
{
"uid": "colors_launch_kiilix",
"title": "Kiilix Studio ⭐⭐⭐",
"subtitle": "🚀 External App",
"description": "Configure your RGB\r\n\r\nMore info about RGB, see [this](https://sites.google.com/view/tailorkey/how-to/rgb)",
"script": "",
"category": "Decorations & RGB",
"appUrl": "https://sites.google.com/view/kiilix/",
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🧬",
"theme": "yellow"
},
"config": {
"category": "Decorations & RGB",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/colors_launch_kiilix.png"
},
{
"uid": "color_magic",
"title": "Magic Key Stylizer",
"subtitle": "Decorate or clear all Magic keys",
"description": "Instantly applies a uniform visual style to all `&magic` keys across every single layer in your layout. \r\n\r\n* Includes the classic `moergo-long` icon.\r\n* Customize the background and icon color via the parameters.\r\n* **To instantly remove all magic key decorators:** Just delete the text in the Background parameter and hit Apply!",
"script": "# ZMK Autonomous Injection Script - \"Magic Key Stylizer\"\r\n# Strategy: Deep map across all layers to target and mutate &magic behaviors\r\n\r\n(.keymap // .) |= (\r\n if .layers then\r\n .layers |= map(map(\r\n \r\n # 1. Target only the keys that are &magic\r\n if type == \"object\" and .value == \"&magic\" then\r\n \r\n # 2. Check if the user wants to clear the decorations (blank background)\r\n if ($background == null or $background == \"\") then\r\n del(.decoration)\r\n \r\n # 3. Otherwise, apply the new styling\r\n else\r\n .decoration = {\r\n \"icon\": \"moergo-long\",\r\n \"background\": $background,\r\n \"color\": $color\r\n }\r\n end\r\n \r\n # Leave all non-magic keys completely untouched\r\n else\r\n .\r\n end\r\n ))\r\n else . end\r\n)",
"category": "Decorations & RGB",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "✨",
"theme": "purple"
},
"config": {
"category": "Decorations & RGB"
},
"param": [
{
"id": "background",
"label": "Background Color (Leave blank to remove styling)",
"type": "text",
"default": "#d4dde1ff"
},
{
"id": "color",
"label": "Icon Color",
"type": "text",
"default": "#000000ff"
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/colors_magic.png"
},
{
"uid": "gaming60",
"title": "Gaming Layer 60",
"subtitle": "Adds the TK Gaming Layer",
"description": "Injects a dedicated left-hand focused Gaming layer for the Go60 with then name 'Gaming_flows'.\n\n🎮 **Note:** layer switch or toggle must be assigned manually in Layout Editor.",
"script": "# ==============================================================================\n# 🎮 MOERGO GO60 GAMING LAYER INJECTOR\n# ==============================================================================\n\n# Purpose: Adds a dedicated Gaming layer to your Go60 layout.\n# Safety: Prevents running on wrong hardware (Glove80) or if layer exists.\n# Pattern: Atomic Injection (All-or-Nothing safety).\n# ==============================================================================\n\n# 1. SCOPE FINDER\n# We wrap the whole script in this parenthesis to find the right entry point.\n# Some files have a \".keymap\" wrapper, others don't. This handles both.\n\n(if .keymap then .keymap else . end) |= (\n\n # ----------------------------------------------------------------------------\n # 🛑 SAFETY CHECKS (FAIL FAST)\n # ----------------------------------------------------------------------------\n\n # Check 1: Hardware Match\n ((.keyboard // \"unknown\") | ascii_downcase) as $hw_sig |\n if ($hw_sig != \"go60\") then\n \"Err: Hardware mismatch. Target: 'go60', Found: '\\($hw_sig)'.\" | halt_error\n else . end |\n\n # Check 2: Duplication Guard\n if (.layer_names | index(\"Gaming_flows\")) then\n \"Err: Gaming layer exists\" | halt_error\n else . end |\n\n # ----------------------------------------------------------------------------\n # 🛠️ HELPERS\n # ----------------------------------------------------------------------------\n\n def kp($code):\n { \"value\": \"&kp\", \"params\": [{ \"value\": $code, \"params\": [] }] };\n\n def kp_mod($code; $modifier):\n { \"value\": \"&kp\", \"params\": [{ \"value\": $modifier, \"params\": [{ \"value\": $code, \"params\": [] }] }] };\n\n # ----------------------------------------------------------------------------\n # 📝 KEYBOARD DATA MAPPING\n # ----------------------------------------------------------------------------\n\n [\n # Number Row (0-12)\n [0,\"ESC\"], [1,\"N1\"], [2,\"N2\"], [3,\"N3\"], [4,\"N4\"], [5,\"N5\"], [6,\"N6\"],\n [7,\"N7\"], [8,\"N8\"], [9,\"N9\"], [10,\"N0\"], [11,\"MINUS\"], [12,\"RET\"],\n\n # Top Row (13-24)\n [13,\"TAB\"], [14,\"Q\"], [15,\"W\"], [16,\"E\"], [17,\"R\"], [18,\"Y\"], [19,\"U\"],\n [20,\"I\"], [21,\"O\"], [22,\"P\"], [24,\"GRAVE\"],\n\n # Home Row (25-36)\n [25,\"LSHFT\"], [26,\"A\"], [27,\"S\"], [28,\"D\"], [29,\"F\"], [30,\"H\"],\n [31,\"J\"], [32,\"K\"], [33,\"L\"], [34,\"SEMI\"], [36,\"B\"],\n\n # Bottom Row (37-46)\n [37,\"LCTRL\"], [38,\"Z\"], [39,\"X\"], [40,\"C\"], [41,\"V\"], [42,\"N\"],\n [43,\"M\"], [44,\"UP\"],\n\n # Thumb Cluster & Modifiers (47-59)\n [47,\"LGUI\"], [48,\"LALT\"], [49,\"T\"], [50,\"G\"], [51,\"LEFT\"],\n [52,\"DOWN\"], [53,\"RIGHT\"], [54,\"SPACE\"],\n [55,\"LSHFT\"], [56,\"LCTRL\"], [57,\"BSPC\"], [58,\"LALT\"], [59,\"RET\"],\n\n # Special Shifted Symbols\n [23,\"EQUAL\",\"LS\"], [35,\"SQT\",\"LS\"], [45,\"COMMA\",\"LS\"], [46,\"DOT\",\"LS\"]\n ] as $mapping |\n\n # ----------------------------------------------------------------------------\n # 🚀 EXECUTION PHASE\n # ----------------------------------------------------------------------------\n\n (.layers | length) as $new_idx |\n\n .creator = \"moosy\" |\n .layer_names += [\"Gaming\"] |\n\n # Initialize layer with transparent keys\n .layers[$new_idx] = [range(60) | { \"value\": \"&trans\", \"params\": [] }] |\n\n # Fill keys\n reduce $mapping[] as $map (.;\n if ($map | length) == 3 then\n .layers[$new_idx][$map[0]] = kp_mod($map[1]; $map[2])\n else\n .layers[$new_idx][$map[0]] = kp($map[1])\n end\n )\n)",
"category": "Gaming",
"appUrl": null,
"manifest": {
"author": "CasuGregSeries",
"keyboards": [
"go60"
],
"icon": "🎮"
},
"config": {
"category": "Gaming",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/game60.png"
},
{
"uid": "glove80_gaming",
"title": "Gaming Layer 80",
"subtitle": "Adds a TK/GE Gaming Layer",
"description": "Injects a dedicated left-hand focused Gaming layer for the Glove80 with then name 'Gaming_flows'.\r\n\r\n🎮 **Note:** layer switch or toggle must be assigned manually in Layout Editor.",
"script": "# 1. SCOPE FINDER\r\n(if .keymap then .keymap else . end) |= (\r\n\r\n # ----------------------------------------------------------------------------\r\n # 🛑 SAFETY CHECKS (FAIL FAST)\r\n # ----------------------------------------------------------------------------\r\n\r\n # Check 1: Hardware Match\r\n ((.keyboard // \"unknown\") | ascii_downcase) as $hw_sig |\r\n if ($hw_sig != \"glove80\") then\r\n \"Err: Hardware mismatch. Target: 'glove80', Found: '\\\\($hw_sig)'.\" | halt_error\r\n else . end |\r\n\r\n # Check 2: Duplication Guard\r\n if (.layer_names | index(\"Gaming_flows\")) then\r\n \"Err: Gaming layer exists\" | halt_error\r\n else . end |\r\n\r\n # ----------------------------------------------------------------------------\r\n # 🛠️ HELPERS\r\n # ----------------------------------------------------------------------------\r\n\r\n def kp($code):\r\n { \"value\": \"&kp\", \"params\": [{ \"value\": $code, \"params\": [] }] };\r\n\r\n def kp_mod($code; $modifier):\r\n { \"value\": \"&kp\", \"params\": [{ \"value\": $modifier, \"params\": [{ \"value\": $code, \"params\": [] }] }] };\r\n\r\n # ----------------------------------------------------------------------------\r\n # 📝 KEYBOARD DATA MAPPING (Glove80 80-Key Matrix)\r\n # ----------------------------------------------------------------------------\r\n\r\n [\r\n # Row 1 (0-9)\r\n [0,\"ESC\"], [1,\"P\"], [2,\"O\"], [3,\"N\"], [4,\"BSPC\"],\r\n [5,\"F1\"], [6,\"F2\"], [7,\"F3\"], [8,\"F4\"], [9,\"F5\"],\r\n\r\n # Row 2 (10-21)\r\n [10,\"M\"], [11,\"N6\"], [12,\"N7\"], [13,\"N8\"], [14,\"N9\"], [15,\"N0\"],\r\n [16,\"F6\"], [17,\"F7\"], [18,\"F8\"], [19,\"F9\"], [20,\"F10\"], [21,\"F11\"],\r\n\r\n # Row 3 (22-33)\r\n [22,\"I\"], [23,\"N1\"], [24,\"N2\"], [25,\"N3\"], [26,\"N4\"], [27,\"N5\"],\r\n [28,\"Y\"], [29,\"U\"], [30,\"I\"], [31,\"O\"], [32,\"P\"], [33,\"F12\"],\r\n\r\n # Row 4 (34-45)\r\n [34,\"T\"], [35,\"TAB\"], [36,\"Q\"], [37,\"W\"], [38,\"E\"], [39,\"R\"],\r\n [40,\"H\"], [41,\"J\"], [42,\"K\"], [43,\"L\"], [44,\"SEMI\"], [45,\"SQT\"],\r\n\r\n # Row 5 (46-63) including Upper Thumbs\r\n [46,\"G\"], [47,\"LSHFT\"], [48,\"A\"], [49,\"S\"], [50,\"D\"], [51,\"F\"],\r\n [52,\"LSHFT\"], [53,\"LALT\"], [54,\"V\"], # Left Thumb (Upper)\r\n [55,\"ESC\"], [56,\"UP\"], [57,\"RET\"], # Right Thumb (Upper)\r\n [58,\"N\"], [59,\"M\"], [60,\"COMMA\"], [61,\"DOT\"], [62,\"FSLH\"], [63,\"BSLH\"],\r\n\r\n # Row 6 (64-79) including Lower Thumbs\r\n [64,\"B\"], [65,\"LCTRL\"], [66,\"Z\"], [67,\"X\"], [68,\"C\"],\r\n [69,\"SPACE\"], [70,\"LCTRL\"], [71,\"RET\"], # Left Thumb (Lower)\r\n [72,\"LEFT\"], [73,\"DOWN\"], [74,\"RIGHT\"], # Right Thumb (Lower)\r\n [75,\"MINUS\"], [76,\"LBKT\"], [77,\"RBKT\"], [78,\"EQUAL\"], [79,\"GRAVE\"]\r\n ] as $mapping |\r\n\r\n # ----------------------------------------------------------------------------\r\n # 🚀 EXECUTION PHASE\r\n # ----------------------------------------------------------------------------\r\n\r\n (.layers | length) as $new_idx |\r\n\r\n .creator = \"moosy\" |\r\n .layer_names += [\"Gaming\"] |\r\n\r\n # Initialize layer with transparent keys (80 keys for Glove80)\r\n .layers[$new_idx] = [range(80) | { \"value\": \"&trans\", \"params\": [] }] |\r\n\r\n # Fill keys\r\n reduce $mapping[] as $map (.;\r\n if ($map | length) == 3 then\r\n .layers[$new_idx][$map[0]] = kp_mod($map[1]; $map[2])\r\n else\r\n .layers[$new_idx][$map[0]] = kp($map[1])\r\n end\r\n )\r\n)",
"category": "Gaming",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"glove80"
],
"icon": "🎮"
},
"config": {
"category": "Gaming"
},
"param": [],
"mediaUrl": null
},
{
"uid": "hrm_add",
"title": "Home-Row Mods",
"subtitle": "Adds Home-Row Modifiers",
"description": "Home-row mods let your home-row keys do two things: act as normal letters when tapped, and as modifier keys when held. \r\n\r\nSee [this video](https://youtu.be/gFW0tgQwnHQ) to learn more about Home-Row Mods.\r\n\r\n⚠️ This will add HRMs to your layout. To avoid conflicts or duplicates, remove any existing HRMs first. You can do this using the [Remove HRMs Flow](https://moosylog.github.io/flows4json/?id=hrm_remove) before applying a new layout.\r\n\r\nℹ️ *Urob Timeless is the safest choice, using the balanced hold-tap flavor, while Sunaku uses a tap-preferred hold-tap flavor.*",
"script": "# Modifier sequences & Colors\r\n{\r\n \"GACS\": [\r\n \"LGUI\", \"LALT\", \"LCTRL\", \"LSHFT\",\r\n \"RSHFT\", \"RCTRL\", \"LALT\", \"RGUI\"\r\n ],\r\n \"CAGS\": [\r\n \"LCTRL\", \"LALT\", \"LGUI\", \"LSHFT\",\r\n \"RSHFT\", \"RGUI\", \"LALT\", \"RCTRL\"\r\n ]\r\n} as $mod_registry |\r\n\r\n{\r\n \"LSHFT\": \"#fffec9\", \"RSHFT\": \"#fffec9\",\r\n \"LCTRL\": \"#d9f9c9\", \"RCTRL\": \"#d9f9c9\",\r\n \"LALT\": \"#e5feff\", \"RALT\": \"#e5feff\",\r\n \"LGUI\": \"#fbe6fe\", \"RGUI\": \"#fbe6fe\"\r\n} as $color_registry |\r\n\r\n# ==============================================================================\r\n# 1. CORE UTILITIES\r\n# ==============================================================================\r\n\r\ndef log_err($msg):\r\n ($msg | stderr) | empty;\r\n\r\ndef get_side($idx):\r\n if $idx < 4 then \"left\" else \"right\" end;\r\n\r\n# Robust node extraction (string/object/null safe)\r\ndef get_char_node:\r\n if type == \"object\" then\r\n (.params[1] // .params[0] // { value: \"NONE\", params: [] })\r\n elif type == \"string\" then\r\n { value: ., params: [] }\r\n else\r\n { value: \"NONE\", params: [] }\r\n end;\r\n\r\n# ==============================================================================\r\n# 2. DATA REGISTRY\r\n# ==============================================================================\r\n\r\ndef GetRegistry($v):\r\n {\r\n \"1\": {\r\n flavor: \"balanced\",\r\n idle: 150,\r\n naming: \"simple\",\r\n profiles: [\r\n { id: \"hand\", term: 280, quick: 175 }\r\n ],\r\n map: [\r\n \"hand\",\"hand\",\"hand\",\"hand\",\r\n \"hand\",\"hand\",\"hand\",\"hand\"\r\n ]\r\n },\r\n\r\n \"2\": {\r\n flavor: \"balanced\",\r\n idle: 150,\r\n naming: \"HRM\",\r\n profiles: [\r\n { id: \"finger\", term: 250, quick: 105 },\r\n { id: \"index\", term: 200, quick: 150 }\r\n ],\r\n map: [\r\n \"finger\",\"finger\",\"finger\",\"index\",\r\n \"index\",\"finger\",\"finger\",\"finger\"\r\n ]\r\n },\r\n\r\n \"3\": {\r\n flavor: \"tap-preferred\",\r\n idle: 150,\r\n naming: \"HRM\",\r\n profiles: [\r\n { id: \"pinky\", term: 270, quick: 300 },\r\n { id: \"ring\", term: 240, quick: 300 },\r\n { id: \"middy\", term: 210, quick: 300 },\r\n { id: \"index\", term: 180, quick: 300, idle: 100 }\r\n ],\r\n map: [\r\n \"pinky\",\"ring\",\"middy\",\"index\",\r\n \"index\",\"middy\",\"ring\",\"pinky\"\r\n ]\r\n }\r\n }[$v | tostring]\r\n // (log_err(\"FATAL: Version \\($v) not found\") | halt);\r\n\r\n# ==============================================================================\r\n# 3. HARDWARE ABSTRACTION LAYER (HAL)\r\n# ==============================================================================\r\n\r\ndef GetHardware:\r\n (.keyboard | if type == \"string\" then ascii_downcase else \"\" end) as $kb |\r\n if $kb == \"glove80\" then\r\n { \r\n type: \"glove80\", \r\n home: [35,36,37,38,41,42,43,44], \r\n l_trigs: [5, 6, 7, 8, 9, 16, 17, 18, 19, 20, 21, 28, 29, 30, 31, 32, 33, 40, 41, 42, 43, 44, 45, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79],\r\n r_trigs: [0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 22, 23, 24, 25, 26, 27, 34, 35, 36, 37, 38, 39, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74]\r\n }\r\n elif $kb == \"go60\" then\r\n { \r\n type: \"go60\", \r\n home: [25,26,27,28,31,32,33,34], \r\n l_trigs: [6, 7, 8, 9, 10, 11, 18, 19, 20, 21, 22, 23, 30, 31, 32, 33, 34, 35, 42, 43, 44, 45, 46, 47, 51, 52, 53, 54, 55, 56, 57, 58, 59],\r\n r_trigs: [0, 1, 2, 3, 4, 5, 12, 13, 14, 15, 16, 17, 24, 25, 26, 27, 28, 29, 36, 37, 38, 39, 40, 41, 48, 49, 50, 54, 55, 56, 57, 58, 59]\r\n }\r\n else\r\n log_err(\"FATAL: Unsupported or missing keyboard property in layout\") | halt\r\n end;\r\n\r\n# ==============================================================================\r\n# 4. MAIN TRANSFORMATION ENGINE\r\n# ==============================================================================\r\n\r\n(GetRegistry($target_version)) as $cfg |\r\n(GetHardware) as $hw |\r\n($mod_registry[$mod_preset] // $mod_registry[\"GACS\"]) as $mod_seq |\r\n\r\n# ----------------------------------------------------------------------\r\n# STAGE 1: Positional Indexing\r\n# ----------------------------------------------------------------------\r\n\r\n(.layout.keys | reduce .[] as $k (\r\n { home_map: {} };\r\n ($hw.home | index($k.i)) as $idx |\r\n (if $idx != null then .home_map[$k.i | tostring] = $idx else . end)\r\n)) as $db |\r\n\r\n# ----------------------------------------------------------------------\r\n# STAGE 2: Apply Transformation\r\n# ----------------------------------------------------------------------\r\n\r\n(.keymap // .) |= (\r\n\r\n .holdTaps = (\r\n [\r\n (.holdTaps // [])[],\r\n\r\n ((\"left\",\"right\") as $side |\r\n $cfg.profiles[] | {\r\n name:\r\n (if $cfg.naming == \"simple\"\r\n then \"&\\($side)_hand\"\r\n else \"&HRM_\\($side)_\\(.id)\" end),\r\n\r\n description: \"Auto-gen \\($side) HRM (v\\($target_version))\",\r\n bindings: [\"&kp\",\"&kp\"],\r\n tappingTermMs: .term,\r\n quickTapMs: .quick,\r\n requirePriorIdleMs: (.idle // $cfg.idle),\r\n flavor: $cfg.flavor,\r\n holdTriggerOnRelease: true,\r\n\r\n holdTriggerKeyPositions:\r\n (if $side == \"left\"\r\n then $hw.l_trigs\r\n else $hw.r_trigs\r\n end)\r\n }\r\n )\r\n ] | unique_by(.name)\r\n ) |\r\n\r\n .layers[0] |= [\r\n range(length) as $i | .[$i] |\r\n ($db.home_map[$i | tostring]) as $h_idx |\r\n\r\n if $h_idx != null then\r\n get_side($h_idx) as $side |\r\n get_char_node as $char |\r\n ($mod_seq[$h_idx]) as $current_mod |\r\n \r\n # Pull the color background lookup safely outside the if/else block!\r\n ($color_registry[$current_mod]) as $bg |\r\n\r\n (\r\n if $set_decorators and $bg != null then\r\n { decoration: { background: $bg } }\r\n elif type == \"object\" and .decoration then\r\n { decoration: .decoration }\r\n else\r\n {}\r\n end\r\n ) as $dec |\r\n\r\n {\r\n value:\r\n (if $cfg.naming == \"simple\"\r\n then \"&\\($side)_hand\"\r\n else \"&HRM_\\($side)_\\($cfg.map[$h_idx])\"\r\n end),\r\n\r\n params: [\r\n { value: $current_mod, params: [] },\r\n $char\r\n ]\r\n } + $dec\r\n\r\n else . end\r\n ]\r\n)",
"category": "Home-Row Mods",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🏚️",
"theme": "green"
},
"config": {
"category": "Home-Row Mods"
},
"param": [
{
"id": "target_version",
"label": "HRM flavor",
"type": "select",
"options": [
"2",
"3"
],
"labels": [
"Urob timeless",
"Sunaku per finger"
],
"default": "2"
},
{
"id": "mod_preset",
"label": "Recommended order",
"type": "select",
"options": [
"GACS",
"CAGS"
],
"labels": [
"Windows / Linux",
"macOS"
],
"default": "GACS"
},
{
"id": "set_decorators",
"label": "Key Decorator",
"type": "boolean",
"default": true
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/hrm_add.png"
},
{
"uid": "hrm_bil_dynamic",
"title": "Bilateral HRM Sunaku",
"subtitle": "Sunaku's Bilateral Home-Row Modifiers",
"description": "Sunaku's Advanced home-row mods with bilateral combination enforcement improve typing flow by placing modifiers directly under your fingertips.\n\n[Learn more](https://sites.google.com/view/keyboards/layout/homerow-mods-explained)\n\n**What this does:**\nInstead of hardcoding layouts, this script reads your current Base layer and dynamically creates the following to support BHRM.\n- 1 new Bilateral HRM layer ('HRM_Bil') \n- 16 required macros \n- 32 required hold-taps \n- 8 required finger layers \n\n**Safety First:**\nThis script features headless pre-flight checks. It will instantly abort with a terminal error if any HRM items already exist in your layout to prevent accidental duplication.\n\n**Configure:**\n- Scroll down to select your operating system.\n- For more advanced, pre-defined configurations (difficulty levels), use the [HRM Tuning Tool](https://moosylog.github.io/flows4json/?id=l_hrm_tuner)",
"script": "(if type == \"object\" and .keymap? then .keymap else . end) |= (\n \n # 1. PRE-FLIGHT CONFLICT CHECK\n (\n [\n (if (.layer_names // []) | index(\"HRM_Bil\") != null then \"- Layer: 'HRM_Bil'\" else empty end),\n (if (.holdTaps // []) | any(.name | startswith(\"&HRM_\")) then \"- HoldTaps: '&HRM_...'\" else empty end),\n (if (.macros // []) | any(.name | startswith(\"&HRM_\")) then \"- Macros: '&HRM_...'\" else empty end)\n ]\n ) as $conflicts |\n \n if ($conflicts | length > 0) then\n error(\"ABORTED: The following items already exist in the layout:\\n\" + ($conflicts | join(\"\\n\")))\n else\n \n # 2. RESOLVE MODIFIERS & HARDWARE MAPS\n {\n \"GACS\": { \"L1\": \"LGUI\", \"R1\": \"RGUI\", \"L2\": \"LCTRL\", \"R2\": \"RCTRL\", \"C1\": \"#d9f9c9\", \"C2\":\"#fbe6fe\" },\n \"CAGS\": { \"L1\": \"LCTRL\", \"R1\": \"RCTRL\", \"L2\": \"LGUI\", \"R2\": \"RGUI\", \"C1\": \"#fbe6fe\", \"C2\":\"#d9f9c9\" }\n }[$mod_preset] as $mod |\n\n (.layers[0] | length) as $kb_len |\n\n # Dynamic Home Row Selection\n (if $kb_len == 80 then [35, 36, 37, 38] else [25, 26, 27, 28] end) as $l_hrm |\n (if $kb_len == 80 then [41, 42, 43, 44] else [31, 32, 33, 34] end) as $r_hrm |\n\n # Dynamic Left/Right Trigger Matrix Mapping\n (if $kb_len == 80 then\n [0,1,2,3,4, 10,11,12,13,14,15, 22,23,24,25,26,27, 34,35,36,37,38,39, 46,47,48,49,50,51, 64,65,66,67,68]\n else\n [0,1,2,3,4,5, 12,13,14,15,16,17, 24,25,26,27,28,29, 36,37,38,39,40,41, 48,49,50, 54,55,56]\n end) as $lh_keys |\n\n (if $kb_len == 80 then\n [5,6,7,8,9, 16,17,18,19,20,21, 28,29,30,31,32,33, 40,41,42,43,44,45, 58,59,60,61,62,63, 75,76,77,78,79]\n else\n [6,7,8,9,10,11, 18,19,20,21,22,23, 30,31,32,33,34,35, 42,43,44,45,46,47, 51,52,53, 57,58,59]\n end) as $rh_keys |\n\n # 3. ENSURE LAYERS EXIST\n ( [\"HRM_Bil\", \"LeftPinky\", \"LeftRingy\", \"LeftMiddy\", \"LeftIndex\", \"RightIndex\", \"RightMiddy\", \"RightRingy\", \"RightPinky\"] as $req |\n reduce $req[] as $ln (.; if (.layer_names | index($ln) == null) then .layer_names += [$ln] | .layers += [[]] else . end)\n ) |\n\n (.layer_names | index(\"HRM_Bil\")) as $idx_hrm |\n (.layer_names | index(\"LeftPinky\")) as $idx_lp |\n (.layer_names | index(\"LeftRingy\")) as $idx_lr |\n (.layer_names | index(\"LeftMiddy\")) as $idx_lm |\n (.layer_names | index(\"LeftIndex\")) as $idx_li |\n (.layer_names | index(\"RightIndex\")) as $idx_ri |\n (.layer_names | index(\"RightMiddy\")) as $idx_rm |\n (.layer_names | index(\"RightRingy\")) as $idx_rr |\n (.layer_names | index(\"RightPinky\")) as $idx_rp |\n\n # Extract dynamic Base Layer keystrokes (Safely extracting full param objects)\n (.layers[0][$l_hrm[0]].params[0] // {\"value\": \"A\"}) as $lk_p |\n (.layers[0][$l_hrm[1]].params[0] // {\"value\": \"S\"}) as $lk_r |\n (.layers[0][$l_hrm[2]].params[0] // {\"value\": \"D\"}) as $lk_m |\n (.layers[0][$l_hrm[3]].params[0] // {\"value\": \"F\"}) as $lk_i |\n (.layers[0][$r_hrm[0]].params[0] // {\"value\": \"J\"}) as $rk_i |\n (.layers[0][$r_hrm[1]].params[0] // {\"value\": \"K\"}) as $rk_m |\n (.layers[0][$r_hrm[2]].params[0] // {\"value\": \"L\"}) as $rk_r |\n (.layers[0][$r_hrm[3]].params[0] // {\"value\": \"SEMI\"}) as $rk_p |\n\n [\n {\"h\":\"left\", \"f\":\"pinky\", \"ms\":270, \"mod\":$mod.L1, \"idx\":$idx_lp, \"bk\":$lk_p, \"others\":[\"ring\",\"middy\",\"index\"]},\n {\"h\":\"left\", \"f\":\"ring\", \"ms\":240, \"mod\":\"LALT\", \"idx\":$idx_lr, \"bk\":$lk_r, \"others\":[\"pinky\",\"middy\",\"index\"]},\n {\"h\":\"left\", \"f\":\"middy\", \"ms\":210, \"mod\":$mod.L2, \"idx\":$idx_lm, \"bk\":$lk_m, \"others\":[\"pinky\",\"ring\",\"index\"]},\n {\"h\":\"left\", \"f\":\"index\", \"ms\":180, \"mod\":\"LSHFT\", \"idx\":$idx_li, \"bk\":$lk_i, \"others\":[\"pinky\",\"ring\",\"middy\"]},\n {\"h\":\"right\",\"f\":\"index\", \"ms\":180, \"mod\":\"RSHFT\", \"idx\":$idx_ri, \"bk\":$rk_i, \"others\":[\"pinky\",\"ring\",\"middy\"]},\n {\"h\":\"right\",\"f\":\"middy\", \"ms\":210, \"mod\":$mod.R2, \"idx\":$idx_rm, \"bk\":$rk_m, \"others\":[\"pinky\",\"ring\",\"index\"]},\n {\"h\":\"right\",\"f\":\"ring\", \"ms\":240, \"mod\":\"RALT\", \"idx\":$idx_rr, \"bk\":$rk_r, \"others\":[\"pinky\",\"middy\",\"index\"]},\n {\"h\":\"right\",\"f\":\"pinky\", \"ms\":270, \"mod\":$mod.R1, \"idx\":$idx_rp, \"bk\":$rk_p, \"others\":[\"ring\",\"middy\",\"index\"]}\n ] as $fingers |\n\n # 4. GENERATE MACROS PROCEDURALLY\n def hold_mac(name; target_idx):\n {\n \"name\": name, \"waitMs\": 0, \"tapMs\": 0,\n \"bindings\": [\n {\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":target_idx}]},\n {\"value\":\"¯o_pause_for_release\"},\n {\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":target_idx}]}\n ],\n \"params\": [\"code\"]\n };\n\n def tap_mac(name; base_param_obj):\n {\n \"name\": name, \"waitMs\": 0, \"tapMs\": 0,\n \"bindings\": [\n {\"value\":\"¯o_release\"},\n {\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]}, {\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},\n {\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]}, {\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},\n {\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]}, {\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},\n {\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]}, {\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},\n {\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[base_param_obj]},\n {\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}\n ],\n \"params\": [\"code\"]\n };\n\n .macros = ((.macros // []) + ($fingers | map(hold_mac(\"&HRM_\\(.h)_\\(.f)_hold_v1B_TKZ\"; .idx), tap_mac(\"&HRM_\\(.h)_\\(.f)_tap_v1B_TKZ\"; .bk)))) |\n\n # 5. GENERATE HOLD-TAPS PROCEDURALLY\n .holdTaps = ((.holdTaps // []) + ($fingers | map(\n . as $cfg |\n (if .h == \"left\" then $rh_keys else $lh_keys end) as $triggers |\n {\n \"name\": \"&HRM_\\(.h)_\\(.f)_v1B_TKZ\",\n \"flavor\": \"tap-preferred\", \"tappingTermMs\": .ms, \"quickTapMs\": 300, \n \"requirePriorIdleMs\": (if .f==\"index\" or .f==\"ring\" then 100 else 150 end),\n \"holdTriggerOnRelease\": true, \"holdTriggerKeyPositions\": $triggers,\n \"bindings\": [\"&HRM_\\(.h)_\\(.f)_hold_v1B_TKZ\", \"&kp\"]\n },\n (.others[] | {\n \"name\": \"&HRM_\\($cfg.h)_\\($cfg.f)_\\(.)_v1B_TKZ\",\n \"flavor\": \"tap-preferred\", \"tappingTermMs\": $cfg.ms, \"quickTapMs\": 300, \n \"requirePriorIdleMs\": (if $cfg.f==\"index\" or $cfg.f==\"ring\" then 100 else 150 end),\n \"holdTriggerOnRelease\": true, \"holdTriggerKeyPositions\": $triggers,\n \"bindings\": [\"&kp\", \"&HRM_\\($cfg.h)_\\($cfg.f)_tap_v1B_TKZ\"]\n })\n ))) |\n\n # 6. GENERATE ALL 9 LAYERS PROCEDURALLY\n (.layers[0] | to_entries | map(\n .key as $k | .value as $v |\n if $k == $l_hrm[0] then {\"value\":\"&HRM_left_pinky_v1B_TKZ\", \"params\":[{\"value\":$mod.L1}, $lk_p], \"decoration\":{\"background\":$mod.C2}}\n elif $k == $l_hrm[1] then {\"value\":\"&HRM_left_ring_v1B_TKZ\", \"params\":[{\"value\":\"LALT\"}, $lk_r], \"decoration\":{\"background\":\"#e5feff\"}}\n elif $k == $l_hrm[2] then {\"value\":\"&HRM_left_middy_v1B_TKZ\", \"params\":[{\"value\":$mod.L2}, $lk_m], \"decoration\":{\"background\":$mod.C1}}\n elif $k == $l_hrm[3] then {\"value\":\"&HRM_left_index_v1B_TKZ\", \"params\":[{\"value\":\"LSHFT\"}, $lk_i], \"decoration\":{\"background\":\"#fffec9\"}}\n elif $k == $r_hrm[0] then {\"value\":\"&HRM_right_index_v1B_TKZ\", \"params\":[{\"value\":\"RSHFT\"}, $rk_i], \"decoration\":{\"background\":\"#fffec9\"}}\n elif $k == $r_hrm[1] then {\"value\":\"&HRM_right_middy_v1B_TKZ\", \"params\":[{\"value\":$mod.R2}, $rk_m], \"decoration\":{\"background\":$mod.C1}}\n elif $k == $r_hrm[2] then {\"value\":\"&HRM_right_ring_v1B_TKZ\", \"params\":[{\"value\":\"LALT\"}, $rk_r], \"decoration\":{\"background\":\"#e5feff\"}}\n elif $k == $r_hrm[3] then {\"value\":\"&HRM_right_pinky_v1B_TKZ\", \"params\":[{\"value\":$mod.R1}, $rk_p], \"decoration\":{\"background\":$mod.C2}}\n else $v end\n )) as $hrm_bil_layer |\n\n def build_finger_layer($hand; $finger; $base_layer):\n ($fingers | map(select(.h == $hand and .f == $finger))[0]) as $cfg |\n $base_layer | to_entries | map(\n .key as $k | .value as $v |\n ($v.params[0] // {\"value\": \"NONE\"}) as $bp |\n \n if ($v.value != \"&kp\") then {\"value\": \"&trans\"}\n else\n if $hand == \"left\" then\n if ($k | IN($lh_keys[])) then\n if $k == $l_hrm[0] then (if $finger == \"pinky\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_left_\\($finger)_pinky_v1B_TKZ\", \"params\":[{\"value\":$mod.L1}, $bp]} end)\n elif $k == $l_hrm[1] then (if $finger == \"ring\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_left_\\($finger)_ring_v1B_TKZ\", \"params\":[{\"value\":\"LALT\"}, $bp]} end)\n elif $k == $l_hrm[2] then (if $finger == \"middy\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_left_\\($finger)_middy_v1B_TKZ\", \"params\":[{\"value\":$mod.L2}, $bp]} end)\n elif $k == $l_hrm[3] then (if $finger == \"index\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_left_\\($finger)_index_v1B_TKZ\", \"params\":[{\"value\":\"LSHFT\"}, $bp]} end)\n else {\"value\": \"&HRM_left_\\($finger)_tap_v1B_TKZ\", \"params\": [$bp]} end\n else\n $v \n end\n else \n if ($k | IN($rh_keys[])) then\n if $k == $r_hrm[0] then (if $finger == \"index\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_right_\\($finger)_index_v1B_TKZ\", \"params\":[{\"value\":\"RSHFT\"}, $bp]} end)\n elif $k == $r_hrm[1] then (if $finger == \"middy\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_right_\\($finger)_middy_v1B_TKZ\", \"params\":[{\"value\":$mod.R2}, $bp]} end)\n elif $k == $r_hrm[2] then (if $finger == \"ring\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_right_\\($finger)_ring_v1B_TKZ\", \"params\":[{\"value\":\"LALT\"}, $bp]} end)\n elif $k == $r_hrm[3] then (if $finger == \"pinky\" then {\"value\":\"&none\"} else {\"value\":\"&HRM_right_\\($finger)_pinky_v1B_TKZ\", \"params\":[{\"value\":$mod.R1}, $bp]} end)\n else {\"value\": \"&HRM_right_\\($finger)_tap_v1B_TKZ\", \"params\": [$bp]} end\n else\n $v \n end\n end\n end\n )\n ;\n\n (.layers[0]) as $base_layer |\n .layers[$idx_hrm] = $hrm_bil_layer |\n .layers[$idx_lp] = build_finger_layer(\"left\"; \"pinky\"; $base_layer) |\n .layers[$idx_lr] = build_finger_layer(\"left\"; \"ring\"; $base_layer) |\n .layers[$idx_lm] = build_finger_layer(\"left\"; \"middy\"; $base_layer) |\n .layers[$idx_li] = build_finger_layer(\"left\"; \"index\"; $base_layer) |\n .layers[$idx_ri] = build_finger_layer(\"right\"; \"index\"; $base_layer) |\n .layers[$idx_rm] = build_finger_layer(\"right\"; \"middy\"; $base_layer) |\n .layers[$idx_rr] = build_finger_layer(\"right\"; \"ring\"; $base_layer) |\n .layers[$idx_rp] = build_finger_layer(\"right\"; \"pinky\"; $base_layer)\n end\n)",
"category": "Home-Row Mods",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"glove80",
"go60"
],
"icon": "📦",
"theme": "red"
},
"config": {
"category": "Home-Row Mods",
"script": "\""
},
"param": [
{
"id": "mod_preset",
"label": "Recommended order",
"type": "select",
"options": [
"GACS",
"CAGS"
],
"labels": [
"Windows / Linux",
"macOS"
],
"default": "GACS"
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/hrm_bil.png"
},
{
"uid": "hrm_bil80",
"title": "G80 Bilateral HRM Sunaku",
"subtitle": "Sunaku's Bilateral Home-Row Modifiers",
"description": "**This flow is available for Glove80 only. It has been replaced by the Bilateral HRM flow, which also supports Go60. We keep this flow in the catalog while we collect more testing results and user feedback for the new flow.**\n\nAdvanced home-row mods with bilateral combination enforcement improve typing flow by placing modifiers directly under your fingertips. \n\n[Learn more](https://sites.google.com/view/keyboards/layout/homerow-mods-explained)\n\n\n**This injects**\n\n- 16 macros \n- 32 hold-taps\n- 1 new QWERTY HRM layer called 'HRM_Bil'\n- 8 finger layers\n\n\n**Notes**\n\n⚠️ This adds all finger layers and behaviors to your layout.\n\n⚠️ You can make 'HRM_Bil' your base layer and use QWERTY Swap to convert everything to another alpha layer, like Colemak-DH or other.\n\n⚠️ Go60 is not supported at the moment. You can still use Glove80 and export to Go60 from the Layout Editor.\n\n⚠️ This will add HRMs to your layout. To avoid conflicts or duplicates, remove any existing HRMs first. You can do this using the [Remove HRMs Flow](https://moosylog.github.io/flows4json/?id=hrm_remove) before applying a new layout.",
"script": "{\n \"GACS\": { \"L1\": \"LGUI\", \"R1\": \"RGUI\", \"L2\": \"LCTRL\", \"R2\": \"RCTRL\", \"C1\": \"#d9f9c9\", \"C2\":\"#fbe6fe\" },\n \"CAGS\": { \"L1\": \"LCTRL\", \"R1\": \"RCTRL\", \"L2\": \"LGUI\", \"R2\": \"RGUI\", \"C1\": \"#fbe6fe\", \"C2\":\"#d9f9c9\" }\n}[$mod_preset] as $mod |\n\n\"HRM_Bil\" as $LYR |\n\n# ZMK Name-Aware Injection (V2.0 - Dynamic Macro Targets & Minimized)\n(if .keymap then .keymap else . end) |= (\n \n # 1. Guarantee all layers exist so we can dynamically grab their indices\n (\n [\"HRM_Bil\", \"LeftPinky\", \"LeftRingy\", \"LeftMiddy\", \"LeftIndex\", \"RightIndex\", \"RightMiddy\", \"RightRingy\", \"RightPinky\"] as $req_layers |\n .layer_names |= (. // []) |\n .layers |= (. // []) |\n reduce $req_layers[] as $name (.;\n if (.layer_names | index($name) == null) then\n .layer_names += [$name] |\n .layers += [[]]\n else . end\n )\n ) |\n\n # 2. Capture their dynamic index values\n (.layer_names | index(\"HRM_Bil\")) as $idx_hrm |\n (.layer_names | index(\"LeftPinky\")) as $idx_lp |\n (.layer_names | index(\"LeftRingy\")) as $idx_lr |\n (.layer_names | index(\"LeftMiddy\")) as $idx_lm |\n (.layer_names | index(\"LeftIndex\")) as $idx_li |\n (.layer_names | index(\"RightIndex\")) as $idx_ri |\n (.layer_names | index(\"RightMiddy\")) as $idx_rm |\n (.layer_names | index(\"RightRingy\")) as $idx_rr |\n (.layer_names | index(\"RightPinky\")) as $idx_rp |\n\n # 3. Inject Hold-Taps (Unchanged)\n .holdTaps = [{\"name\":\"&HRM_left_index_middy_v1B_TKZ\",\"description\":\"HRM_left_index_middy_bilateral -> &kp - &HRM_left_index_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_index_tap_v1B_TKZ\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_index_pinky_v1B_TKZ\",\"description\":\"HRM_left_index_pinky_bilateral -> &kp - &HRM_left_index_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_index_tap_v1B_TKZ\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_index_ringv1_TKZ\",\"description\":\"HRM_left_index_ring_bilateral -> &kp - &HRM_left_index_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_index_tap_v1B_TKZ\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_index_v1B_TKZ\",\"description\":\"HRM_left_index_bilateral -> &HRM_left_index_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_left_index_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_middy_index_v1B_TKZ\",\"description\":\"HRM_left_middy_index_bilateral -> &kp ->&HRM_left_middy_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_middy_tap_v1B_TKZ\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_middy_pinky_v1B_TKZ\",\"description\":\"HRM_left_middy_pinky_bilateral -> &kp - &HRM_left_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_middy_tap_v1B_TKZ\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_middy_ring_v1B_TKZ\",\"description\":\"HRM_left_middy_ring_bilateral -> &kp - &HRM_left_middy_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_middy_tap_v1B_TKZ\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_middy_v1B_TKZ\",\"description\":\"HRM_left_middy_bilateral -> &HRM_left_index_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_left_middy_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_pinky_index_v1B_TKZ\",\"description\":\"HRM_left_pinky_index_bilateral -> &kp ->&HRM_left_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_pinky_tap_v1B_TKZ\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_pinky_middy_v1B_TKZ\",\"description\":\"HRM_left_pinky_middy_bilateral -> &kp - &HRM_left_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_pinky_tap_v1B_TKZ\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_pinky_ring_v1B_TKZ\",\"description\":\"HRM_left_pinky_ring_bilateral -> &kp - &HRM_left_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_pinky_tap_v1B_TKZ\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_pinky_v1B_TKZ\",\"description\":\"HRM_left_pinky_bilateral - &HRM_left_pinky_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_left_pinky_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_ring_index_v1B_TKZ\",\"description\":\"HRM_left_ring_index_bilateral -> &kp ->&HRM_left_ring_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_ring_tap_v1B_TKZ\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_ring_middy_v1B_TKZ\",\"description\":\"HRM_left_ring_middy_bilateral -> &kp - &HRM_left_ring_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_ring_tap_v1B_TKZ\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_ring_pinky_v1B_TKZ\",\"description\":\"HRM_left_ring_pinky_bilateral -> &kp - &HRM_left_ring_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_left_ring_tap_v1B_TKZ\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_left_ring_v1B_TKZ\",\"description\":\"HRM_left_ring_bilateral - &HRM_left_ring_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_left_ring_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[57,56,55,72,73,74,5,6,7,8,16,17,18,19,20,28,29,30,31,32,40,41,42,43,44,58,59,60,61,62,75,76,77,78,9,21,33,45,63,79,52,53,54,70,71,69]},{\"name\":\"&HRM_right_index_middy_v1B_TKZ\",\"description\":\"HRM_right_index_middy_bilateral -> &kp - &HRM_right_index_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_index_tap_v1B_TKZ\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_index_pinky_v1B_TKZ\",\"description\":\"HRM_right_index_pinky_bilateral -> &kp - &HRM_right_index_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_index_tap_v1B_TKZ\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_index_ring_v1B_TKZ\",\"description\":\"HRM_right_index_ring_bilateral -> &kp - &HRM_right_index_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_index_tap_v1B_TKZ\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_index_v1B_TKZ\",\"description\":\"HRM_right_index_bilateral -> &HRM_right_index_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_right_index_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":180,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_middy_index_v1B_TKZ\",\"description\":\"HRM_right_middy_index_bilateral -> &kp ->&HRM_right_middy_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_middy_tap_v1B_TKZ\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_middy_pinky_v1B_TKZ\",\"description\":\"HRM_right_middy_pinky_bilateral -> &kp - &HRM_right_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_middy_tap_v1B_TKZ\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,46,64,65,47,52,51,39,27,15,4,3,2,1,11,23,35,34,48,66,69,70,71,54,53,55,56,57,74,73,72,68,67,49,50,38,26,14,13,25,37,24,12,36]},{\"name\":\"&HRM_right_middy_ring_v1B_TKZ\",\"description\":\"HRM_right_middy_ring_bilateral -> &kp - &HRM_right_middy_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_middy_tap_v1B_TKZ\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_middy_v1B_TKZ\",\"description\":\"HRM_right_middy_bilateral -> &HRM_right_index_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_right_middy_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":210,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_pinky_index_v1B_TKZ\",\"description\":\"HRM_right_pinky_index_bilateral -> &kp ->&HRM_right_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_pinky_tap_v1B_TKZ\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_pinky_middy_v1B_TKZ\",\"description\":\"HRM_right_pinky_middy_bilateral -> &kp - &HRM_right_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_pinky_tap_v1B_TKZ\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_pinky_ring_v1B_TKZ\",\"description\":\"HRM_right_pinky_ring_bilateral -> &kp - &HRM_right_pinky_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_pinky_tap_v1B_TKZ\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_pinky_v1B_TKZ\",\"description\":\"HRM_right_pinky_bilateral - &HRM_right_pinky_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_right_pinky_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":270,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":150,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_ring_index_v1B_TKZ\",\"description\":\"HRM_right_ring_index_bilateral -> &kp ->&HRM_right_ring_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_ring_tap_v1B_TKZ\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_ring_middy_v1B_TKZ\",\"description\":\"HRM_right_ring_middy_bilateral -> &kp - &HRM_right_ring_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_ring_tap_v1B_TKZ\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_ring_pinky_v1B_TKZ\",\"description\":\"HRM_right_ring_pinky_bilateral -> &kp - &HRM_right_ring_tap - TailorKey\",\"bindings\":[\"&kp\",\"&HRM_right_ring_tap_v1B_TKZ\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]},{\"name\":\"&HRM_right_ring_v1B_TKZ\",\"description\":\"HRM_right_ring_bilateral - &HRM_right_ring_hold -> &kp - TailorKey\",\"bindings\":[\"&HRM_right_ring_hold_v1B_TKZ\",\"&kp\"],\"tappingTermMs\":240,\"flavor\":\"tap-preferred\",\"quickTapMs\":300,\"requirePriorIdleMs\":100,\"holdTriggerOnRelease\":true,\"holdTriggerKeyPositions\":[0,10,22,34,46,64,65,47,35,23,1,2,12,11,24,36,48,66,67,49,37,25,13,3,4,14,15,27,26,38,39,51,50,68,52,53,54,71,70,69,55,56,57,74,73,72]}] |\n \n # 4. Inject Macros (Using dynamic variable indices instead of hardcoded numbers)\n .macros = [{\"name\":\"&HRM_left_index_hold_v1B_TKZ\",\"description\":\"HRM_left_index_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_li}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_li}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_left_index_tap_v1B_TKZ\",\"description\":\"HRM_left_index_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"F\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_left_middy_hold_v1B_TKZ\",\"description\":\"HRM_left_middy_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_lm}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_lm}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_left_middy_tap_v1B_TKZ\",\"description\":\"HRM_left_middy_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"D\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_left_pinky_hold_v1B_TKZ\",\"description\":\"HRM_left_pinky_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_lp}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_lp}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"description\":\"HRM_left_pinky_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_left_ring_hold_v1B_TKZ\",\"description\":\"HRM_left_ring_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_lr}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_lr}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_left_ring_tap_v1B_TKZ\",\"description\":\"HRM_left_ring_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"S\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_index_hold_v1B_TKZ\",\"description\":\"HRM_right_index_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_ri}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_ri}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_index_tap_v1B_TKZ\",\"description\":\"HRM_right_index_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"J\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_middy_hold_v1B_TKZ\",\"description\":\"HRM_right_middy_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_rm}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_rm}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_middy_tap_v1B_TKZ\",\"description\":\"HRM_right_middy_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"K\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_pinky_hold_v1B_TKZ\",\"description\":\"HRM_right_pinky_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_rp}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_rp}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"description\":\"HRM_right_pinky_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"SEMI\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_ring_hold_v1B_TKZ\",\"description\":\"HRM_right_ring_hold -> swich layer - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_press\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_rr}]},{\"value\":\"¯o_pause_for_release\"},{\"value\":\"¯o_release\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&mo\",\"params\":[{\"value\":$idx_rr}]}],\"params\":[\"code\"]},{\"name\":\"&HRM_right_ring_tap_v1B_TKZ\",\"description\":\"HRM_right_ring_tap - incl. QWERTY alpha character - TailorKey\",\"waitMs\":0,\"tapMs\":0,\"bindings\":[{\"value\":\"¯o_release\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R1}]},{\"value\":\"¯o_tap\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"L\"}]},{\"value\":\"¯o_tap\"},{\"value\":\"¯o_param_1to1\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]}],\"params\":[\"code\"]}] |\n \n # 5. Inject specific layer configurations directly to their dynamic indices\n .layers[$idx_hrm] = [{\"value\":\"&kp\",\"params\":[{\"value\":\"F1\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F2\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F3\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F4\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F5\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F6\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F7\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F8\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F9\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F10\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"EQUAL\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N1\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N2\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N3\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N4\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N5\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N6\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N7\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N8\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N9\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N0\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"MINUS\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"TAB\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"Q\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"W\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"E\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"R\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"T\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"Y\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"U\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"I\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"O\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"P\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"BSLH\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"ESC\"}]},{\"value\":\"&HRM_left_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.L1},{\"value\":\"A\"}],\"decoration\":{\"background\":$mod.C2}},{\"value\":\"&HRM_left_ring_v1B_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"S\"}],\"decoration\":{\"background\":\"#e5feff\"}},{\"value\":\"&HRM_left_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.L2},{\"value\":\"D\"}],\"decoration\":{\"background\":$mod.C1}},{\"value\":\"&HRM_left_index_v1B_TKZ\",\"params\":[{\"value\":\"LSHFT\"},{\"value\":\"F\"}],\"decoration\":{\"background\":\"#fffec9\"}},{\"value\":\"&kp\",\"params\":[{\"value\":\"G\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"H\"}]},{\"value\":\"&HRM_right_index_v1B_TKZ\",\"params\":[{\"value\":\"RSHFT\"},{\"value\":\"J\"}],\"decoration\":{\"background\":\"#fffec9\"}},{\"value\":\"&HRM_right_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.R2},{\"value\":\"K\"}],\"decoration\":{\"background\":$mod.C1}},{\"value\":\"&HRM_right_ring_v1B_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"L\"}],\"decoration\":{\"background\":\"#e5feff\"}},{\"value\":\"&HRM_right_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.R1},{\"value\":\"SEMI\"}],\"decoration\":{\"background\":$mod.C2}},{\"value\":\"&kp\",\"params\":[{\"value\":\"SQT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"GRAVE\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"Z\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"X\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"C\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"V\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"B\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L2}]},{\"value\":\"&lower\"},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.L1}]},{\"value\":\"&kp\",\"params\":[{\"value\":$mod.R2}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RSHFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"N\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"M\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"COMMA\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"DOT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"FSLH\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"PG_UP\"}]},{\"value\":\"&magic\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"HOME\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"END\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LEFT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RIGHT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"BSPC\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"DEL\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RALT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RET\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"SPACE\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"UP\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"DOWN\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"LBKT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"RBKT\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"PG_DN\"}]}] |\n .layers[$idx_lp] = [{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F1\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F2\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F3\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F4\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"EQUAL\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N1\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N2\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N3\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N4\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"Q\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"W\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"E\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"R\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"T\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&none\"},{\"value\":\"&HRM_left_pinky_ring_v1B_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"S\"}]},{\"value\":\"&HRM_left_pinky_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.L2},{\"value\":\"D\"}]},{\"value\":\"&HRM_left_pinky_index_v1B_TKZ\",\"params\":[{\"value\":\"LSHFT\"},{\"value\":\"F\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"G\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"J\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"K\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"L\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"SEMI\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"Z\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"X\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"C\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"V\"}]},{\"value\":\"&HRM_left_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"B\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}] |\n .layers[$idx_lr] = [{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F1\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F2\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F3\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F4\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"EQUAL\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N1\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N2\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N3\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N4\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"Q\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"W\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"E\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"R\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"T\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_ring_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.L1},{\"value\":\"A\"}]},{\"value\":\"&none\"},{\"value\":\"&HRM_left_ring_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.L2},{\"value\":\"D\"}]},{\"value\":\"&HRM_left_ring_index_v1B_TKZ\",\"params\":[{\"value\":\"LSHFT\"},{\"value\":\"F\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"G\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"J\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"K\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"L\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"SEMI\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"Z\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"X\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"C\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"V\"}]},{\"value\":\"&HRM_left_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"B\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}] |\n .layers[$idx_lm] = [{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F1\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F2\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F3\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F4\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"EQUAL\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N1\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N2\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N3\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N4\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"Q\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"W\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"E\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"R\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"T\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_middy_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.L1},{\"value\":\"A\"}]},{\"value\":\"&HRM_left_middy_ring_v1B_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"S\"}]},{\"value\":\"&none\"},{\"value\":\"&HRM_left_middy_index_v1B_TKZ\",\"params\":[{\"value\":\"LSHFT\"},{\"value\":\"F\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"G\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"J\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"K\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"L\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"SEMI\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"Z\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"X\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"C\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"V\"}]},{\"value\":\"&HRM_left_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"B\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}] |\n .layers[$idx_li] = [{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F1\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F2\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F3\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F4\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"EQUAL\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N1\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N2\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N3\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N4\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N5\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"Q\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"W\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"E\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"R\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"T\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_index_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.L1},{\"value\":\"A\"}]},{\"value\":\"&HRM_left_index_ringv1_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"S\"}]},{\"value\":\"&HRM_left_index_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.L2},{\"value\":\"D\"}]},{\"value\":\"&none\"},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"G\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"J\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"K\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"L\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"SEMI\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"Z\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"X\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"C\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"V\"}]},{\"value\":\"&HRM_left_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"B\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}] |\n .layers[$idx_ri] = [{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F6\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F7\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F8\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F9\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"F10\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N6\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N7\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N8\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N9\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N0\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"MINUS\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"Y\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"U\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"I\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"O\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"P\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"BSLH\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"S\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"D\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F\"}]},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"H\"}]},{\"value\":\"&none\"},{\"value\":\"&HRM_right_index_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.R2},{\"value\":\"K\"}]},{\"value\":\"&HRM_right_index_ring_v1B_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"L\"}]},{\"value\":\"&HRM_right_index_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.R1},{\"value\":\"SEMI\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"SQT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"N\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"M\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"COMMA\"}]},{\"value\":\"&HRM_right_index_tap_v1B_TKZ\",\"params\":[{\"value\":\"DOT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}] |\n .layers[$idx_rm] = [{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F6\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F7\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F8\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F9\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"F10\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N6\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N7\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N8\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N9\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N0\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"MINUS\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"Y\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"U\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"I\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"O\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"P\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"BSLH\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"S\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"D\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F\"}]},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"H\"}]},{\"value\":\"&HRM_right_middy_index_v1B_TKZ\",\"params\":[{\"value\":\"RSHFT\"},{\"value\":\"J\"}]},{\"value\":\"&none\"},{\"value\":\"&HRM_right_middy_ring_v1B_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"L\"}]},{\"value\":\"&HRM_right_middy_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.R1},{\"value\":\"SEMI\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"SQT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"N\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"M\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"COMMA\"}]},{\"value\":\"&HRM_right_middy_tap_v1B_TKZ\",\"params\":[{\"value\":\"DOT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}] |\n .layers[$idx_rr] = [{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F6\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F7\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F8\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F9\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"F10\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N6\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N7\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N8\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N9\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N0\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"MINUS\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"Y\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"U\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"I\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"O\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"P\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"BSLH\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"S\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"D\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F\"}]},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"H\"}]},{\"value\":\"&HRM_right_ring_index_v1B_TKZ\",\"params\":[{\"value\":\"RSHFT\"},{\"value\":\"J\"}]},{\"value\":\"&HRM_right_ring_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.R2},{\"value\":\"K\"}]},{\"value\":\"&none\"},{\"value\":\"&HRM_right_ring_pinky_v1B_TKZ\",\"params\":[{\"value\":$mod.R1},{\"value\":\"SEMI\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"SQT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"N\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"M\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"COMMA\"}]},{\"value\":\"&HRM_right_ring_tap_v1B_TKZ\",\"params\":[{\"value\":\"DOT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}] |\n .layers[$idx_rp] = [{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F6\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F7\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F8\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F9\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"F10\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N6\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N7\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N8\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N9\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N0\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"MINUS\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"Y\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"U\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"I\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"O\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"P\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"BSLH\"}]},{\"value\":\"&trans\"},{\"value\":\"&kp\",\"params\":[{\"value\":\"A\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"S\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"D\"}]},{\"value\":\"&kp\",\"params\":[{\"value\":\"F\"}]},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"H\"}]},{\"value\":\"&HRM_right_pinky_index_v1B_TKZ\",\"params\":[{\"value\":\"RSHFT\"},{\"value\":\"J\"}]},{\"value\":\"&HRM_right_pinky_middy_v1B_TKZ\",\"params\":[{\"value\":$mod.R2},{\"value\":\"K\"}]},{\"value\":\"&HRM_right_pinky_ring_v1B_TKZ\",\"params\":[{\"value\":\"LALT\"},{\"value\":\"L\"}]},{\"value\":\"&none\"},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"SQT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"N\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"M\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"COMMA\"}]},{\"value\":\"&HRM_right_pinky_tap_v1B_TKZ\",\"params\":[{\"value\":\"DOT\"}]},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"},{\"value\":\"&trans\"}]\n)",
"category": "Home-Row Mods",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"glove80"
],
"icon": "📦",
"theme": "red"
},
"config": {
"category": "Home-Row Mods"
},
"param": [
{
"id": "mod_preset",
"label": "Recommended order",
"type": "select",
"options": [
"GACS",
"CAGS"
],
"labels": [
"Windows / Linux",
"macOS"
],
"default": "GACS"
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/hrm_bil80.png"
},
{
"uid": "hrm_remove",
"title": "HRM Remove",
"subtitle": "Del HRM from your Layout",
"description": "Removes all home-row mods (HRMs), including TailorKey Bilateral HRM layers.\n\nThis removes hold-taps and bindings from your base layer, as well as any finger layers and macros, if available.\n\n**Note:** This fully removes all HRM functionality.",
"script": "# ==============================================================================\n# 0. SETTINGS & TOGGLES\n# ==============================================================================\n# Set to true to keep colors and UI decorators. Set to false for a clean wipe.\ndef PRESERVE_DECORATORS: false; \n\n# ==============================================================================\n# 1. HARDWARE ABSTRACTION LAYER (HAL)\n# ==============================================================================\ndef GetHomeIndices:\n if .layout.keys then\n (.layout.keys | length) as $len |\n if $len > 70 then [35, 36, 37, 38, 41, 42, 43, 44] # Glove80\n else [25, 26, 27, 28, 31, 32, 33, 34] # Go60\n end\n else [25, 26, 27, 28, 31, 32, 33, 34] # Default Fallback\n end;\n\n# Helper for shifting layer references safely\n# Restricts to numbers <= 30 to explicitly protect macro timers (e.g., 250ms)\n# which are also stored inside .params[].value arrays.\ndef ShiftLayer($target_idx; $deleted_idx):\n if ($target_idx | type == \"number\" and $target_idx <= 30) then\n if $target_idx > $deleted_idx then $target_idx - 1\n elif $target_idx == $deleted_idx then 0\n else $target_idx end\n else $target_idx end;\n\n# ==============================================================================\n# 2. MAIN TRANSFORMATION\n# ==============================================================================\nif (type != \"object\") then . else\n (.keymap // .) |= (\n \n # SETUP\n [ \"LeftIndex\", \"LeftMiddy\", \"LeftRingy\", \"LeftPinky\", \n \"RightIndex\", \"RightMiddy\", \"RightRingy\", \"RightPinky\" ] as $targets |\n (GetHomeIndices) as $home_row |\n\n # STAGE 1: IDENTIFY HRM NAMES (Recursive lookup)\n # Collects names from Layer 0 home row. \n # EXPLICITLY ignores standard ZMK behaviors to protect layers like Cursor/Gaming.\n ([ .layers[0][($home_row[])].value | select(. != null) ] | map(ltrimstr(\"&\")) | \n map(select(IN(\"kp\", \"mt\", \"lt\", \"mo\", \"sl\", \"sk\", \"tog\", \"none\", \"trans\") | not))) as $to_purge |\n \n # STAGE 2: GLOBAL KEY REVERSION (Preserves Styling)\n # Scans every layer. Converts any key referencing an HRM behavior to &kp.\n .layers |= map(\n map(\n if (.value | ltrimstr(\"&\") | (startswith(\"HRM_\") or IN($to_purge[]))) then\n (.params | if type == \"array\" and length > 0 then . else [{ \"value\": \"NONE\" }] end) as $p |\n (if ($p | length > 1) then $p[1].value else $p[0].value end) as $keycode |\n \n # NEW BINDING OBJECT\n { \"value\": \"&kp\", \"params\": [{ \"value\": $keycode }] } as $new_key |\n \n # TOGGLE LOGIC: Preserve existing decorators or replace entirely\n # Force overwrite the params array to prevent index-merging corruption\n if PRESERVE_DECORATORS then \n (. * $new_key | .params = $new_key.params)\n else \n $new_key \n end\n else . end\n )\n ) |\n\n # STAGE 3: REGISTRY PURGE\n ( .holdTaps, .macros, .behaviors ) |= (\n if type == \"array\" then\n map(select(.name | type == \"string\" and ((. | IN($to_purge[])) or (ltrimstr(\"&\") | startswith(\"HRM_\"))) | not))\n else . end\n ) |\n\n # STAGE 4: SURGICAL LAYER DELETION & RE-INDEXING\n if (.layer_names | type == \"array\") then\n ([.layer_names | to_entries[] | select(.value | IN($targets[])) | .key] | sort | reverse) as $delete_list |\n \n # EXPLICIT GUARD: Only run deletion and re-indexing if layers were actually found\n if ($delete_list | length > 0) then\n reduce $delete_list[] as $idx (.;\n del(.layers[$idx]) | \n del(.layer_names[$idx]) |\n \n # Universal Parameter Re-indexing \n # Strictly targets ONLY objects inside a .params array to ignore root-level properties\n (.. | objects | select(has(\"params\") and (.params | type == \"array\"))) |= (\n .params |= map(\n if (type == \"object\" and has(\"value\")) then\n .value |= ShiftLayer(.; $idx)\n else . end\n )\n ) |\n \n # Combo Layer Requirements Sync\n (.combos // [])[]? |= (\n if has(\"layers\") and (.layers | type == \"array\") then\n .layers |= map(if . == $idx then empty else ShiftLayer(.; $idx) end)\n else . end\n ) |\n\n # Input Listener Layer Requirements Sync\n (.inputListeners // [])[]?.nodes[]? |= (\n if has(\"layers\") and (.layers | type == \"array\") then\n .layers |= map(if . == $idx then empty else ShiftLayer(.; $idx) end)\n else . end\n )\n )\n else\n . # Do nothing if no layers matched the targets\n end\n else . end |\n\n # STAGE 5: FINAL CLEANUP\n # Automatically strip out any null keys (like \"macros\": null) so the parser doesn't choke\n with_entries(select(.value != null)) |\n\n .creator = \"moosy\"\n )\nend",
"category": "Home-Row Mods",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "❌",
"theme": "green"
},
"config": {
"category": "Home-Row Mods",
"num": "123"
},
"param": [],
"mediaUrl": null
},
{
"uid": "l_cleaner",
"title": "Layout Cleaner",
"subtitle": "🚀 External App",
"description": "**Detect clutter & allows bulk delete**\nHelps you maintain lean configurations by automatically identifying \"orphans\"—unused macros, combos, hold-taps, or layers—and letting you bulk delete them safely via an intuitive UI.\nNote: Custom Defined Behaviors are ignored.\n\n## IMPORTANT: Custom Defined Behaviors are not supported.",
"script": "",
"category": "Cleanup",
"appUrl": "https://sites.google.com/view/keyboards/tools/tailorkey-toolbox/layout-cleaner",
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🧹",
"theme": "purple"
},
"config": {
"category": "Cleanup",
"num": "123"
},
"param": [],
"mediaUrl": null
},
{
"uid": "l_hrm_tuner",
"title": "HRM Configurator ⭐⭐",
"subtitle": "🚀 External App",
"description": "Advanced Home-Row Mod Configurator is an **external application** that lets you bulk-edit home-row mod settings by applying best-practice presets from Sunaku and Urob, or by setting manual values, across your entire layout at once.\n\nIt supports both standard HRM and TailorKey bilateral HRM.",
"script": "",
"category": "Home-Row Mods",
"appUrl": "https://sites.google.com/view/tailorkey/how-to/hrm-tuner",
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "⚙️",
"theme": "blue"
},
"config": {
"category": "Home-Row Mods",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/l_hrm_tuner.png"
},
{
"uid": "l_oryx_swap",
"title": "ZSA Oryx Migration Assistant",
"subtitle": "🚀 External App",
"description": "Migrate your ZSA ORYX **Moonlander | Voyager** Layout to MoErgo Go60 / Glove80.\nThis tool converts a Oryx layouts to the Layout Editor.",
"script": "",
"category": "ZSA Migration",
"appUrl": "https://github.com/moosylog/oma/blob/main/README.md",
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🦌",
"theme": "blue"
},
"config": {
"category": "ZSA Migration",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/l_oryx_swap.png"
},
{
"uid": "l_qwerty_swap",
"title": "QWERTY Swap ⭐⭐⭐",
"subtitle": "🚀 External App",
"description": "Replace QWERTY with any alt layout Instantly with an easy to use app.\nSwitch from QWERTY to an alternative layout like Colemak-DH with a single click, keeping your entire custom setup intact. Supports multi-layer configurations and advanced Home Row Mods (HRM) from TailorKey.",
"script": "",
"category": "QWERTY Alternatives",
"appUrl": "https://sites.google.com/view/tailorkey/moergo/qwerty_swap",
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🚀"
},
"config": {
"category": "QWERTY Alternatives",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/l_qwerty_swap.png"
},
{
"uid": "macro_wizard",
"title": "Macro Wizard",
"subtitle": "String Macro Generator",
"description": "Creating macros in the MoErgo Layout Editor can be repetitive and time-consuming, especially for longer text strings. This flow automatically generates a macro from any text string you provide, reducing the number of manual clicks required in the editor.\nYou can configure both the macro name and the output text in the Configuration Options. Character mappings are based on the en-US keyboard layout.\n\n🚫 **WARNING: DO NOT STORE SECRETS OR PERSONALLY IDENTIFIABLE INFORMATION IN YOUR LAYOUT.**\n\nMoErgo Layout Editor files are always accessible via it's URL—there is \"no private mode\", whether published in the catalog or not.\n\n**Supported Characters:**\n- Lowercase Letters: a b c d e f g h i j k l m n o p q r s t u v w x y z\n- Uppercase Letters: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z\n- Numbers: 0 1 2 3 4 5 6 7 8 9\n- Punctuation & Math: . , ; : ' \" - _ = + / \\ |\n- Brackets & Grouping: ( ) [ ] { } < >\n- Special Symbols: ! @ # $ % ^ & * ? ~`",
"script": "# Map symbols to ZMK keycodes\ndef zmk_sym($c):\n if $c == \" \" then \"SPACE\"\n elif $c == \"!\" then \"EXCL\"\n elif $c == \"@\" then \"AT\"\n elif $c == \"#\" then \"HASH\"\n elif $c == \"$\" then \"DLLR\"\n elif $c == \"%\" then \"PRCNT\"\n elif $c == \"^\" then \"CARET\"\n elif $c == \"&\" then \"AMPS\"\n elif $c == \"*\" then \"STAR\"\n elif $c == \"(\" then \"LPAR\"\n elif $c == \")\" then \"RPAR\"\n elif $c == \"-\" then \"MINUS\"\n elif $c == \"_\" then \"UNDER\"\n elif $c == \"=\" then \"EQUAL\"\n elif $c == \"+\" then \"PLUS\"\n elif $c == \"[\" then \"LBKT\"\n elif $c == \"{\" then \"LBRC\"\n elif $c == \"]\" then \"RBKT\"\n elif $c == \"}\" then \"RBRC\"\n elif $c == \"|\" then \"PIPE\"\n elif $c == \";\" then \"SEMI\"\n elif $c == \":\" then \"COLON\"\n elif $c == \"'\" then \"SQT\"\n elif $c == \",\" then \"COMMA\"\n elif $c == \"<\" then \"LT\"\n elif $c == \".\" then \"DOT\"\n elif $c == \">\" then \"GT\"\n elif $c == \"/\" then \"FSLH\"\n elif $c == \"?\" then \"QMARK\"\n elif $c == \"`\" then \"GRAVE\"\n elif $c == \"~\" then \"TILDE\"\n elif $c == \"\\\\\" then \"BSLH\"\n elif $c == \"\\\"\" then \"DQT\"\n else \"NONE\" end;\n\n# Generate the new macro object\n(\n {\n \"name\": \"&\\($macro_id)\",\n \"description\": \"Print \\\"\\($macro_string)\\\"\",\n \"bindings\": (\n $macro_string | split(\"\") | map(\n . as $char |\n if test(\"^[A-Z]$\") then\n [\n { \"value\": \"¯o_press\" },\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LSHFT\" } ] },\n { \"value\": \"¯o_tap\" },\n { \"value\": \"&kp\", \"params\": [ { \"value\": $char } ] },\n { \"value\": \"¯o_release\" },\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LSHFT\" } ] },\n { \"value\": \"¯o_tap\" }\n ]\n elif test(\"^[a-z]$\") then\n [\n {\n \"value\": \"&kp\",\n \"params\": [ { \"value\": ($char | ascii_upcase) } ]\n }\n ]\n elif test(\"^[0-9]$\") then\n [\n {\n \"value\": \"&kp\",\n \"params\": [ { \"value\": (\"N\" + $char) } ]\n }\n ]\n else\n [\n {\n \"value\": \"&kp\",\n \"params\": [ { \"value\": zmk_sym($char) } ]\n }\n ]\n end\n ) | flatten\n ),\n \"params\": []\n }\n) as $new_macro |\n\n\"&\\($macro_id)\" as $macro_name |\n\n# Safely inject into the AST context (handles both flat and nested keymaps!)\n(.keymap // .) |= (\n (.macros // []) as $existing_macros |\n ($existing_macros | map(.name) | index($macro_name)) as $idx |\n\n # Check if it exists, and validate overwrite flag\n if $idx != null then\n if $overwrite_macro then\n .macros[$idx] = $new_macro\n else\n error(\"Macro '\" + $macro_name + \"' already exists! Check the 'Overwrite' box to replace it.\")\n end\n else\n .macros = $existing_macros + [$new_macro]\n end\n)",
"category": "Special keys",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🧙🏼♂️",
"theme": "purple"
},
"config": {
"script": "\""
},
"param": [
{
"id": "macro_id",
"label": "Macro Name",
"type": "text",
"default": "flows_macro_string"
},
{
"id": "macro_string",
"label": "Text to Type",
"type": "text",
"default": "Tr0ub4doR12@#$%"
},
{
"id": "overwrite_macro",
"label": "Allow Macro Overwrite?",
"type": "boolean",
"default": true
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/macro_wizard.png"
},
{
"uid": "swap_trackpads_lh_rh",
"title": "Swap Trackpads",
"subtitle": "Swap Left & Right Trackpads",
"description": "Swaps the entire touchpad configuration between the left and right hands. \r\n\r\nIf your right trackpad controls the mouse pointer and your left trackpad handles scrolling (the factory default), applying this flow will perfectly flip them. The left hand will become the mouse, and the right hand will become the scroll wheel.",
"script": "(.keymap // .) |= (\r\n # Check if inputListeners exists and is an array\r\n if .inputListeners and (.inputListeners | type == \"array\") then\r\n .inputListeners |= map(\r\n # If this config block targets the Left Hand, point it to the Right Hand\r\n if .code == \"&cirque_lh_listener\" then\r\n .code = \"&cirque_rh_listener\"\r\n \r\n # If this config block targets the Right Hand, point it to the Left Hand\r\n elif .code == \"&cirque_rh_listener\" then\r\n .code = \"&cirque_lh_listener\"\r\n \r\n # Leave any other custom listeners (like trackballs) untouched\r\n else\r\n .\r\n end\r\n )\r\n else\r\n .\r\n end\r\n)",
"category": "Mouse Controls",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"glove80",
"go60"
],
"icon": "⚫",
"theme": "orange"
},
"config": {
"category": "Mouse Controls"
},
"param": [],
"mediaUrl": null
},
{
"uid": "mouse_emulation_universal",
"title": "Mouse Emulation",
"subtitle": "Adds Mouse Emulation Layers",
"description": "Turns your keyboard into a powerful mouse control system with dedicated movement and click layers.\n🖱️ Mouse Emulation Example (using Layout Editor’s built-in capabilities)\nThis example showcases Mouse Emulation Behaviors — including cursor movement, scrolling, and mouse button presses — powered by the Layout Editor’s built-in (native) Behaviors and Input Listeners.\n\n✅ **Enable HID_POINTING in Advanced Configuration**\n\n✅ **First-time users clear all Bluetooth profiles and re-pair with their devices.**\n\nThis example draws from Glorious Engrammer / TailorKey.\nWe’d like to acknowledge Sunaku and Moosy for their support and contributions to the Glove80 community.\n\n🔍 For more details, please visit:\nhttps://zmk.dev/docs/keymaps/behaviors/mouse-emulation\n\n\n🚩 To turn it on, you manually add a layer switch using < on the thumb.",
"script": "# ZMK Autonomous Injection Script (V5.6) - \"Hardware-Safe Mouse Engine\"\n# Strategy: Explicit Keyboard Detection + Fully Populated Go60 Matrix\n\n# --- STEP 1: CAPTURE HARDWARE STRING FROM ROOT ---\n(.keyboard? | if type == \"string\" then ascii_downcase else \"glove80\" end) as $kb |\n\n(if .keymap then .keymap else . end) |= (\n\n # --- STEP 2: BUILD HARDWARE-SPECIFIC ARRAYS ---\n (if $kb == \"glove80\" then {\n key_count: 80,\n base_lt_idx: 73,\n mappings: [\n [24, \"&msc\", \"SCRL_LEFT\"], [25, \"&mmv\", \"MOVE_UP\"], [26, \"&msc\", \"SCRL_RIGHT\"],\n [29, \"&msc\", \"SCRL_LEFT\"], [30, \"&msc\", \"SCRL_UP\"], [31, \"&msc\", \"SCRL_DOWN\"], [32, \"&msc\", \"SCRL_RIGHT\"],\n [35, \"&msc\", \"SCRL_UP\"], [36, \"&mmv\", \"MOVE_LEFT\"], [37, \"&mmv\", \"MOVE_DOWN\"], [38, \"&mmv\", \"MOVE_RIGHT\"],\n [41, \"&mo\", \"warp\"], [42, \"&mo\", \"fast\"], [43, \"&mo\", \"slow\"],\n [47, \"&msc\", \"SCRL_DOWN\"], [48, \"&mo\", \"slow\"], [49, \"&mo\", \"fast\"], [50, \"&mo\", \"warp\"],\n [52, \"&mkp\", \"MCLK\"], [54, \"&mkp\", \"MB5\"],\n [59, \"&mmv\", \"MOVE_LEFT\"], [60, \"&mmv\", \"MOVE_UP\"], [61, \"&mmv\", \"MOVE_DOWN\"], [62, \"&mmv\", \"MOVE_RIGHT\"],\n [69, \"&mkp\", \"LCLK\"], [70, \"&mkp\", \"RCLK\"], [71, \"&mkp\", \"MB4\"],\n [75, \"&mkp\", \"LCLK\"], [76, \"&mkp\", \"RCLK\"], [77, \"&mkp\", \"MCLK\"], [78, \"&mkp\", \"MB4\"], [79, \"&mkp\", \"MB5\"]\n ]\n } else {\n key_count: 60,\n base_lt_idx: 58,\n mappings: [\n [13, \"&msc\", \"SCRL_UP\"], [14, \"&msc\", \"SCRL_LEFT\"], [15, \"&mmv\", \"MOVE_UP\"], [16, \"&msc\", \"SCRL_RIGHT\"], [17, \"&msc\", \"SCRL_DOWN\"],\n [25, \"&msc\", \"SCRL_DOWN\"], [26, \"&mmv\", \"MOVE_LEFT\"], [27, \"&mmv\", \"MOVE_DOWN\"], [28, \"&mmv\", \"MOVE_RIGHT\"],\n [31, \"&mo\", \"warp\"], [32, \"&mo\", \"fast\"], [33, \"&mo\", \"slow\"],\n [38, \"&mo\", \"slow\"], [39, \"&mo\", \"fast\"], [40, \"&mo\", \"warp\"],\n [50, \"&mkp\", \"MCLK\"], [51, \"&mkp\", \"LCLK\"], [52, \"&mkp\", \"RCLK\"],\n [56, \"&mkp\", \"MCLK\"], [57, \"&mkp\", \"LCLK\"], [58, \"&mkp\", \"RCLK\"]\n ]\n } end) as $cfg |\n\n # --- STEP 3: INITIALIZE NAMES & LAYERS ---\n [\"Mouse\", \"MouseSlow\", \"MouseFast\", \"MouseWarp\"] as $required |\n\n .layer_names |= (if . == null then [] else . end) |\n .layers |= (if . == null then [] else . end) |\n\n reduce $required[] as $name (.;\n if (.layer_names | index($name) == null) then\n .layer_names += [$name] |\n .layers += [[range($cfg.key_count) | {\"value\": \"&trans\", \"params\": []}]]\n else .\n end\n ) |\n\n # --- STEP 4: RESOLVE DYNAMIC INDICES ---\n (.layer_names | index(\"Mouse\")) as $idx_mouse |\n (.layer_names | index(\"MouseSlow\")) as $idx_slow |\n (.layer_names | index(\"MouseFast\")) as $idx_fast |\n (.layer_names | index(\"MouseWarp\")) as $idx_warp |\n\n # --- STEP 5: NON-DESTRUCTIVE LAYER-TAP INJECTION ON BASE LAYER ---\n (\n .layers[0][$cfg.base_lt_idx] as $target_key |\n \n # Only upgrade the key if it is a simple &kp so we don't break custom Hold-Taps/Macros\n if $target_key.value == \"&kp\" then\n .layers[0][$cfg.base_lt_idx] = {\n \"value\": \"<\",\n \"params\": [\n {\"value\": $idx_mouse, \"params\": []},\n $target_key.params[0] # Dynamically reuse their existing keycode!\n ]\n } + (if $target_key.decoration then {decoration: $target_key.decoration} else {} end)\n else\n .\n end\n ) |\n\n # --- STEP 6: CONDITIONAL KEYMAP INJECTION ---\n reduce $cfg.mappings[] as $b (.;\n (if $b[2] == \"slow\" then $idx_slow\n elif $b[2] == \"fast\" then $idx_fast\n elif $b[2] == \"warp\" then $idx_warp\n else $b[2] end) as $final_param |\n \n .layers[$idx_mouse][$b[0]] = {\n \"value\": $b[1],\n \"params\": [\n {\"value\": $final_param, \"params\": []}\n ]\n }\n ) |\n\n # --- STEP 7: COMPREHENSIVE INPUT LISTENERS ---\n .inputListeners = [\n {\n \"code\": \"&mmv_input_listener\",\n \"inputProcessors\": [],\n \"nodes\": [\n {\n \"code\": \"slow\",\n \"layers\": [$idx_slow],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [1, 9]}\n ]\n },\n {\n \"code\": \"fast\",\n \"layers\": [$idx_fast],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [3, 1]}\n ]\n },\n {\n \"code\": \"warp\",\n \"layers\": [$idx_warp],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [12, 1]}\n ]\n }\n ]\n },\n {\n \"code\": \"&msc_input_listener\",\n \"inputProcessors\": [],\n \"nodes\": [\n {\n \"code\": \"slow\",\n \"layers\": [$idx_slow],\n \"inputProcessors\": [\n {\"code\": \"&zip_scroll_scaler\", \"params\": [1, 9]}\n ]\n },\n {\n \"code\": \"fast\",\n \"layers\": [$idx_fast],\n \"inputProcessors\": [\n {\"code\": \"&zip_scroll_scaler\", \"params\": [3, 1]}\n ]\n },\n {\n \"code\": \"warp\",\n \"layers\": [$idx_warp],\n \"inputProcessors\": [\n {\"code\": \"&zip_scroll_scaler\", \"params\": [12, 1]}\n ]\n }\n ]\n },\n {\n \"code\": \"&cirque_lh_listener\",\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [11, 12]},\n {\"code\": \"&zip_xy_transform\", \"params\": [[\"INPUT_TRANSFORM_Y_INVERT\"]]},\n {\"code\": \"&zip_xy_to_scroll_mapper\", \"params\": []},\n {\"code\": \"&zip_click_to_right_click_mapper\", \"params\": []},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ],\n \"nodes\": [\n {\n \"code\": \"slow\",\n \"layers\": [$idx_slow],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [5, 14]},\n {\"code\": \"&zip_xy_transform\", \"params\": [[\"INPUT_TRANSFORM_Y_INVERT\"]]},\n {\"code\": \"&zip_xy_to_scroll_mapper\", \"params\": []},\n {\"code\": \"&zip_click_to_right_click_mapper\", \"params\": []},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ]\n },\n {\n \"code\": \"fast\",\n \"layers\": [$idx_fast],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [3, 2]},\n {\"code\": \"&zip_xy_transform\", \"params\": [[\"INPUT_TRANSFORM_Y_INVERT\"]]},\n {\"code\": \"&zip_xy_to_scroll_mapper\", \"params\": []},\n {\"code\": \"&zip_click_to_right_click_mapper\", \"params\": []},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ]\n },\n {\n \"code\": \"warp\",\n \"layers\": [$idx_warp],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [13, 3]},\n {\"code\": \"&zip_xy_transform\", \"params\": [[\"INPUT_TRANSFORM_Y_INVERT\"]]},\n {\"code\": \"&zip_xy_to_scroll_mapper\", \"params\": []},\n {\"code\": \"&zip_click_to_right_click_mapper\", \"params\": []},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ]\n }\n ]\n },\n {\n \"code\": \"&cirque_rh_listener\",\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [5, 2]},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ],\n \"nodes\": [\n {\n \"code\": \"slow\",\n \"layers\": [$idx_slow],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [1, 1]},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ]\n },\n {\n \"code\": \"fast\",\n \"layers\": [$idx_fast],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [4, 1]},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ]\n },\n {\n \"code\": \"warp\",\n \"layers\": [$idx_warp],\n \"inputProcessors\": [\n {\"code\": \"&zip_xy_scaler\", \"params\": [7, 1]},\n {\"code\": \"&zip_temp_layer\", \"params\": [$idx_mouse, 2000]}\n ]\n }\n ]\n }\n ]\n)",
"category": "Mouse Controls",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🖱️",
"theme": "blue"
},
"config": {
"category": "Mouse Controls",
"num": "123"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/mouselyr.png"
},
{
"uid": "app_switcher_key",
"title": "Alt-Tab Switcher Key",
"subtitle": "Adds one macro",
"description": "### Single-Key App Switcher (Alt-Tab)\r\n\r\n**What this does:**\r\nNormally, switching between open apps requires holding one key and tapping another (like Alt + Tab on Windows or Cmd + Tab on Mac). This flow makes things more efficient by condensing that entire action into a single, easy button press.\r\n\r\n**What happens automatically:**\r\nWhen you apply this, the flow does the heavy lifting for you. It automatically builds a special background shortcut (a macro) called **`&AppSwitch`** and sets it up with optimal timings so the app switching feels snappy and reliable.\r\n\r\n**What YOU need to do to make it work:**\r\nBecause everyone likes their shortcuts in different places, you need to tell your keyboard which button should trigger this feature.\r\n\r\n**Step-by-Step Setup:**\r\n1. Open the Layout Editor.\r\n2. Choose a specific key (or a combo) that you want to use for switching apps.\r\n3. Assign the newly created **`&AppSwitch`** macro to that key. \r\n\r\n**Optional Tweaks:**\r\nThe default timings are set up to work great right out of the box. However, if you feel the app switching is happening too fast or too slow, you can manually adjust the `tapMs` (how long the key is held down) and `waitMs` (the pause between key presses) directly in your macro editor.",
"script": "# ZMK Autonomous Injection Script - \"App Switcher Macro\"\r\n# Strategy: Safely append the Alt-Tab macro using strict MoErgo AST compliance\r\n\r\n(if .keymap then .keymap else . end) |= (\r\n .macros |= (\r\n (if . == null then [] else . end) as $m |\r\n \r\n # Check if '&AppSwitch' already exists to prevent duplicate injections\r\n if ($m | map(.name) | index(\"&AppSwitch\") == null) then\r\n $m + [\r\n {\r\n \"name\": \"&AppSwitch\",\r\n \"description\": \"Alt-Tab App Switcher Macro\",\r\n \"waitMs\": 100,\r\n \"tapMs\": 40,\r\n \"params\": [],\r\n \"bindings\": [\r\n {\r\n \"value\": \"¯o_press\",\r\n \"params\": []\r\n },\r\n {\r\n \"value\": \"&kp\",\r\n \"params\": [ { \"value\": \"LALT\" } ]\r\n },\r\n {\r\n \"value\": \"¯o_tap\",\r\n \"params\": []\r\n },\r\n {\r\n \"value\": \"&kp\",\r\n \"params\": [ { \"value\": \"TAB\" } ]\r\n },\r\n {\r\n \"value\": \"¯o_tap\",\r\n \"params\": []\r\n },\r\n {\r\n \"value\": \"&sk\",\r\n \"params\": [ { \"value\": \"LALT\" } ]\r\n },\r\n {\r\n \"value\": \"¯o_release\",\r\n \"params\": []\r\n },\r\n {\r\n \"value\": \"&kp\",\r\n \"params\": [ { \"value\": \"LALT\" } ]\r\n }\r\n ]\r\n }\r\n ]\r\n else\r\n $m\r\n end\r\n )\r\n)",
"category": "Special keys",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "💊",
"theme": "blue"
},
"config": {
"category": "Special keys"
},
"param": [],
"mediaUrl": null
},
{
"uid": "app_switcher_macro",
"title": "Alt-Tab Switcher Layer",
"subtitle": "Using a Layer",
"description": "### Alt-Tab App Switcher & Navigation Layer\r\n\r\n**What this does:**\r\nThis feature gives you a seamless way to switch between apps (like Alt-Tab on Windows or Cmd-Tab on Mac) directly from your keyboard. It also includes a dedicated navigation layout loaded with useful shortcuts like arrow keys, copy, paste, and cut. \r\n\r\n**What happens automatically:**\r\nThis flow automatically builds the background code for you. Specifically, it adds:\r\n* **The underlying logic:** Two special macros (`&mod_tab_chord_v2_TKZ` and `mod_tab_switcher_chord`) that make the happen.\r\n* **A new layout:** A dedicated navigation layer named `Flows_Nav`. \r\n\r\n**What YOU need to do to make it work:**\r\nBecause everyone's layout is different, you need to manually assign a key (or a combo) to activate this feature. \r\n\r\n**Step-by-Step Setup:**\r\n1. Choose a key or combo on your keyboard that you want to use to switch apps.\r\n2. Assign the **`&mod_tab_chord_v2_TKZ`** behavior to that key.\r\n3. It will ask for two parameters: a **modifier** and a **layer**.\r\n4. For the layer, choose **`Flows_Nav`**.\r\n5. For the modifier, choose the one that matches your operating system:\r\n\r\n**Examples based on your OS:**\r\n* **For macOS:** Select **LCTRL** as your modifier.\r\n* **For Windows:** Select **LALT** or **LGUI** (the Windows key) as your modifier.",
"script": "# 1. Capture hardware type\r\n(.keyboard? | if type == \"string\" then ascii_downcase else \"glove80\" end) as $kb |\r\n\r\n# 2. Define the new Macros\r\n([\r\n {\r\n \"name\": \"&mod_tab_chord_v2_TKZ\",\r\n \"description\": \"mod_tab_switcher_chord - TailorKey\",\r\n \"waitMs\": 0,\r\n \"tapMs\": 0,\r\n \"bindings\": [\r\n { \"value\": \"¯o_press\", \"params\": [] },\r\n { \"value\": \"¯o_param_2to1\", \"params\": [] },\r\n { \"value\": \"&mo\", \"params\": [ { \"value\": \"MACRO_PLACEHOLDER\" } ] },\r\n { \"value\": \"¯o_press\", \"params\": [] },\r\n { \"value\": \"¯o_param_1to1\", \"params\": [] },\r\n { \"value\": \"&mod_tab_v1_TKZ\", \"params\": [ { \"value\": \"MACRO_PLACEHOLDER\" } ] },\r\n { \"value\": \"¯o_pause_for_release\", \"params\": [] },\r\n { \"value\": \"¯o_release\", \"params\": [] },\r\n { \"value\": \"¯o_param_1to1\", \"params\": [] },\r\n { \"value\": \"&mod_tab_v1_TKZ\", \"params\": [ { \"value\": \"MACRO_PLACEHOLDER\" } ] },\r\n { \"value\": \"¯o_release\", \"params\": [] },\r\n { \"value\": \"¯o_param_2to1\", \"params\": [] },\r\n { \"value\": \"&mo\", \"params\": [ { \"value\": \"MACRO_PLACEHOLDER\" } ] }\r\n ],\r\n \"params\": [ \"code\", \"layer\" ]\r\n },\r\n {\r\n \"name\": \"&mod_tab_v1_TKZ\",\r\n \"description\": \"mod_tab_switcher - TailorKey\\n\\n\",\r\n \"waitMs\": 0,\r\n \"tapMs\": 0,\r\n \"bindings\": [\r\n { \"value\": \"¯o_press\", \"params\": [] },\r\n { \"value\": \"¯o_param_1to1\", \"params\": [] },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"MACRO_PLACEHOLDER\" } ] },\r\n { \"value\": \"¯o_tap\", \"params\": [] },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"TAB\" } ] },\r\n { \"value\": \"¯o_pause_for_release\", \"params\": [] },\r\n { \"value\": \"¯o_release\", \"params\": [] },\r\n { \"value\": \"¯o_param_1to1\", \"params\": [] },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"MACRO_PLACEHOLDER\" } ] }\r\n ],\r\n \"params\": [ \"code\" ]\r\n }\r\n]) as $new_macros |\r\n\r\n# 3. Main Mutation Engine\r\n(if .keymap then .keymap else . end) |= (\r\n \r\n # A. Safe Macro Injection (Merges & prevents duplicates)\r\n .macros = ($new_macros + (.macros // []) | unique_by(.name)) |\r\n \r\n # B. Layer Injection\r\n (if (.layer_names | index(\"Flows_Nav\") == null) then\r\n .layer_names += [\"Flows_Nav\"] |\r\n .layers += [\r\n if $kb == \"go60\" then\r\n [\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"X\"}]}], \"decoration\": {\"label\": \"Cut\", \"icon\": \"fa-cut\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"X\"}]}], \"decoration\": {\"label\": \"Cut\", \"icon\": \"fa-cut\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&sk\", \"params\": [{\"value\": \"LSHFT\"}], \"decoration\": {\"label\": \"StckyShft\", \"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LGUI\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LALT\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LCTRL\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LSHFT\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"C\"}]}], \"decoration\": {\"label\": \"Copy\", \"icon\": \"fa-copy\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"C\"}]}], \"decoration\": {\"label\": \"Copy\", \"icon\": \"fa-copy\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LEFT\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"UP\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"DOWN\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"RIGHT\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"V\"}]}], \"decoration\": {\"label\": \"Paste\", \"icon\": \"fa-paste\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"V\"}]}], \"decoration\": {\"label\": \"Paste\", \"icon\": \"fa-paste\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"HOME\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"PG_UP\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"PG_DN\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"END\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&none\", \"decoration\": {\"background\": \"#dcdcdcff\"}},\r\n {\"value\": \"&none\", \"decoration\": {\"background\": \"#dcdcdcff\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}\r\n ]\r\n else\r\n [\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"X\"}]}], \"decoration\": {\"label\": \"Cut\", \"icon\": \"fa-cut\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"X\"}]}], \"decoration\": {\"label\": \"Cut\", \"icon\": \"fa-cut\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&sk\", \"params\": [{\"value\": \"LSHFT\"}], \"decoration\": {\"label\": \"StckyShft\", \"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LGUI\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LALT\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LCTRL\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LSHFT\"}], \"decoration\": {\"background\": \"#f2f2f2ff\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"C\"}]}], \"decoration\": {\"label\": \"Copy\", \"icon\": \"fa-copy\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"C\"}]}], \"decoration\": {\"label\": \"Copy\", \"icon\": \"fa-copy\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LEFT\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"UP\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"DOWN\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"RIGHT\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"V\"}]}], \"decoration\": {\"label\": \"Paste\", \"icon\": \"fa-paste\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&none\", \"decoration\": {\"background\": \"#dcdcdcff\"}},\r\n {\"value\": \"&none\", \"decoration\": {\"background\": \"#dcdcdcff\"}},\r\n {\"value\": \"&none\", \"decoration\": {\"background\": \"#dcdcdcff\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"LC\", \"params\": [{\"value\": \"V\"}]}], \"decoration\": {\"label\": \"Paste\", \"icon\": \"fa-paste\", \"background\": \"#fffec9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"HOME\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"PG_UP\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"PG_DN\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&kp\", \"params\": [{\"value\": \"END\"}], \"decoration\": {\"background\": \"#d9f9c9\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"},\r\n {\"value\": \"&none\", \"decoration\": {\"background\": \"#dcdcdcff\"}},\r\n {\"value\": \"&none\", \"decoration\": {\"background\": \"#dcdcdcff\"}},\r\n {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}, {\"value\": \"&none\"}\r\n ]\r\n end\r\n ]\r\n else . end)\r\n)",
"category": "Special keys",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "💫",
"theme": "blue"
},
"config": {
"category": "Special keys"
},
"param": [],
"mediaUrl": null
},
{
"uid": "emoji_macros",
"title": "Emoji Set",
"subtitle": "Adds 40-Emoji on a Layer",
"description": "Adds an Emoji layer featuring 40 of the most widely used emojis for fast, expressive communication across modern messaging tools. Assign your own layer switch key (```&to```, `&tog` or `&layer`) to activate it.\n| Category | Emojis |\n| :--- | :--- |\n| **Faces & Emotion** | 😊 😉 😍 😅 😂 🤣 😭 🥺 🥲 🤔 🫡 😮 🙁 🫠 |\n| **Hands, People & Sentiment** | ❤️ 🫶 💔 👍 👎 🙏 👏 🤝 🤷 🤦 |\n| **Emphasis, Intent & Structure** | ✅ ❌ ⚠️ 📌 👀 🔥 ✨ 💯 🎉 🚀 |\n| **Tone Nuance & Culture Boosters** | 😎 🙇🏻 💀 🤡 💦 💩 |\n\n### ⚠️ Prerequisites: OS Unicode Support\nStandard keyboards send keycodes, not characters. To output emojis, your OS must be configured to accept hexadecimal input:\n\n🪟 **Windows (WinCompose):** Install and run [WinCompose](https://github.com/samhocevar/wincompose) in the background.\n\n🍏 **macOS:** Install the fixed **Unicode Hex Input** layout from [ldanet/unicode-hex-input-fix](https://github.com/ldanet/unicode-hex-input-fix) and select it as your primary input source.\n\n🐧 **Linux:** Ensure IBus is running (default on GNOME). See [Ubuntu Special Characters](https://help.ubuntu.com/stable/ubuntu-help/tips-specialchars.html.en#ctrlshiftu).\n\n\n*This content is generated by the machines and should meet the same prerequisites as Sunaku’s Glorious Engrammer.*",
"script": "# -------------------------------------------------------------------------\n# ZMK UNICODE MACRO GENERATOR (Protocol v8.4 - UI Timings & Trans Padding)\n# -------------------------------------------------------------------------\n# Purpose: Automatically generates ZMK macros and a dedicated Emoji Layer.\n# Features: \n# 1. Abstract Naming: Macros are named generically (e.g., &UC_PREFIX, &UC_winking_face).\n# 2. Macro Chaining: Defines OS prefixes/suffixes once and chains them.\n# 3. Custom Speeds: Uses UI-defined wait and tap times to prevent OS dropped keys.\n# 4. Layer Builder: Safely pads with &trans so layer-toggles aren't broken.\n# -------------------------------------------------------------------------\n\n# =========================================================================\n# --- 1. CONFIGURATION & UNICODE DATA (USER EDITABLE) ---\n# =========================================================================\n\n# --- Color Palette ---\n\"#ffadadff\" as $bg_faces | # Pastel Red\n\"#e0f032ff\" as $bg_hands | # Yellow-Green\n\"#9bf6ffff\" as $bg_intent | # Pastel Cyan\n\"#bdb2ffff\" as $bg_boosters | # Pastel Purple\n\n# --- Layer ---\n\"Emoji_flows\" as $emoji_layer | # Layer Name\n\n[\n # --- Faces & Emotion ---\n { \"name\": \"smiling_eyes\", \"u\": \"1F60A\", \"symb\": \"😊\", \"bg\": $bg_faces },\n { \"name\": \"winking_face\", \"u\": \"1F609\", \"symb\": \"😉\", \"bg\": $bg_faces },\n { \"name\": \"heart_eyes\", \"u\": \"1F60D\", \"symb\": \"😍\", \"bg\": $bg_faces },\n { \"name\": \"sweat_smile\", \"u\": \"1F605\", \"symb\": \"😅\", \"bg\": $bg_faces },\n { \"name\": \"tears_of_joy\", \"u\": \"1F602\", \"symb\": \"😂\", \"bg\": $bg_faces },\n { \"name\": \"rofl\", \"u\": \"1F923\", \"symb\": \"🤣\", \"bg\": $bg_faces },\n { \"name\": \"loudly_crying\", \"u\": \"1F62D\", \"symb\": \"😭\", \"bg\": $bg_faces },\n { \"name\": \"pleading_face\", \"u\": \"1F97A\", \"symb\": \"🥺\", \"bg\": $bg_faces },\n { \"name\": \"smiling_tear\", \"u\": \"1F972\", \"symb\": \"🥲\", \"bg\": $bg_faces },\n { \"name\": \"thinking_face\", \"u\": \"1F914\", \"symb\": \"🤔\", \"bg\": $bg_faces },\n { \"name\": \"saluting_face\", \"u\": \"1FAE1\", \"symb\": \"🫡\", \"bg\": $bg_faces },\n { \"name\": \"open_mouth\", \"u\": \"1F62E\", \"symb\": \"😮\", \"bg\": $bg_faces },\n { \"name\": \"slightly_frowning\", \"u\": \"1F641\", \"symb\": \"🙁\", \"bg\": $bg_faces },\n { \"name\": \"melting_face\", \"u\": \"1FAE0\", \"symb\": \"🫠\", \"bg\": $bg_faces },\n\n # --- Hands, People & Sentiment ---\n { \"name\": \"red_heart\", \"u\": \"2764 FE0F\", \"symb\": \"❤️\", \"bg\": $bg_hands }, \n { \"name\": \"heart_hands\", \"u\": \"1FAF6\", \"symb\": \"🫶\", \"bg\": $bg_hands },\n { \"name\": \"broken_heart\", \"u\": \"1F494\", \"symb\": \"💔\", \"bg\": $bg_hands },\n { \"name\": \"thumbs_up\", \"u\": \"1F44D\", \"symb\": \"👍\", \"bg\": $bg_hands },\n { \"name\": \"thumbs_down\", \"u\": \"1F44E\", \"symb\": \"👎\", \"bg\": $bg_hands },\n { \"name\": \"folded_hands\", \"u\": \"1F64F\", \"symb\": \"🙏\", \"bg\": $bg_hands },\n { \"name\": \"clapping_hands\", \"u\": \"1F44F\", \"symb\": \"👏\", \"bg\": $bg_hands },\n { \"name\": \"handshake\", \"u\": \"1F91D\", \"symb\": \"🤝\", \"bg\": $bg_hands },\n { \"name\": \"shrug\", \"u\": \"1F937\", \"symb\": \"🤷\", \"bg\": $bg_hands },\n { \"name\": \"facepalm\", \"u\": \"1F926\", \"symb\": \"🤦\", \"bg\": $bg_hands },\n\n # --- Emphasis / Intent / Structure ---\n { \"name\": \"check_mark\", \"u\": \"2705\", \"symb\": \"✅\", \"bg\": $bg_intent },\n { \"name\": \"cross_mark\", \"u\": \"274C\", \"symb\": \"❌\", \"bg\": $bg_intent },\n { \"name\": \"warning\", \"u\": \"26A0 FE0F\", \"symb\": \"⚠️\", \"bg\": $bg_intent },\n { \"name\": \"pushpin\", \"u\": \"1F4CC\", \"symb\": \"📌\", \"bg\": $bg_intent },\n { \"name\": \"eyes\", \"u\": \"1F440\", \"symb\": \"👀\", \"bg\": $bg_intent },\n { \"name\": \"fire\", \"u\": \"1F525\", \"symb\": \"🔥\", \"bg\": $bg_intent }, \n { \"name\": \"sparkles\", \"u\": \"2728\", \"symb\": \"✨\", \"bg\": $bg_intent },\n { \"name\": \"hundred_points\", \"u\": \"1F4AF\", \"symb\": \"💯\", \"bg\": $bg_intent },\n { \"name\": \"party_popper\", \"u\": \"1F389\", \"symb\": \"🎉\", \"bg\": $bg_intent },\n { \"name\": \"rocket\", \"u\": \"1F680\", \"symb\": \"🚀\", \"bg\": $bg_intent },\n\n # --- Tone Nuance & Internet Culture Boosters ---\n { \"name\": \"sunglasses\", \"u\": \"1F60E\", \"symb\": \"😎\", \"bg\": $bg_boosters },\n { \"name\": \"person_bowing\", \"u\": \"1F647 1F3FB\", \"symb\": \"🙇🏻\", \"bg\": $bg_boosters },\n { \"name\": \"skull\", \"u\": \"1F480\", \"symb\": \"💀\", \"bg\": $bg_boosters },\n { \"name\": \"clown\", \"u\": \"1F921\", \"symb\": \"🤡\", \"bg\": $bg_boosters },\n { \"name\": \"sweat_drops\", \"u\": \"1F4A6\", \"symb\": \"💦\", \"bg\": $bg_boosters },\n { \"name\": \"poop\", \"u\": \"1F4A9\", \"symb\": \"💩\", \"bg\": $bg_boosters }\n] as $macro_data |\n\n# =========================================================================\n# --- 2. CORE ENGINE (DO NOT EDIT BELOW THIS LINE) ---\n# =========================================================================\n\n(\n # --- HELPER FUNCTIONS ---\n def to_hex($len):\n \"0123456789ABCDEF\" as $chars |\n [ . as $n | recurse(if . >= 16 then ./16|floor else empty end) | . % 16 ] \n | reverse | map($chars[.:.+1]) | join(\"\") \n | (if length < $len then \"0\" * ($len - length) + . else . end);\n\n def mk_bare($v): { \"value\": $v, \"params\": [] };\n def mk_kp($code): { \"value\": \"&kp\", \"params\": [ mk_bare($code) ] };\n\n # --- MAIN LOGIC ---\n (if .keymap then .keymap else . end) |= (\n \n # --- KNOWLEDGE BASE: Prefix & Suffix definitions ---\n {\n \"windows\": { \"start_mode\": \"¯o_tap\", \"start_keys\": [\"RALT\", \"U\"], \"end_mode\": \"¯o_tap\", \"end_keys\": [\"ENTER\"], \"surrogate\": false },\n \"macos\": { \"start_mode\": \"¯o_press\", \"start_keys\": [\"LALT\"], \"end_mode\": \"¯o_release\", \"end_keys\": [\"LALT\"], \"surrogate\": true },\n \"linux\": { \"start_mode\": \"¯o_tap\", \"start_keys\": [\"LC(LS(U))\"], \"end_mode\": \"¯o_tap\", \"end_keys\": [\"ENTER\"], \"surrogate\": false }\n } as $os_registry |\n \n ($os_registry[$target_os]) as $cfg |\n\n # =====================================================================\n # PHASE 1: GENERATE OS MODIFIER MACROS (The Prefix & Suffix)\n # =====================================================================\n {\n \"name\": \"&UC_PREFIX\",\n \"description\": \"Unicode Prefix Sequence (\\($target_os))\",\n \"compatible\": \"zmk,behavior-macro\",\n \"config\": { \"wait-ms\": $macro_wait, \"tap-ms\": $macro_tap },\n \"bindings\": [ mk_bare($cfg.start_mode), ($cfg.start_keys[] | mk_kp(.)) ],\n \"params\": []\n } as $macro_start |\n\n {\n \"name\": \"&UC_SUFFIX\",\n \"description\": \"Unicode Suffix Sequence (\\($target_os))\",\n \"compatible\": \"zmk,behavior-macro\",\n \"config\": { \"wait-ms\": $macro_wait, \"tap-ms\": $macro_tap },\n \"bindings\": [ mk_bare($cfg.end_mode), ($cfg.end_keys[] | mk_kp(.)) ],\n \"params\": []\n } as $macro_end |\n\n # Ensure we clear out old generated macros to prevent duplication on multiple runs\n # (Note: added &UC_start and &UC_end to the filter list to clean up previous versions)\n ( [$macro_start.name, $macro_end.name, \"&UC_start\", \"&UC_end\"] + ($macro_data | map(\"&UC_\\(.name)\")) ) as $generated_names |\n \n .macros |= (\n if . == null then [] else . end |\n map(select(.name as $n | $generated_names | index($n) | not)) |\n . + [$macro_start, $macro_end]\n ) |\n\n # =====================================================================\n # PHASE 2: GENERATE CHAINED EMOJI MACROS\n # =====================================================================\n (reduce $macro_data[] as $item (.;\n ([\n ($item.u | split(\" \")[] | . as $cp |\n \n # 1. Trigger the abstract Start Macro\n mk_bare($macro_start.name),\n \n # 2. Tap the Hex Codes\n mk_bare(\"¯o_tap\"),\n \n ( reduce ($cp | ascii_upcase | split(\"\") | .[]) as $char \n (0; . * 16 + (\"0123456789ABCDEF\" | index($char))) \n ) as $dec |\n\n (if $cfg.surrogate and $dec > 65535 then\n [ (((($dec - 65536) / 1024 | floor) + 55296) | to_hex(4)), \n (((($dec - 65536) % 1024) + 56320) | to_hex(4)) ]\n else \n [ $cp ] \n end)[] | . as $hex_segment |\n\n ($hex_segment | split(\"\")[] | \n (if . >= \"0\" and . <= \"9\" then \"N\" + . else . end) | mk_kp(.)\n ),\n \n # 3. Trigger the abstract End Macro\n mk_bare($macro_end.name)\n )\n ]) as $bindings |\n\n # CONSTRUCT AND INJECT MACRO\n {\n \"name\": \"&UC_\\($item.name)\",\n \"description\": \"Unicode \\($item.symb) \\($item.name)\",\n \"compatible\": \"zmk,behavior-macro\",\n \"config\": { \"wait-ms\": $macro_wait, \"tap-ms\": $macro_tap },\n \"bindings\": $bindings,\n \"params\": []\n } as $new_macro |\n\n .macros |= . + [$new_macro]\n )) |\n\n # =====================================================================\n # PHASE 3: GENERATE EMOJI LAYER\n # =====================================================================\n \n # 1. Read hardware key count from base layer\n (.layers[0] | length) as $key_count |\n\n # 2. Map macros to standard layout array with UI decorations\n ([\n $macro_data[] | {\n \"value\": \"&UC_\\(.name)\",\n \"params\": [],\n \"decoration\": {\n \"label\": .symb,\n \"background\": .bg\n }\n }\n ]) as $emoji_keys |\n\n # 3. Truncate (if too many macros) and pad with &trans to match key_count exactly\n (\n $emoji_keys[0:$key_count] + \n [range([0, $key_count - ($emoji_keys | length)] | max) | { \"value\": \"&trans\", \"params\": [] }]\n ) as $new_layer |\n\n # 4. Inject layer (Overwrite existing \"Emoji\" layer, or append a new one)\n ((.layer_names | index($emoji_layer)) // (.layers | length)) as $layer_idx |\n .layer_names[$layer_idx] = $emoji_layer |\n .layers[$layer_idx] = $new_layer\n )\n)",
"category": "Special keys",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🤪",
"theme": "red"
},
"config": {
"script": "\""
},
"param": [
{
"id": "target_os",
"label": "Operating System",
"type": "select",
"options": [
"windows",
"macos",
"linux"
],
"labels": [
"Windows",
"macOS",
"Linux"
],
"default": "windows"
},
{
"id": "macro_wait",
"label": "Macro Wait (ms)",
"type": "number",
"default": "10"
},
{
"id": "macro_tap",
"label": "Macro Tap (ms)",
"type": "number",
"default": "10"
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/sp_emoji_macros.png"
},
{
"uid": "mirror_keyboard_halves",
"title": "Mirror Keyboard Halves",
"subtitle": "Swaps Left and Right Sides",
"description": "Automatically swaps all keybindings between the left and right halves of your keyboard for a specific layer.\n\nThis uses exact, 1:1 hardware matrix arrays for both **Go60** and **Glove80**, guaranteeing zero glitches around the thumb clusters or skipped bottom rows.\n\n### Features:\n* **Swap Style:** Choose between a physical block translation or a symmetric reflection (pinky-to-pinky).\n* **Thumb Exclusion:** Optionally lock your thumb keys in place so only the finger-wells mirror.\n\n### Safety Check:\nIf you select a layer that doesn't exist, or run this on an unsupported keyboard, the script will gracefully abort to protect your layout.",
"script": "# ----------------------------------------------------------------------------\n# 1. CORE ENGINE (Global Scope to prevent WASM pipeline bugs)\n# ----------------------------------------------------------------------------\ndef build_lookup(left; right; size):\n reduce range(left | length) as $i (\n [range(size)];\n .[(left[$i])] = right[$i] |\n .[(right[$i])] = left[$i]\n );\n\n# ----------------------------------------------------------------------------\n# 2. MAIN EXECUTION PIPELINE\n# ----------------------------------------------------------------------------\n(if type == \"object\" and .keymap? then .keymap else . end) |= (\n \n ($layer_idx | tonumber) as $l_idx |\n \n (if .layers == null or (.layers | length) == 0 then\n error(\"FATAL: Keymap contains no layers.\")\n else . end) |\n \n (.layers[0] | length) as $kb_len |\n \n # Map exactly to the hardware indices provided in the physical schematics\n (if $kb_len == 80 then\n [0,1,2,3,4, 10,11,12,13,14,15, 22,23,24,25,26,27, 34,35,36,37,38,39, 46,47,48,49,50,51, 52,53,54, 64,65,66,67,68, 69,70,71] as $L |\n (if $mirror_style == \"symmetric\" then\n [9,8,7,6,5, 21,20,19,18,17,16, 33,32,31,30,29,28, 45,44,43,42,41,40, 63,62,61,60,59,58, 57,56,55, 79,78,77,76,75, 74,73,72]\n else\n [5,6,7,8,9, 16,17,18,19,20,21, 28,29,30,31,32,33, 40,41,42,43,44,45, 58,59,60,61,62,63, 55,56,57, 75,76,77,78,79, 72,73,74]\n end) as $R |\n \n build_lookup($L; $R; 80) |\n \n # Safely overwrite the thumb indices to map to themselves if excluded\n (if $exclude_thumbs == \"yes\" then\n reduce [52,53,54,55,56,57,69,70,71,72,73,74][] as $t (.; .[$t] = $t)\n else . end)\n \n elif $kb_len == 60 then\n [0,1,2,3,4,5, 12,13,14,15,16,17, 24,25,26,27,28,29, 36,37,38,39,40,41, 48,49,50, 54,55,56] as $L |\n (if $mirror_style == \"symmetric\" then\n [11,10,9,8,7,6, 23,22,21,20,19,18, 35,34,33,32,31,30, 47,46,45,44,43,42, 53,52,51, 59,58,57]\n else\n [6,7,8,9,10,11, 18,19,20,21,22,23, 30,31,32,33,34,35, 42,43,44,45,46,47, 51,52,53, 57,58,59]\n end) as $R |\n \n build_lookup($L; $R; 60) |\n \n # Safely overwrite the thumb indices to map to themselves if excluded\n (if $exclude_thumbs == \"yes\" then\n reduce [54,55,56,57,58,59][] as $t (.; .[$t] = $t)\n else . end)\n \n else\n error(\"FATAL: Unsupported matrix. Expected 80 or 60 keys, found \" + ($kb_len | tostring))\n end) as $lookup |\n \n (if (.layers | length) <= $l_idx then\n error(\"FATAL: Target Layer \" + ($l_idx | tostring) + \" does not exist.\")\n else . end) |\n \n # Replace the target layer array using the explicit lookup mapping\n .layers[$l_idx] = (\n .layers[$l_idx] as $old_layer |\n [\n range($kb_len) |\n . as $current_idx |\n $lookup[$current_idx] as $target_idx |\n ($old_layer[$target_idx] // { \"value\": \"&none\" })\n ]\n )\n)",
"category": "Special keys",
"appUrl": null,
"manifest": {
"author": "MoosyResearch",
"keyboards": [
"glove80",
"go60"
],
"icon": "🪞",
"theme": "blue"
},
"config": {
"category": "Special keys",
"script": "\""
},
"param": [
{
"id": "layer_idx",
"label": "Layer to Mirror",
"type": "select",
"options": [
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
"10",
"11",
"12",
"13",
"14",
"15",
"16",
"17",
"18",
"19",
"20",
"21",
"22",
"23",
"24",
"25",
"26",
"27",
"28",
"29",
"30"
],
"default": "0"
},
{
"id": "mirror_style",
"label": "Swap Style",
"type": "select",
"options": [
"symmetric",
"block"
],
"labels": [
"Symmetric Mirror (Pinky -> Pinky)",
"Block Swap (Left Side -> Right Side)"
],
"default": "symmetric"
},
{
"id": "exclude_thumbs",
"label": "Exclude Thumb Keys",
"type": "select",
"options": [
"no",
"yes"
],
"labels": [
"No, swap thumbs too",
"Yes, keep thumb keys in their original place"
],
"default": "no"
}
],
"mediaUrl": null
},
{
"uid": "sym_numrow",
"title": "Primeagen's NumRow",
"subtitle": "Custom Number Row",
"description": "Modifies the number row to use dual-function keys.\r\n\r\nInspired by ThePrimeagen, this maps specific programmer symbols directly onto the number row so you don't have to stretch for the Shift key. \r\n\r\n**⚠️Warning: It replaces your current NumRow on layer0**\r\n\r\nCurrently supports **Hold-Tap** (hold for symbol, tap for number). *Tap-Dance and Mod-Morph implementations are coming soon.*",
"script": "# ==============================================================================\r\n# 1. CORE UTILITIES & HARDWARE\r\n# ==============================================================================\r\n\r\ndef log_err($msg):\r\n ($msg | stderr) | empty;\r\n\r\ndef GetHardware:\r\n (.keyboard | if type == \"string\" then ascii_downcase else \"\" end) as $kb |\r\n if $kb == \"glove80\" then\r\n { offset: 10, len: 12 } # Glove80 number row is keys 10 through 22\r\n elif $kb == \"go60\" then\r\n { offset: 0, len: 12 } # Go60 number row is keys 0 through 12\r\n else\r\n log_err(\"FATAL: Unsupported or missing keyboard property in layout\") | halt\r\n end;\r\n\r\n# ==============================================================================\r\n# 2. BEHAVIOR DEFINITIONS\r\n# ==============================================================================\r\n\r\ndef get_primeagen_holdtap: {\r\n \"name\": \"&ht_primeagen\",\r\n \"description\": \"Primeagen NumRow Hold-Tap\",\r\n \"bindings\": [\"&kp\", \"&kp\"],\r\n \"tappingTermMs\": 200,\r\n \"flavor\": \"tap-preferred\"\r\n};\r\n\r\n# ==============================================================================\r\n# 3. DATA REGISTRY\r\n# ==============================================================================\r\n\r\n# Array 1: Numbers (Tap)\r\n[\"AT\",\"N1\",\"N2\",\"N3\",\"N4\",\"N5\",\"N6\",\"N7\",\"N8\",\"N9\",\"N0\",\"DOLLAR\"] as $arr_nums |\r\n\r\n# Array 2: Symbols (Hold)\r\n[\"PLUS\",\"EXCL\",\"LBKT\",\"LBRC\",\"LPAR\",\"AMPS\",\"EQUAL\",\"RPAR\",\"RBRC\",\"RBKT\",\"ASTRK\",\"PERCENT\"] as $arr_syms |\r\n\r\n(GetHardware) as $hw |\r\n\r\n# ==============================================================================\r\n# 4. MAIN TRANSFORMATION ENGINE\r\n# ==============================================================================\r\n\r\n(.keymap // .) |= (\r\n \r\n # Step 1: Inject the selected behavior into the AST\r\n (if $behavior_type == \"hold-tap\" then\r\n .holdTaps = ((.holdTaps // []) + [get_primeagen_holdtap] | unique_by(.name))\r\n else \r\n . \r\n end) \r\n \r\n |\r\n\r\n # Step 2: Modify the Number Row on the Base Layer\r\n .layers[0] |= [\r\n range(length) as $i | .[$i] |\r\n \r\n # Check if the current key index is strictly inside the hardware's number row\r\n if ($i >= $hw.offset) and ($i < ($hw.offset + $hw.len)) then\r\n \r\n ($i - $hw.offset) as $idx | # Maps index back to 0-9 to pull from our arrays cleanly\r\n\r\n if $behavior_type == \"hold-tap\" then\r\n \r\n # Safely preserve any UI decorators the user has applied\r\n (if type == \"object\" and .decoration then { decoration: .decoration } else {} end) as $dec |\r\n \r\n {\r\n value: \"&ht_primeagen\",\r\n params: [\r\n { value: $arr_nums[$idx], params: [] }, # Tap action (Number)\r\n { value: $arr_syms[$idx], params: [] } # Hold action (Symbol)\r\n ]\r\n } + $dec\r\n \r\n elif $behavior_type == \"tap-dance\" then\r\n # FUTURE: Implement Tap-Dance AST structure here\r\n .\r\n elif $behavior_type == \"mod-morph\" then\r\n # FUTURE: Implement Mod-Morph AST structure here\r\n .\r\n else \r\n . \r\n end\r\n\r\n else \r\n . # Leave keys outside the number row completely untouched\r\n end\r\n ]\r\n)",
"category": "Symbols",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🔢",
"theme": "yellow"
},
"config": {
"category": "Symbols"
},
"param": [
{
"id": "behavior_type",
"label": "Trigger Behavior",
"type": "select",
"options": [
"hold-tap",
"tap-dance",
"mod-morph"
],
"labels": [
"Hold-Tap (Hold for Symbol)",
"Tap-Dance (Coming Soon)",
"Mod-Morph (Coming Soon)"
],
"default": "hold-tap"
}
],
"mediaUrl": "https://moosylog.github.io/flows4json/sym_PrimNumRow.png"
},
{
"uid": "add_symbl_lyr",
"title": "Symbol Layer",
"subtitle": "Adds Sunaku's Symbol Layer",
"description": "This adds Sunaku’s Symbol Layer to your **Go60** or **Glove80** layout.\r\n\r\n### This creates:\r\n\r\n- A new layer named **Symbol**\r\n- A macro, `&symb_dotdot_v1_TKZ`, that outputs `..` with a single key press on the Symbol layer\r\n- When `RH-T1` is configured as a normal key press (`&kp`), it will be replaced with a layer-tap (`<`) that activates the new `Symbol` layer when held. Otherwise, the layer activation needs to be configured manually.",
"script": "# --- CONFIGURATION CONSTANTS ---\r\n\"Symbol\" as $layer_name |\r\n\"&symb_dotdot_v1_TKZ\" as $macro_name |\r\n\r\n# 1. Capture hardware type\r\n(.keyboard? | if type == \"string\" then ascii_downcase else \"glove80\" end) as $kb |\r\n\r\n# --- ERROR HANDLING: Check for duplicates ---\r\n((.keymap // .).layer_names // []) as $existing_layers |\r\nif ($existing_layers | index($layer_name) != null) then\r\n error(\"A layer named '\\\\($layer_name)' already exists! Aborting to prevent duplicates.\")\r\nelse . end |\r\n\r\n# 2. Define the required macro dynamically\r\n{\r\n \"name\": $macro_name,\r\n \"description\": \"Symbol layer dot dot\",\r\n \"waitMs\": 0,\r\n \"tapMs\": 0,\r\n \"bindings\": [\r\n { \"value\": \"¯o_tap\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"DOT\" } ] },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"DOT\" } ] }\r\n ],\r\n \"params\": []\r\n} as $dot_macro |\r\n\r\n# 3. Select the correct Layer Matrix based on hardware\r\n(if $kb == \"go60\" then\r\n [\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"GRAVE\" } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"COMMA\" } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N9\" } ] } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N0\" } ] } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SEMI\" } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"DOT\" } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N1\" } ] } ], \"decoration\": { \"background\": \"#fbe6feff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LBKT\" } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"LBKT\" } ] } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"RBKT\" } ] } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"RBKT\" } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"FSLH\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"GRAVE\" } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"DEL\" } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"TAB\" } ] } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"INS\" } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"ESC\" } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N3\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N6\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"EQUAL\" } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"MINUS\" } ] } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N4\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N8\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"SINGLE_QUOTE\" } ] } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"BSPC\" } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"TAB\" } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SPACE\" } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"RET\" } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"GRAVE\" } ] } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"COMMA\" } ] } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"BSLH\" } ] } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"MINUS\" } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"DOT\" } ] } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"FSLH\" } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SQT\" } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"LSHFT\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"LCTRL\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"LALT\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"LGUI\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SQT\" } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"SINGLE_QUOTE\" } ] } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"EQUAL\" } ] } ], \"decoration\": { \"background\": \"#f8e6d7\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"BSLH\" } ], \"decoration\": { \"background\": \"#fffec9ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N7\" } ] } ], \"decoration\": { \"background\": \"#fffec9ff\" } },\r\n { \"value\": $macro_name, \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N5\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"SEMI\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N2\" } ] } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&none\" }, { \"value\": \"&none\" },\r\n { \"value\": \"&none\", \"decoration\": { \"icon\": \"io-finger-print\", \"color\": \"#ffffffff\", \"background\": \"#000000ff\" } }\r\n ]\r\nelse\r\n [\r\n { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"GRAVE\" } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N6\" } ] } ], \"decoration\": { \"label\": \",\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N9\" } ] } ], \"decoration\": { \"label\": \"(\", \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N0\" } ] } ], \"decoration\": { \"label\": \")\", \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SEMI\" } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"COMMA\" } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N1\" } ] } ], \"decoration\": { \"label\": \"!\", \"background\": \"#fbe6feff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LBKT\" } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"LBKT\" } ] } ], \"decoration\": { \"label\": \"{\", \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"RBKT\" } ] } ], \"decoration\": { \"label\": \"}\", \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"RBKT\" } ], \"decoration\": { \"background\": \"#e0ebf6\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"FSLH\" } ] } ], \"decoration\": { \"label\": \"?\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"DOT\" } ], \"decoration\": { \"label\": \".\", \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"DEL\" } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"TAB\" } ] } ], \"decoration\": { \"label\": \"Shift Tab\", \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"INS\" } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"ESC\" } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N3\" } ] } ], \"decoration\": { \"label\": \"#\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N6\" } ] } ], \"decoration\": { \"label\": \"^\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"EQUAL\" } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"MINUS\" } ] } ], \"decoration\": { \"label\": \"_\", \"background\": \"#e5feff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N4\" } ] } ], \"decoration\": { \"label\": \"$\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N8\" } ] } ], \"decoration\": { \"label\": \"*\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"COMMA\" } ], \"decoration\": { \"label\": \",\", \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"BSPC\" } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"TAB\" } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SPACE\" } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"RET\" } ], \"decoration\": { \"background\": \"#f8e6d7ff\" } },\r\n { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"GRAVE\" } ] } ], \"decoration\": { \"label\": \"~\", \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"COMMA\" } ] } ], \"decoration\": { \"label\": \"<\", \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"BSLH\" } ] } ], \"decoration\": { \"label\": \"|\", \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"MINUS\" } ], \"decoration\": { \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"DOT\" } ] } ], \"decoration\": { \"label\": \">\", \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"FSLH\" } ], \"decoration\": { \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"BSLH\" } ], \"decoration\": { \"background\": \"#fbe6feff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"DOT\" } ], \"decoration\": { \"label\": \".\", \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N8\" } ] } ], \"decoration\": { \"label\": \"*\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&none\" }, { \"value\": \"&none\" }, { \"value\": \"&none\" },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SEMI\" } ], \"decoration\": { \"label\": \";\", \"background\": \"#d9f9c9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"SINGLE_QUOTE\" } ] } ], \"decoration\": { \"label\": \"\\\\\\\"\", \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SQT\" } ], \"decoration\": { \"label\": \"'\", \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"GRAVE\" } ], \"decoration\": { \"label\": \"`\", \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"BSLH\" } ], \"decoration\": { \"background\": \"#fbe6feff\" } },\r\n { \"value\": \"&none\" },\r\n { \"value\": $macro_name, \"decoration\": { \"label\": \"..\", \"background\": \"#e5feff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N7\" } ] } ], \"decoration\": { \"label\": \"&\", \"background\": \"#e5feff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"SQT\" } ], \"decoration\": { \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"SINGLE_QUOTE\" } ] } ], \"decoration\": { \"label\": \"\\\\\\\"\", \"background\": \"#fbe6fe\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"EQUAL\" } ] } ], \"decoration\": { \"label\": \"+\", \"background\": \"#e5feff\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N5\" } ] } ], \"decoration\": { \"label\": \"%\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"SEMI\" } ] } ], \"decoration\": { \"label\": \":\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&kp\", \"params\": [ { \"value\": \"LS\", \"params\": [ { \"value\": \"N2\" } ] } ], \"decoration\": { \"label\": \"@\", \"background\": \"#fffec9\" } },\r\n { \"value\": \"&none\" }, { \"value\": \"&none\" },\r\n { \"value\": \"&none\", \"decoration\": { \"icon\": \"io-finger-print\", \"color\": \"#ffffffff\", \"background\": \"#000000fc\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"RSHFT\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"RCTRL\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"RALT\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&sk\", \"params\": [ { \"value\": \"RGUI\" } ], \"decoration\": { \"background\": \"#f2f2f2ff\" } },\r\n { \"value\": \"&none\" }\r\n ]\r\nend) as $new_layer |\r\n\r\n# 4. Engine STEP A: Force the macro injection first\r\n(.keymap // .) |= (\r\n .macros = (.macros // []) |\r\n if (any(.macros[]; .name == $macro_name) | not) then\r\n .macros += [$dot_macro]\r\n else\r\n .\r\n end\r\n) |\r\n\r\n# 5. Engine STEP B: Now that the macro is strictly built, inject the layer\r\n(.keymap // .) |= (\r\n .layer_names = (.layer_names // []) + [$layer_name] |\r\n .layers = (.layers // []) + [$new_layer]\r\n) |\r\n\r\n# 6. Engine STEP C: Non-destructive Layer-Tap injection on base layer\r\n(.keymap // .) |= (\r\n (.layer_names | index($layer_name)) as $idx_symbol |\r\n (if $kb == \"glove80\" then 74 else 59 end) as $base_lt_idx |\r\n \r\n .layers[0][$base_lt_idx] as $target_key |\r\n \r\n # Only upgrade the key if it is a simple &kp so we don't break custom Hold-Taps/Macros\r\n if $target_key.value == \"&kp\" then\r\n .layers[0][$base_lt_idx] = {\r\n \"value\": \"<\",\r\n \"params\": [\r\n {\"value\": $idx_symbol, \"params\": []},\r\n $target_key.params[0] # Dynamically reuse their existing keycode!\r\n ]\r\n } + (if $target_key.decoration then {decoration: $target_key.decoration} else {} end)\r\n else\r\n .\r\n end\r\n)",
"category": "Symbols",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🔣",
"theme": "yellow"
},
"config": {
"category": "Symbols"
},
"param": [],
"mediaUrl": "https://moosylog.github.io/flows4json/symbol_layer..png"
},
{
"uid": "de_symbol",
"title": "Symbols 2 German",
"subtitle": "🌍 Map en-US to de-DE",
"description": "When you change the language settings in the MoErgo Layout Editor from the default US English keyboard layout (en-US) to German (de-DE), some symbols no longer match their expected characters.\n\nThis flow remaps those symbols so they produce the correct characters for the German layout.\n\n⚠️ **Required:** Symbol Layer must be included in your layout.\n\n🤖 **Quality note:** The symbol mappings aren’t created by humans, they’re generated by the machines.",
"script": "# ==============================================================================\n# GERMAN SYMBOL MAPPER (For MoErgo Layout Editor / ZMK)\n# OS TARGET: WINDOWS / LINUX (Standard ISO / de-DE)\n# ==============================================================================\n\n{\n # --- Punctuation & Basics ---\n \"DOT\": [{\"value\": \"DOT\", \"params\": []}], # . -> .\n \"COMMA\": [{\"value\": \"COMMA\", \"params\": []}], # , -> ,\n \"EQUAL\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N0\", \"params\": []}]}], # = -> Shift + 0\n\n # --- Fixed Column 4 Realignment ---\n \"MINUS\": [{\"value\": \"LS\", \"params\": [{\"value\": \"FSLH\", \"params\": []}]}], # Source Minus -> German Underscore (Shift + -)\n \"UNDER\": [{\"value\": \"FSLH\", \"params\": []}], # Source Underscore -> German Minus (- key)\n \"UNDERSCORE\": [{\"value\": \"FSLH\", \"params\": []}], \n \"LS(MINUS)\": [{\"value\": \"FSLH\", \"params\": []}], \n \"PLUS\": [{\"value\": \"RBKT\", \"params\": []}], # + -> + key (German physical RBKT)\n\n # --- Brackets & Braces ---\n \"LPAR\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N8\", \"params\": []}]}], # ( -> Shift + 8\n \"LS(N9)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N8\", \"params\": []}]}], \n \"RPAR\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N9\", \"params\": []}]}], # ) -> Shift + 9\n \"LS(N0)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N9\", \"params\": []}]}], \n \"LBKT\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N8\", \"params\": []}]}], # [ -> AltGr + 8\n \"RBKT\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N9\", \"params\": []}]}], # ] -> AltGr + 9\n \"LBRC\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N7\", \"params\": []}]}], # { -> AltGr + 7\n \"LS(LBKT)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N7\", \"params\": []}]}], \n \"RBRC\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N0\", \"params\": []}]}], # } -> AltGr + 0\n \"LS(RBKT)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N0\", \"params\": []}]}], \n \"LT\": [{\"value\": \"NON_US_BSLH\", \"params\": []}], # < -> < key\n \"LS(COMMA)\": [{\"value\": \"NON_US_BSLH\", \"params\": []}], \n \"GT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}], # > -> Shift + <\n \"LS(DOT)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}], \n\n # --- Slashes & Pipes ---\n \"FSLH\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N7\", \"params\": []}]}], # / -> Shift + 7\n \"BSLH\": [{\"value\": \"RA\", \"params\": [{\"value\": \"MINUS\", \"params\": []}]}], # \\ -> AltGr + ß\n \"PIPE\": [{\"value\": \"RA\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}], # | -> AltGr + <\n \"LS(BSLH)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}], \n\n # --- Quotes & Ticks ---\n \"SQT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_HASH\", \"params\": []}]}], # ' -> Shift + #\n \"SINGLE_QUOTE\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_HASH\", \"params\": []}]}], \n \"DQT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], # \" -> Shift + 2\n \"LS(SINGLE_QUOTE)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], \n \"LS(SQT)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], \n \"GRAVE\": [{\"value\": \"LS\", \"params\": [{\"value\": \"EQUAL\", \"params\": []}]}], # ` -> Shift + ´\n\n # --- Special Symbols (Number Row & Misc) ---\n \"EXCLM\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N1\", \"params\": []}]}], # ! -> Shift + 1\n \"LS(N1)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N1\", \"params\": []}]}], \n \"AT\": [{\"value\": \"RA\", \"params\": [{\"value\": \"Q\", \"params\": []}]}], # @ -> AltGr + Q\n \"LS(N2)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"Q\", \"params\": []}]}], \n \"HASH\": [{\"value\": \"NON_US_HASH\", \"params\": []}], # # -> # key\n \"LS(N3)\": [{\"value\": \"NON_US_HASH\", \"params\": []}], \n \"DLLR\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N4\", \"params\": []}]}], # $ -> Shift + 4\n \"LS(N4)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N4\", \"params\": []}]}], \n \"PRCNT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N5\", \"params\": []}]}], # % -> Shift + 5\n \"LS(N5)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N5\", \"params\": []}]}], \n \"CARET\": [{\"value\": \"GRAVE\", \"params\": []}], # ^ -> ^ key (top left)\n \"LS(N6)\": [{\"value\": \"GRAVE\", \"params\": []}], \n \"AMPS\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N6\", \"params\": []}]}], # & -> Shift + 6\n \"LS(N7)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N6\", \"params\": []}]}], \n \"STAR\": [{\"value\": \"LS\", \"params\": [{\"value\": \"RBKT\", \"params\": []}]}], # * -> Shift + +\n \"LS(N8)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"RBKT\", \"params\": []}]}], \n \"TILDE\": [{\"value\": \"RA\", \"params\": [{\"value\": \"RBKT\", \"params\": []}]}], # ~ -> AltGr + +\n \"LS(GRAVE)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"RBKT\", \"params\": []}]}], \n \"QMARK\": [{\"value\": \"LS\", \"params\": [{\"value\": \"MINUS\", \"params\": []}]}], # ? -> Shift + ß\n \"LS(FSLH)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"MINUS\", \"params\": []}]}], \n \"COLON\": [{\"value\": \"LS\", \"params\": [{\"value\": \"DOT\", \"params\": []}]}], # : -> Shift + .\n \"LS(SEMI)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"DOT\", \"params\": []}]}], \n \"SEMI\": [{\"value\": \"LS\", \"params\": [{\"value\": \"COMMA\", \"params\": []}]}] # ; -> Shift + ,\n} as $german_symbol_map |\n\n# ==============================================================================\n# CONFIGURATION TARGETS\n# ==============================================================================\n\n.locale = \"de-DE\" |\n\"Symbol\" as $layer_to_translate |\n\n# ==============================================================================\n# BEHIND-THE-SCENES TRANSLATION ENGINE\n# ==============================================================================\n\n(.layer_names // .keymap.layer_names) as $all_layers |\n\nif $all_layers == null then\n \"Error: Could not find any keyboard layer names in this file.\" | halt_error\nelse\n ($all_layers | index($layer_to_translate)) as $layer_index |\n\n if $layer_index == null then\n \"Error: The layer named '\\($layer_to_translate)' does not exist.\" | halt_error\n else\n # Outer logic block structures modifications correctly for standard JQ environments\n if .keymap.layers then\n .keymap.layers[$layer_index] |= map(\n if . == null or .value != \"&kp\" or .params == null or .params == [] then \n .\n else\n (.params[0] | if .params == null or .params == [] then .value else \"\\(.value)(\\(.params[0].value))\" end) as $current_key |\n if $german_symbol_map[$current_key] then .params = $german_symbol_map[$current_key] else . end\n end\n )\n else\n .layers[$layer_index] |= map(\n if . == null or .value != \"&kp\" or .params == null or .params == [] then \n .\n else\n (.params[0] | if .params == null or .params == [] then .value else \"\\(.value)(\\(.params[0].value))\" end) as $current_key |\n if $german_symbol_map[$current_key] then .params = $german_symbol_map[$current_key] else . end\n end\n )\n end\n end\nend",
"category": "Symbols",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🇩🇪",
"theme": "blue"
},
"config": {
"category": "Symbols",
"num": "123"
},
"param": [],
"mediaUrl": null
},
{
"uid": "fr_symbol",
"title": "Symbols 2 French AZERTY",
"subtitle": "🌍 Map en-US to fr-FR",
"description": "When you change the language settings in the MoErgo Layout Editor from the default US English keyboard layout (en-US) to French (fr-FR), some symbols no longer match their expected characters.\n\nThis flow remaps those symbols so they produce the correct characters for the French layout.\n\n⚠️ **Required:** Symbol Layer must be included in your layout.\n\n🤖 **Quality note:** The symbol mappings aren’t created by humans, they’re generated by the machines.",
"script": "# ==============================================================================\n# FRENCH SYMBOL MAPPER (For MoErgo Layout Editor / ZMK)\n# OS TARGET: WINDOWS / LINUX (Standard ISO / fr-FR)\n# ==============================================================================\n# \n# WELCOME! This script translates your \"Symbol\" layer keys for a French AZERTY OS.\n# Maps aliases (e.g., SQT/SINGLE_QUOTE) to prevent any normalization bugs.\n# ==============================================================================\n\n{\n # --- Punctuation & Basics ---\n \"DOT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"COMMA\", \"params\": []}]}], # . -> Shift + ; key (US COMMA position)\n \"COMMA\": [{\"value\": \"M\", \"params\": []}], # , -> , key (US M position)\n \"MINUS\": [{\"value\": \"N6\", \"params\": []}], # - -> - key (US N6)\n \"EQUAL\": [{\"value\": \"EQUAL\", \"params\": []}], # = -> = key (US EQUAL)\n\n # --- Brackets & Braces ---\n \"LPAR\": [{\"value\": \"N5\", \"params\": []}], # ( -> ( key (US N5)\n \"LS(N9)\": [{\"value\": \"N5\", \"params\": []}], \n \"RPAR\": [{\"value\": \"MINUS\", \"params\": []}], # ) -> ) key (US MINUS position)\n \"LS(N0)\": [{\"value\": \"MINUS\", \"params\": []}], \n \"LBKT\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N5\", \"params\": []}]}], # [ -> AltGr + 5\n \"RBKT\": [{\"value\": \"RA\", \"params\": [{\"value\": \"MINUS\", \"params\": []}]}], # ] -> AltGr + ) (US MINUS position)\n \"LBRC\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N4\", \"params\": []}]}], # { -> AltGr + 4\n \"LS(LBKT)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N4\", \"params\": []}]}], \n \"RBRC\": [{\"value\": \"RA\", \"params\": [{\"value\": \"EQUAL\", \"params\": []}]}], # } -> AltGr + = (US EQUAL position)\n \"LS(RBKT)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"EQUAL\", \"params\": []}]}], \n \"LT\": [{\"value\": \"NON_US_BSLH\", \"params\": []}], # < -> < key (next to L-Shift)\n \"LS(COMMA)\": [{\"value\": \"NON_US_BSLH\", \"params\": []}], \n \"GT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}], # > -> Shift + <\n \"LS(DOT)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}], \n\n # --- Slashes & Pipes ---\n \"FSLH\": [{\"value\": \"LS\", \"params\": [{\"value\": \"DOT\", \"params\": []}]}], # / -> Shift + : key (US DOT position)\n \"BSLH\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N8\", \"params\": []}]}], # \\ -> AltGr + 8\n \"PIPE\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N6\", \"params\": []}]}], # | -> AltGr + 6\n \"LS(BSLH)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N6\", \"params\": []}]}], \n\n # --- Quotes & Ticks ---\n \"SQT\": [{\"value\": \"N4\", \"params\": []}], # ' -> ' key (US N4)\n \"SINGLE_QUOTE\": [{\"value\": \"N4\", \"params\": []}], \n \"DQT\": [{\"value\": \"N3\", \"params\": []}], # \" -> \" key (US N3)\n \"LS(SINGLE_QUOTE)\": [{\"value\": \"N3\", \"params\": []}], \n \"LS(SQT)\": [{\"value\": \"N3\", \"params\": []}], \n \"GRAVE\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N7\", \"params\": []}]}], # ` -> AltGr + 7\n\n # --- Special Symbols ---\n \"EXCLM\": [{\"value\": \"FSLH\", \"params\": []}], # ! -> ! key (US FSLH position)\n \"LS(N1)\": [{\"value\": \"FSLH\", \"params\": []}], \n \"AT\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N0\", \"params\": []}]}], # @ -> AltGr + 0\n \"LS(N2)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N0\", \"params\": []}]}], \n \"HASH\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N3\", \"params\": []}]}], # # -> AltGr + 3\n \"LS(N3)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N3\", \"params\": []}]}], \n \"DLLR\": [{\"value\": \"RBKT\", \"params\": []}], # $ -> $ key (US RBKT position)\n \"LS(N4)\": [{\"value\": \"RBKT\", \"params\": []}], \n \"PRCNT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"SQT\", \"params\": []}]}], # % -> Shift + ù key (US SQT position)\n \"LS(N5)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"SQT\", \"params\": []}]}], \n \"CARET\": [{\"value\": \"LBKT\", \"params\": []}], # ^ -> ^ key (US LBKT dead key)\n \"LS(N6)\": [{\"value\": \"LBKT\", \"params\": []}], \n \"AMPS\": [{\"value\": \"N1\", \"params\": []}], # & -> & key (US N1)\n \"LS(N7)\": [{\"value\": \"N1\", \"params\": []}], \n \"STAR\": [{\"value\": \"BSLH\", \"params\": []}], # * -> * key (US BSLH position)\n \"LS(N8)\": [{\"value\": \"BSLH\", \"params\": []}], \n \"TILDE\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], # ~ -> AltGr + 2\n \"LS(GRAVE)\": [{\"value\": \"RA\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], \n \"UNDER\": [{\"value\": \"N8\", \"params\": []}], # _ -> _ key (US N8)\n \"UNDERSCORE\": [{\"value\": \"N8\", \"params\": []}], \n \"LS(MINUS)\": [{\"value\": \"N8\", \"params\": []}], \n \"QMARK\": [{\"value\": \"LS\", \"params\": [{\"value\": \"M\", \"params\": []}]}], # ? -> Shift + , key (US M position)\n \"LS(FSLH)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"M\", \"params\": []}]}], \n \"COLON\": [{\"value\": \"DOT\", \"params\": []}], # : -> : key (US DOT position)\n \"LS(SEMI)\": [{\"value\": \"DOT\", \"params\": []}], \n \"SEMI\": [{\"value\": \"COMMA\", \"params\": []}] # ; -> ; key (US COMMA position)\n} as $french_symbol_map |\n\n# ==============================================================================\n# CONFIGURATION TARGETS\n# ==============================================================================\n\n.locale = \"fr-FR-AZERTY\" |\n\"Symbol\" as $layer_to_translate |\n\n# ==============================================================================\n# BEHIND-THE-SCENES TRANSLATION ENGINE\n# ==============================================================================\n\n(.layer_names // .keymap.layer_names) as $all_layers |\n\nif $all_layers == null then\n \"Error: Could not find any keyboard layer names in this file.\" | halt_error\nelse\n ($all_layers | index($layer_to_translate)) as $layer_index |\n\n if $layer_index == null then\n \"Error: The layer named '\\($layer_to_translate)' does not exist.\" | halt_error\n else\n if .keymap.layers then .keymap.layers else .layers end |= (\n .[$layer_index] |= map(\n if . == null or .value != \"&kp\" or .params == null or .params == [] then \n .\n else\n # Extracts inner parameters safely to eliminate the outer wrapper mismatch\n (.params[0] | if .params == null or .params == [] then .value else \"\\(.value)(\\(.params[0].value))\" end) as $current_key |\n \n if $french_symbol_map[$current_key] then \n .params = $french_symbol_map[$current_key] \n else \n . \n end\n end\n )\n )\n end\nend",
"category": "Symbols",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🇫🇷",
"theme": "blue"
},
"config": {
"category": "Symbols",
"num": "123"
},
"param": [],
"mediaUrl": null
},
{
"uid": "gb_symbol",
"title": "Symbols 2 UK English",
"subtitle": "🌍 Map en-US to en-GB",
"description": "When you change the language settings in the MoErgo Layout Editor from the default US English keyboard layout (en-US) to UK English (en-GB), some symbols no longer match their expected characters.\n\nThis flow remaps those symbols so they produce the correct characters for the UK Windows/Linux layout.\n\n⚠️ **Required:** Symbol Layer must be included in your layout.\n\n🤖 **Quality note:** The symbol mappings aren’t created by humans, they’re generated by the machines.",
"script": "# ==============================================================================\n# UK ENGLISH SYMBOL MAPPER (For MoErgo Layout Editor / ZMK)\n# OS TARGET: WINDOWS / LINUX (Standard ISO / en-GB)\n# ==============================================================================\n\n{\n # --- Quotes & At Sign (@ / \") ---\n \"AT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"SQT\", \"params\": []}]}], # @ -> Shift + '\n \"LS(N2)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"SQT\", \"params\": []}]}], \n \"DQT\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], # \" -> Shift + 2\n \"LS(SINGLE_QUOTE)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], \n \"LS(SQT)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"N2\", \"params\": []}]}], \n\n # --- Hash & Tilde (# / ~) ---\n \"HASH\": [{\"value\": \"NON_US_HASH\", \"params\": []}], # # -> # key (ISO)\n \"LS(N3)\": [{\"value\": \"NON_US_HASH\", \"params\": []}], \n \"TILDE\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_HASH\", \"params\": []}]}], # ~ -> Shift + #\n \"LS(GRAVE)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_HASH\", \"params\": []}]}], \n\n # --- Slashes & Pipes (\\\\ / |) ---\n \"BSLH\": [{\"value\": \"NON_US_BSLH\", \"params\": []}], # \\\\ -> \\\\ key (ISO)\n \"PIPE\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}], # | -> Shift + \\\\\n \"LS(BSLH)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}] \n} as $uk_symbol_map |\n\n# ==============================================================================\n# CONFIGURATION TARGETS\n# ==============================================================================\n\n.locale = \"en-GB\" |\n\"Symbol\" as $layer_to_translate |\n\n# ==============================================================================\n# BEHIND-THE-SCENES TRANSLATION ENGINE\n# ==============================================================================\n\n(.layer_names // .keymap.layer_names) as $all_layers |\n\nif $all_layers == null then\n \"Error: Could not find any keyboard layer names in this file.\" | halt_error\nelse\n ($all_layers | index($layer_to_translate)) as $layer_index |\n\n if $layer_index == null then\n \"Error: The layer named '\\\\($layer_to_translate)' does not exist.\" | halt_error\n else\n # Outer logic block structures modifications correctly for standard JQ environments\n if .keymap.layers then\n .keymap.layers[$layer_index] |= map(\n if . == null or .value != \"&kp\" or .params == null or .params == [] then \n .\n else\n (.params[0] | if .params == null or .params == [] then .value else \"\\\\(.value)(\\\\(.params[0].value))\" end) as $current_key |\n if $uk_symbol_map[$current_key] then .params = $uk_symbol_map[$current_key] else . end\n end\n )\n else\n .layers[$layer_index] |= map(\n if . == null or .value != \"&kp\" or .params == null or .params == [] then \n .\n else\n (.params[0] | if .params == null or .params == [] then .value else \"\\\\(.value)(\\\\(.params[0].value))\" end) as $current_key |\n if $uk_symbol_map[$current_key] then .params = $uk_symbol_map[$current_key] else . end\n end\n )\n end\n end\nend",
"category": "Symbols",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🇬🇧",
"theme": "blue"
},
"config": {
"category": "Symbols",
"num": "123"
},
"param": [],
"mediaUrl": null
},
{
"uid": "mac_gb_symbol",
"title": "Symbols 2 UK English macOS",
"subtitle": "🌍 Map en-US to en-GB-mac",
"description": "When you change your OS layout to macOS British (en-GB), Apple maps some keys differently than standard US layouts or Windows UK layouts.\n\nThis flow remaps those specific keys (Hash, Grave, and Tilde) so they produce the correct symbols on macOS.\n\n⚠️ **Required:** Symbol Layer must be included in your layout.\n\n**Note:** If your macOS input source is set to \"British - PC\" instead of the standard \"British\", use the Windows UK mutation instead.\n\n🤖 **Quality note:** The symbol mappings aren’t created by humans, they’re generated by the machines.",
"script": "# ==============================================================================\n# MAC UK ENGLISH SYMBOL MAPPER (For MoErgo / ZMK)\n# OS TARGET: MACOS (Standard \"British\" layout)\n# ==============================================================================\n\n{\n # --- Hash (#) ---\n # On Mac UK, Shift+3 is £. Hash is Option+3 (mapped as Left Alt in ZMK).\n \"HASH\": [{\"value\": \"LA\", \"params\": [{\"value\": \"N3\", \"params\": []}]}],\n \"LS(N3)\": [{\"value\": \"LA\", \"params\": [{\"value\": \"N3\", \"params\": []}]}],\n\n # --- Grave (`) and Tilde (~) ---\n # On Mac UK, the US grave key outputs §. Grave and Tilde live on the ISO Extra Key.\n \"GRAVE\": [{\"value\": \"NON_US_BSLH\", \"params\": []}],\n \"TILDE\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}],\n \"LS(GRAVE)\": [{\"value\": \"LS\", \"params\": [{\"value\": \"NON_US_BSLH\", \"params\": []}]}]\n \n # Note: macOS UK keeps @ and \" in their US positions, and maps ANSI Backslash natively to \\\\ and |.\n # Therefore, those keys do not need remapping!\n} as $mac_uk_symbol_map |\n\n# ==============================================================================\n# CONFIGURATION TARGETS\n# ==============================================================================\n\n.locale = \"en-GB-mac\" |\n\"Symbol\" as $layer_to_translate |\n\n# ==============================================================================\n# BEHIND-THE-SCENES TRANSLATION ENGINE\n# ==============================================================================\n\n(.layer_names // .keymap.layer_names) as $all_layers |\n\nif $all_layers == null then\n \"Error: Could not find any keyboard layer names in this file.\" | halt_error\nelse\n ($all_layers | index($layer_to_translate)) as $layer_index |\n\n if $layer_index == null then\n \"Error: The layer named '\\\\($layer_to_translate)' does not exist.\" | halt_error\n else\n if .keymap.layers then\n .keymap.layers[$layer_index] |= map(\n if . == null or .value != \"&kp\" or .params == null or .params == [] then \n .\n else\n (.params[0] | if .params == null or .params == [] then .value else \"\\\\(.value)(\\\\(.params[0].value))\" end) as $current_key |\n if $mac_uk_symbol_map[$current_key] then .params = $mac_uk_symbol_map[$current_key] else . end\n end\n )\n else\n .layers[$layer_index] |= map(\n if . == null or .value != \"&kp\" or .params == null or .params == [] then \n .\n else\n (.params[0] | if .params == null or .params == [] then .value else \"\\\\(.value)(\\\\(.params[0].value))\" end) as $current_key |\n if $mac_uk_symbol_map[$current_key] then .params = $mac_uk_symbol_map[$current_key] else . end\n end\n )\n end\n end\nend",
"category": "Symbols",
"appUrl": null,
"manifest": {
"author": "moosyresearch",
"keyboards": [
"go60",
"glove80"
],
"icon": "🇬🇧",
"theme": "purple"
},