Config
Properties
file: ~/.config/chordgen/chords.csv
keyboard:
directional:
custom_layout:
- _X__X__X__X__X__X__X__X_
- X_XX_XX_XX_XX_XX_XX_XX_X
- _X__X__X__X__X__X__X__X_
- _X__X_
- X_XX_X
- _X__X_
- _X__X_
- X_XX_X
- _X__X_
custom_layout_name: custom
directional_change_penalty: 2
effort_map:
- '040030020020'
- '695594493493'
- '030020010010'
- '030'
- '192'
- '040'
- '030'
- '192'
- '040'
layout: charachorder
standard:
custom_layout:
- _qwertyuiop_
- _asdfghjkl;_
- _zxcvbnm,./_
- ____
custom_layout_name: custom
effort_map:
- '965446'
- '732116'
- '865536'
- '43'
layout: qwerty
same_column_chord_penalty: 2
same_row_chord_penalty: 2
scissor_penalty: 3
type: standard
alts:
adjective:
enabled: true
forms:
- comparative
- superlative
adverb:
enabled: true
forms: []
demonstrative:
enabled: true
forms:
- plural
- distal
modal:
enabled: true
forms:
- past
noun:
enabled: true
forms:
- plural
number:
enabled: true
forms:
- ordinal
overwrite: false
pronoun:
enabled: true
forms:
- objective
- possessive_det
- reflexive
verb:
enabled: true
forms:
- 3sg
- past
- gerund
assignment:
frequency_exponent: 3.0
min_frequency_weight: 1.0
priority_tiers: []
unmatched_penalty: 10000.0
min_word_length: 3
min_chord_length: 0
key_replacement: {}
formats:
- qmk
- zmk
- charachorder
- kanata
- training
qmk:
alt1_keys:
- KC_CHORD_ALT1
alt2_keys:
- KC_CHORD_ALT2
alt3_keys:
- KC_CHORD_ALT1
- KC_CHORD_ALT2
chord_keys:
- KC_CHORD
file: ~/.config/chordgen/qmk_chords.def
key_codes:
;: KC_SFT_SEMI
A: KC_SFT_A
D: KC_GUI_D
F: KC_CTL_F
J: KC_CTL_J
K: KC_GUI_K
L: KC_ALT_L
S: KC_ALT_S
shifted_chord_keys:
- KC_CHORD
- KC_CHORD_SFT
zmk:
alt1_keys:
- '!'
alt2_keys:
- '@'
alt3_keys:
- '!'
- '@'
chord_keys:
- $
chord_timeout: 100
chords_file: ~/.config/chordgen/zmk_chords.dtsi
key_positions:
- _qwertyuiop_
- _asdfghjkl;_
- _zxcvbnm,./_
- _!@#$_
limit: 200
macros_file: ~/.config/chordgen/zmk_macros.dtsi
shifted_chord_keys:
- $
- '#'
charachorder:
file: ~/.config/chordgen/charachorder_chords.json
kanata:
alt1_keys:
- lalt
alt2_keys:
- spc
alt3_keys:
- lalt
- spc
chord_keys:
- prtsc
chord_timeout: 100
file: ~/.config/chordgen/kanata_chords.kbd
key_mapping: {}
limit: 0
shifted_chord_keys:
- prtsc
- ralt
training:
file: ~/.config/chordgen/training.txt
show_words: 10
new_words_per_day: 20
reviews_per_day: 200
leech_threshold: 8
mastery_threshold: 3
learning_steps: 5
show_chord_steps: 3
relearn_steps: 2
target_retention: 0.9
slow_wpm_fraction: 0.7
slow_min_samples: 20
show_words: 10
mode: time
count: 25
time_seconds: 30
include_alts: true
always_show_chords: false
wpm_window_seconds: 30
max_width: 80
always_show_chords: false
theme (string): Textual theme used by the learn and drill TUIs. Updated automatically when you change the theme via the in-app command palette (Ctrl+P). Default: "textual-dark".
Definitions
AdjectiveAltOptions (object)
enabled (boolean): Default: true.
forms (array): Adjective forms to fill alt1..alt3 with, in order. Length must be at most 3. Default: ["comparative", "superlative"].
- Items (string): Must be one of: "comparative" or "superlative".
AdverbAltOptions (object)
enabled (boolean): Default: true.
forms (array): Adverb forms to fill alt1..alt3 with, in order. Length must be at most 3. Default: [].
- Items (string): Must be one of: "comparative" or "superlative".
AltOptions (object)
overwrite (boolean): Overwrite existing alt1/alt2/alt3 values in chords.csv. By default, non-empty alt slots are preserved. Default: false.
-
verb: Refer to #/$defs/VerbAltOptions. Default:
enabled: true
forms:
- 3sg
- past
- gerund
-
noun: Refer to #/$defs/NounAltOptions. Default:
enabled: true
forms:
- plural
-
adjective: Refer to #/$defs/AdjectiveAltOptions. Default:
enabled: true
forms:
- comparative
- superlative
-
adverb: Refer to #/$defs/AdverbAltOptions. Default:
-
pronoun: Refer to #/$defs/PronounAltOptions. Default:
enabled: true
forms:
- objective
- possessive_det
- reflexive
-
demonstrative: Refer to #/$defs/DemonstrativeAltOptions. Default:
enabled: true
forms:
- plural
- distal
-
modal: Refer to #/$defs/ModalAltOptions. Default:
enabled: true
forms:
- past
-
number: Refer to #/$defs/NumberAltOptions. Default:
enabled: true
forms:
- ordinal
-
AssignmentOptions (object)
min_frequency_weight (number): Floor for the weight applied to words missing a frequency value. Treats them as low-priority but still eligible. Default: 1.0.
unmatched_penalty (number): Cost charged per word that ends up without a chord. Acts as a soft constraint in the optimal matcher: if recovering a word would cost more than this, leaving it unmatched is allowed. Default: 10000.0.
frequency_exponent (number): Exponent applied to each word's frequency weight before it multiplies the chord score. 1.0 gives a linear cost model. Values > 1 (like the default 3.0) make frequent words dominate the cost so the matcher won't trade a common word's short chord to a rare word that happens to improve the global sum slightly. Must be > 0. Default: 3.0.
priority_tiers (array): Cumulative frequency-rank cutoffs for tiered assignment. The pool (already in descending-frequency order) is split at each cutoff, then each tier is solved by the optimal matcher in order, with previous tiers' chord keys reserved out. Default [] runs a single global pass. Example [500, 1000] runs three passes: top 500 -> next 500 -> rest. Cutoffs must be strictly increasing; values >= len(pool) are clamped. Default: [].
BookOptions (object)
wpm_window_seconds (integer): Sliding window (in seconds) over which the running WPM is computed in book mode. Default: 30.
max_width (integer): Maximum width (in characters) of the rendered text block in book mode. Long paragraphs are wrapped to this width. Default: 80.
always_show_chords (boolean): When true, the chord for the current word is rendered beneath it the moment the cursor lands on it, instead of only after a stumble. Mirrors the drill option of the same name. Default: false.
CharaChorderOutput (object)
file (string, format: path): Default: "~/.config/chordgen/charachorder_chords.json".
DemonstrativeAltOptions (object)
enabled (boolean): Default: true.
forms (array): Demonstrative forms to fill alt1..alt3 with, in order. Demonstratives are this, that, these, and those arranged on number (singular/plural) and distance (proximal/distal) axes. Length must be at most 3. Default: ["plural", "distal"].
- Items (string): Must be one of: "singular", "plural", "proximal", or "distal".
DirectionalKeyboardOptions (object)
layout (string): Must be one of: "charachorder", "stained", "svalboard_qwerty", or "custom". Default: "charachorder".
directional_change_penalty (integer): A penalty to add when chords have different directions per finger on the same hand. Can be set to -1 to disable this type of chord. Default: 2.
custom_layout (array): Default: ["_X__X__X__X__X__X__X__X_", "X_XX_XX_XX_XX_XX_XX_XX_X", "_X__X__X__X__X__X__X__X_", "_X__X_", "X_XX_X", "_X__X_", "_X__X_", "X_XX_X", "_X__X_"].
custom_layout_name (string): Display name used for a custom layout in places like the drill score leaderboard. Only meaningful when layout='custom'. Default: "custom".
effort_map (array): Default: ["040030020020", "695594493493", "030020010010", "030", "192", "040", "030", "192", "040"].
DrillOptions (object)
show_words (integer): Number of words shown on screen at once during a drill. Default: 10.
mode (string): How a drill session ends: 'count' stops after a fixed number of words, 'time' stops when the timer runs out. Must be one of: "count" or "time". Default: "time".
count (integer): Number of words drilled when mode = count. Ignored when mode = time. Default: 25.
time_seconds (integer): Duration of the drill in seconds when mode = time. Ignored when mode = count. Default: 30.
include_alts (boolean): When true, alt-slot inflections (alt1/alt2/alt3 columns of chords.csv) ride along into the drill pool whenever their base word is graduated. The chord shown after a stumble is suffixed with the slot digit (e.g. au1) and the alt-slot indicator below the keyboard highlights the matching modifier. Set to false to drill only the base word from each chord row. Default: true.
always_show_chords (boolean): When true, chords are revealed below every word in the drill row, not just on a stumble. Useful while you're still building muscle memory; turn off (default) once you want drill mode to test recall. Default: false.
GenOptions (object)
file (string, format: path): Default: "~/.config/chordgen/chords.csv".
-
keyboard: Refer to #/$defs/KeyboardOptions. Default:
type: standard
standard:
custom_layout:
- _qwertyuiop_
- _asdfghjkl;_
- _zxcvbnm,./_
- ____
custom_layout_name: custom
effort_map:
- '965446'
- '732116'
- '865536'
- '43'
layout: qwerty
same_column_chord_penalty: 2
same_row_chord_penalty: 2
scissor_penalty: 3
directional:
custom_layout:
- _X__X__X__X__X__X__X__X_
- X_XX_XX_XX_XX_XX_XX_XX_X
- _X__X__X__X__X__X__X__X_
- _X__X_
- X_XX_X
- _X__X_
- _X__X_
- X_XX_X
- _X__X_
custom_layout_name: custom
directional_change_penalty: 2
effort_map:
- '040030020020'
- '695594493493'
- '030020010010'
- '030'
- '192'
- '040'
- '030'
- '192'
- '040'
layout: charachorder
-
alts: Refer to #/$defs/AltOptions. Default:
overwrite: false
verb:
enabled: true
forms:
- 3sg
- past
- gerund
noun:
enabled: true
forms:
- plural
adjective:
enabled: true
forms:
- comparative
- superlative
adverb:
enabled: true
forms: []
pronoun:
enabled: true
forms:
- objective
- possessive_det
- reflexive
demonstrative:
enabled: true
forms:
- plural
- distal
modal:
enabled: true
forms:
- past
number:
enabled: true
forms:
- ordinal
-
assignment: Refer to #/$defs/AssignmentOptions. Default:
min_frequency_weight: 1.0
unmatched_penalty: 10000.0
frequency_exponent: 3.0
priority_tiers: []
-
min_word_length (integer): Default: 3.
min_chord_length (integer): The minimum length a chord, setting this to 2 and disabling the chord key is a way to avoid needing a chord key. This works well on CharaChorder, but you will need to lower the chord timeout to avoid missfires on other keyboards. Default: 0.
key_replacement (object): Map characters to replacements when generating chord candidates. For example, if your keyboard lacks 'q' and 'z', set {'q': 'k', 'z': 's'} so chords use 'k' instead of 'q' and 's' instead of 'z' -- the typed word is unaffected, only the chord string changes. Useful for remapping non-letter characters too: "'": x lets a word like "o'clock" earn a chord that contains 'x' wherever the apostrophe sits. Each key must be a single lowercase character; its replacement must be a single lowercase letter that exists on your keyboard. Can contain additional properties. Default: {}.
- Additional properties (string)
KanataOutput (object)
file (string, format: path): Default: "~/.config/chordgen/kanata_chords.kbd".
chord_keys (array): Default: ["prtsc"].
shifted_chord_keys (array): Default: ["prtsc", "ralt"].
alt1_keys (array): Default: ["lalt"].
alt2_keys (array): Default: ["spc"].
alt3_keys (array): Default: ["lalt", "spc"].
limit (integer): Default: 0.
chord_timeout (integer): Default: 100.
key_mapping (object): Since Kanata combos are based in the layout in defsrc (probably qwerty) you will need to remap the letters if you are using a custom layout eg. 'a': 'b'. Can contain additional properties. Default: {}.
- Additional properties (string)
KeyboardOptions (object)
type (string): Must be one of: "standard" or "directional". Default: "standard".
-
standard: Refer to #/$defs/StandardKeyboardOptions. Default:
layout: qwerty
scissor_penalty: 3
same_column_chord_penalty: 2
same_row_chord_penalty: 2
custom_layout:
- _qwertyuiop_
- _asdfghjkl;_
- _zxcvbnm,./_
- ____
custom_layout_name: custom
effort_map:
- '965446'
- '732116'
- '865536'
- '43'
-
directional: Refer to #/$defs/DirectionalKeyboardOptions. Default:
layout: charachorder
directional_change_penalty: 2
custom_layout:
- _X__X__X__X__X__X__X__X_
- X_XX_XX_XX_XX_XX_XX_XX_X
- _X__X__X__X__X__X__X__X_
- _X__X_
- X_XX_X
- _X__X_
- _X__X_
- X_XX_X
- _X__X_
custom_layout_name: custom
effort_map:
- '040030020020'
- '695594493493'
- '030020010010'
- '030'
- '192'
- '040'
- '030'
- '192'
- '040'
-
LearnOptions (object)
show_words (integer): Number of words shown on screen at once during learning. Default: 10.
new_words_per_day (integer): Maximum number of brand-new words introduced per calendar day, inspired by Anki's 'new cards per day' setting. Once the day's quota is exhausted no more new words are added until tomorrow. Default: 20.
reviews_per_day (integer): Maximum number of overdue / re-drilled review words surfaced per calendar day. Prevents a long absence from dumping the entire backlog at once. Default: 200.
leech_threshold (integer): Number of lapses (Again ratings on a graduated word) after which a word is considered a 'leech' and called out in the session summary. Set to 0 to disable leech detection. Default: 8.
mastery_threshold (integer): Number of total FSRS reviews before a word is considered mastered and its chord is hidden during practice. If you make a mistake on a mastered word, its chord is revealed again for that attempt. Default: 3.
learning_steps (integer): Number of consecutive correct repetitions a brand-new word must earn in one session before it graduates to Review state. Each error resets the step counter to zero so the word starts over. Default: 5.
show_chord_steps (integer): How many of the initial learning steps show the chord during the learning phase. After this many consecutive correct reps the chord is hidden for the remaining learning steps. An error resets the counter and the chord reappears. Default: 3.
relearn_steps (integer): Number of consecutive correct repetitions a lapsed word must earn before re-graduating to Review state. Each error resets the step counter to zero so the word starts over. Default: 2.
target_retention (number): FSRS desired retention probability. The next review for each word is scheduled when its predicted recall falls to this value. Default: 0.9.
slow_wpm_fraction (number): A correct word counts as 'slow' (FSRS hard) when its per-word WPM is below this fraction of the user's rolling median per-word WPM. Set to 0 to disable slow grading. Default: 0.7.
slow_min_samples (integer): Minimum number of recorded per-word WPM samples before slow grading activates. Until this is reached all correct words are graded 'good'. Default: 20.
ModalAltOptions (object)
enabled (boolean): Default: true.
forms (array): Modal-verb forms to fill alt1..alt3 with, in order. Modals are paired present <-> past: can/could, will/would, shall/should, may/might. must has no past form. Length must be at most 3. Default: ["past"].
- Items (string): Must be one of: "present" or "past".
NounAltOptions (object)
enabled (boolean): Default: true.
forms (array): Noun forms to fill alt1..alt3 with, in order. Length must be at most 3. Default: ["plural"].
- Items (string): Must be one of: "plural" or "singular".
NumberAltOptions (object)
enabled (boolean): Default: true.
forms (array): Number forms to fill alt1..alt3 with, in order. Numbers are cardinal/ordinal pairs (one/first, two/second, ...). Length must be at most 3. Default: ["ordinal"].
- Items (string): Must be one of: "cardinal" or "ordinal".
OutputOptions (object)
formats (array): Default: ["qmk", "zmk", "charachorder", "kanata", "training"].
- Items (string): Must be one of: "qmk", "zmk", "charachorder", "kanata", or "training".
-
qmk: Refer to #/$defs/QmkOutput. Default:
file: ~/.config/chordgen/qmk_chords.def
chord_keys:
- KC_CHORD
shifted_chord_keys:
- KC_CHORD
- KC_CHORD_SFT
alt1_keys:
- KC_CHORD_ALT1
alt2_keys:
- KC_CHORD_ALT2
alt3_keys:
- KC_CHORD_ALT1
- KC_CHORD_ALT2
key_codes:
;: KC_SFT_SEMI
A: KC_SFT_A
D: KC_GUI_D
F: KC_CTL_F
J: KC_CTL_J
K: KC_GUI_K
L: KC_ALT_L
S: KC_ALT_S
-
zmk: Refer to #/$defs/ZmkOutput. Default:
chords_file: ~/.config/chordgen/zmk_chords.dtsi
macros_file: ~/.config/chordgen/zmk_macros.dtsi
chord_keys:
- $
shifted_chord_keys:
- $
- '#'
alt1_keys:
- '!'
alt2_keys:
- '@'
alt3_keys:
- '!'
- '@'
limit: 200
chord_timeout: 100
key_positions:
- _qwertyuiop_
- _asdfghjkl;_
- _zxcvbnm,./_
- _!@#$_
-
charachorder: Refer to #/$defs/CharaChorderOutput. Default:
file: ~/.config/chordgen/charachorder_chords.json
-
kanata: Refer to #/$defs/KanataOutput. Default:
file: ~/.config/chordgen/kanata_chords.kbd
chord_keys:
- prtsc
shifted_chord_keys:
- prtsc
- ralt
alt1_keys:
- lalt
alt2_keys:
- spc
alt3_keys:
- lalt
- spc
limit: 0
chord_timeout: 100
key_mapping: {}
-
training: Refer to #/$defs/TrainingOutput. Default:
file: ~/.config/chordgen/training.txt
-
PronounAltOptions (object)
enabled (boolean): Default: true.
forms (array): Pronoun forms to fill alt1..alt3 with, in order. Length must be at most 3. Default: ["objective", "possessive_det", "reflexive"].
- Items (string): Must be one of: "nominative", "objective", "possessive_det", "possessive_pron", or "reflexive".
QmkOutput (object)
file (string, format: path): Default: "~/.config/chordgen/qmk_chords.def".
chord_keys (array): Default: ["KC_CHORD"].
shifted_chord_keys (array): Default: ["KC_CHORD", "KC_CHORD_SFT"].
alt1_keys (array): Default: ["KC_CHORD_ALT1"].
alt2_keys (array): Default: ["KC_CHORD_ALT2"].
alt3_keys (array): Default: ["KC_CHORD_ALT1", "KC_CHORD_ALT2"].
-
key_codes (object): Can contain additional properties. Default:
A: KC_SFT_A
S: KC_ALT_S
D: KC_GUI_D
F: KC_CTL_F
J: KC_CTL_J
K: KC_GUI_K
L: KC_ALT_L
;: KC_SFT_SEMI
- Additional properties (string)
StandardKeyboardOptions (object)
layout (string): Must be one of: "qwerty", "colemak", "colemak_dh", "canary", "engram_2021", "engram_en", "enthium_v14", or "custom". Default: "qwerty".
scissor_penalty (integer): A penalty to add when pressing keys on the top and bottom rows together. Can be set to -1 to disable this type of chord. Default: 3.
same_column_chord_penalty (integer): A penalty to add when pressing 2 keys and the same time with the same finger in the same column. Can be set to -1 to disable this type of chord. Default: 2.
same_row_chord_penalty (integer): A penalty to add when pressing 2 keys and the same time with the same finger in the same row. Can be set to -1 to disable this type of chord. Default: 2.
custom_layout (array): Default: ["_qwertyuiop_", "_asdfghjkl;_", "_zxcvbnm,./_", "____"].
- Items (string)
custom_layout_name (string): Display name used for a custom layout in places like the drill score leaderboard. Only meaningful when layout='custom'. Default: "custom".
effort_map (array): Default: ["965446", "732116", "865536", "43"].
- Items (string)
TrainingOutput (object)
file (string, format: path): Default: "~/.config/chordgen/training.txt".
VerbAltOptions (object)
enabled (boolean): Default: true.
forms (array): Verb forms to fill alt1..alt3 with, in order. Length must be at most 3. Default: ["3sg", "past", "gerund"].
- Items (string): Must be one of: "3sg", "past", "gerund", or "ppart".
ZmkOutput (object)
chords_file (string, format: path): Default: "~/.config/chordgen/zmk_chords.dtsi".
macros_file (string, format: path): Default: "~/.config/chordgen/zmk_macros.dtsi".
chord_keys (array): Default: ["$"].
- Items (string)
shifted_chord_keys (array): Default: ["$", "#"].
- Items (string)
alt1_keys (array): Default: ["!"].
- Items (string)
alt2_keys (array): Default: ["@"].
- Items (string)
alt3_keys (array): Default: ["!", "@"].
- Items (string)
limit (integer): Limit the number of chords outputted. It will vary depending on MCU, but I have found ZMK to be quite limited compared to QMK with the number or chords it can fit. Default: 200.
chord_timeout (integer): Default: 100.
key_positions (array): Should contain the same number of characters as keys on your keyboard. Use _ to ignore a key. Chord, shift, alt1, alt2 can be represented by shifted characters such as $#!@. Spaces will be ignored and can be used for formatting. Default: ["_qwertyuiop_", "_asdfghjkl;_", "_zxcvbnm,./_", "_!@#$_"].
- Items (string)