2 Commits 187680f2b7 ... c11e830e72

Author SHA1 Message Date
  Jacque Fresco c11e830e72 Merge branch 'restruct' into Dolores 2 years ago
  tfelypoc 08eeda2830 ufdfd, restruct unofficial official? 2 years ago

+ 626 - 0
Dictionary Format/README.md

@@ -0,0 +1,626 @@
+This page contains an explanation for the syntax used in Plover's dictionaries, as well as the operators that control capitalization, spacing, keyboard shortcuts, and other commands.
+
+**Table of Contents**
+
+- [About Strokes and Dictionaries](#about-strokes-and-dictionaries)
+- [Plover's Default Dictionaries](#plovers-default-dictionaries)
+  - [Dictionary priority](#dictionary-priority)
+- [JSON and RTF/CRE](#json-and-rtfcre)
+  - [Limitations](#limitations)
+- [Plover Control Commands](#plover-control-commands)
+- [Sending Symbols](#sending-symbols)
+- [Prefix strokes](#prefix-strokes)
+- [Text Formatting](#text-formatting)
+  - [Prefixes, Infixes, and Suffixes](#prefixes-infixes-and-suffixes)
+  - [Glue Operator (Numbers, Fingerspelling)](#glue-operator-numbers-fingerspelling)
+  - [Capitalizing](#capitalizing)
+    - [Capitalize Next Word](#capitalize-next-word)
+    - [Capitalize Last Word](#capitalize-last-word)
+  - [Uncapitalizing](#uncapitalizing)
+    - [Uncapitalize Next Word](#uncapitalize-next-word)
+    - [Uncapitalize Last Word](#uncapitalize-last-word)
+  - [Carrying Capitalization](#carrying-capitalization)
+  - [Uppercasing (CAPS)](#uppercasing-caps)
+    - [Uppercase Next Word](#uppercase-next-word)
+    - [Uppercase Last Word](#uppercase-last-word)
+  - [Spacing](#spacing)
+    - [Suppress Next Space](#suppress-next-space)
+    - [Manually Add a Space](#manually-add-a-space)
+  - [Canceling Formatting of Next Word](#canceling-formatting-of-next-word)
+  - [Format Currency](#format-currency)
+  - [Conditional](#conditional)
+- [Friendly Command Names](#friendly-command-names)
+- [Undoable Line Breaks and Tabs](#undoable-line-breaks-and-tabs)
+- [Macros](#macros)
+  - [Undo / Delete Last Stroke](#undo--delete-last-stroke)
+  - [Repeat Last Stroke](#repeat-last-stroke)
+  - [Toggle asterisk](#toggle-asterisk)
+  - [Retroactively Add Space](#retroactively-add-space)
+  - [Retroactively Delete Space](#retroactively-delete-space)
+- [Keyboard Shortcuts](#keyboard-shortcuts)
+  - [Modifier Names](#modifier-names)
+  - [Shortcut Key Names](#shortcut-key-names)
+  - [Example Shortcuts](#example-shortcuts)
+  - [Escaping Special Characters](#escaping-special-characters)
+  - ["Do Nothing" Translation](#do-nothing-translation)
+- [Output Modes](#output-modes)
+  - [Reset Command](#reset-command)
+  - [Modes](#modes)
+  - [Custom Modes](#custom-modes)
+- [Summary of suggested commands you can cut and paste into your dictionary](#summary-of-suggested-commands-you-can-cut-and-paste-into-your-dictionary)
+
+## About Strokes and Dictionaries 
+If you are new to stenography:
+
+- A _stroke_ is a group of keyboard keys that are pressed simultaneously to produce output. As soon as all keys on the keyboard are released, the steno machine sends out that entire chord of key presses as a stroke. 
+- Plover converts that input into English words and phrases on the screen, by using _dictionaries_. 
+- The dictionaries map a stroke (or a combination of strokes) to an English word or phrase, number, punctuation symbol, emoji, software command, or a meta command for controlling spacing and capitalization.
+- Every stenographer creates their own customized dictionary to supplement or amend the default dictionary that comes with a steno application, such as Plover. By default, you add your customizations to the `user.json` dictionary that comes with Plover.
+
+## Plover's Default Dictionaries
+
+Plover comes supplied with three dictionaries: 
+
+- `main.json`. This contains the default dictionary. It is based on Mirabai Knight's own personal dictionary, which follows a StenEd-style theory. It contains over 140,000 entries and is adequate for anyone learning stenography. Mirabai uses this dictionary professionally for her realtime work.
+- `commands.json`. This contains [Plover Control Commands](#plover-control-commands).
+- `user.json`. This is available for your personal customizations. `user.json` is a blank dictionary. By default, the `user.json` dictionary is at the bottom of the dictionary list and has the highest priority - it is the first dictionary Plover will use. When you define new strokes, they will get added to this dictionary. This means you can see which strokes you've defined yourself, instead of trying to locate them inside the default dictionaries.
+
+You can add extra dictionaries to Plover, as well. Dictionaries may be located on your system in any directory/folder; they do not have to be in a subdirectory/subfolder of the Plover installation.
+
+> **Note:** We do not recommend you remove the `commands.json` dictionary from the dictionary list. This is because Plover has some concepts that users of other steno software will not be familiar with initially. 
+
+### Dictionary priority
+
+If two dictionaries contain the same steno strokes, Plover will use the one in the dictionary that has the highest priority. The dictionaries in the dictionary list are prioritised from the bottom up. 
+
+By default, the `user.json` dictionary is placed at the bottom of the dictionary list and has the highest priority. If you want new strokes to go to different dictionary (for example, you have your own dictionary already), make sure that dictionary is at the bottom of the list.
+
+> **Note:** With Plover 4.0+, default dictionary priority is now top-down and can be changed.  In the configuration settings, you can select your preferred ordering of dictionary priority to be bottom-up or top-down. 
+
+## JSON and RTF/CRE
+
+Plover supports two types of dictionaries:
+
+- **JSON** (the default and recommended format), and 
+- **RTF/CRE**. 
+
+RTF/CRE is an import/export format used by proprietary steno software. This means Plover can work with exported dictionaries from Eclipse, ProCAT, Case CATalyst, and other steno software applications.
+
+> **Note:** With Plover 4.0+, there is a plugin `plover-python-dictionary` that allows you to use Python (`.py`) dictionaries. After installing the plugin, you will need to restart Plover before it will let you load Python dictionaries.
+
+### Limitations
+
+There are some limitations with each format:
+
+- RTF dictionaries will cause Plover to take longer to start up and won't have Unicode support. 
+- The JSON format that Plover uses is not used or supported by other steno applications. If you want to move or copy your Plover JSON formatted dictionary to another steno software application, you will need to convert it to RTF. 
+- The Plover JSON format doesn't have support for stroke metadata. At the moment, Plover doesn't support reading/writing of RTF metadata.
+
+## Plover Control Commands
+
+You can control some aspects of Plover with [strokes](#strokes-and-dictionaries). Plover's default dictionary (`commands.json`) contains these commands:
+
+| Command name | Command | Default Stroke | Description |
+|----------|----------| ----------| ----------| 
+| Add Translation | `{PLOVER:ADD_TRANSLATION}` | `TKUPT` (think DUPT for "Dictionary UPdaTe") | Opens a translation window where you can enter a stroke and translation text to create a new dictionary entry. |
+| Disable Output | `{PLOVER:SUSPEND}` | `PHRO*F` (think PLOF for "PLover OFf") | Stop translating steno. With a keyboard machine, you will be able to type normally again. |
+| Enable Output | `{PLOVER:RESUME}` | `PHRO*PB` (think PLON for "PLover ON") | Re-enable Plover's output. You can write this stroke to switch back from your keyboard into steno mode. |
+| Toggle Output | `{PLOVER:TOGGLE}` | `PHROLG` (think PLOLG, for PLOver toGGLe) | Toggle between output being enabled and disabled. |
+
+These commands are not in `commands.json` by default, but can be added to a dictionary:
+
+
+| Command name| Command | _Suggested_ Stroke | Description |
+|----------|----------| ----------| ----------| 
+| Look Up Stroke | `{PLOVER:LOOKUP}` | `PHR*UP` | Open a search dialog that you write a translation into to get a list of entries in your dictionaries. |
+| Suggestions | `{PLOVER:SUGGESTIONS}` | `PHROGS` (think PLOSHUN) for PLOver suggesTION) | Open and focus the plover suggestions window which will suggest alternative ways of writing |
+| Configure | `{PLOVER:CONFIGURE}` | `PHROFG` (think PLOFG, for PLOver conFiG) | Open and focus the Plover configuration window. |
+| Focus | `{PLOVER:FOCUS}` | `PHROFBGS` (think PLOFKS, for PLOver focus) | Open and focus the main Plover window. |
+| Quit | `{PLOVER:QUIT}` | `PHROBGT` (think PLOKT, for PLOver **qu**i**t**) | Quit Plover entirely. |
+| Set configuration | `{PLOVER:SET_CONFIG:option:value}`, `{PLOVER:SET_CONFIG:option1:value1,option2:value2,...}` | | Set Plover config option. |
+
+Example for `SET_CONFIG` Plover command:
+
+* `{PLOVER:SET_CONFIG:'translation_frame_opacity':100}`
+* `{PLOVER:SET_CONFIG:'start_attached':True,'start_capitalized':True}`
+
+As a side effect, `SET_CONFIG` also reload the (changed) dictionaries.
+
+## Sending Symbols
+
+Since Plover 3.0.0, users can write full Unicode. You can use symbols in your JSON dictionary, or paste them into the "Add Translation" dialog (or into the dictionary manager). You can get symbols from a character insert panel in your operating system (if you have one), or you can copy and paste symbols from another application, such as a web browser.
+
+```json
+{
+  "SHR*UG": "¯\\_(ツ)_/¯",
+  "TR*PL": "{^}™",
+  "TPHA*ES": "n̶o̶ yes"
+}
+```
+
+## Prefix strokes
+
+It's possible to select the translation for a stroke depends on whether the previous word is finished.
+
+Given the dictionary:
+
+```json
+{
+	"S": "word",
+	"/S": "{prefix^}"
+}
+```
+
+with a stroke `S`, the translation `"/S": "{prefix^}"` is chosen; unless the previous word is not finished
+(for example if the previous translation is `{con^}`), then the translation `"S": "word"` is chosen.
+
+It's possible to explicitly mark a translation as "finished" with `{$}` (or equivalently `{:word_end}`).
+
+See this [blackbox test](https://github.com/openstenoproject/plover/blob/df65bf1c6e2e6e7f958f635f0a3922b0b7b80c63/test/test_blackbox.py#L1597-L1604)
+for an example.
+
+
+## Text Formatting
+
+### Prefixes, Infixes, and Suffixes
+
+Strokes can be attached at the beginning and/or end using the "attach" operator. You can also use some of the built-in orthographic rules that Plover uses for creating intelligent strokes.
+
+- `{^}` is the attach operator.
+- `{^ish}` is an orthographic-aware suffix that will add "ish" to the end of the previous word. E.g. `RED/EURB` will output `reddish`. Note: addition of a second "d" caused by Plover's understanding of English orthography.
+- `{^}ish` is a suffix with the text outside the operator—this means that the text will simply be attached without grammar rules. Using this stroke in the previous example would give instead `redish`.
+- `{^-to-^}` is an infix, e.g. `day-to-day`.
+- `{in^}` is a prefix, e.g. `influx`.
+- Most custom punctuation entries will take advantage of the attach operator, e.g. `{^—^}` for an emdash.
+
+### Glue Operator (Numbers, Fingerspelling)
+
+Glue is sort of like the [attach operator](#prefixes-infixes-suffixes) above, except that "glued" strokes only attach to neighboring "glue" strokes.
+
+Translations containing *only* digits are glued, allowing you to output multiple number strokes to make a large number.
+
+- `{&}` is the glue operator.
+- `{&a}`, `{&b}`, `{&c}`, etc. are how the fingerspelling alphabet is made.
+- `{&th}` is a multiletter glue stroke, which can be useful (`TH*` in the default dictionary)
+
+Because glued translations only glue to other glued translations, they won't attach to regular words. This gives us some power because you can write:
+
+`THR/-R/#H/#A/KATS` to get "there are 45 cats" and only `#H` (4) and `#A` (5) are "glued" to each other.
+
+### Capitalizing
+
+Capitalizing a word means turning the first letter into a capital, e.g. proper nouns and in titles. Usually your dictionary has capitals pre-defined, but there are times when you need to capitalize a word on the go.
+
+#### Capitalize Next Word
+
+- `{-|}`
+
+The next word will have a capitalized first letter. In the default dictionary, we have `"KPA": "{-|}"`, which will capitalize the next word; and `"KPA*": "{^}{-|}"` which omits a space and capitalizes the next word. That last stroke would let you writeLikeThis. This formatting style is called "camel case', which some programmers use in their work. 
+
+Capitalize next word can also be used in name titles, like `Ms. {-|}`.
+
+**Default strokes:**
+
+- `KPA`: `{-|}` (think "cap")
+- `KPA*`: `{^}{-|}` (also suppresses space)
+
+#### Capitalize Last Word
+
+- `{*-|}`
+
+The last stroke word will have a capitalized first letter. This is useful in case you realize that a word should be capitalized after you've written it. It can also be used in a stroke, like in `{*-|}{^ville}`. This would capitalize the last word and attach to it. This would be useful for town names on the fly, such as `Catville`.
+
+**Suggested stroke:** `KA*PD`
+
+### Uncapitalizing
+
+#### Uncapitalize Next Word
+
+- `{>}`
+
+Forces the next letter to be lowercase, e.g. `{>}Plover` → `plover`
+
+**Suggested stroke:** `HRO*ER` (lower)
+
+#### Uncapitalize Last Word
+
+- `{*>}`
+
+Rewrite the last word to start with a lowercase letter, e.g. `Plover{*>}` → `plover`
+
+**Suggested stroke:** `HRO*ERD` (lowered)
+
+### Carrying Capitalization
+
+- `{~|text}` or `{^~|text^}` where the attach operator is optional and the text can be changed.
+
+In English, we have punctuation that doesn't get capitalized, but instead the next letter gets the capitalization. For example, if you end a sentence in quotes, the next sentence still starts with a capital letter! `"You can't eat that!" The baby ate on.` 
+
+In order to support this, there is a special pre/in/suffix syntax that will "pass on" or "carry" the capitalized state. You might find this useful with quotes, parentheses, and words like `'til` or `'cause`. 
+
+The default dictionary for Plover should use these operators where appropriate.
+
+```json
+{
+  "KW-GS": "{~|\"^}",
+  "KR-GS": "{^~|\"}",
+  "KA*US": "{~|'^}cause",
+  "PREPB": "{~|(^}",
+  "PR*EPB": "{^~|)}"
+}
+```
+
+ For a newline, the syntax would be `{^~|\n^}`.
+
+### Uppercasing (CAPS)
+
+See [Output Modes](#output-modes) for CAPS mode, which acts like CAPS lock on a regular keyboard. Alternatively, you can use a [Keyboard Shortcut](#keyboard-shortcuts) set to `{#Caps_Lock}` to activate the system CAPS lock like you can on your keyboard.
+
+**Suggested stroke:** `"KA*PS": "{MODE:CAPS}"`
+
+#### Uppercase Next Word
+
+- `{<}`
+
+Output next stroke in capital letters, e.g. `{<}cat` → `CAT`
+
+**Suggested stroke:** `KPA*L` (cap all)
+
+#### Uppercase Last Word
+
+- `{*<}`
+
+Rewrite last word in capital letters, e.g. `cat{*<}` → `CAT`
+
+**Suggested stroke:** `*UPD`
+
+
+### Spacing
+
+#### Suppress Next Space
+
+- `{^^}` (or `{^}`)
+
+See also: [Retroactively Delete Space](#retroactively-delete-space)
+
+**Default stroke:** `TK-LS` (**D**e**l**ete **S**pace)
+
+This is a special case of an infix. See also [Prefixes, Infixes, and Suffixes](#prefixes-infixes-and-suffixes).
+
+#### Manually Add a Space
+
+- `{^ ^}`
+
+See also: [Retroactively Add Space](#retroactively-add-space)
+
+**Default stroke:** `S-P` (**SP**ace)
+
+This is a special case of an infix. See also [Prefixes, Infixes, and Suffixes](#prefixes-infixes-and-suffixes).
+
+### Canceling Formatting of Next Word
+
+In order to cancel formatting of the next word, use the empty meta tag as your definition:
+
+- `{}`
+
+Using `{}` in front of a arrow key commands, as in `{}{#Left}`, is useful if the arrow key commands are used to move cursor to edit text. Canceling formatting actions for cursor movement prevents Plover from, for instance, capitalizing words in middle of a sentence if cursor is moved back when the last stroke, such as `{.}`, includes action to capitalize next word.
+
+See also the ["do nothing" translation](#do-nothing-translation)
+
+### Format Currency
+
+There is a built-in meta in Plover that allows you to format the last-written number as currency. The format is `{*($c)}` where `$` is any currency symbol you'd like, and `c` is the amount, formatted in standard currency format, with either no decimals or two. Commas are added every 3 numbers before the decimal automatically.
+
+- `{*($c)}`: Standard English dollars
+  + `23{*($c)}` → $23
+  + `2000.5{*($c)}` → $2,000.50
+- `{*($c CAD)}`: You can include other text, e.g. when specifying a currency's country
+  - `100{*($c CAD)}` → $100 CAD
+- `{*(c円)}`: The symbol can be placed on either side of the number, which often happens in languages other than English and in certain regions.
+  - `2345{*(c円)}`: 2,345円
+
+Here are some other currency symbols, in case you need to copy-paste them into your entries: £, ¥, €, $, ₩, ¢
+
+### Conditional
+
+- `{=regex/text_if_match/text_if_no_match}`
+
+Conditional translation depending on the following text. Outputs `text_if_match` if the following text matches the regex, otherwise outputs `text_if_no_match`. Regex is case-sensitive. For example, `{=[AEIOUaeiou]/an/a}` outputs "a" unless the next word starts with a vowel, in which case it outputs "an".
+
+## Friendly Command Names
+
+In a sufficiently-new Plover version, it's possible to use friendly names for some commands/metas.
+
+For detailed descriptions of the commands, see the other sections.
+
+| Command/macro/meta | Equivalent |
+|------|------------|
+| `{*}`  | `=retrospective_toggle_asterisk` |
+| `{*!}` | `=retrospective_delete_space` |
+| `{*?}` | `=retrospective_insert_space` |
+| `{*+}` | `=repeat_last_stroke` |
+| `{^}` | `{:attach}` |
+| `{^word}` | `{:attach:^word}` |
+| `{word^}` | `{:attach:word^}` |
+| `{^word^}` | `{:attach:word}` |
+| `{&a}` | `{:glue:a}` |
+| `{-\|}` | `{:case:cap_first_word}` |
+| `{*-\|}` | `{:retro_case:cap_first_word}` |
+| `{~\|word}` | `{:carry_capitalize:word}` |
+| `{<}` | `{:case:upper_first_word}` |
+| `{*<}` | `{:retro_case:upper_first_word}` |
+| `{>}` | `{:case:lower_first_char}` |
+| `{*>}` | `{:retro_case:lower_first_char}` |
+| `{*($c)}` | `{:retro_currency:$c}` |
+| `{#shift(a)}` | `{:key_combo:shift(a)}` |
+| `{PLOVER:LOOKUP}` | `{:command:LOOKUP}` |
+| `{MODE:CAPS}` | `{:mode:CAPS}` |
+| `{.}` | `{:stop:.}` |
+| `{,}` | `{:comma:,}` |
+| `{$}` | `{:word_end}` |
+
+Note that currently the `{#a}` form will be interpreted literally in the "Strokes" text box of the Plover "Add Translation" dialog box, however entering a stroke mapped to `{:key_combo:a}` will enter the raw stroke into the text box.
+
+## Undoable Line Breaks and Tabs
+
+When you use [keyboard shortcuts](#keyboard-shortcuts), the asterisk/undo command on Plover will not have any effect. This is a limitation imposed by the fact that most commands will not have a meaningful undo. For example, you wouldn't "undo" a "copy" command. For this reason, `{#return}` and `{#tab}` don't work how many users would expect.
+
+Instead, we must use special characters that can be undone by Plover for new paragraphs and erasable tabs. Specifically: 
+
+- `\n` or `\r` for line breaks. 
+- `\t` for tabs. 
+
+For example:
+
+- `{^\n^}{-|}`
+
+    This translation would create a line break without spacing and then capitalize the next word. It can be removed with the asterisk key.
+
+- `{^\t^}`
+
+    This translation presses the tab key without any other spacing. It can be undone with the asterisk key.
+
+## Macros
+
+Macros can be mapped from a stroke and perform operations on the stroke-level. This means that it can perform actions based on previous strokes, not necessarily on previous words or translations.
+
+### Undo / Delete Last Stroke
+
+- `=undo`
+
+The built-in "undo" macro is assigned to the asterisk key `*`. You can map other strokes to "undo" or "delete last stroke" by creating a stroke where the translation is `=undo`
+
+### Repeat Last Stroke
+
+- `{*+}`
+
+    A stroke mapping to this macro will send the last stroke entered. A common stroke to map to repeat-last is the bare number bar; `"#": "{*+}"`; causing `KAT/#/#` to behave like `KAT/KAT/KAT`. 
+
+    Repeat last stroke `{*+}` is very useful for keys that you repeat. For example, when you are moving around text in a document.
+
+**Suggested stroke:** `#`
+
+### Toggle asterisk
+
+- `{*}`
+
+    A stroke mapping to this macro will toggle the asterisk key on the last stroke entered. For example, if you had this stroke in your dictionary as Number Bar + Asterisk, `"#*": "{*}"`, when you write `KAT/#*` it will behave as if you wrote `KA*T`. 
+
+    Toggle asterisk `{*}` is useful for when you notice that you should have included an asterisk in your last stroke. For example, you wanted to write the name "Mark" (a person's name), but you wrote "mark" (the noun/verb). At this point, you can use Toggle asterisk `{*}` to correct it. You wouldn't have to erase the word and re-stroke it (this time, with you including the missing the asterisk).
+
+**Suggested stroke:** `#*`
+
+### Retroactively Add Space
+
+- `{*?}`
+
+    A stroke mapping to this macro will add a space between your last stroke and the one before that, splitting apart the two strokes. For example, if your dictionary contained `PER` as "Perfect", `SWAEUGS` as "Situation" and `PER/SWAEUGS` as "Persuasion". If you meant to write "Perfect situation", but saw your output was "Persuasion", you could force these two strokes to be split apart by using the `{*?}` stroke. This means your output would change on the screen from "Persuasion" to "Perfect situation".
+
+**Suggested stroke:** `AFPS` (add space)
+
+### Retroactively Delete Space
+
+- `{*!}`
+
+    A stroke mapping to this macro will delete the space between your last stroke and the one before that. If you wrote "Basket ball" but wanted it to be "Basketball", you could force these strokes together by using the {*!} stroke. Plover will go back and remove the space before your last stroke; As a result, your output would become "Basketball".
+
+**Suggested stroke:** `TK-FPS` (**d**elete space)
+
+## Keyboard Shortcuts
+
+Most Plover strokes are just text and formatting operators. Plover handles standard strokes really well. This allows it to handle "undoing" with the asterisk key, as well as automatically handling case and spacing. However, Plover's text and formatting strokes can't send arbitrary key strokes, such as sending keyboard shortcuts.
+
+**Note:** Plover 3.1 introduces new rules for commands that differ slightly from the previous implementation. Before Plover 3.1, commands were used to send symbols because Plover didn't have full Unicode support. *It used to be possible to send "+" by writing `{#plus}`, but the system has been updated.*
+
+- `{#}` is the command operator.
+
+Inside of a command block, you write in what keys you want Plover to simulate. The keys hit in command blocks won't be "undone" when using the asterisk (because you can't backspace a keyboard shortcut). You select the keys by their name. All key names will only refer to the base key. For example, to use letter keys, you just use the corresponding letter (case insensitive) separated by spaces:
+
+- `{#a b c d}` will send "abcd" and will not affect Plover's text formatting or asterisk undo-buffer.
+
+You can also use key names, which is needed when you are accessing a symbol key. For example, on the QWERTY layout there is an equal/plus key in the top right, which you can access by either of its names:
+
+- `{#equal plus}` will send "==". Plover doesn't send modifiers. It just hits the key based on the name. 
+
+If you want to send symbols, though, don't use commands. Commands should be used for keyboard shortcuts only. Instead, use the symbol in your dictionary entry.
+
+### Modifier Names
+
+If you want to use a modifier, use it by name (e.g. `Shift_L`). For convenience, all key names are case insensitive and you can optionally default to the left modifier by dropping the side selector:
+
+| Modifier | Command Key Names (case-insensitive) | 
+|----------|----------| 
+| Shift | `Shift_L`, `Shift_R`, `shift` | 
+| Control |  `Control_L`, `Control_R`, `control` | 
+| Alt | `Alt_L`, `Alt_R`, `alt`, `option` | 
+| Super | `Super_L`, `Super_R`, `super`, `windows`, `command` | 
+
+For modifiers, use parentheses to delimit where the keys are pressed down.
+
+### Shortcut Key Names
+
+Here are the key names you'll want to use:
+
+| Keys | Command Key Names (case-insensitive) | 
+|----------|----------| 
+| 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` |
+| Accented Letters (international layouts) | `udiaeresis`, `eacute`, etc.  |
+| Numbers | `0`, `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9` | 
+| Control Keys |  `Escape`, `Tab`, `Caps_Lock`, `space`, `BackSpace`, `Delete`, `Return`, etc. | 
+| F-Keys | `F1`, `F2`, `F3`, `F4`, `F5`, `F6`, `F7`, `F8`, `F9`, `F10`, `F11`, `F12` | 
+| Common Named Keys | `= equal`<br />`- minus`<br />`[ bracketleft`<br />`] bracketright`<br />`/ slash`<br />`\ backslash`<br />`' quoteright`<br />`, comma`<br />`. period`<br />`; semicolon`<br />`~ asciitilde`<br />`^ asciicircum`<br />`` ` quoteleft``<br />[…and more](https://github.com/openstenoproject/plover/blob/master/plover/key_combo.py#L21) |
+| Media Keys | **Common**: `AudioRaiseVolume`, `AudioLowerVolume`, `AudioMute`, `AudioNext`, `AudioPrev`, `AudioStop`, `AudioPlay`, `AudioPause`, `Eject`<br />**Mac**: `MonBrightnessUp`, `MonBrightnessDown`, `KbdBrightnessUp`, `KbdBrightnessDown`<br />**Windows**: `Back`, `Forward`, `Refresh`<br />**Linux**: XF86 key names are supported, for example `XF86_MonBrightnessUp` - refer to [the definition file in `python-xlib`](https://github.com/python-xlib/python-xlib/blob/master/Xlib/keysymdef/xf86.py) for the key names. |
+
+Consult the code for the [full list of supported keyboard shortcut keys](https://github.com/openstenoproject/plover/blob/master/plover/key_combo.py#L21).
+
+**Note:** a key name will determine a key to emulate with **no modifiers** based on your keyboard layout. For example, let's say we want to make a keyboard shortcut to hit shift-2 which is "@" in QWERTY: `{#at}` will only press the `2` key. To get the `@` symbol, we need to add the shift key: `{#shift(at)}`, which is functionally the same as `{#shift(2)}`.
+
+### Example Shortcuts
+
+Here are some shortcuts. They are in JSON format:
+
+- `"STPH-G": "{#right}"` — right arrow on the keyboard, for moving the cursor to the right once
+- `"SKWR-G": "{#shift(right)}"` — shift and right arrow on the keyboard, for selecting one character
+- `"SKWR-BG": "{#control(shift(right))}"` — shift, control, and right arrow on the keyboard, for selecting one word to the right on Windows/Linux
+- `"SKWR-BG": "{#option(shift(right))}"` — option (alt), control, and right arrow on the keyboard, for selecting one word to the right on Mac
+
+These next strokes are not particularly useful, but they show you what you can do with the command syntax:
+
+- `"TKAO*UP": "{#control(c v v v)}"` — copy, then paste 3 times
+- `"SKPH-Z": "{#control(z shift(z))"` — program-dependent, but possibly "undo/redo". Notice how the first z has only the control operator, and the second has both the control and the shift operator.
+
+Commands are case insensitive - adding capitals will not affect the output. `{#control(z shift(z))` is the same as `"{#CONTROL_L(Z SHIFT(Z))}"`
+
+### Escaping Special Characters
+
+Most symbols (e.g. `+, =, ~, r`) can just be included directly in the definition. But some symbols are part of the dictionary syntax and so need to be escaped: 
+
+| Symbol | Escaped Form | 
+|----------|----------| 
+| `\` | `\\`   |
+| `{` | `\{`  |
+| `}` | `\}`  |
+
+`\` is a special case. It must be escaped only if there's any possible ambiguity.
+
+Special case: `=content` might be interpreted as the invocation of a macro named `content`.
+Use `{#}=content` instead.
+
+If you edit the JSON file directly rather than with Plover's built-in editor/"Add translation" feature,
+you need to escape those characters in addition, according to JSON syntax:
+
+| Symbol | Escaped Form | 
+|----------|----------| 
+| `\` | `\\`   |
+| `"` | `\"`  |
+
+Example:
+
+| JSON | Plover show | Plover input | Plover output | 
+|-|-|-|-|
+| `"ab"` | `ab` | `ab` | `<a> <b>` |
+| `"\\{"` | `\{` | `\{` | `<{>` |
+| `"\\\\{"` | `\\{` | `\\{` | `<\> <{>` |
+| `"\""` | `"` | `"` | `<">` |
+| `"\\"` | `\` | `\` | `<\>` |
+| `"\\\\"` | `\\` | `\\` | `<\> <\>` |
+| `"\\\\\\"` | `\\\` | `\\\` | `<\> <\> <\>` |
+| `"\n"` | `\n` | `\n` | `<\n>` |
+| `"\\n"` | `\\n` | `\\n` | `<\> <n>` |
+| `"\\x"` | `\x` | `\x` | `<\> <x>` |
+| `"\\\n"` | `\\n` | (none) | `<\> <\n>` |
+| `"\\\\n"` | `\\\n` | `\\\n` | `<\> <\> <n>` |
+
+Column explanation:
+
+* JSON: how the entry is stored in the JSON file.
+* Plover show: how the entry is displayed in Plover "Add translation" dialog. (version 4)
+* Plover input: how the entry can be added to the dictionary using Plover "Add translation"
+dialog. `(none)` means it's only possible to obtain the entry by editing the JSON in an
+external editor.
+* Plover output: what Plover will send to the emulated keyboard when that stroke is
+pressed.
+
+
+### "Do Nothing" Translation
+
+You can use the keyboard shortcut syntax (`{#}`) if you want a stroke that effectively does nothing. For example: a null or canceled stroke, which doesn't affect formatting, doesn't output anything, and cannot be "undone" with the asterisk key. A stroke mapped to `{#}` will effectively do nothing but show up in your logs.
+
+- `{#}` an effective "null" stroke.
+
+See also: [Canceling Formatting of Next Word](#canceling-formatting-of-next-word)
+
+## Output Modes
+
+- `{MODE:}` is the mode operator
+
+Plover supports special character casing, such as CAPS LOCK and Title Case. It also supports replacing its implicit space with other characters. This is useful for when you want to write_in_snake_case.
+
+**Output modes** are activated with a special syntax in your dictionary. They can be a stroke or just part of a stroke. They can then be turned off with a special reset command. 
+
+An example flow for CAPS LOCK might be:
+
+1. Turn on CAPS LOCK.
+1. Write in capital letters.
+1. Turn off CAPS LOCK.
+
+However, there's nothing stopping you from building in output modes into your strokes. For example, you might want your new paragraph stroke to reset the case mode, no matter what.
+
+### Reset Command
+
+You can reset the output mode to its default with `{MODE:RESET}`. 
+
+> **Important**: We recommended you have a reset output mode command, so that you can always reset Plover's output mode. This is in case you change it by accident. 
+
+- `{MODE:RESET}`: Reset the case and space character. We recommended this for getting out of any custom output mode.
+    For example: `"R-R": "{^~|\n^}{MODE:RESET}"` and `"TPEFBG": "{#escape}{MODE:RESET}"`
+- `{MODE:RESET_CASE}`: Exit caps, lower, or title case.
+- `{MODE:RESET_SPACE}`: Use spaces as normal.
+
+### Modes
+
+There are some built-in modes you can use:
+
+| Dictionary Syntax | Sample Output | 
+|-----------|---------|
+| `{MODE:CAPS}` | THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG. |
+| `{MODE:TITLE}` | The Quick Brown Fox Jumps Over The Lazy Dog. | 
+| `{MODE:LOWER}` | the quick brown fox jumps over the lazy dog. |
+| `{MODE:CAMEL}` | theQuickBrownFoxJumpsOverTheLazyDog. |
+| `{MODE:SNAKE}` | The_quick_brown_fox_jumps_over_the_lazy_dog. |
+
+### Custom Modes
+
+You can define your own custom modes with the `SET_SPACE:` operator. This allows you to replace the space that Plover outputs with anything. Plover's snake-mode is the same as `SET_SPACE:_`. 
+
+Here are some other examples:
+
+| Dictionary Syntax | Sample Output | 
+|---------|-----------|
+| `{MODE:SET_SPACE:}` | Thequickbrownfoxjumpsoverthelazydog. |
+| `{MODE:SET_SPACE:-}` | The-quick-brown-fox-jumps-over-the-lazy-dog. | 
+| `{MODE:SET_SPACE:😁}` | The😁quick😁brown😁fox😁jumps😁over😁the😁lazy😁dog. | 
+
+## Summary of suggested commands you can cut and paste into your dictionary
+
+Here is a summary of the suggested commands you can cut and paste into your personal dictionary:
+
+```json
+{
+"PHR*UP":"{PLOVER:LOOKUP}",
+"PHROFG":"{PLOVER:CONFIGURE}",
+"PHROFBGS":"{PLOVER:FOCUS}",
+"PHROBGT":"{PLOVER:QUIT}",
+"KA*PD":"{*-|}",
+"KA*PS":"{MODE:CAPS}",
+"KPA*L":"{<}",
+"*UPD":"{*<}",
+"HRO*ER":"{>}",
+"HRO*ERD":"{*>}",
+"#":"{*+}",
+"#*":"{*}",
+"AFPS":"{*?}",
+"TK-FPS":"{*!}"
+}
+```
+> **Note:** The final entry must not have a trailing comma.

+ 323 - 0
Frequently_Asked_Questions/README.md

@@ -0,0 +1,323 @@
+**Table of Contents**
+
+- [Plover](#plover)
+  - [What is stenography?](#what-is-stenography)
+  - [How fast can stenographers write?](#how-fast-can-stenographers-write)
+  - [What is Plover?](#what-is-plover)
+  - [Why "Plover"?](#why-plover)
+  - [Who's responsible for Plover's development?](#whos-responsible-for-plovers-development)
+  - [Why does Plover exist?](#why-does-plover-exist)
+  - [How does Stenography compare to typing?](#how-does-stenography-compare-to-typing)
+  - [What does using Plover look like?](#what-does-using-plover-look-like)
+  - [How does it compare to alternative layouts like Dvorak and Colemak?](#how-does-it-compare-to-alternative-layouts-like-dvorak-and-colemak)
+  - [If I learn steno, will it make using QWERTY harder?](#if-i-learn-steno-will-it-make-using-qwerty-harder)
+  - [Why isn't steno more popular than QWERTY?](#why-isnt-steno-more-popular-than-qwerty)
+  - [Will stenography be replaced with automatic voice recognition?](#will-stenography-be-replaced-with-automatic-voice-recognition)
+  - [What theory is Plover's default dictionary based on?](#what-theory-is-plovers-default-dictionary-based-on)
+  - [Where can I find other people who use Plover?](#where-can-i-find-other-people-who-use-plover)
+  - [How can I help?](#how-can-i-help)
+- [Using Plover](#using-plover)
+  - [How can I get started?](#how-can-i-get-started)
+  - [What hardware do I need?](#what-hardware-do-i-need)
+  - [Can I still get by without a professional machine?](#can-i-still-get-by-without-a-professional-machine)
+  - [Can I use Plover for normal computer use?](#can-i-use-plover-for-normal-computer-use)
+  - [Can I use Plover for programming?](#can-i-use-plover-for-programming)
+  - [Can I use Plover for languages other than English?](#can-i-use-plover-for-languages-other-than-english)
+  - [How long does it take to learn?](#how-long-does-it-take-to-learn)
+  - [What's a brief/stroke/arpeggiating/etc.?](#whats-a-briefstrokearpeggiatingetc)
+  - [What can't Plover do?](#what-cant-plover-do)
+- [Comparisons to professional stenography](#comparisons-to-professional-stenography)
+  - [Why does steno need amateurs?](#why-does-steno-need-amateurs)
+  - [What is Steno Arcade?](#what-is-steno-arcade)
+    - [Is Steno Arcade going to put steno schools out of business?](#is-steno-arcade-going-to-put-steno-schools-out-of-business)
+  - [How is Plover different from commercial steno programs?](#how-is-plover-different-from-commercial-steno-programs)
+  - [Is Plover going to put CAT software companies out of business?](#is-plover-going-to-put-cat-software-companies-out-of-business)
+  - [What are some features in Plover not commonly found in most CAT software?](#what-are-some-features-in-plover-not-commonly-found-in-most-cat-software)
+  - [Can I use my Luminex/Stentura/Lightspeed/other stenotype machine?](#can-i-use-my-luminexstenturalightspeedother-stenotype-machine)
+  - [Can I use my dictionaries from another program?](#can-i-use-my-dictionaries-from-another-program)
+
+## Plover
+
+### What is stenography?
+
+*Stan's Quick and Dirty: How Stenography Works*<br>
+[![Plover Dictionary Update Demo](https://img.youtube.com/vi/62l64Acfidc/0.jpg)](https://youtu.be/62l64Acfidc "Plover Dictionary Update Demo")<br>
+[(click to view video — 3:13)](https://youtu.be/62l64Acfidc "Plover Dictionary Update Demo")
+
+[Stenography](https://en.wikipedia.org/wiki/Shorthand) is a form of shorthand writing/typing, usually done on a [special machine](https://en.wikipedia.org/wiki/Stenotype) (although with Plover, you can use computer keyboard that has [n-key rollover](https://en.wikipedia.org/wiki/Rollover_(key))). It was invented in the early 1900s.
+
+Real-time machine stenography is a code translation system that lets users enter words and syllables by pressing multiple keys simultaneously in a chord, which is then instantly translated into English text.
+
+### How fast can stenographers write?
+
+| Method | Typical Speed |
+| ----------|-----------|
+| Handwriting | 30 WPM |
+| Average Typist | [40 WPM](https://www.youtube.com/watch?v=P5Ml_y5-KmI&list=PLFCCB3E328121B261) |
+| Fast Typist | [120 WPM](https://www.youtube.com/watch?v=k71XmfDM1dU) |
+| Typing World Record | [200 WPM](https://www.youtube.com/watch?v=FgjivmUE9o8) |
+| Voice Writer | 180 WPM |
+| Average Speech | 200 WPM |
+| Amateur Stenographer | [160 WPM](https://www.youtube.com/watch?v=a9hVQ5BT1ls) |
+| Professional Stenographer | [225 WPM](https://www.youtube.com/watch?v=UNmqwUEEJA4) |
+| [Steno World Record](https://www.guinnessworldrecords.com/world-records/fastest-realtime-court-reporter-(stenotype-writing)) | 360 WPM |
+
+In the first year of steno school, many students learn to exceed 100 words per minute. By comparison, top qwerty typists can do 120 WPM, top Dvorak typists around 140 WPM, and voice writers dictating to voice recognition software around 180 WPM. But experienced stenographers can enter text at up to 300 words per minute (the world record is actually 360, but that's an outlier). Conceivably, with practice, amateur steno users could reach 160-200 words per minute.
+
+(also see [How long does it take to learn?](#how-long-does-it-take-to-learn))
+
+### What is Plover?
+
+Plover is a 100% free, open source steno program that lets you use your keyboard as a steno machine.It is a small Python application that you run in the background. It acts as a translator to read steno movements and then emulate keystrokes, so the programs you use can't tell that you are using steno.
+
+Plover is available on Windows, Mac and Linux. To get started, follow the [Beginner's Guide](https://github.com/openstenoproject/plover/wiki/Beginner's-Guide:-Get-Started-with-Plover).
+
+### Why "Plover"?
+
+The short answer is that it's a two-syllable, six-letter word that can be written in a single stroke on a steno machine. The longer answer is [here](http://plover.stenoknight.com/2010/03/why-plover.html).
+
+### Who's responsible for Plover's development?
+
+Plover was originally created by [Mirabai Knight](http://www.blogger.com/profile/16494847224950297255) and [Joshua
+Harlan Lifton](http://launchpad.net/~joshua-harlan-lifton), and is the software arm of [The Open Steno Project](http://openstenoproject.org/), an umbrella organization for open source steno tools. The current lead developer is Theodore (Ted) Morin.
+
+### Why does Plover exist?
+
+Falling numbers of graduates from steno schools and the high attrition of retiring stenographers initially caused [Mirabai Knight](http://StenoKnight.com) to worry about the future of her profession, as inferior non-verbatim systems (e.g. ER,
+Typewell, C-Print, automated speech recognition) threaten to fill in the supply vacuum caused by a shortage of steno professionals.
+
+At the same time, she saw steno's great potential in helping to improve the lives of the large number of people who work in front of computers all day, whether they're writing prose, creating software, entering data, or communicating in text with friends and coworkers.  As a method of text entry, Qwerty is inefficient and unergonomic, but so far it hasn't been supplanted by any of the competing systems (such as [Dvorak](http://en.wikipedia.org/wiki/Dvorak_Simplified_Keyboard) or [Colemak](http://en.wikipedia.org/wiki/Keyboard_layout#Colemak)), because they're simply not powerful enough to justify the time investment necessary to learn them. Steno, on the other hand, is.
+
+So Plover has a double-pronged approach:
+
+1. Find people who want to learn steno, whether just as amateurs or as aspiring professionals, and give them a cheap, simple, and fun way to try it out.
+1. Then, for those few who find that they've got both a gift and a passion for steno, provide an opportunity to turn that skill into a career, feeding the talent pools for future professional stenographers and ensuring that steno as a profession will survive into the future.
+
+### How does Stenography compare to typing?
+
+- Typing is (usually) data entry with single fingers
+
+Most likely, you are using a qwerty or dvorak keyboard layout to type everything out character by character. If you ever practiced piano, it might be helpful to liken them to certain piano pieces common in a pianist's repertoire. The "typewriter-style" systems (qwerty, dvorak, etc.) are like [Chopin's Fantasie Impromptu](https://www.youtube.com/watch?v=tvm2ZsRv3C8).
+
+Notice how this piece — like typing — is mainly runs of single fingers. When you learn and practice this piece, you often do many finger exercises to strengthen certain fingers to increase your speed.
+
+- Stenography is chorded data entry, using multiple fingers
+
+However, Plover, and other steno systems, use keyboard "chords" to type syllables, words, or entire phrases. You press keys, and lift off, rather than pressing down individual keys one after the other.
+
+> "When your fingers are in position, press them all down together, and release them. Out comes the word 'tap'! You've just tapped your first word in steno! Notice that it doesn't really matter that all the keys go down absolutely simultaneously. The only thing Plover cares about is that there's one moment in time when all three keys are down together."
+>
+> — [Learn Plover!](https://sites.google.com/site/learnplover/lesson-1-fingers-and-keys)
+
+Plover — and all steno systems — express words primarily as groups of sounds rather than groups of letters of the alphabet.
+
+"Steno-style" systems (NYCI, StenoEd, Phoenix, etc.) are like [Rachmaninoff's Prelude in G Minor](https://www.youtube.com/watch?v=4QB7ugJnHgs).
+
+Unlike the Chopin, this piece is almost entirely chorded. When learning a piece like this, you learn how to block your chords. So your approach to learning steno may be completely different than learning a different keyboard layout, since it's a completely different system.
+
+### What does using Plover look like?
+
+| **QWERTY versus Stenography on Steno Arcade** | **Plover wins the race!** | **Demonstration of Plover with Qwerty Keyboard** |
+| - | - | - |
+| [![QWERTY versus Stenography on Steno Arcade](https://i.ytimg.com/vi/UtQzTUEuPWo/hqdefault.jpg)](https://youtu.be/UtQzTUEuPWo?t=8s)<br>[(click to view video — 3:25)](https://youtu.be/UtQzTUEuPWo?t=8s) | [![Plover Wins the Race!](https://img.youtube.com/vi/jkUyg_uoidY/0.jpg)](https://www.youtube.com/watch?v=jkUyg_uoidY)<br>[(click to view video — 0:30)](https://www.youtube.com/watch?v=jkUyg_uoidY) | [![Demonstration of Plover with Qwerty Keyboard](https://img.youtube.com/vi/JXQQzW99cAI/0.jpg)](https://www.youtube.com/watch?v=JXQQzW99cAI)<br>[(click to view video — 1:05)](https://www.youtube.com/watch?v=JXQQzW99cAI) |
+| **Realtime Text to Speech with Plover** | **Coding in Stenography, Quick Demo** | **Rails 7: The Steno Demo** |
+| [![Realtime Text to Speech with Plover](https://img.youtube.com/vi/K3MYFT6VZk8/0.jpg)](https://www.youtube.com/watch?v=K3MYFT6VZk8)<br>[(click to view video — 3:36)](https://www.youtube.com/watch?v=K3MYFT6VZk8) | [![Coding in Stenography, Quick Demo](https://i.ytimg.com/vi/RBBiri3CD6w/hqdefault.jpg)](https://www.youtube.com/watch?v=RBBiri3CD6w)<br>[(click to view video — 2:00)](https://www.youtube.com/watch?v=RBBiri3CD6w)| [![Rails 7: The Steno Demo](https://i.ytimg.com/vi/q7g0ml60LGY/hqdefault.jpg)](https://www.youtube.com/watch?v=q7g0ml60LGY)<br>[(click to view video — 2:08:59)](https://www.youtube.com/watch?v=q7g0ml60LGY)|
+
+### How does it compare to alternative layouts like Dvorak and Colemak?
+
+In terms of speed, professional stenographers are expected to get to 225wpm at minimum, and the [world record is 360wpm](https://www.guinnessworldrecords.com/world-records/fastest-realtime-court-reporter-(stenotype-writing)). Audiobooks are narrated at around 150wpm ([source from an Audible/iTunes book provider](https://help.acx.com/s/article/how-long-will-my-narrated-audiobook-be)). The world record typist, Barbara Blackburn, has achieved a peak speed of 212wpm on Dvorak.
+
+In terms of comfort, many people say than stenography is more comfortable. Here is [ Mirabai's article on the ergonomic argument for stenography](http://plover.stenoknight.com/2010/05/ergonomic-argument.html). There are fewer keys and therefore less finger movement. You write chords, not letters, so that reduces vertical movement. And you don't write out every single character — spaces are automatically inserted, and you can write whole words and phrases with a single stroke.
+
+### If I learn steno, will it make using QWERTY harder?
+
+If you have used alternative layouts like Dvorak and Colemak, you might have found that learning one would make it harder to use QWERTY (e.g. needing time to warm up when changing layouts, losing speed).
+
+From reports of users in the [Plover discord](https://github.com/openstenoproject/plover/wiki/Links-to-the-Steno-Community), people don't seem to experience this with steno and QWERTY in the same way. This could be because:
+
+- Chorded input is very different from typing, so the muscle memory doesn't interfere as much
+- Steno is typically used on hardware that feels very different (e.g. non-staggered, light keys)
+
+### Why isn't steno more popular than QWERTY?
+
+There are a number of possible reasons:
+
+1. Stenography was copyrighted for many decades, which limited the amount of competition in the marketplace.
+1. The vendors decided to focus on high value products in market sectors where organizations would be willing to pay higher prices. Professional hardware and software can cost several thousands of dollars.
+1. It takes longer to learn how to write with steno than it does learning how to type. (See [How long does it take to learn?](#how-long-does-it-take-to-learn))
+1. Plover software, and [suitable low cost hardware](https://github.com/openstenoproject/plover/wiki/Supported-Hardware), didn't exist [until recently](https://github.com/openstenoproject/plover/wiki/Open-Steno-Project-Timeline).
+### Will stenography be replaced with automatic voice recognition?
+
+Mirabai Knight has done [a presentation](https://www.youtube.com/watch?v=XKe1O7ppyqQ) on this topic. As a summary, automatic voice recognition is still not accurate enough in certain situations such as if there is bad audio, someone speaking with a non-standard accent, or if the cost of certain mistakes is too high.
+
+Some people are experimenting with voice typing technology, where someone who knows the voice recognition software well speaks into a special mic.
+
+### What theory is Plover's default dictionary based on?
+
+It's basically Mirabai Knight's personal dictionary, which is a mix of New York Career Institute theory and Sten Ed, with several thousand tweaks, briefs, and additions of her own.
+
+### Where can I find other people who use Plover?
+
+Check out these [links to the community](https://github.com/openstenoproject/plover/wiki/Links-to-the-Steno-Community).
+
+### How can I help?
+
+The Open Steno Project is run by volunteers.
+
+You can help by:
+
+- [Contributing code](https://github.com/openstenoproject/plover/blob/master/CONTRIBUTING.md#contributing-code)
+- [Reporting issues](https://github.com/openstenoproject/plover/blob/master/CONTRIBUTING.md#reporting-issues)
+- [Editing this wiki](https://github.com/openstenoproject/plover/wiki)
+- [Getting involved in the community](https://github.com/openstenoproject/plover/wiki/Links-to-the-Steno-Community)
+- [Donating money](https://www.openstenoproject.org/donate/)
+- Telling people about Open Steno, Plover, and stenography!
+
+## Using Plover
+### How can I get started?
+
+The [Beginner's Guide](https://github.com/openstenoproject/plover/wiki/Beginner's-Guide:-Get-Started-with-Plover) has everything you need to get started, including how to install Plover, what hardware you need, and how to practice and learn.
+
+### What hardware do I need?
+
+You can just get started and try Plover out on the keyboard you are using right now.
+
+However, some keyboards will be easier to use for stenography than others. Features to look out for are:
+ - [NKRO](https://github.com/openstenoproject/plover/wiki/Supported-Hardware#whats-nkro), so you don't have to [arpeggiate](https://github.com/openstenoproject/plover/wiki/Glossary#arpeggiate).
+ - No stagger and a smaller gap between keys, so that you can easily press keys that are next to each other. However, it's possible to [adapt a keyboard](https://github.com/openstenoproject/plover/wiki/Supported-Hardware#adapt-a-keyboard-for-steno-use) to work better for steno.
+ - Lighter keys, so it's less fatiguing.
+
+[Find more information in this section of the beginner's guide](https://github.com/openstenoproject/plover/wiki/Beginner's-Guide:-Get-Started-with-Plover#connect-a-compatible-keyboard-or-stenography-machine), or in the [keyboards section of the hardware page](https://github.com/openstenoproject/plover/wiki/Supported-Hardware#keyboards).
+
+### Can I still get by without a professional machine?
+
+Yes, Mirabai Knight wrote in [her review of the Georgi](http://plover.stenoknight.com/2019/12/georgi-review.html) that she was able to caption 8 hour conferences with no fatigue. General consensus is that this should also be possible with other [hobbyist steno machines](https://github.com/openstenoproject/plover/wiki/Supported-Hardware#commercially-available-hobbyist-machines).
+
+This isn't to say that professional machines do not have some benefits:
+- They do not require a computer, instead they can store text on the machine
+- The pressure and sensitivity can be adjusted on the fly and per key
+- The amount of force you need to use is similar regardless of the number of keys you press. With keyboards, where each key is separate, a stroke that uses 8 keys will require 8 times the amount of force as a single key
+
+[Thomas Baart's post "Exploring Professional Stenotype Machines"](https://thomasbaart.nl/2019/01/24/exploring-professional-stenotype-machines/) goes into more of the features that professional machines have.
+
+### Can I use Plover for normal computer use?
+
+Yes! Plover can send nearly every keyboard key or combination you like. See the [dictionary format](https://github.com/openstenoproject/plover/wiki/Dictionary-Format#keyboard-shortcuts) for more information.
+
+The only limitation is that it cannot hold down keys (for example, if you want to shift+drag). There is currently a [pull request](https://github.com/openstenoproject/plover/pull/1278) for this, so hopefully it will be possible soon.
+
+Since there are many symbols and modifiers and not all of these are defined in the default Plover dictionaries, you may be interested in some dictionaries and plugins other people have made:
+
+ - [Emily Symbols](https://github.com/EPLHREU/emily-symbols), for typing symbols (including those not in the main Plover dictionary)
+ - [Emily Modifiers](https://github.com/EPLHREU/emily-modifiers), for typing with modifiers (e.g. ALT+D, CTRL+-, SUPER, SHIFT+F5)
+ - [Abby's Left Hand Modifiers](https://github.com/4hrue2kd83f/abby-left-hand-modifiers), for typing with modifiers but keeping the right hand free
+ - [Plover Emoji](https://github.com/morinted/plover_emoji), for typing emoji
+
+### Can I use Plover for programming?
+
+Yes, and many people do!
+
+For example:
+- The author of [Art of Chording](https://www.artofchording.com/) (a Plover theory textbook) is a programmer and he has some videos of him programming with steno: [Coding in Stenography, Quick Demo](https://www.youtube.com/watch?v=RBBiri3CD6w), [Raw unedited steno coding demo](https://www.youtube.com/watch?v=711T2simRyI)
+- [Paul Fioravanti](https://www.paulfioravanti.com/) recreated DHH's rails 7 demo using steno: [Rails 7: The Steno Demo](https://www.youtube.com/watch?v=q7g0ml60LGY)
+- Mirabai Knight, who started Plover, has a [demo of her transcribing some of Plover's python source code](https://www.youtube.com/watch?v=jRFKZGWrmrM)
+
+To make programming easier with steno:
+- For writing words/symbols used in programming, you can define a dictionary for them. You may want to use a dictionary someone else has already made, or look there for inspiration:
+  - Specific dictionaries
+    - [Emily Symbols](https://github.com/EPLHREU/emily-symbols) for writing symbols.
+  - Dictionary collections which include some programming related dictionaries
+    - [stenodict](https://www.openstenoproject.org/stenodict/) a user-submitted collection of dictionaries
+    - [Di's steno dictionaries](https://github.com/didoesdigital/steno-dictionaries), the creator of Typey Type (and whose programming dictionaries can be [practiced on the site](https://didoesdigital.com/typey-type/lessons#tech))
+    - [Emily's dictionaries](https://github.com/EPLHREU/emily-dictionaries)
+    - [Antistic's dictionaries](https://github.com/antistic/steno-dictionaries)
+    - [Paul's dictionaries](https://github.com/paulfioravanti/steno-dictionaries)
+    - [Josiah's dictionaries](https://github.com/Josiah-tan/plover_dict)
+
+- For writing in snake/camel/pascal/etc. case: You can set [typing modes](https://github.com/openstenoproject/plover/wiki/Dictionary-Format#modes), [control capitalisation](https://github.com/openstenoproject/plover/wiki/Dictionary-Format#capitalizing), or type symbols like `_`. There are also various plugins (see a list [here](https://github.com/openstenoproject/plover/discussions/1355)) which lets you do this retroactively.
+- Since it's harder to use both the mouse and steno at the same time, you may also want to learn how to use more keyboard shortcuts. Check out the question ["Can I use Plover for normal computer use?"](#can-i-use-plover-for-normal-computer-use) above.
+
+### Can I use Plover for languages other than English?
+
+Plover supports custom systems, so it's possible to use different language systems in Plover. Here's a list of current [chorded systems](https://github.com/openstenoproject/plover/wiki/Steno-Layouts-&-Supported-Languages) that have been made.
+
+If you want to fingerspell with non-English letters, JorWat has a [fingerspelling dictionary for diacritics](https://github.com/JorWat25/dictionaries/blob/main/diacritics.json) (e.g. é, ç, ø, ñ etc.).
+
+Unfortunately, due to the lack of learning resources for other languages, it is usually advised that you learn the English system first so that you get a good understanding of stenography before learning another system.
+
+The #multilingual channel on the [discord server](https://discord.gg/0lQde43a6dGmAMp2) is likely the best place to seek support for other languages.
+
+### How long does it take to learn?
+
+You can see the [2021 community survey results](https://docs.google.com/forms/d/1lPX-DkdqNm0L0JfgjjxwQqvYxwSMtB8HmiMCcIhAcS0/viewanalytics) to see how long people have been learning stenography, and what their speed is. It is reasonable to get to around your qwerty speed in about 6 months, though of course it depends on your qwerty speed and how you practice.
+
+Aerick made a [youtube video showing his progress over 5 months](https://www.youtube.com/watch?v=28v3cm21uAA), where he was able to get to 100-160wpm, depending on the text.
+
+People in professional stenography schools often expect to take about 2 years to get to 225wpm with 98% accuracy. However, stenography school is not a necessarily a one-to-one comparison to your personal use case, since it is designed as a track to being a professional court reporter/live captioner/CART provider etc. This may involve learning specific legal terminology, medical terminology, CAT software training, how courts work etc.
+
+### What's a brief/stroke/arpeggiating/etc.?
+
+You can find a list of commonly used terms in the [glossary](https://github.com/openstenoproject/plover/wiki/Glossary).
+
+### What can't Plover do?
+
+For general information on what Plover cannot do, see the [open feature requests](https://github.com/openstenoproject/plover/issues?q=is%3Aissue+is%3Aopen+label%3Afeature-request). If there's something you'd like Plover to do that it currently doesn't, you can open a feature request of your own.
+
+- Sticky Metakeys (issue [#72](https://github.com/openstenoproject/plover/issues/72))
+
+Plover lacks arbitrarily stackable metakeys. You can explicitly define a metakey+key combination in the dictionary (and there is a dictionary for general shortcuts such as `Control-C`), but you can't map a stroke to, say, `Control` and then be able to simulate holding it down while choosing another key in realtime to be activated along with it.
+
+- Transcript management and workflow
+
+Plover is not court reporting (CAT) software, and there are no plans to make it into CAT replacement software. It has no transcript preparation utilities of any kind. For example: document approval and delivery workflow, document encryption, or file management. See [Is Plover going to put CAT software companies out of business?](#is-plover-going-to-put-cat-software-companies-out-of-business).
+
+
+## Comparisons to professional stenography
+### Why does steno need amateurs?
+
+In most skill-based fields — music, photography, athletics, and computer programming, to name a few — a healthy pool of amateurs makes it possible for professionals to exist. People cultivate an interest, buy some cheap equipment, take a few classes, discover that they love the work, hone their skills with thousands of hours of practice, and eventually a very dedicated and talented few are able to become good enough to make a living at what they love. The rest do it without compensation, just for their own pleasure and enjoyment. This is the natural ecosystem of any difficult skill: A wide base of dabblers and dilettantes at the bottom, and a small number of world class hotshots at the top.
+
+Without a steady supply of amateurs to hold the ranks, it's difficult for professionals to exist. Many legendary musicians started out with a $50 guitar and a tattered songbook. If every guitar cost $5,000 and the only way to learn how to play it was at a conservatory, how many potentially great guitarists would never even get within strumming range? Plover reduces the $1,500+ initial startup cost of steno to around $70, which means vastly more people can give it a try and see if it might be for them.
+
+### What is Steno Arcade?
+
+[![Steno Arcade](http://cdn.akamai.steamstatic.com/steam/apps/256661129/movie.293x165.jpg?t=1456810705)](http://store.steampowered.com/app/449000/)
+
+[Steno Arcade](http://store.steampowered.com/app/449000/) is a suite of arcade games designed to teach and drill steno fundamentals in an immersive, addictive, responsive, and interactive way.
+
+#### Is Steno Arcade going to put steno schools out of business?
+
+Very unlikely. There will always be a place for high-speed dictation and one-on-one interaction between steno professionals and students. Steno Arcade will be directed at people who want to use steno non-professionally, aren't sure whether steno is for them, or who want to try it out a bit before committing to making it a definite career goal.
+
+There will always be some autodidacts who can get through the Steno Arcade program entirely by themselves and find themselves certification-ready at the end of it, but that will probably be fairly rare.
+
+### How is Plover different from commercial steno programs?
+
+Well, first off, it's free. Free to distribute, free to modify. No dongles, no upgrade fees, no constraints. That's already a $4,000 difference.
+
+To the developer's knowledge, it's also the only steno software that works on a buffer-based system rather than a timer-based system, and that has direct access to the OS rather than filtering everything into a steno-specific word processor. This means it's lightweight, powerful, and doesn't require a 1.5-second wait time between when a stroke is entered and when the translation appears in an external program. In Plover, the translation appears instantly, and the software isn't cluttered up with file managers, printer handlers, and other court-reporting flimflam that an amateur stenographer will never use. Instead, it's a direct conduit between the steno keyboard and the OS. Plover can do everything a qwerty keyboard can do – but much, much faster.
+
+### Is Plover going to put CAT software companies out of business?
+
+Definitely not. Plover is not court reporting software. It has no transcript preparation utilities of any kind. However, it might prove useful to people who use other CAT systems for their work but would like to use Plover as a replacement for their qwerty keyboard in daily computing tasks. At some point Plover might become a solid option for CART providers, but there are no plans to make it into CAT replacement software for either court reporters or broadcast captioners.
+
+### What are some features in Plover not commonly found in most CAT software?
+
+1. Plover's main purpose is to replace the qwerty keyboard with a steno keyboard. Unlike other CAT systems, it does not have a text entry window; it's a pure conduit straight to the operating system. Anything you can do with a qwerty keyboard can be done with Plover, and you can use it with the word processor or text editor of your choice.
+1. Plover runs on Windows, Mac, and Linux.
+1. Its length-based buffer, as opposed to the time-based buffer used in most CAT software, ensures instant
+delivery of text with no buffer flushing or time delay.
+1. Its dictionary is text-based, so you can search through and edit it using any text editor. Updating the dictionary from the writer is smooth and seamless.
+1. And, of course, its biggest feature: It's 100% free and open source. You can download it, keep it on a USB key, and have it to hand as a backup in case something happens to your CAT software. You can distribute it to interested friends and potential steno students. You can run it on as many computers as you like, with absolutely no restrictions. And, if you
+know how to program in Python, you can modify it and change it to your heart's delight.
+
+Plover Dictionary Update Demo<br>
+[![Plover Dictionary Update Demo](https://img.youtube.com/vi/eSU5JlVXT1A/0.jpg)](https://youtu.be/eSU5JlVXT1A "Plover Dictionary Update Demo")<br>
+[(click to view video — 1:44)](https://youtu.be/eSU5JlVXT1A)
+### Can I use my Luminex/Stentura/Lightspeed/other stenotype machine?
+
+Yes! See the [stenotype machine section in supported hardware](https://github.com/openstenoproject/plover/wiki/Supported-Hardware#stenotype-machines) for machines that have been confirmed to work with Plover, and any specific setup instructions you may need to follow.
+
+### Can I use my dictionaries from another program?
+
+Yes, Plover supports the RTF/CRE format, which is exportable from just about any CAT software.

+ 662 - 0
Plugins/README.md

@@ -0,0 +1,662 @@
+Plugins can be made for Plover to extend its functionality in various ways, from the tools available in the GUI to the types of dictionaries supported. They are available starting from Plover version 4.0.
+
+## How to Install Plugins
+
+- Right click the plover icon
+- Go to Tools → Plugins Manager†
+- The plugins manager window should appear. Here you can browse through the available plugins. You can click on the plugin to view more information and select `Install/Update` to install the plugin.
+- You need to restart plover after installing/updating/removing plugins
+
+
+† Note: If you don't see the menu option for the plugins manager, it may not be installed. For developers, install the plugins manager by running `pip install plover-plugins-manager` in the command line. Otherwise, try uninstalling Plover and re-[installing a recent version](https://github.com/openstenoproject/plover/wiki/Installation-Guide) (try Plover v4.0.0.dev5 or newer) to automatically add the plugin manager.
+
+## An example of installing a plugin
+
+The following screenshots were made on macOS Monterey using Plover 4 (specifically 4.0.0.dev10+120.g4394ef1). If you see something different, please edit this page and add a screenshot!
+
+- In Plover, click on the Plugins Manager:
+<img width="745" alt="plover-plugins-manager" src="https://user-images.githubusercontent.com/2476974/153801643-5312a3df-30ec-4f64-9dd4-bfb00ac10e1e.png">
+
+- In the Plugins Manager, choose a plugin you want to install and click "Install/Update":
+<img width="799" alt="plover-plugins-manager-plover-dict-commands" src="https://user-images.githubusercontent.com/2476974/153801696-46a3124f-1a80-498f-8ec4-58dee4de6082.png">
+
+- You should see a warning. It's true, installing plugins is a security risk. Before choosing "Yes", you might take the time to learn more about the plugin itself.
+<img width="563" alt="malware-warning" src="https://user-images.githubusercontent.com/2476974/153801708-b5e2eb98-7a35-4e02-a96b-d55d82c23d88.png">
+
+- Ask the generous folks on Discord if they've used the plugin and trust it. You can also follow the link from the Plugins Manager description to the plugin page on GitHub, like this one:
+<img width="958" alt="GitHub-README" src="https://user-images.githubusercontent.com/2476974/153801740-fd21a8d3-1fa1-478a-b7b7-88f1d5760667.png">
+
+- If you're happy to accept the risk, choose "Yes" to install the plugin. You should see a dialog like this:
+<img width="605" alt="plover-install-dialog" src="https://user-images.githubusercontent.com/2476974/153801787-0f8cb8a7-66b4-4b49-8c99-0e24463c171f.png">
+
+- After installing, click "Restart":
+<img width="395" alt="plover-restart" src="https://user-images.githubusercontent.com/2476974/153801807-bd2f7f86-1602-4d9c-a749-974c6c991c87.png">
+
+- For Plugins that are considered "Extensions", you may need to take some extra steps. If you're not sure if it's an extension, follow the steps anyway. In Plover, go to "Configure":
+<img width="747" alt="plover-configure" src="https://user-images.githubusercontent.com/2476974/153801838-fd51dd0d-8be4-48b9-a066-b06411c0c736.png">
+
+- Click on the Plugins tab. If the plugin is listed, check the box to Enable it:
+<img width="469" alt="plugins-extensions" src="https://user-images.githubusercontent.com/2476974/153801861-e7a3f35b-d088-4ba8-9456-10cf37e85683.png">
+
+Now the plugin should work. If not, ask the lovely folk on Discord for help.
+
+For the example above, I installed the `plover-dict-commands` plugin. Now I will show testing that the plugin works by adding a dictionary entry to toggle off the `di-briefs.json` dictionary.
+
+- Open the "Add Translation" window (either from Plover or use the brief if you have one). Add strokes like `T*EFT` and a translation like `{PLOVER:TOGGLE_DICT:-di-briefs.json}`:
+<img width="753" alt="add-translation" src="https://user-images.githubusercontent.com/2476974/153803179-8a2b8f5c-7ff2-40b0-98aa-8d10c3de7745.png">
+
+- Here you can see my list of enabled dictionaries:
+<img width="745" alt="list-of-dictionaries" src="https://user-images.githubusercontent.com/2476974/153803364-d772117a-279c-48f1-8bdf-804599fd2e3d.png">
+
+- Then I press `T*EFT` and it turns off the `di-briefs.json` dictionary:
+
+<img width="742" alt="toggled-off-dictionary" src="https://user-images.githubusercontent.com/2476974/153803480-277b701e-fe45-4435-93d8-d72b62ae0141.png">
+
+***
+
+**TODO: Information on how to install the plugins manager for non-developers, screenshots, point developers towards the development workflow section which has other options.**
+
+## Plugin Development
+
+Checkout the [Plugin Development Guide](https://plover.readthedocs.io/en/latest/plugin_dev.html), which is the updated version of the information below. You might also find the [API reference](https://plover.readthedocs.io/en/latest/api_reference.html) to be useful.
+
+## How Plugins Work
+
+Plugins are generally implemented as separate Python packages that are installed into the Python environment that Plover uses. In order to support this, Plover's code uses a dynamic plugin discovery system via [setuptools's entry_points configuration](https://setuptools.readthedocs.io/en/latest/setuptools.html#dynamic-discovery-of-services-and-plugins) to allow other packages to define themselves as certain types of plugins for Plover. After collecting the registry of plugins in the active Python environment on initialization, Plover has hooks in its code to call into each of the different types in the registry at various parts of its life cycle.
+
+Much of Plover's built-in functionary is actually implemented via this plugin architecture in the main repository. For example, .json and .rtf dictionary support is from dictionary plugins, keyboard, Gemini PR, TX Bolt, and more input methods are all machine plugins, the English stenography layout is a system plugin, the entire UI itself is a GUI plugin, and much more.
+
+## Types of Plugins
+
+The following is each type of plugin available to develop in the packaged version of Plover and their relevant technical information.
+
+Some examples are given for each type of plugin, but also check out the setup files in the [main Plover repository](https://github.com/openstenoproject/plover) to find a bunch of plugins built into the release.
+
+**TODO: Document the base engine's hooks, or at least point to the code for them, for extension and GUI plugins**
+
+### plover.command
+
+Command plugins are used for executing arbitrary logic in response to a stroke. The logic can interact with the stenography engine itself but can also do completely separate tasks. It is not recommended to use command plugins to manipulate the stenography translation process as other plugin types are generally more suited for that.
+
+Examples:
+
+* [plover_vlc_commands](https://github.com/benoit-pierre/plover_vlc_commands)
+* [plover_system_switcher](https://github.com/nsmarkop/plover_system_switcher)
+
+#### API
+
+The following would be for a new command called "example_command".
+
+`setup.cfg`:
+
+```ini
+...
+[options.entry_points]
+plover.command =
+    example_command = plover_example_command.command:example
+...
+```
+
+`plover_example_command/command.py`:
+
+```python
+...
+def example(engine: plover.engine.StenoEngine, argument: str) -> None:
+...
+```
+
+The string argument is optional, and if not provided by the stroke definition after a `:` will always be sent as `''`.
+
+Dictionary format:
+
+```json
+{
+    "S-": "{PLOVER:EXAMPLE_COMMAND:argument}",
+    "T-": "{PLOVER:EXAMPLE_COMMAND}"
+}
+```
+
+### plover.dictionary
+
+Dictionary plugins are used to support other types of dictionary formats other than Plover's default JSON format. They can range from other text formats to completely code-driven dictionaries.
+
+Examples:
+
+* [plover_python_dictionary](https://github.com/benoit-pierre/plover_python_dictionary)
+* [plover_yaml_dictionary](https://github.com/nsmarkop/plover_yaml_dictionary)
+* [plover_excel_dictionary](https://github.com/benoit-pierre/plover_excel_dictionary)
+
+#### API
+
+The following would be for a new dictionary file format with a file extension of ".abc".
+
+`setup.cfg`:
+
+```ini
+...
+[options.entry_points]
+plover.dictionary =
+    abc = plover_example_dictionary.dictionary:ExampleDictionary
+...
+```
+
+`plover_example_dictionary/dictionary.py`:
+
+```python
+from plover.steno_dictionary import StenoDictionary
+
+class ExampleDictionary(StenoDictionary):
+    # The basics are that _load is called during initialization to pull your dictionary
+    # file format into memory and _save is called after an edit for you to implement
+    # saving to your dictionary file format. If you are not relying on the typical way
+    # StenoDictionary stores entries in memory as part of your _load implementation,
+    # such as what plover_python_dictionary does, you may need to re-implement more parts
+    # of the base class like get, while making sure LONGEST_KEY and similar essential state
+    # is set appropriately and maintained. See the base class for details on what is available.
+
+    def _load(self, filename: str) -> None:
+        # If you are not maintaining your own state format, self.update is usually
+        # called here to add strokes / definitions to the dictionary state.
+        pass
+
+    def _save(self, filename: str) -> None:
+        pass
+```
+
+Note that setting `readonly` to `True` on your dictionary class will make it so the user is not able to modify a dictionary of that type in the UI.
+
+### plover.extension
+
+Extension plugins are used to execute arbitrary code. They are started when Plover starts and can be enabled or disabled in the *Plugins* section of the configuration dialog. They are ideal for background processes that should run concurrently to the main stenography engine but can be used to perform one-time actions as well.
+
+Examples:
+* [plover_dictionary_lookup](https://github.com/nsmarkop/plover_dictionary_lookup)
+* [plover_websocket_server](https://github.com/nsmarkop/plover_websocket_server)
+* [plover_auto_reconnect_machine](https://github.com/tschulte/plover_auto_reconnect_machine)
+* [plover_focus_track](https://github.com/benoit-pierre/plover/blob/extension_focus_track/plover/extension/focus_track.py)
+
+#### API
+
+`setup.cfg`:
+
+```ini
+...
+[options.entry_points]
+plover.extension =
+    example_extension = plover_example_extension.main:Main
+...
+```
+
+`plover_example_extension/main.py`:
+
+```python
+class Main:
+
+    def __init__(self, engine: plover.engine.StenoEngine) -> None:
+        # Called once to initialize an instance which lives until Plover exits.
+        pass
+
+    def start(self) -> None:
+        # Called to start the extension or when the user enables the extension.
+        # It can be used to start a new thread for example.
+        pass
+
+    def stop(self) -> None:
+        # Called when Plover exits or the user disables the extension.
+        pass
+```
+
+### plover.gui
+
+Plugins of this type are only available when the Qt GUI is being used.
+
+#### plover.gui.qt.machine_option
+
+Examples:
+* [plover_midi](https://github.com/benoit-pierre/plover_midi/blob/master/plover_midi/gui_qt/midi_option.py#L15)
+
+#### plover.gui.qt.tool
+
+Tool plugins are used to create new user-facing GUI tools like the Suggestions and Lookup windows.
+
+Examples:
+* [plover_wpm_meter](https://github.com/arxanas/plover_wpm_meter)
+* [plover_layout_display](https://github.com/morinted/plover_layout_display)
+* [plover_plugins_manager](https://github.com/benoit-pierre/plover_plugins_manager)
+* [plover_dictionary_builder](https://github.com/morinted/plover_dictionary_builder)
+* [spectra_analyzer](https://github.com/fourshade/spectra_lexer)
+
+##### API
+
+`setup.cfg`:
+
+```ini
+...
+[options.entry_points]
+plover.gui.qt.tool =
+    example_tool = plover_example_tool.main:Main
+...
+```
+
+And if you're using Qt Designer to create your UI, you can use the helpers provided by `plover_build_utils.setup` to automate the generation of Python code from your UI definitions; in `setup.py`:
+
+```python
+from setuptools import setup
+from plover_build_utils.setup import BuildPy, BuildUi
+
+BuildPy.build_dependencies.append("build_ui")
+BuildUi.hooks = ["plover_build_utils.pyqt:fix_icons"]
+CMDCLASS = {
+    "build_py": BuildPy,
+    "build_ui": BuildUi,
+}
+
+setup(cmdclass=CMDCLASS)
+```
+Note: this will also hook into the `build_py` command so other relevant setup commands (`build`, `install`, `develop`, ...) will automatically generate the UI files.
+
+Additionally, you'll want to make sure the correct file are included/excluded; in `MANIFEST.in`:
+
+```txt
+# Exclude generated UI files.
+exclude plover_example_tool/*_rc.py
+exclude plover_example_tool/*_ui.py
+# Ensure base UI files are included.
+include plover_example_tool/*.ui
+recursive-include plover_example_tool/resources *
+```
+
+Check the [relevant section of the Python Packaging User Guide](https://packaging.python.org/guides/using-manifest-in/) for more information on using `MANIFEST.in`.
+
+`plover_example_tool/main.py`:
+
+```python
+from plover.gui_qt.tool import Tool
+from plover.engine import StenoEngine
+
+
+# You will also want to import / inherit from the Python class generated by your .ui
+# file if you are using Qt Designer.
+class Main(Tool):
+
+    # This is what the tool will show up as in the UI
+    TITLE = 'Example Tool'
+    # This is the Qt path to your icon in your resource files to use
+    ICON = ''
+    # This is an identifier for your tool, just make it unique
+    ROLE = 'example_tool'
+
+    def __init__(self, engine: plover.engine.StenoEngine) -> None:
+        super().__init__(engine)
+        # If you are inheriting from your .ui generated class, also call `self.setupUi(self)`.
+```
+
+All of the above assumes that `plover_example_tool/resources/` will be where your resources are stored.
+
+### plover.machine
+
+Machine plugins are used to support new input protocols, such the serial input from various professional stenography machines or even MIDI keyboards.
+
+Examples:
+
+* [plover_treal](https://github.com/morinted/plover-treal)
+* [plover_midi](https://github.com/benoit-pierre/plover_midi)
+* [plover_procat](https://github.com/openstenoproject/plover/blob/master/plover/machine/procat.py)
+* [plover_geminipr](https://github.com/openstenoproject/plover/blob/master/plover/machine/geminipr.py)
+
+#### API
+
+Example implementation of a new machine called "Example Machine":
+
+`setup.cfg`:
+
+```ini
+...
+[options.entry_points]
+plover.machine =
+    Example Machine = plover_example_machine.main:ExampleMachine
+...
+```
+
+`plover_example_machine/main.py`:
+
+```python
+from typing import Any, Callable, Dict, Tuple
+
+from plover.machine.base import ThreadedStenotypeBase
+
+
+class ExampleMachine(ThreadedStenotypeBase):
+    """This is an example machine."""
+
+    # The keys on the machine, separated by whitespace.
+    KEYS_LAYOUT: str = '0 1 2 3 4 5 6 7 8 9 10'
+ 
+    def __init__(self, params: Dict[str, Any]) -> None:
+        super().__init__()
+        # Store the parameters for whatever is needed during runtime
+        # if you have any provided by or stored in the config
+        self._params = params
+
+    def run(self) -> None:
+        self._ready()
+        # You can loop over self.finished.is_set() instead of waiting for a 1 second timeout
+        # or have any other condition here, but this will be the main place to listen to
+        # your machine input and construct / notify about stroke input
+        while not self.finished.wait(1):
+            self._notify(self.keymap.keys_to_actions(['1']))
+
+    def start_capture(self) -> None:
+        """Begin listening for output from the machine."""
+        # The super class implementation by default starts the `run` method in a new thread.
+        # You likely don't need to write this function when sub-classing `ThreadedStenotypeBase`
+        super().start_capture()
+
+    def stop_capture(self) -> None:
+        """Stop listening for output from the machine."""
+        # The super class implementation by default sets the `self.finished` `threading.Event` object
+        # then waits for the thread to finish. The `run` method must stop when the event is set.
+        # You likely don't need to write this function when sub-classing `ThreadedStenotypeBase`
+        super().stop_capture()
+
+    @classmethod
+    def get_option_info(cls) -> Dict[str, Tuple[Any, Callable[[Any], Any]]]:
+        """Get the default options for this machine."""
+        # Value format: [0]: default value, [1]: conversion function to convert your value into a single usable value.
+        # The opions can be configured through the UI if a dedicated `machine_option` plugin is available, of by
+        # manually editing the relevant section in `plover.cfg`.
+        return {
+            'option 1': ('default for option 1', str),
+            'option 2': ('default for option 2', str),
+        }
+...
+```
+
+There are 4 methods that can be called to inform Plover about the machine status: `_stopped`, `_initializing`, `_ready`, `_error`.
+
+The `_notify` method should be called whenever a stroke is received. It takes a set of key names in the current system (it's possible to convert from machine key names to system key names (actions) with `self.keymap.keys_to_actions` function) and then tells the steno engine the key input that just occurred.
+
+There are 3 ways to configure the keymap:
+
+* Add an entry for the machine in a system plugin's default bindings definition (`KEYMAPS` variable).
+* The user can manually set the keymap in the *Plover -> Configure -> Machine* tab, along with any other additional configuration if a `machine_option` plugin is available for the machine type
+* Define a class variable `KEYMAP_MACHINE_TYPE`, which means that the default configuration is the same as the default configuration of the specified machine. [Example](https://github.com/openstenoproject/plover/blob/f4e45364fc5f58745c459f878d13ec6442497f46/plover/machine/procat.py#L33)
+
+The example shown uses the `ThreadedStenotypeBase` class as it is the most common use case, but you can build machine plugins off of the `StenotypeBase`, `SerialStenotypeBase`, or other classes depending on your needs.
+
+
+### plover.macro
+
+Macro plugins are used for defining strokes that add translations to or modify translations in the translator based on existing state. Unlike commands, macro plugins have access to the entire translator object used by the engine to go from strokes to translations and are meant for manipulating the stenography translation process.
+
+**TODO: Probably improve the description of the use cases here, especially meta vs. macro.**
+
+Examples:
+
+* [plover_last_translation](https://github.com/nsmarkop/plover_last_translation)
+* [plover_agnostic_toggle](https://github.com/stenoshrink/plover_agnostic_toggle)
+
+#### API
+
+The following would be for a new macro called "example_macro".
+
+setup.cfg:
+
+```ini
+...
+[options.entry_points]
+plover.macro =
+    example_macro = plover_example_macro.macro:example
+...
+```
+
+plover_example_macro/macro.py:
+
+```python
+def example(translator: plover.translation.Translator, stroke: plover.translation.Stroke, argument: str) -> None:
+    ...
+```
+
+The string argument is optional, and if not provided by the stroke definition after a `:` will always be sent as `''`.
+
+Through the use of `translator.get_state().translations` you can access the previously translated entries. You can undo translations using `translator.untranslate_translation(...)` and you can apply new translations onto the translator using `translator.translate_translation(...)`.
+
+Dictionary format:
+
+```json
+{
+    "S-": "=example_macro:argument",
+    "T-": "=example_macro"
+}
+```
+
+### plover.meta
+
+Meta plugins are used for defining strokes that create custom formatting actions that get added to the translator. Unlike commands, meta plugins have access to the previously translated text via the formatter that maps translations to actions so they can be used for manipulating the stenography translation process.
+
+**TODO: Probably improve the description of the use cases here, especially meta vs. macro.**
+
+Examples:
+
+* [plover_merge_words](https://github.com/morinted/plover_merge_words)
+* [plover_retro_quotes](https://github.com/arxanas/plover_retro_quotes)
+* [plover_last_translation](https://github.com/nsmarkop/plover_last_translation)
+* [plover_retro_text_transform](https://github.com/nimble0/plover_retro_text_transform)
+
+#### API
+
+The following would be for a new meta called "example_meta".
+
+setup.cfg:
+
+```ini
+...
+[options.entry_points]
+plover.meta =
+    example_meta = plover_example_meta.meta:example
+...
+```
+
+plover_example_meta/meta.py:
+
+```python
+def example(context: plover.formatting._Context, argument: str) -> plover.formatting._Action:
+    ...
+```
+
+The string argument is optional, and if not provided by the stroke definition after a `:` will always be sent as `''`.
+
+You will want to use either `context.new_action()` or `context.copy_last_action()` as the basis for your output value. See the source code for the various properties around an action that can be set or modified. To access the previously translated text, you can call `context.last_*` methods.
+
+Dictionary format:
+
+```json
+{
+    "S-": "{:example_meta:argument}",
+    "T-": "{:example_meta}"
+}
+```
+
+### plover.system
+
+System plugins are used to define stenography key layouts. If you want to modify steno order, add new keys, remove keys, rename keys, change how orthography rules work, and more then you can define a new system to do so. Once installed, users can change their system in the Plover -> Configure -> System menu.
+
+Examples:
+
+* [plover_midi4text](https://github.com/nsmarkop/plover_midi4text)
+* [plover_palantype](https://github.com/morinted/plover_palantype)
+* [plover_michela](https://github.com/benoit-pierre/plover_michela)
+* [plover_korean](https://github.com/nsmarkop/plover_korean)
+
+#### API
+
+The following would be for a new system called "Example System".
+
+setup.cfg:
+
+```ini
+...
+[options]
+include_package_data = True
+...
+[options.entry_points]
+plover.system =
+    Example System = plover_example_system.system
+...
+```
+
+MANIFEST.in:
+
+```txt
+include plover_example_system/dictionaries/*
+```
+
+Without the MANIFEST file and `include_package_data` in your setup files, your dictionaries may not be properly copied into your build when you go to distribute the plugin.
+
+plover_example_system/system.py:
+
+```python
+...
+# The keys in your system, defined in steno order
+KEYS: Tuple[str, ...] = ('S-', 'T-' '*', '-D', '-Z')
+
+# Keys that serve as an implicit hyphen between the two sides of a stroke
+IMPLICIT_HYPHEN_KEYS: Tuple[str, ...] = ('T-', '*', '-D')
+
+# Singular keys that are defined with suffix strokes in the dictionary to allow for folding
+# them into a stroke without an explicit definition, like -G as {^ing} for English
+SUFFIX_KEYS: Tuple[str, ...] = ('-Z',)
+
+# The key in KEYS that serves as the "number key" like # in English
+NUMBER_KEY: Optional[str] = None
+
+# A mapping of keys in KEYS to "number" aliases. For example, 'S-': '1-' in English
+# means a stroke containing the NUMBER_KEY, '#', and 'S-' can be written as '1-'
+NUMBERS: Dict[str, str] = {}
+
+# The stroke to undo the last stroke. It can be multiple keys. As of Plover 4.0,
+# this is not strictly required and can just be '' since the undo macro has been
+# implemented which allows dictionary entries to be defined as the undo stroke:
+# https://github.com/openstenoproject/plover/wiki/Dictionary-Format#undo--delete-last-stroke
+UNDO_STROKE_STENO: str = '*'
+
+# A list of regex input -> regex output rules for orthography. For example, in English
+# +ly, artistic + ly = artistically is defined as: (r'^(.*[aeiou]c) \^ ly$', r'\1ally')
+ORTHOGRAPHY_RULES: List[Tuple[str, str]] = []
+
+# When a suffix is being added to a word, these aliases are added to the candidate list
+# of options for the resulting word. Can be used for similar / interchangable suffixes
+# to have an orthography rule found in the word list without being exactly the same.
+# For example, in English 'able' is mapped to 'ible'
+ORTHOGRAPHY_RULES_ALIASES: Dict[str, str] = {}
+
+# Name of a file containing words that can be used to resolve the orthography ambiguity
+# when applying suffixes. Suffixes for words will be looked up against the word list
+# along with their aliases to find a match before just applying a suffix directly.
+# The format of a line in the file is:
+# word number
+# Where number is an integer that sorts possible matches for priority: the lower the
+# number, the higher the priority.
+# Plover will look for this file in the following directories:
+# - the configuration directory (so a user can override the word list)
+# - the system's dictionaries root (`DICTIONARIES_ROOT`) 
+ORTHOGRAPHY_WORDLIST: Optional[str] = 'american_english_words.txt'
+
+# The default key mappings for machine plugins to your system's keys.
+# You can define mappings for 0 to many machines, and it is not required that
+# the user actually have a plugin installed for the corresponding machine
+KEYMAPS: Dict[str, Dict[str, Union[str, Tuple[str, ...]]]] = {
+    'Keyboard': {
+        'S-'        : ('a', 'q'),
+        'T-'        : 'w',
+        '*'         : ('t', 'g', 'y', 'h'),
+        '-D'        : '[',
+        '-Z'        : '\'',
+        'arpeggiate': 'space',
+
+        # Suppress adjacent keys to prevent miss-strokes
+        'no-op'     : ('z', 'x', 'b', ',', '.', '/', ']', '\\'),
+    },
+}
+
+# The path to your default dictionaries. Note it's not an actual folder path, but
+# is sort of a relative one similar to paths defined in setup files (but different)
+DICTIONARIES_ROOT: str = 'asset:plover_example_system:dictionaries'
+
+# The filenames of files in DICTIONARIES_ROOT that are the default dictionaries.
+# Note that they will appear to the user in the order / priority they appear here.
+# They do not have to be .json format, but if they are other formats you should
+# make sure your plugin has an install dependency on the other plugin providing
+# support for the dictionary format you are using
+
+# ONE OF THE MOST IMPORTANT THINGS! is that you prefix your default dictionaries
+# with something specific to your system. If you just call one 'main.json' Plover
+# will mess up and load the English system's 'main.json' dictionary for example
+
+# Another thing to note is that updating these dictionary files and pushing out
+# an update will not necessarily update a user's dictionary if they have made
+# copies or otherwise added dictionaries to the system themselves. There is
+# currently no good way to handle this sort of dictionary versioning in Plover
+DEFAULT_DICTIONARIES: Tuple[str, ...] = (
+    'plover_example_system_other_stuff.json',
+    'plover_example_system_main.json',
+)
+```
+
+Note that there are a lot of possible fields in a system plugin. You must set them all to something but you don't necessarily have to set them to something meaningful, as shown above, so they can be pretty straightforward.
+
+Since it is a Python file rather than purely declarative you can run code for logic as needed but Plover will try to directly access all of these fields which does not leave much room for that. However, it does mean that if for example you wanted to make a slight modification on the standard English system to add a key, you could import it and set your system's fields to its fields as desired with changes to KEYS only; or, you could make a base system class that you import and expand with slightly different values in the various fields for multiple system plugins like Michela does for Italian.
+
+## Development Workflow
+
+### Starting Development
+
+**TODO: Create a suite of [template repos](https://help.github.com/en/github/creating-cloning-and-archiving-repositories/creating-a-template-repository) that can be cloned by people to start their own to make this section really simple. Also point to https://github.com/openstenoproject/plover's README about setting up a dev environment first (and maybe update that to encourage the use of venv instead of system-wide setup)**
+
+**TODO 
+Flesh out the issues that arose on [Discord](https://discord.com/channels/136953735426473984/144999734254370816/712446672944234507). The big takeaway was that if running from source, you will need the plugin manager installed via `pip install -r requirements_plugins.txt`
+
+### Testing
+
+While developing your plugin you will need to test the functionality works as expected and the way you can test it depends on how you are running Plover. For any methods discussed, you will at minimum need to restart Plover after you make any code changes to your plugin for them to take effect.
+
+If you are running a packaged version of Plover like what is installed from the Windows installer or the AppImage, you can run the following command on the Plover executable file to install a plugin into Plover's Python environment:
+
+```bash
+plover -s plover_plugins install -e /path/to/plugin/directory
+```
+
+On Windows you will need to use `plover_console.exe` instead of `plover.exe`. Note that what is exposed through that interface is essentially the `pip` command, so the `-e` in the example is the "editable" flag for `pip` which lets you just restart Plover to see your changes rather than having to reinstall the plugin each time. That means you also have the freedom to install plugins from local file paths, from git, etc. as you would install any Python package with `pip`.
+
+If you are running Plover from source instead, Plover will be using whatever Python environment you execute Plover from. You can still use the above command if plover is in the PATH of the environment you're running from and you've already installed the [plugin manager](https://github.com/benoit-pierre/plover_plugins_manager) into your environment, otherwise you would just use `pip` commands like normal to install your plugin into the Python environment you're using:
+
+```bash
+pip install -e /path/to/plugin/directory
+```
+
+### Publishing
+
+Once you've finished testing your plugin works as expected, you're ready to publish it to be installed by other users that are not developers. This is done by uploading your package to [PyPI, the Python Package Index](https://pypi.org/) with some guidelines around it.
+
+Those guidelines up front:
+* Your plugin's name as defined in your setup files should start with `plover-` to avoid clashing with general Python package namespaces
+* Your plugin's setup files must define one of its keywords to be `plover_plugin` as this is how the plugin manager finds it on PyPI
+* Your plugin's setup files must define a long_description. The plugin manager can display plain text, .rst, or .md files specified here.
+* Your plugin should only use features that the distributed version of Plover supports in order to prevent errors for end users; that version can be verified by looking at Plover's setup files
+
+The first thing you need to do to actually publish is make an account on PyPI which should be relatively straightforward.
+
+There are a myriad of ways to actually build and publish a package but the easiest and most recommended way to publish to PyPI is by running [twine](https://twine.readthedocs.io/en/latest/) in your plugin directory like so:
+
+```bash
+python setup.py sdist bdist_wheel
+twine upload dist/*
+```
+
+See its documentation for more information on how to install it and set it up. You don't need to publish to Test PyPI as it suggests unless you want to as part of your workflow. One thing to note about twine is it will automatically convert your `plover_x_name` snake case name for your plugin into a `plover-x-name` hyphenated name for the package it uploads.
+
+If you make updates to your plugin and need to publish that, just make sure to bump the version in your setup files and otherwise the steps are exactly the same.
+
+### Adding the package to the Plover plugins registry
+
+Because PyPI's XMLRPC search endpoint is disabled, starting from version 0.5.16, the [Plugins manager for Plover](https://github.com/benoit-pierre/plover_plugins_manager/) fetches the list of Plover plugins from a [GitHub repository](https://github.com/openstenoproject/plover_plugins_registry). You should contact the maintainer to have your plugin added to the list.

+ 572 - 0
Steno Layouts & Supported Languages/README.md

@@ -0,0 +1,572 @@
+A chorded system, or _system_ for short, is a set of rules for Plover that determines the keys, language rules, and default dictionaries in Plover. **System Plugins** allow Plover to support different machine types and languages other than English.
+
+The [American Ward Stone Ireland Stenotype](https://en.wikipedia.org/wiki/Stenotype) is the default layout in Plover, and what we teach and recommend by default. However, there are many different chorded systems worldwide and some of them have been implemented in Plover.
+
+Note that not all of these systems have been fully implemented; many of them are probably not going to be implemented in Plover, but they have been listed so that you may use them as a reference should you choose to create your own layout/system.
+
+For systems proposed for implementation, check out the [issues list](https://github.com/openstenoproject/plover/issues?q=is%3Aopen+label%3Aplugin-candidate+label%3Asystems).
+
+|     |                                                      |
+| --- | ---------------------------------------------------- |
+| 🔴  | Not supported in Plover                              |
+| 🟠  | Work in progress, not actively updated or maintained |
+| 🟡  | Work in progress                                     |
+| 🟢  | Stable and available for Plover                      |
+
+## Languages
+
+- English:
+  - [Stenotype](#stenotype-ireland)
+  - [Palantype](#possum-palantype)
+  - [Michela](#michela)
+  - [Phenrsteno](#phenrsteno)
+  - [Velotype](#velotype)
+  - [Jackdaw](#jackdaw)
+  - [Kinglet](#kinglet)
+- Chinese, Mandarin (國語 / 普通话):
+  - [Yawei](#yawei)
+  - [EXun](#exun)
+  - [Suoheng](#suoheng)
+- Chinese, Cantonese (粵語):
+  - [SanSan](#sansan)
+  - [MaaJik](#maajik)
+- Czech / Čeština:
+  - [Stenotype](#czech-stenograph)
+  - [Trillo](#trillo)
+  - [Plover Czech](#plover-czech)
+- Danish / Dansk: [Stenotype](#stenotype-ireland)
+- Dutch / Nederlands:
+  - [Stenotype](#stenotype-ireland)
+  - [Velotype](#velotype)
+- Finnish / Suomi:
+  - [Stenotype](#stenotype-ireland)
+  - [Especias](#especias)
+- French / Français:
+  - [Stenotype](#stenotype-ireland)
+  - [Grandjean](#grandjean)
+- German / Deutsch:
+  - [Stenotype](#stenotype-ireland)
+  - [Palantype](#possum-palantype)
+  - [Syllatype](#german-syllatype)
+- Greek / Ελληνικά: [Stenotype](#stenotype-ireland)
+- Hebrew / עברית: [Stenotype](#stenotype-ireland)
+- Italian / Italiano:
+  - [Stenotype](#stenotype-ireland)
+  - [Michela](#michela)
+- Japanese / 日本語:
+  - [Stenotype](#stenotype-ireland)
+  - [Sokutaipu](#sokutaipu)
+  - [StenoWord](#stenoword)
+  - [Hachidori](#hachidori)
+  - [Frag](#frags-japanese-system)
+- Korean / 한국어:
+  - [CAS](#korean-cas)
+  - [Sorizava](#sorizava)
+- Polish / Polski: [Trillo](#trillo)
+- Portuguese / Português: [Stenotype](#stenotype-ireland)
+- Russian / Русский:
+  - [Stenotype](#stenotype-ireland)
+  - [Trillo](#trillo)
+- Slovak / Slovenčina: [Trillo](#trillo)
+- Spanish / Español:
+  - [Stenotype](#stenotype-ireland)
+  - [Grandjean](#grandjean)
+  - [Especias](#especias)
+- Swedish / Svenska: [Palantype](#possum-palantype)
+- Thai / ภาษาไทย: [Stenotype](#stenotype-ireland)
+- Turkish / Türkçe: [Stenotype](#stenotype-ireland)
+- Vietnamese / Tiếng Việt: [Stenotype](#stenotype-ireland)
+
+---
+
+## Stenotype (Ireland)
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/en-0.png?raw=true" width="500">
+
+The default system in Plover. Used internationally for English-language transcription, invented in the United States in 1913.
+
+|                       | Author                                           | Language   | Type         | Plugin                                                                                          | Dictionary                                                                                     | Notes                                                                                                                                                                                                         |
+| --------------------- | ------------------------------------------------ | ---------- | ------------ | ----------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| 🟢 **Plover**         | Mirabai Knight                                   | English    | Phonetic     | Built-in                                                                                        | [147k entries](https://github.com/openstenoproject/plover/blob/master/plover/assets/main.json) | [Learning Resources](https://github.com/openstenoproject/plover/wiki/Learning-Stenography)                                                                                                                    |
+| 🟢 **Lapwing**        | [Aerick](https://github.com/aerickt)             | English    | Phonetic     | Built-in                                                                                        | [122k entries](https://github.com/aerickt/steno-dictionaries/blob/main/lapwing-base.json)      |
+| 🟡 **Cocoa**          | [Kaoffie](https://github.com/Kaoffie)            | English    | Phonetic     | Built-in                                                                                        |
+| 🟢 **LaSalle**        | Claire Lefebvre-Yelle                            | French     | Phonetic     | Built-in                                                                                        | [4.2k entries](https://github.com/morinted/la_tao_dictionary)                                  | Non-realtime-capable theory, taught at the _École de sténographie judiciaire du Québec_                                                                                                                       |
+| 🟡 **Pluvier**        | [Vermoot](https://github.com/Vermoot)            | French     | Phonetic     |                                                                                                 |                                                                                                | Realtime-capable theory based on LaSalle                                                                                                                                                                      |
+| 🟢 **Stanley's**      | [Stanley Sakai](https://github.com/stanographer) | Spanish    | Phonetic     | Built-in                                                                                        | [12k entries](https://github.com/stanographer/steno-dictionaries/blob/master/stanespanol.json) |
+| 🟢 **EO Variant**     | [Eliseo Ocampos](https://github.com/roskoff)     | Spanish    | Phonetic     | [plover-spanish-system-eo-variant](https://github.com/roskoff/plover_spanish_system_eo_variant) | 71k entries                                                                                    | Developed for the default Plover layout, proposes a syllabic system trading-off a little of abbreviations for consistent rules.                                                                               |
+| 🔴 **Marino**         |                                                  | Spanish    | Phonetic     |                                                                                                 |                                                                                                | Spanish theory used in the Argentine Senate, along with Spanish Grandjean.<br>[Overview](https://taquigrafica.ucoz.net/publ/edicion_numero_01/2-1-0-14)<br>[Facebook Page](https://www.facebook.com/stenocap) |
+| 🟢 **Trillo Finnish** | Priscilla Trillo                                 | Finnish    | Phonetic     |                                                                                                 | [49k entries](https://github.com/Plover-Trillo/pikakirjoitus/blob/master/Suomeksi.rtf)         | [Textbook](https://github.com/Plover-Trillo/pikakirjoitus/blob/master/PIKAKIRJOITUS%20SUOMEKSI.pdf) (in Finnish)                                                                                              |
+| 🟢 **plover-vi**      | user202729                                       | Vietnamese | Orthographic | [`plover-vi`](https://github.com/user202729/plover_vi)                                          |
+
+### Shavian
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/en-shav.png?raw=true" width="500">
+
+Shavian is an alternate alphabet for English; the Shavian Stenotype is a steno system designed to be used on a regular English Stenotype keyboard.
+
+|               | Author      | Language          | Type         | Plugin | Dictionary | Notes                                                           |
+| ------------- | ----------- | ----------------- | ------------ | ------ | ---------- | --------------------------------------------------------------- |
+| 🟠 **Magpie** | Lynn (Ruma) | English (Shavian) | Orthographic |        |            | Capable of both Shavian and orthodox (Latin script) translation |
+
+### Brazilian Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/pt-braz.png?raw=true" width="500">
+
+Brazilian Portuguese system used by [Paulo Paniago](http://openstenoblog.blogspot.ca/2015/04/my-experience-in-open-source.html), published in the textbook _Transcrição em Tempo Real: Teoria da Estenotipia compatível com o computador_. Also included in some Stenograph machines.
+
+|                             | Author                                                | Language   | Type     | Plugin                                                               | Dictionary                                      | Notes |
+| --------------------------- | ----------------------------------------------------- | ---------- | -------- | -------------------------------------------------------------------- | ----------------------------------------------- | ----- |
+| 🟢 **Brazilian Stenograph** | Randall Adam Czerenda, Jucineia J. de Andrade Pereira | Portuguese | Phonetic | [`plover-portuguese`](https://github.com/morinted/plover_portuguese) | 4k entries<br>(available on the Plover Discord) |
+
+### Czech Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/cs-sten.png?raw=true" width="500">
+
+The Czech layout that comes built-in on some Stenograph machines, including the latest Luminex II.
+
+|                         | Author | Language | Type     | Plugin | Dictionary | Notes |
+| ----------------------- | ------ | -------- | -------- | ------ | ---------- | ----- |
+| 🔴 **Czech Stenograph** |        | Czech    | Phonetic |
+
+### Greek Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/el-sten.png?raw=true" width="500">
+
+The Greek layout that built into some Stenograph/Stentura machines. Not much is known about this layout.
+
+|                         | Author | Language | Type     | Plugin | Dictionary | Notes |
+| ----------------------- | ------ | -------- | -------- | ------ | ---------- | ----- |
+| 🔴 **Greek Stenograph** |        | Greek    | Phonetic |
+
+### Hebrew Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/he-sten.png?raw=true" width="500">
+
+The Hebrew layout that built into some Stenograph/Stentura machines. Not much is known about this layout.
+
+|                          | Author | Language | Type     | Plugin | Dictionary | Notes |
+| ------------------------ | ------ | -------- | -------- | ------ | ---------- | ----- |
+| 🔴 **Hebrew Stenograph** |        | Hebrew   | Phonetic |
+
+### Turkish Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/tr-sten.png?raw=true" width="500">
+
+The Turkish layout that comes built-in on some Stenograph machines, including the latest Luminex II.
+
+|                           | Author | Language | Type     | Plugin | Dictionary | Notes |
+| ------------------------- | ------ | -------- | -------- | ------ | ---------- | ----- |
+| 🔴 **Turkish Stenograph** |        | Turkish  | Phonetic |
+
+### Russian Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/ru-sten.png?raw=true" width="500">
+
+The Russian layout that built into some Stenograph/Stentura machines. Not much is known about this layout.
+
+|                           | Author | Language | Type     | Plugin | Dictionary | Notes |
+| ------------------------- | ------ | -------- | -------- | ------ | ---------- | ----- |
+| 🔴 **Russian Stenograph** |        | Russian  | Phonetic |
+
+### Spanish Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/es-sten.png?raw=true" width="500">
+
+The Spanish layout that comes built-in on some Stenograph machines, including the latest Luminex II.
+
+|                           | Author | Language | Type     | Plugin | Dictionary | Notes |
+| ------------------------- | ------ | -------- | -------- | ------ | ---------- | ----- |
+| 🔴 **Spanish Stenograph** |        | Spanish  | Phonetic |
+
+### German Stenograph
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/de-plov.png?raw=true" width="500">
+
+German stenography system for Plover based on the not realtime capable theory of the book "Deutsches System der computerkompatiblen Stenografie". This book can be found in the university library of Dresden and can be read via interlibrary loan. This is also the system that is built into some Stenograph machines.
+
+|                          | Author | Language | Type     | Plugin                                                       | Dictionary | Notes |
+| ------------------------ | ------ | -------- | -------- | ------------------------------------------------------------ | ---------- | ----- |
+| 🔴 **German Stenograph** |        | German   | Phonetic | [`plover-german`](https://github.com/percidae/plover_german) |
+
+### Regenpfeifer
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/de-rege.png?raw=true" width="500">
+
+A German steno system based on a modified English stenotype layout; the `-Z` key is replaced with `-N`.
+
+|                     | Author                                    | Language | Type     | Plugin                                                                | Dictionary   | Notes                                                         |
+| ------------------- | ----------------------------------------- | -------- | -------- | --------------------------------------------------------------------- | ------------ | ------------------------------------------------------------- |
+| 🟠 **Regenpfeifer** | [Martin Körner](https://github.com/mkrnr) | German   | Phonetic | [`plover-regenpfeifer`](https://github.com/mkrnr/plover_regenpfeifer) | 219k entries | [Dictionary generator](https://github.com/mkrnr/regenpfeifer) |
+
+### German Syllatype
+
+A syllabic and orthographic system with the mission to be more intuitive and easy to learn.
+
+|            | Author         | Language | Type     | Plugin          | Dictionary   | Notes                                                         |
+| ---------- | -------------- | -------- | -------- | --------------- | ------------ | ------------------------------------------------------------- |
+| 🟢 **Syllatype** | [YAMERO](https://github.com/YAMEROOOO) | German   | Orthographic | [`plover-german-syllatype`](https://github.com/YAMEROOOO/plover-german-syllatype) | 5k+ entries (syllables) |  |
+
+
+### 42triangles' Kana System
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/jp-42tr.png?raw=true" width="500">
+
+Simple kana input system designed to work alongside the English layout to input Japanese without switching steno systems.
+
+|                                 | Author      | Language | Type                                      | Plugin | Dictionary | Notes                |
+| ------------------------------- | ----------- | -------- | ----------------------------------------- | ------ | ---------- | -------------------- |
+| 🟢 **42triangles' Kana System** | 42triangles | Japanese | Orthographic (Mora + Coda)<br>Romaji-only |        |            | Relies on a user IME |
+
+### Willem's Kana System
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/jp-will.png?raw=true" width="500">
+
+A way to write Japanese kana in steno. This is not focused on speed; instead it is meant to be easy to learn for English steno users while still being reasonably efficient. It uses the standard English layout.
+
+|                             | Author                                        | Language | Type                                      | Plugin                                                                       | Dictionary | Notes                |
+| --------------------------- | --------------------------------------------- | -------- | ----------------------------------------- | ---------------------------------------------------------------------------- | ---------- | -------------------- |
+| 🟢 **Willem's Kana System** | [Willem Sonke](https://github.com/Willem3141) | Japanese | Orthographic (Mora + Coda)<br>Romaji-only | [`plover-japanese-kana`](https://github.com/Willem3141/plover_japanese_kana) |            | Relies on a user IME |
+
+### Danish Hjejle
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/da-hjej.png?raw=true" width="500">
+
+A Danish steno dictionary based on the standard English layout with slight modifications. While the layout is different from the standard English one, this system does not come with a separate system plugin and uses the default English one, so the tape output might not reflect the actual phonetic value of each stroke.
+
+|               | Author                                               | Language | Type     | Plugin   | Dictionary                                               | Notes |
+| ------------- | ---------------------------------------------------- | -------- | -------- | -------- | -------------------------------------------------------- | ----- |
+| 🟢 **Hjejle** | [Lars Rune Præstmark](https://github.com/SeaLiteral) | Danish   | Phonetic | Built-in | [5k entries](https://github.com/SeaLiteral/hjejleOrdbog) |
+
+### Melani
+
+#### Italian
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/it-mela.png?raw=true" width="500">
+
+|               | Author | Language | Type         | Plugin                                                            | Dictionary | Notes                               |
+| ------------- | ------ | -------- | ------------ | ----------------------------------------------------------------- | ---------- | ----------------------------------- |
+| 🟢 **Melani** |        | Italian  | Orthographic | [`plover-melani`](https://github.com/benoit-pierre/plover_melani) |            | [Stenolab](https://www.stenolab.it) |
+
+#### Spanish
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/es-mela.png?raw=true" width="500">
+
+Spanish system based on the Melani Italian layout, used at MQD.
+
+|                   | Author                                            | Language | Type     | Plugin                                                               | Dictionary                                                                               | Notes |
+| ----------------- | ------------------------------------------------- | -------- | -------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----- |
+| 🟢 **MQD Melani** | [Noelia Ruiz Martínez](https://github.com/nvdaes) | Spanish  | Phonetic | [`plover-spanish-mqd`](https://github.com/nvdaes/plover_spanish_mqd) | [11k entries](https://github.com/nvdaes/plover_spanish_mqd/tree/main/plover_spanish_mqd) |
+
+#### Russian
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/ru-mela.png?raw=true" width="500">
+
+Not much is known about this layout; see [this](https://github.com/openstenoproject/plover/issues/492) discussion about Russian steno.
+
+|               | Author | Language | Type     | Plugin | Dictionary | Notes |
+| ------------- | ------ | -------- | -------- | ------ | ---------- | ----- |
+| 🔴 **Melani** |        | Russian  | Phonetic |
+
+### Thai Steno
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/th-parn.png?raw=true" width="500">
+
+A work-in-progress Thai steno system.
+
+|                   | Author       | Language | Type     | Plugin                                                             | Dictionary | Notes |
+| ----------------- | ------------ | -------- | -------- | ------------------------------------------------------------------ | ---------- | ----- |
+| 🟡 **Thai Steno** | Parnikkapore | Thai     | Phonetic | [`plover-thsteno`](https://github.com/parnikkapore/plover_thsteno) |
+
+### Aerick's Vietnamese System
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/vi-aeri.png?raw=true" width="500">
+
+Orthographic Vietnamese system designed to input one syllable per stroke.
+
+|                                   | Author                               | Language   | Type         | Plugin                                                  | Dictionary | Notes |
+| --------------------------------- | ------------------------------------ | ---------- | ------------ | ------------------------------------------------------- | ---------- | ----- |
+| 🟢 **Aerick's Vietnamese System** | [Aerick](https://github.com/aerickt) | Vietnamese | Orthographic | [`plover-viet`](https://github.com/aerickt/plover_viet) |
+
+### Jade's Dutch System
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/nl-jade.png?raw=true" width="500">
+
+Dutch steno system that uses a modified version of the English stenotype layout with one extra `G` key on the left.
+
+|                            | Author                                   | Language | Type     | Plugin                                                    | Dictionary   | Notes |
+| -------------------------- | ---------------------------------------- | -------- | -------- | --------------------------------------------------------- | ------------ | ----- |
+| 🟢 **Jade's Dutch System** | [Jade Geels](https://github.com/Jade-GG) | Dutch    | Phonetic | [`plover-dutch`](https://github.com/Jade-GG/Plover_Dutch) | 3.4k entries |
+
+### Willem's Dutch System
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/nl-will.png?raw=true" width="500">
+
+Dutch steno system that uses a modified English stenotype layout. It was made to be as similar as possible to the default English system to minimize confusion between the two; nevertheless, quite a few differences are unavoidable to make the system practical.
+
+|                              | Author                                        | Language | Type     | Plugin                                                       | Dictionary   | Notes |
+| ---------------------------- | --------------------------------------------- | -------- | -------- | ------------------------------------------------------------ | ------------ | ----- |
+| 🟢 **Willem's Dutch System** | [Willem Sonke](https://github.com/Willem3141) | Dutch    | Phonetic | [`plover-dutch`](https://github.com/Willem3141/plover_dutch) | 7.7k entries |
+
+## Grandjean
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/fr-gran.png?raw=true" width="500">
+
+The Grandjean Stenotype was created in 1909; it is also known as the "Continental" layout by some manufacturers and is the preferred phonetic system in France (The orthographic Velotype system is more commonly used for transcribing many TV programs and broadcasts).
+
+|                  | Author | Language | Type     | Plugin                                                             | Dictionary                                                         | Notes                                                                         |
+| ---------------- | ------ | -------- | -------- | ------------------------------------------------------------------ | ------------------------------------------------------------------ | ----------------------------------------------------------------------------- |
+| 🟢 **Grandjean** |        | French   | Phonetic | [`plover-grandjean`](https://github.com/stenomax/plover_grandjean) | [690k+ entries](https://github.com/azizyemloul/plover-france-dict) | [GitHub](https://github.com/azizyemloul/plover-france-dict)                   |
+| 🔴 **Grandjean** |        | Spanish  | Phonetic |                                                                    |                                                                    | [Asociacion Española de Estenotipistas](http://www.estenotipiaasociacion.com) |
+
+## Michela
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/it-mich.png?raw=true" width="500">
+
+A piano-like keyboard layout, widely used in Italy. The English adaptation is drawn from the "Method for the English language" included in the machine's 1878 American patent.
+
+|                  | Author   | Language | Type         | Plugin                                                              | Dictionary                                                                                                                                                                    | Notes                                                                                                                                      |
+| ---------------- | -------- | -------- | ------------ | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
+| 🟢 **Michela**   | Sillabix | Italian  | Phonetic     | [`plover-michela`](https://github.com/benoit-pierre/plover_michela) | [103k entries](https://github.com/Sillabix/Sistema_Michela-Michela_system/tree/main/Teoria%20Michela%20per%20l'italiano)                                                      | [Manual](https://github.com/Sillabix/Sistema_Michela-Michela_system/tree/main/Teoria%20Michela%20per%20l'italiano)                         |
+| 🟡 **Michela**   | Sillabix | English  | Phonetic     | [`plover-michela`](https://github.com/benoit-pierre/plover_michela) | [150 entries](<https://github.com/Sillabix/Sistema_Michela-Michela_system/blob/main/Michela%20theory%20for%20English%20(under%20construction)/Michela-English%20sample.json>) | [Manual](<https://github.com/Sillabix/Sistema_Michela-Michela_system/tree/main/Michela%20theory%20for%20English%20(under%20construction)>) |
+| 🟡 **Midi4Text** | Sillabix | Italian  | Orthographic | [`plover-midi4text`](https://github.com/nsmarkop/plover_midi4text)  | [95k entries](<https://github.com/Sillabix/Midi4Text/blob/master/Midi4Text%20(ITA)/Midi4Text%20(ITA)%20main%20(ver.1.0).json>)                                                | [Manual](<https://github.com/Sillabix/Midi4Text/tree/master/Midi4Text%20(ITA)>)                                                            |
+| 🟡 **Midi4Text** | Sillabix | English  | Orthographic | [`plover-midi4text`](https://github.com/nsmarkop/plover_midi4text)  | [159k entries](<https://github.com/Sillabix/Midi4Text/blob/master/Midi4Text%20(ENG)/Midi4Text%20main%20(eng)%20(1.3.7).json>)                                                 | [Manual](<https://github.com/Sillabix/Midi4Text/tree/master/Midi4Text%20(ENG)>)                                                            |
+
+## Possum Palantype
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/en-pala.png?raw=true" width="500">
+
+The [Possum Palantype](http://www.openstenoproject.org/palantype) is a system invented in the UK which was optimized to have readable shorthand notes (the untranslated output). It has more keys than the Ireland layout. It is still used by some [STTRs](https://en.wikipedia.org/wiki/Speech-to-text_reporter) worldwide for writing in English.
+
+|                          | Author | Language | Type     | Plugin                                                                                | Dictionary  | Notes                                                                                                  |
+| ------------------------ | ------ | -------- | -------- | ------------------------------------------------------------------------------------- | ----------- | ------------------------------------------------------------------------------------------------------ |
+| 🟢 **Palantype**         |        | English  | Phonetic | [`plover-palantype`](https://github.com/morinted/plover_palantype)                    | 21k entries | [Learn Palantype](http://www.openstenoproject.org/palantype/)                                          |
+| 🔴 **Swedish Palantype** |        | Swedish  | Phonetic | [`plover-swedish-palantype`](https://github.com/stenoshrink/plover_swedish_palantype) | 87k entries | [Swedish Theory](https://github.com/stenoshrink/plover_swedish_palantype/tree/master/Swedish%20theory) |
+
+### Plover German Palantype
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/de-pala.png?raw=true" width="500">
+
+German steno system based on the Possum Palantype layout with two additional keys.
+
+|                         | Author | Language | Type     | Plugin                                                                           | Dictionary  | Notes |
+| ----------------------- | ------ | -------- | -------- | -------------------------------------------------------------------------------- | ----------- | ----- |
+| 🟢 **German Palantype** |        | German   | Phonetic | [`plover-palantype-german`](https://github.com/percidae/plover_palantype_german) | 85k entries |
+
+### Ruben Moor's German Palantype
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/de-gpal.png?raw=true" width="500">
+
+|                         | Author     | Language | Type     | Plugin | Dictionary                                      | Notes                             |
+| ----------------------- | ---------- | -------- | -------- | ------ | ----------------------------------------------- | --------------------------------- |
+| 🟡 **German Palantype** | Ruben Moor | German   | Phonetic |        | 100k entries, with plans to expand to 2 million | [Tutorial](https://palantype.com) |
+
+## Trillo
+
+### Trillo Russian
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/ru-tril.png?raw=true" width="500">
+
+A realtime theory for Russian writing based on the Tréal machine.
+
+|                       | Author           | Language | Type     | Plugin                                                                       | Dictionary  | Notes                                                                                                                        |
+| --------------------- | ---------------- | -------- | -------- | ---------------------------------------------------------------------------- | ----------- | ---------------------------------------------------------------------------------------------------------------------------- |
+| 🟢 **Trillo Russian** | Priscilla Trillo | Russian  | Phonetic | [`plover-russian-trillo`](https://github.com/morinted/plover_russian_trillo) | 15k entries | [Textbook](https://github.com/openstenoproject/plover/files/1533593/Russian.Theory.-.ARA.doc.zip) (in mixed English/Russian) |
+
+### Trillo West Slavic
+
+<img src="https://user-images.githubusercontent.com/7952620/191169996-5b53de4e-7cd0-4382-8a7c-e3a3e4a6283b.png" width="500">
+
+|                           | Author           | Language              | Type     | Plugin | Dictionary | Notes                                                                                              |
+| ------------------------- | ---------------- | --------------------- | -------- | ------ | ---------- | -------------------------------------------------------------------------------------------------- |
+| 🟢 **Trillo West Slavic** | Priscilla Trillo | Czech, Slovak, Polish | Phonetic |        |            | [Textbook](https://github.com/Plover-Trillo/WestSlavicStenography/releases/tag/%23SlavicLanguages) |
+
+## Yawei
+
+### Yawei
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/zh-yawe.png?raw=true" width="500">
+
+Yawei is the most commonly used Chinese stenotype system - it is widely used in Mainland China and Taiwan and uses Pinyin without tones as its main way of inputing characters; learners are required to memorize the positions of homophones based on their position in a frequency-based selection menu for fast character entry.
+
+|                     | Author | Language                            | Type                      | Plugin | Dictionary | Notes                                                                           |
+| ------------------- | ------ | ----------------------------------- | ------------------------- | ------ | ---------- | ------------------------------------------------------------------------------- |
+| 🟡 **Yawei** (亚伟) |        | Mandarin (Traditional / Simplified) | Symmetric Toneless Pinyin |        |            | [Wikipedia](https://zh.wikipedia.org/wiki/%E4%BA%9A%E4%BC%9F%E9%80%9F%E5%BD%95) |
+
+### MaaJik
+
+<img src="https://user-images.githubusercontent.com/7952620/191170046-445a18a1-669b-4d58-b26c-cbc04cc648f5.png" width="500">
+
+|                      | Author                                                                                | Language                | Type                        | Plugin                                                      | Dictionary                                                                             | Notes |
+| -------------------- | ------------------------------------------------------------------------------------- | ----------------------- | --------------------------- | ----------------------------------------------------------- | -------------------------------------------------------------------------------------- | ----- |
+| 🟡 **MaaJik** (孖翼) | [Sammi de Guzman](https://github.com/sammdot), [Samuel Lo](https://github.com/vatnid) | Cantonese (Traditional) | Symmetric Toneless Jyutping | [`plover-maajik`](https://github.com/sammdot/plover-maajik) | [314k entries](https://github.com/sammdot/plover-maajik/tree/main/maajik/dictionaries) |
+
+
+### SanSan
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/yue-sans.png?raw=true" width="500">
+
+|                      | Author                                        | Language                | Type                        | Plugin | Dictionary | Notes                                                   |
+| -------------------- | --------------------------------------------- | ----------------------- | --------------------------- | ------ | ---------- | ------------------------------------------------------- |
+| 🟠 **SanSan** (珊々) | [Sammi de Guzman](https://github.com/sammdot) | Cantonese (Traditional) | Symmetric Toneless Jyutping |        |            | [Steno Explainers](https://steno.sammdot.ca/explainers) |
+
+### TCIM
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/zh-tcim.png?raw=true" width="500">
+
+|                        | Author | Language               | Type                      | Plugin                                                   | Dictionary | Notes |
+| ---------------------- | ------ | ---------------------- | ------------------------- | -------------------------------------------------------- | ---------- | ----- |
+| 🟡 **TCIM** (千鳥詞註) |        | Mandarin (Traditional) | Symmetric Toneless Zhuyin | [`plover-tcim`](https://github.com/Quisette/plover-TCIM) |
+
+## EXun
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/zh-exun.png?raw=true" width="500">
+
+EXun is a Mandarin steno system used in Mainland China. Not much is known about it other than the fact that it is based on pinyin and uses a structure system for individual character input.
+
+|                    | Author | Language              | Type                      | Plugin | Dictionary | Notes |
+| ------------------ | ------ | --------------------- | ------------------------- | ------ | ---------- | ----- |
+| 🔴 **EXun** (E 讯) |        | Mandarin (Simplified) | Symmetric Toneless Pinyin |
+
+## Suoheng
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/zh-suoh.png?raw=true" width="500">
+
+Very little is known about the Suoheng system and there are no plans to implement it in Plover.
+
+|                       | Author | Language              | Type                      | Plugin | Dictionary | Notes |
+| --------------------- | ------ | --------------------- | ------------------------- | ------ | ---------- | ----- |
+| 🔴 **Suoheng** (索恒) |        | Mandarin (Simplified) | Symmetric Toneless Pinyin |
+
+## Korean CAS
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/kr-cas.png?raw=true" width="500">
+
+The Computer Aided Steno-machine, or CAS, was developed by [Korea Steno](http://www.koreasteno.com/) and features one of the two modern stenography systems for Korean in use today.
+
+|            | Author | Language | Type                                            | Plugin                                                                           | Dictionary | Notes                                                                                                  |
+| ---------- | ------ | -------- | ----------------------------------------------- | -------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------ |
+| 🟡 **CAS** |        | Korean   | Orthographic (Initial/Medial/Final) with Briefs | [`plover-korean`](https://github.com/nsmarkop/plover_korean) ("Korean Modern C") |            | [Theory documentation](https://github.com/nsmarkop/plover_korean/tree/master/plover_korean/system/cas) |
+
+## Korean Sorizava
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/kr-sori.png?raw=true" width="500">
+
+Sorizava, developed by [a company of the same name](http://www.sorizava.co.kr/), is the second of the modern stenography systems for Korean in use today and the more recent to have been created.
+
+The Sorizava system is not currently under development. There are partial pieces of an implementation in [plover-korean](https://github.com/nsmarkop/plover_korean) but outside of a partial dictionary no theory materials have been obtained to progress further.
+
+|                 | Author | Language | Type                                            | Plugin                                                                           | Dictionary | Notes |
+| --------------- | ------ | -------- | ----------------------------------------------- | -------------------------------------------------------------------------------- | ---------- | ----- |
+| 🔴 **Sorizava** |        | Korean   | Orthographic (Initial/Medial/Final) with Briefs | [`plover-korean`](https://github.com/nsmarkop/plover_korean) ("Korean Modern S") |
+
+## Sokutaipu
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/jp-soku.png?raw=true" width="500">
+
+Also known as the Stentura (ステンチュラ) layout. The two sides are symmetric and are each in charge of a syllable, while the thumb is in charge of connecting the two sides; there are also one-side briefs that can be mirrored on the other side or merged.
+
+|                               | Author | Language | Type                                        | Plugin                                                                                | Dictionary   | Notes                                                     |
+| ----------------------------- | ------ | -------- | ------------------------------------------- | ------------------------------------------------------------------------------------- | ------------ | --------------------------------------------------------- |
+| 🟢 **Sokutaipu** (ソクタイプ) |        | Japanese | Semi-Symmetric 2 Mora + 1 Coda<br>Pure Kana | [`plover-japanese-sokutaipu`](https://github.com/na4zagin3/plover_japanese_sokutaipu) | 365k entries | [Kana table](http://hoangmoc123.d.dooo.jp/sokutaipu.html) |
+
+## StenoWord
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/jp-sten.png?raw=true" width="500">
+
+The preferred Japanese steno system for NHK live captions; the left hand is for consonants and the right hand is for vowels.
+
+|                                 | Author | Language | Type                                 | Plugin                                                                              | Dictionary   | Notes                                                     |
+| ------------------------------- | ------ | -------- | ------------------------------------ | ----------------------------------------------------------------------------------- | ------------ | --------------------------------------------------------- |
+| 🟢 **StenoWord** (ステノワード) |        | Japanese | Orthographic 1-Syllable<br>Pure Kana | [`plover-japanese-stenoword`](https://github.com/na2hiro/plover-japanese-stenoword) | 2.6k entries | [Kana table](http://hoangmoc123.d.dooo.jp/Stenoword.html) |
+
+## Frag's Japanese System
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/jp-frag.png?raw=true" width="500">
+
+|                               | Author | Language | Type                                                         | Plugin | Dictionary | Notes |
+| ----------------------------- | ------ | -------- | ------------------------------------------------------------ | ------ | ---------- | ----- |
+| 🟡 **Frag's Japanese System** | Frag   | Japanese | Symmetric 2 Mora + 2 Coda<br>Stucture-based kanji conversion |
+
+A Japanese steno system created for the Georgi machine; the layout is symmetrical to allow the user to type one kanji on'yomi on each side. This system also addresses the problem of inaccurate kanji conversions in existing systems by introducing a way for users to directly input kanji using a structure-based system where most common kanji can be entered in just one stroke.
+
+This is the updated version of the Japanese layout available on TypeyType.
+
+## Hachidori
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/jp-hach.png?raw=true" width="500">
+
+Japanese steno system created to fix all the downsides of Sokutaipu and introduce an intuitive Kanji input system. The system is symmetrical and each side is capable of inputting a full on'yomi; the layout is designed to keep as many keys from the English layout in the same position as possible whilst also maintaining compatibility with as many hobbyist keyboards as possible.
+
+|                             | Author                                | Language | Type                      | Plugin | Dictionary | Notes |
+| --------------------------- | ------------------------------------- | -------- | ------------------------- | ------ | ---------- | ----- |
+| 🟡 **Hachidori** (はちどり) | [Kaoffie](https://github.com/Kaoffie) | Japanese | Symmetric 2 Mora + 2 Coda |
+
+## Velotype
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/zz-velo.png?raw=true" width="500">
+
+The Velotype is an orthographic system designed to support many European languages. It has also been implemented as a separate app in [Qweyboard](https://github.com/kqr/qweyboard) by kqr.
+
+|                 | Author | Language       | Type         | Plugin                                                                                   | Dictionary | Notes                                                         |
+| --------------- | ------ | -------------- | ------------ | ---------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------- |
+| 🟢 **Velotype** |        | English, Dutch | Orthographic | [`plover-syllabic-chording`](https://github.com/AlexandraAlter/plover_syllabic_chording) |            | [Official website](https://www.velotype.com/en/homepage-eng/) |
+
+## Jackdaw
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/en-jack.png?raw=true" width="500">
+
+An orthographic system based entirely on spelling rather than phonetics, allowing the user to type any word as long as they know the spelling.
+
+|                | Author | Language | Type         | Plugin                                                                     | Dictionary | Notes                                                                               |
+| -------------- | ------ | -------- | ------------ | -------------------------------------------------------------------------- | ---------- | ----------------------------------------------------------------------------------- |
+| 🟢 **Jackdaw** |        | English  | Orthographic | [`plover-jackdaw-alt1`](https://github.com/user202729/plover-jackdaw-alt1) |            | [Learn Plover! Jackdaw tutorial](https://sites.google.com/site/learnplover/jackdaw) |
+
+## Kinglet
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/en-king.png?raw=true" width="500">
+
+Kinglet was an attempt to create a spelling-based steno system that would have a theoretical speed equal to Plover (about 1 word per stroke). It succeeds in doing this at the cost of a high degree of finger contortion and accuracy in each individual finger, making it difficult to use.
+
+|                | Author        | Language | Type         | Plugin                                                                                                                                      | Dictionary | Notes                                                                                                               |
+| -------------- | ------------- | -------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------- |
+| 🟢 **Kinglet** | Zachary Brown | English  | Orthographic | [Plover 2.5.8 modified for Kinglet](https://drive.google.com/file/d/0B9Je8TDYCh1xSVRjVmQ0RUF0ejA/edit?resourcekey=0-6XylRvd298I4w4OVUc-IDg) |            | [Learn Plover! Kinglet tutorial](https://sites.google.com/site/learnplover/kinglet-a-letter-based-stenotype-system) |
+
+## Phenrsteno
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/en-phen.png?raw=true" width="500">
+
+Phenrsteno is a machine shorthand theory implemented as a system for Plover. It's designed for non-rhotic accents—British English in particular—but really anyone might like to use it or adapt it to their own idiolect.
+
+|                   | Author                                            | Language | Type     | Plugin                                                              | Dictionary  | Notes                                                                |
+| ----------------- | ------------------------------------------------- | -------- | -------- | ------------------------------------------------------------------- | ----------- | -------------------------------------------------------------------- |
+| 🟢 **Phenrsteno** | [Gregory Chamberlain](https://github.com/chambln) | English  | Phonetic | [`plover-phenrsteno`](https://github.com/chambln/plover-phenrsteno) | 15k entries | [Phenrsteno wiki](https://github.com/chambln/plover-phenrsteno/wiki) |
+
+## Plover Czech
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/cs-plov.png?raw=true" width="500">
+
+|                     | Author                                           | Language | Type     | Plugin                                                      | Dictionary | Notes |
+| ------------------- | ------------------------------------------------ | -------- | -------- | ----------------------------------------------------------- | ---------- | ----- |
+| 🟠 **Plover Czech** | [Ashlynn Anderson](https://github.com/lambdadog) | Czech    | Phonetic | [`plover-czech`](https://github.com/lambdadog/plover_czech) |
+
+## Especias
+
+### Finnish Especias
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/fi-espe.png?raw=true" width="500">
+
+An orthographic system (spelling-based) for Finnish capable of writing Swedish loadwords. The layout allows writing two "vowels" and two "consonants" per stroke. The available consonants include a few consonant clusters, and the first vowel must be from a list of mostly short vowels and the second vowel is chosen from one of two lists to match the frontness of the first vowel.
+
+|                 | Author                                               | Language | Type         | Plugin   | Dictionary                                           | Notes |
+| --------------- | ---------------------------------------------------- | -------- | ------------ | -------- | ---------------------------------------------------- | ----- |
+| 🟢 **Especias** | [Lars Rune Præstmark](https://github.com/SeaLiteral) | Finnish  | Orthographic | Built-in | [Dictionary](https://github.com/SeaLiteral/especias) |
+
+### Spanish Especias
+
+<img src="https://github.com/Kaoffie/steno_diags/blob/master/converted/es-espe.png?raw=true" width="500">
+
+A layout that allows writing two "vowels" and two "consonants" per stroke. It uses the same layout as Finnish, except for one of the colon keys being replaced with an s to write plurals.
+
+|                 | Author                                               | Language | Type         | Plugin   | Dictionary                                           | Notes |
+| --------------- | ---------------------------------------------------- | -------- | ------------ | -------- | ---------------------------------------------------- | ----- |
+| 🟢 **Especias** | [Lars Rune Præstmark](https://github.com/SeaLiteral) | Spanish  | Orthographic | Built-in | [Dictionary](https://github.com/SeaLiteral/especias) |

+ 313 - 0
Supported Hardware/README.md

@@ -0,0 +1,313 @@
+This page lists the machine known to work with Plover.
+
+<!-- START doctoc generated TOC please keep comment here to allow auto update -->
+<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
+**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*
+
+- [Dedicated machines designed for use with Plover](#dedicated-machines-designed-for-use-with-plover)
+  - [Commercially Available Hobbyist Machines](#commercially-available-hobbyist-machines)
+  - [DIY Machines](#diy-machines)
+  - [Out-of-production Machines](#out-of-production-machines)
+- [Stenotype Machines](#stenotype-machines)
+  - [Supported protocols](#supported-protocols)
+  - [Known supported stenotypes](#known-supported-stenotypes)
+- [Keyboards](#keyboards)
+  - [What's NKRO?](#whats-nkro)
+  - [How do I know if my keyboard has NKRO](#how-do-i-know-if-my-keyboard-has-nkro)
+    - [Test #1: Double Shift](#test-1-double-shift)
+    - [Test #2: Keyboard Ghosting Test](#test-2-keyboard-ghosting-test)
+  - [What if my keyboard is not capable of NKRO?](#what-if-my-keyboard-is-not-capable-of-nkro)
+  - [Known supported keyboards](#known-supported-keyboards)
+    - [Which type of key switch should I choose?](#which-type-of-key-switch-should-i-choose)
+  - [Adapt a keyboard for steno use](#adapt-a-keyboard-for-steno-use)
+    - [Keytoppers](#keytoppers)
+    - [Keycaps](#keycaps)
+  - [NKRO keyboards with an ortholinear layout](#nkro-keyboards-with-an-ortholinear-layout)
+- [Laptops with NKRO](#laptops-with-nkro)
+  - [Laptops that don't actually work with Plover](#laptops-that-dont-actually-work-with-plover)
+
+<!-- END doctoc generated TOC please keep comment here to allow auto update -->
+
+# Dedicated machines designed for use with Plover
+
+Various steno enthusiasts are making and selling machines designed for use with Plover.
+
+## Commercially Available Hobbyist Machines
+
+Machines that are or will be available for purchase. As of right now, there are no hobbyist lever machines. Instead, most options opt for keyboard switches, such as Cherry-style (Gateron Clear@35g), Kailh Choc (gChoc at 20g), or Matias (Red at 40g).
+
+<!-- The following table is listed alphabetically by product name -->
+
+| Product Name                       | Manufacturer       | About                   | Price |
+| ---------------------------------- | ------------------ | ----------------------- | ----- |
+| [Steko](https://quanicboards.com/products/steko) | [Quanic Boards](https://quanicboards.com) | <img alt="Quanic Boards Steko" src="https://i.imgur.com/ab9Ln8p.jpeg" width="300px" align="right" /> A simple, small steno keyboard featuring a RP2040 chip, a USB-C interface, Durock Dolphin silent switches, and 3D Printed PLA keycaps.<br><br>**Stock status** (as of December 2022): In stock | $75 |
+| [Ecosteno](https://nolltronics.com/product/ecosteno/) | [Nolltronics](https://nolltronics.com/) | <img alt="Nolltronics Ecosteno" src="https://nolltronics.com/wp-content/uploads/2021/04/Noll-Steno-Front-Angle.jpg" width="300px" align="right" /> A machine whose mission is to be the best value option on the market. It has low-profile Kailh Choc switches with 20g actuation force. It features USB-C connectivity and an aluminum backplate.<br><br>**Stock status** (as of December 2022): Low stock | $95 |
+| [The Uni](https://www.stenokeyboards.com/products/the-uni-v4) | [StenoKeyboards](https://www.stenokeyboards.com) | <img alt="The Uni" src="https://docs.stenokeyboards.com/images/pics/uniAngle.jpg" width="300px" align="right" /> A split, unibody steno keyboard that comes pre-assembled with Gateron Clears (35g). Embedded steno compatible.<br><br>**Stock status** (as of December 2022): In stock | $100 |
+| [Polyglot](https://stenokeyboards.com/products/polyglot-keyboard) | [StenoKeyboards](https://www.stenokeyboards.com) | <img alt="StenoKeyboards Polyglot" src="https://user-images.githubusercontent.com/7952620/208587451-87f9b998-b5a9-429f-bb8c-a90e1eda099b.jpg" width="300px" align="right" />A steno keyboard made for both Steno and Qwerty. More switches enable normal typing in qwerty mode. You can also do things like shift+click in steno mode.<br><br>**Stock status** (as of December 2022): On preorder, estimated shipping March 2023. | $125 |
+| [SOFT/HRUF Splitography](https://softhruf.love) | Scott Urueta | <img alt="SOFT/HRUF Splitography" src="https://i.imgur.com/pvmzoQy.png" width="300px" align="right" /> Open source hardware. Its keycaps are injection molded and fit on Matias keyboard switches. The name is the steno representation for, and is pronounced as, "soft love". The SOFT/HRUF uses Matias Red switches (~40g actuation). With third-party springs and removing the switch's internal leaflet, it is possible to reduce the force required to actuate.<br><br>**Stock status** (as of December 2022): Out of stock. New batch of parts arriving in a few months. [(source)](https://softhruf.love/products/soft-hruf-erl) | $138 |
+| [TinyMod](https://stenomod.blogspot.com) | Charley Shattuck | <img alt="TinyMod" src="https://2.bp.blogspot.com/-EtmothiLtUo/XL4RrK7jw5I/AAAAAAAACTU/8TibacoLPuYBu6-nmPhaEQnVZsweVEp5gCLcBGAs/s400/20190422_120223.png" width="300px" align="right" /> Open source hardware. A smaller, nonsplit version of the Stenomod that omits the number bar in order to reduce costs and size. The center vowel key is used as a number bar replacement. See [Mirabai's review](http://plover.stenoknight.com/2019/12/tinymod-review.html).<br><br>**Stock status** (as of December 2022): In stock | $140 (stock)<br>$180 (silent) |
+| [Multisteno](https://nolltronics.com/product/multisteno/) | [Nolltronics](https://nolltronics.com/) | <img alt="Nolltronics Multisteno" src="https://nolltronics.com/wp-content/uploads/2022/05/DSC03181-Multi-Main-1200x1200.jpg" width="300px" align="right" /> The premium version of the Ecosteno, the Multisteno features 42 Kailh Choc (Pro Pink) switches with 20g actuation force, USB-C connectivity, an aluminium backplate and a camera mount.<br><br>**Stock status** (as of December 2022): In stock | $170 |
+
+## DIY Machines
+
+Projects to build your own machine.
+
+| Product Name                       | About                   |
+| ---------------------------------- | ----------------------- |
+| [MechWild BB Steno](https://mechwild.com/product/bb-steno/) | <img alt="BB Steno" src="https://user-images.githubusercontent.com/7952620/202928180-c25d7641-1a4a-41b9-ba16-ea93e0bdddb4.png" width="300px" align="right" /> A barebones keyboard kit from MechWild. Comes with a PCB ($10) and optional microcontroller (+$8) and a few other parts; you supply the switches and keycaps.
+| [Stenokey](https://github.com/mike-ady/Stenokey) | <img alt="Stenokey" src="https://raw.githubusercontent.com/mike-ady/Stenokey/master/Documentation/Stenokey.png" width="300px" align="right" /> Stenokey is an open-source do-it-yourself stenographic keyboard project. It is aimed at makers with some electronics experience (soldering) and who own a 3D printer or who have a friend with a 3D printer. |
+| [The Uni v2 PCB](https://stenokeyboards.com/products/uni-v2-pcb) | <img alt="The Uni v2 PCB" src="https://i.imgur.com/gtbh0MD.jpg" width="300px" align="right" /> The Uni v2 PCB, instructions in the description. Some prior experience is recommended. Only comes with a PCB and has pre-soldered diodes. |
+| [Yet Another Steno Keyboard](https://github.com/ttempe/YASK)| <img alt="YASK" src="https://github.com/ttempe/YASK/raw/main/YASK_small.jpg" width="300px" align="right"/> YAKS is an easy-to-build open-source design for a steno keyboard. Simple, beautiful, robust, no 3D printed parts needed. Check out the [build instructions](https://youtu.be/82yD0RMeEw8)|
+
+
+## Out-of-production Machines
+
+Models that are no longer made or available for sale.
+
+| Product Name                       | Manufacturer       | About                   | Years |
+| ---------------------------------- | ------------------ | ----------------------- | ----- |
+| Stenoboard | Utopen (Emanuele Caruso) | <img alt="Stenoboard" src="https://cdn.thingiverse.com/renders/a9/15/3f/8c/6a/stenoboard_1.1_preview_preview_featured.jpg" width="300px" align="right" /> The Stenoboard was the first open source steno machine on the market, released in 2014 for around $180USD. The Stenoboard's keys actuate like mouse-clicks instead of a keyboard or lever-machine, which made it very uncomfortable to use. | 2014-2017 |
+| [SOFT/HRUF](https://softhruf.love) | Scott Urueta | <img alt="Original SOFT/HRUF" src="https://groups.google.com/group/ploversteno/attach/1d0225cb7826d/Screen%20Shot%202016-10-14%20at%203.46.28%20PM.png?part=0.1&view=1" width="300px" align="right" /> The nonsplit version of SOFT/HRUF. | 2017-2018, superseded by the Splitography |
+| [Stenomod](https://stenomod.blogspot.com) | Charley Shattuck | <img alt="Stenomod" src="https://2.bp.blogspot.com/-n7j50BDdjAg/WJECk94jwCI/AAAAAAAAAI4/2E-G1dgflccCltPFN9FEPI4QtMW62ttCQCK4B/s400/20170131_131923.jpgre" width="300px" align="right" /> Open source hardware. This has light (35g actuation) keys and a split design. See [Ted Morin's review of the Stenomod](https://www.tedmor.in/blog/posts/stenomod-affordable-steno-machine) as well as [Martin Körner's review](https://stenoblog.com/the-stenomod/). The name is supposed to hint at how the machine is "modular" and adaptable. | 2017-2018, superseded by the TinyMod |
+| [Georgi](https://www.gboards.ca/product/georgi) | [g Heavy Industries](https://www.gboards.ca) | <img alt="Georgi" src="https://assets.bigcartel.com/product_images/235027235/imadd+ge0.jpg?auto=format&fit=max&w=600" width="300px" align="right" /> Portable, affordable, and light-touch option. Low-profile Kailh Choc switches with 12g-actuation springs swapped in makes this the lightest-touch and lowest-height machine made for Plover so far. The removal of a number bar reduces costs and weight for portability. A third thumb key is to be used as a number bar replacement like the TinyMod. See [Martin's Georgi Stand with Trackball review](https://stenoblog.com/georgi-stand-with-trackball/), [Mirabai's review](http://plover.stenoknight.com/2019/12/georgi-review.html), [Aerick's Georgi Mount](https://aerick.ca/steno/georgi-stand/), and [Josh's photos](https://gist.github.com/JoshuaGrams/f688ae7a14a995c78ed06d49402dea04). | 2019-2021 |
+
+
+# Stenotype Machines
+
+<img src="https://www.stenograph.com/product/image/large/45009_wave.jpg" width="300"/>
+
+## Supported protocols
+
+Plover supports several protocols that are in use by various machines:
+
+* **Stentura serial**: most machines by Stenograph and many others.
+* **Gemini PR serial**: typically any recent machine made by the Neutrino Group, such as the Piper, Revolution, or Infinity series.
+* **ProCAT**: protocol used by all ProCAT machines.
+* **TX Bolt**: an older protocol supported by some machines as a primary or secondary protocol.
+* **Treal**: used only by the Treal from Word Technologies.
+* **Passport**: used only by the Passport Writer from Advantage Software.
+
+This means that, in theory, many machines work with Plover.
+
+## Known supported stenotypes
+
+The following machines have been confirmed by users to work with Plover
+after actually trying it:
+
+| Product Name                       | Manufacturer       | Protocol/Connection | Comments                |
+| ---------------------------------- | ------------------ | ------------------- | ----------------------- |
+| Elan Cybra Student                 | Stenograph         | Stenograph USB OR TX Bolt (serial)    |                         |
+| Flash, Blaze, Impression, and Xpression | ProCAT        | ProCAT (serial, *maybe*)             | (For Blaze and other Windows CE-based writers) USB cannot be used with Plover, it is only to transfer files created on the Blaze to your PC or CAT software. USB does not work on Windows 10, only Windows XP (with ActiveSync), and Windows Vista/7/8 with WMDC.exe (Windows Mobile Device Center). Both are abandonware. You need an RJ11 (male) to DB9 (female) to use this writer. |
+| Flash Writer                       | ProCAT             | TX Bolt             | Press `Mode` (far right button), click `Setup`, then press the `Emul` button. Display should read `Emulate: Baron` |
+| Gemini2                            | Neutrino Group     | Gemini PR (serial)  |                         |
+| Gemini RT                          | Neutrino Group     | TX Bolt             | Must start a job on screen or in [Infinity2](https://www.infinitytraditional.com/infinity-2/) |
+| Lightspeed                         | Stenovations       | TX Bolt (serial over USB/Bluetooth) | Baud rate 9600 |
+| Lightspeed Touch                   | Stenovations       | Gemini PR, TX Bolt (USB only)  | Must use provided "Lightspeed Zenith" software, not the "Lightspeed" software from the Stenovations website. Protocol can be changed depending on the "Writer Mode" setting in options. Choose "Model II and Model III" at startup. |
+| Infinity Ergonomic                 | Neutrino Group     | Gemini PR (serial over USB/Bluetooth)  | Baud rate 115200 |
+| Infinity Genesis                   | Neutrino Group     | Gemini PR (serial)  |                         |
+| Passport                           | Advantage Software | Passport (USB)      |                         |
+| Passport Touch                     | Advantage Software | USB, Bluetooth | While in "Emulation Mode": Stentura over Bluetooth or TX Bolt over USB  |
+| Revolution Grand                   | Neutrino Group     | Gemini PR (serial)  |                         |
+| Stentura 400 SRT                   | Stenograph         | Stentura (serial)   | [Setup Instructions](https://github.com/openstenoproject/plover/wiki/How-to-setup-and-use-Plover-with-a-Stentura-400SRT)  |
+| Stentura 200 SRT                   | Stenograph         | Stentura (serial)   | (same instructions as the 400 SRT)  |
+| Stentura 500                       | Stenograph         | Stentura (serial)   | (same instructions as the 400 SRT)  |
+| Stentura 8000 and 8000LX           | Stenograph         | Stentura (serial)   | (same instructions as the 400 SRT)  |
+| Stentura Protégé                   | Stenograph         | Stentura (serial) OR Stenograph USB   | Works with the [plover-stenograph-usb](https://pypi.org/project/plover-stenograph-usb/0.0.3/) plugin for USB. For Stentura serial: connect Serial-to-USB cable to serial port of Protégé. [Setup Instructions for Serial](https://github.com/openstenoproject/plover/wiki/Stentura-Protege-Setup-and-Usage-Instructions)|
+| Tréal                              | Word technologies  | Treal (USB)         |                         |
+| Wave                               | Stenograph         | Stentura (serial) OR Stenograph USB | Requires Stenograph drivers to do serial on Windows. All platforms can use the [plover-stenograph-usb](https://pypi.org/project/plover-stenograph-usb/0.0.3/) plugin. Make sure "serial protocol" on the Wave is set to "Stentura". |
+| Luminex II                         | Stenograph         | Stenograph USB OR Stenograph Wi-Fi | All platforms can use the [plover-stenograph-usb](https://pypi.org/project/plover-stenograph-usb/0.0.3/) plugin for USB, or the [plover-stenograph](https://pypi.org/project/plover-stenograph/2.0.3/) plugin for Wi-Fi. Make sure the machine is connected to the same local network to use Wi-Fi. |
+
+# Keyboards
+
+If you don't have a steno machine, you can use a keyboard that supports N-Key Rollover (NKRO).
+
+## What's NKRO?
+
+This is a feature of some keyboards that means that you can press as many keys as you want simultaniously, and they will all register. Typical keyboards stop working correctly when you press somewhere between 4 and 7 keys at once.
+For more information, see the [Wikipedia entry about NKRO](https://en.wikipedia.org/wiki/Rollover_(key)#n-key_rollover).
+
+## How do I know if my keyboard has NKRO
+
+In general, most keyboards will not be NKRO. "Gamer" and mechanical keyboards are most likely to have NKRO, while budget as well as laptop keyboards are unlikely to have NKRO.
+
+### Test #1: Double Shift
+
+**Note: this test results in a false positive on some Macbooks**
+
+To test your keyboard for NKRO capability:
+
+1. Open up a text editor.
+2. Hold down both shift keys.
+3. Type each letter on your keyboard (from A-Z).
+
+> **Note**: You must hold down both shift keys while you type each letter on your keyboard.
+
+If all keys are typed into the text editor, your keyboard probably has NKRO.
+
+### Test #2: Keyboard Ghosting Test
+
+The [in-browser steno demo](https://www.openstenoproject.org/demo/) provides a browser-based application that lets you test your keyboard's capabilities for registering multiple key presses with simulated steno output.
+
+To test your keyboard:
+
+1. Open your web browser and go to the [in-browser steno demo](https://www.openstenoproject.org/demo/).
+1. Click in the **Output box** to start
+    * Each key you press will light up in the picture of a keyboard. 
+1. Press the middle row keys `asdfjkl;` **all at once**.
+    * With a normal keyboard only 6 of the 8 keys will light up (likely fewer).
+    * If your keyboard has N-key rollover, all 8 keys will light up. 
+1. Press other multiple-key combinations, such as `yuhj`, and see if they all light up. Ideally, your keyboard should register the entire first two rows of your keyboard at once, plus `c`, `v`, `b`, and ` n`.
+
+## What if my keyboard is not capable of NKRO?
+
+If you don't have a keyboard that's capable of NKRO, but still want to give Plover a try, you can arpeggiate/roll the keyboard chords. More info can be found at the bottom of [this post](http://plover.stenoknight.com/2011/02/plover-211-released.html).
+
+## Known supported keyboards
+
+> **Warning**: Be wary of false advertising; some keyboards are advertised as NKRO or anti-ghosting, but are limited to certain combinations. Check reviews to get confirmation before making a purchase. Some keyboards might only support full-NKRO over a PS/2 connector (the [old-style plug](https://en.wikipedia.org/wiki/PS/2_port#/media/File:Ps-2-ports.jpg).) Full NKRO over USB is possible. Many keyboards do it well, and will work with Plover.
+
+The following machines have been confirmed by users to work with Plover after actually trying it:
+
+| Product Name                | Manufacturer           | Comments        | Price
+| --------------------------- | ---------------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+| Anne Pro II | Obinslabs | NKRO over USB; 6KRO over bluetooth; Works on Mac | $20-100
+| Aukey KM-G9 | Aukey | NKRO over USB; May not work on Mac | $35-50
+| I-500 Victop (compact: 87 keys)     | Eastern times tech | NKRO over USB   | [27 GBP](https://www.amazon.co.uk/Water-Resistant-VicTop-Mechanical-Waterproof-Anti-ghosting/dp/B01DBYNVSY/)
+| DareU DK87 (red switch) | DareU | NKRO over USB (Tested on Linux), however some keys may be stuck after released. Discontinued model. There is a [similar model](http://www.dareu.com/?m=home&c=View&a=index&aid=169), they may have the glitch mentioned above or not. | < $30
+| TOMOKO (87 key Mechanical Keyboard) | TOMOKO               | NKRO over USB (Works on Mac)   | [$30](https://www.amazon.com/TOMOKO-Water-Resistant-Mechanical-Keyboard-Non-Conflicting/dp/B01DBJTZU2/)
+| K552 | Redragon | NKRO over USB | [$35](https://www.amazon.com/Redragon-KUMARA-Backlit-Mechanical-Keyboard/dp/B016MAK38U)
+| X51 (Gaming Mechanical Keyboard 87/104) | Metoo                | NKRO over USB   | [$40](https://www.aliexpress.com/item/Metoo-Gaming-Mechanical-Keyboard-87-104-Anti-ghosting-Luminous-Blue-Red-Black-Switch-Backlit-LED-wired/32782819448.html) 
+| ZM-K600S                    | Zalman                 | NKRO over USB   | [$40](https://www.amazon.com/Zalman-Unlimited-Multi-Key-keyboard-ZM-K600S/dp/B0196J3IPE)
+| K582                         | Redragon               | NKRO over USB  (Works on Mac. NB: Hitting Fn+WIN removes NKRO) | [$50](https://www.amazon.com/Redragon-Mechanical-Keyboard-Keys-Linear-Quiet-Red/dp/B07KCRTN9Q/)
+| K66                         | Corsair                | NKRO over USB   | [$55](https://www.amazon.com/CORSAIR-K66-Mechanical-Gaming-Keyboard/dp/B072LTTNVS/)
+| K63                         | Corsair                | NKRO over USB (Works on Mac!) | [$80](https://www.amazon.com/Corsair-CH-9115020-NACORSAIR-Compact-Mechanical-Keyboard/dp/B06XC1WNPT)
+| K68                         | Corsair                | NKRO over USB   | $160-200
+| K95                         | Corsair                | NKRO over USB   | [~$200](https://www.amazon.com/CORSAIR-PLATINUM-Mechanical-Gaming-Keyboard/dp/B01MU3R9VM)
+| KG901                       | Marvo                  | NKRO over USB   | $30-70 AUD
+| STRAFE                      | Corsair                | NKRO over USB   | [$80](https://www.amazon.com/CORSAIR-STRAFE-Mechanical-Gaming-Keyboard/dp/B012B6X7MI/)
+| CM Storm Quickfire TK       | Cooler Master          | NKRO over USB (Doesn't work on Mac)   | [$85](https://www.amazon.com/CM-Storm-QuickFire-TK-Mechanical/dp/B00A378L4C/)
+| Vengeance K65               | Corsair                | NKRO over USB   | [$90](http://www.corsair.com/en/gaming-peripherals/gaming-keyboards/vengeance-k65-compact-mechanical-gaming-keyboard.html)
+| C413 Carbon                  | Logitech             | 26KRO            | [$90](https://www.logitechg.com/en-us/products/gaming-keyboards/g413-mechanical-gaming-keyboard.920-008300.html)
+| Francium Pro                  | Deck            | NKRO over USB when in "lightning" mode (Fn + F10). Full NKRO works on Windows and Linux, but is rumored NOT to work on Macs (you'd be stuck with 6KRO).  | [$94](https://mechanicalkeyboards.com/shop/index.php?l=product_detail&p=690)
+| Noppoo Choc                 | Noppoo                 | NKRO over USB (works on Mac without adapters)   | [$95](https://www.amazon.com/Noppoo-84-Technology-Mechanical-Keyboard/dp/B0091Q34EI/ref=sr_1_1?s=pc&ie=UTF8&qid=1458020924&sr=1-1-spons&keywords=noppoo+choc+mini&psc=1)
+| Razer BlackWidow V3 Tenkeyless | Razer                  | 14KRO over USB when in "gaming" mode (Fn + F10). Older BlackWidow Tournament Edition 2014 tested.  | [$100](https://www.razer.com/gaming-keyboards/Razer-BlackWidow-V3-Tenkeyless/RZ03-03490200-R3U1)
+| Apex M750 TKL               | SteelSeries            | NKRO over USB (Works on Mac, but for some reason if you install the SteelSeries Engine it stops working) | [$120](https://www.amazon.com/dp/B076XDTLBB)
+| G710+                       | Logitech               | NKRO over USB   | [$130](https://gaming.logitech.com/en-us/product/g710plus-mechanical-gaming-keyboard)
+| Majestouch-2                | Filco                  | NKRO over USB   | [$167](https://amzn.to/oLy2xQ)
+| Das Keyboard 4 Ultimate     | Das Keyboard           | NKRO over USB requires key sequence to enable. See fine print on underside of keyboard   | [$169](https://shop.daskeyboard.com/products/das-keyboard-4-ultimate/)
+| Apex M800                   | SteelSeries            | NKRO over USB   | [$199](https://steelseries.com/gaming-keyboards/apex-m800)
+| Ergo Pro                    | Matias                 | NKRO over USB   | [$200](https://matias.ca/ergopro/pc/)
+| Ultimate Hacking Keyboard   | Ultimate Gadget Labs   | NKRO over USB   | [$250](https://www.crowdsupply.com/ugl/ultimate-hacking-keyboard)
+| Ergodox                     | Ergodox                | NKRO over USB   | [Parts €160.00 - Assembled €247.00](https://falba.tech/customize-your-keyboard/customize-your-ergodox/)
+| Ergodox EZ (swappable switches) | ZSA Technology Labs, Inc.| NKRO over USB  | [EZ Only $270 - All Upgrades $354+](https://ergodox-ez.com)
+| Planck EZ (swappable switches) | ZSA Technology Labs, Inc. | NKRO over USB  | [ Planck only $180 - W/LED Backlighting $195 ](https://ergodox-ez.com/pages/planck)
+| Model01                     | Keyboard.io            | NKRO over USB   | [$329](https://shop.keyboard.io)
+| Vortex Race 3 | Vortex Keyboard           | NKRO over USB (Only 6KRO on Mac. Untested on Linux)  | [$139](https://mechanicalkeyboards.com/shop/index.php?l=product_detail&p=3917)
+
+### Which type of key switch should I choose?
+
+Because you hit many keys with steno at once, there are two properties that are useful to have in a mechanical keyboard switch for steno: a **light actuation force** on a **linear** switch.
+
+The light actuation makes it easier on your hands. For a chord like `TKPWHRAOEUGD` (gliding), you are hitting 8 keys with your left hand. That means that whatever switch force you need to depress one key, you have to push 8-times as much. For a 80cN (~80 grams, ~2.9 oz) switch, that's 640cN (~640g, ~22.6 oz). **For this reason, your wrists will have a much easier time working with your machine if its actuation force is as light as possible.**
+
+| How many keys are in the average chord? |  |
+| --- | --- |
+| 1:&nbsp;23<br />2:&nbsp;221<br />3:&nbsp;1115<br />4:&nbsp;3247<br />5:&nbsp;6168<br />6:&nbsp;7820<br />7:&nbsp;7293<br />8:&nbsp;5069<br />9:&nbsp;2707<br />10:&nbsp;1126<br />11:&nbsp;331<br />12:&nbsp;90<br />13:&nbsp;21<br />14:&nbsp;3<br />15:&nbsp;1 | <img src="https://i.imgur.com/77sH9t0.png" width="500px" /> |
+
+The linearity is recommended because it's been found that the tactile feedback that one gets from an individual switch is not as useful when you are receiving 4-10 of those feedbacks at once. The brain just doesn't process all the fingers' feedback in a useful manner. And since the bump usually requires a small addition to the actuation force, we recommend keeping it linear and simple.
+
+Professional steno machines, historically, always bottomed out (meaning the keys are pressed until they can no longer travel; the bottom.) Newer machines use more complicated mechanisms for detecting key travel, often using magnets and the hall effect to determine where the key is, allowing for customizable actuation points. The typical force required for a modern steno machine is between **10cN and 20cN**, with some extremes on either end for personal preference. The travel of a typical lever steno machine is usually between **2mm and 30mm**. The lower end is found in machines like the LightSpeed (nonlever), where the higher end is around the maximum that you can configure a lever machine to stroke.
+
+Most of the mechanical switches have a 2mm actuation point and 4mm travel/bottoming out, but some community members have found that "speed switches" with an earlier actuation point (usually 1.1-1.4mm) are better for steno due to their increased sensitivity.
+
+| Switch | Stat | Note | Machines |
+| ------ | ---- | ---- | ------- |
+| Gateron Clear / White | 35 cN linear | Best stock option available on the market | Stenomod uses this switch |
+| Matias Red | 35 cN linear | Feels heavier than 35 cN switches due to having a "flat" force curve. Matias also has a different stem from Cherry | SOFT/HRUF uses this switch |
+| Cherry MX Red | 45 cN linear | | |
+| Kailh Silver | 50 cN spring* linear | Has an early actuation (1.1mm vs 2mm) | |
+| Cherry MX Brown | 45 cN bumpy | While not ideal compared to other options, this switch is still a better choice than blues, blacks, and other Cherry switches | |
+|Kailh Choc Red | 50 cN spring* linear | | The Georgi uses this switch |
+
+\* The Kailh silvers and Choc reds use a spring that would cause a 50 cN actuation point at 2mm, but since they actuate earlier (1.1mm), the force required is nearer to 35 cN.
+
+There are other methods to decrease actuation force for even these switches. This includes:
+
+- Putting the Gateron Clear's 35 cN spring into the Kailh Silver for its earlier actuation point.
+- Trimming the springs of a linear switch by several mm to reduce force.
+- Using an aftermarket spring with lower forces, such as a prototype 20 cN spring that isn't yet released to the wider market.
+- Removing the leaf-spring (not the primary spring) in the Matias Red switch to make the force curve less flat.
+
+## Adapt a keyboard for steno use
+
+![](https://c1.staticflickr.com/5/4202/34180678224_98d3e26f1f_n.jpg)
+
+Most keyboards have the keys in staggered rows, which can make it difficult to press two keys in a column with a single finger. To adapt a keyboard for steno use, you can use:
+
+* Keytoppers
+* Keycaps
+
+You can also use a keyboard with an ortholinear layout.
+
+### Keytoppers
+
+Laser-cut keytoppers are in the shape of the keys on a steno machine. You stick them on top of the relevant keys on the keyboard. You can buy laser-cut keytoppers from the [Plover Store](http://plover.deco-craft.com/). You can also make your own keytoppers out of plastic or even coins.
+
+![Laser-cut keytoppers sitting in a pile](https://i.imgur.com/cjWDy2J.jpg)
+ 
+### Keycaps
+
+If you have a mechanical keyboard, it is likely your keys have a [Cherry MX stem](https://deskthority.net/wiki/Cherry_MX) and will work with custom keycaps. You can replace the existing keycaps on your keyboard with different keycaps, to improve the layout for stenoing.
+
+- [StenoToppers](https://cemrajc.github.io/stenotoppers/) is a 3D printed keycap set designed by Jason Cemra. It aligns the rows, raises the keys, and reduces the keycap tapering, slant and gap. The 3d model (.stl) files are available on Github. If you have access to a 3D printer, you can download .stl files and print them for a negligible cost. Otherwise, you would need to use a 3D printing service.
+
+  <img src="https://imgur.com/FRwXu8x.jpg" width="400">
+
+- The [G20 keycap set](https://pimpmykeyboard.com/g20-blank-keycap-sets/) from Signature Plastics is a great set for steno, and will fit on an ErgoDox or other mechanical keyboard. The keys have a direction, so for optimal comfort, you should angle the top row of steno (`STPH...`) down, so that they are close to the bottom row (`SKWR...`)
+- You can 3D-print a [steno-friendly keycap](https://github.com/morinted/stenomod_case).
+
+Keys that have little space between them are good for steno, because then you can hit two neighboring keys with one finger (which is frequently necessary).
+
+## NKRO keyboards with an ortholinear layout
+
+Keyboards with an "ortholinear" layout have the keys in straight columns. This is handy for steno, as it makes it easier to press two keys in a column with a single finger. 
+
+The following machines have been confirmed by users to work with Plover after actually trying it:
+
+| Product Name                       | Manufacturer       | Protocol/Connection | Comments                |
+| ---------------------------------- | ------------------ | ------------------- | ----------------------- |
+| [ErgoDox](https://deskthority.net/wiki/ErgoDox)           |   ErgodoxEZ, Massdrop, FalbaTech, others |  USB  |     The ErgoDox is a fairly high-end NKRO keyboard at $200, with an ortholinear layout. It has two separate halves, so you can angle them to suit you. You can order it with the Gateron White keys, which have an extremely light, 35 gram activation force. Read a [guide to Starting Stenography with an Ergodox by Paul Fioravanti](https://www.paulfioravanti.com/blog/starting-stenography-ergodox/).                    |
+| [Planck](https://olkb.com/planck/) | OLKB | USB | The Planck is a fully programmable NKRO keyboard with an ortholinear layout. It is 40% the size of a standard keyboard. Read a [guide to starting stenography with a Planck by DiDoesDigital](https://didoesdigital.com/blog/build-your-own-steno-keyboard-its-easier-than-you-think/).  <br /> ![Planck steno keyboard](https://i.imgur.com/e9B2qpO.jpg)|
+|[Preonic](https://olkb.com/preonic/)| OLKB | USB | The Preonic is a fully programmable NKRO keyboard with an ortholinear layout. It is 50% the size of a standard keyboard. |
+| [Gherkin](http://plover.stenoknight.com/2018/05/limited-time-offer-stenogherkins-at-cost.html) | | USB | The Gherkin is a fully programmable NKRO keyboard with an ortholinear layout. It is 30% the size of a standard keyboard.
+| [Iris](https://keeb.io/products/iris-keyboard-split-ergonomic-keyboard) | Keebio | USB | The Iris is a cheaper and slightly smaller alternative to the ErgoDox. It is a fully programmable split NKRO keyboard with 56 keys. The firmware needs to be edited to enable either NKRO or Gemini PR. Available in PCB and pre-built.
+
+<a id="notebooks-with-nkro"></a>
+# Laptops with NKRO
+
+If you want to always have steno on the go, you might consider finding a notebook with NKRO. Note that not all these machines are equivalent in terms of actuation force or key shape. You might find, for example, that chiclet keys don't feel as good as the Alienware's classic keyboard style. It's always best to try laptop keyboards at a local store, if possible.
+
+| Model    | Screen Size | Manufacturer    | Rollover | Price (USD) | Weight |
+| -------- | ----------- | --------------- | ------- | ----- | ------ |
+| [Alienware R3/R4](https://www.dell.com/en-us/shop/dell-laptops/sc/laptops/alienware-laptops) | 13", 15", 17" | Dell        | n-key | **$1000** to $3000 | 5.8 to 9.8 lbs |
+| [GL553](https://www.asus.com/ca-en/Laptops/ROG-GL553VD/)    | 15"         | Asus        | 30-key  | $1200     | 5.5 lbs |
+| [Razer Blade Stealth 8th Gen](https://www.razer.com/ca-en/gaming-laptops/razer-blade-stealth) | 13" | Razer | 14-key | $1200+ | **2.98 lbs** |
+| [Zephyrus GM501](https://www.asus.com/ca-en/Laptops/ROG-ZEPHYRUS-GM501/) | 15"   | Asus        | 30-key   | $1500 to $2200     | 5.5lbs |
+| [Omen X](https://www8.hp.com/us/en/campaigns/omenxlaptop/overview.html) | 17" | HP | n-key* | $1800 | 10.7 lbs |
+| [P57X](https://www.gigabyte.com/Laptop/P57X-v7)     | 17"         | Gigabyte    | 30-key   | $1800     | 6.6 + 2.2 (power adaptor) lbs |
+| [GL502](https://www.asus.com/ca-en/ROG-Republic-Of-Gamers/ROG-GL502VT/)    | 15"         | Asus        | 30-key   | $1900 | 4.9 lbs |
+| [Aero 15/15x](https://www.gigabyte.com/us/Laptop/AERO-15--i7-8750H) | 15"      | Gigabyte    | 80-key*   | $2000 to $2900 | 4.6 lbs |
+| [Legion Y920](https://www3.lenovo.com/us/en/laptops/ideapad/lenovo-legion-y-series-laptops/Legion-Y920/p/88GMY900877) | 17" | Lenovo | 100-key* | $2200 | 10.1 lbs |
+| [Zephyrus GX501](https://www.asus.com/ca-en/Laptops/ROG-ZEPHYRUS-GX501/) | 15"   | Asus        | 30-key   | $2500     | 4.85lbs |
+| Aorus [X5 v8](https://www.aorus.com/product-detail.php?p=744) and [X7 v8](https://www.aorus.com/product-detail.php?p=745) | 15", 17" | Aorus | 80-key* | $2600, $3000 | 5.51 lbs, 7.05 lbs |
+| [Predator Triton 700](https://us-store.acer.com/predator-triton-700-gaming-laptop-pt715-51-732q) | 15" | Acer | n-key (clicky keys) | $3000 | 5.3 lbs |
+\* Untested for use with Plover
+
+## Laptops that don't actually work with Plover
+
+After testing some of the laptops on the list above, they were found to not live up to their claims.
+
+| Model    | Manufacturer    | Claimed Rollover | Findings |
+| -------- | --------------- | ------- | ----- |
+| HP Omen [15](https://store.hp.com/us/en/pdp/omen-by-hp---15-ce051nr) and [17](https://store.hp.com/us/en/pdp/omen-by-hp---17-an053nr) | HP | "26-key rollover anti-ghosting" | Combination "YUHJ" on Qwerty only produces 3 letters |
+| [GF62](https://us.msi.com/Laptop/GF62-7th-Gen-GEFORCE-GTX-1050TI.html) and [GP72](https://us.msi.com/Laptop/GP72-Leopard-Pro-6th-Gen-GTX-960M) | MSI | "anti-ghosting for up to 45 keys" | 99% of chords were OK, certain combinations wouldn't work -- e.g. QWEAS blocked R. Keyboard also responded abnormally slow when writing chords. |