To define a new machine called Example Machine, add the name as an entry point to your

plover.machine =
  Example Machine = plover_my_plugin.machine:ExampleMachine

Machines are implemented as classes that inherit from one of a few machine classes. 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_my_plugin/

from plover.machine.base import ThreadedStenotypeBase

class ExampleMachine(ThreadedStenotypeBase):
  KEYS_LAYOUT: str = '0 1 2 3 4 5 6 7 8 9 10'

  def __init__(self, params):
    self._params = params

  def run(self):
    while not self.finished.wait(1):

  def start_capture(self):

  def stop_capture(self):

  def get_option_info(cls):

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 (or “actions”) with Keymap.keys_to_actions) 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)

  • The user can manually set the keymap in the Machine section in the configuration, 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.

See plover.machine – Steno machine protocols for more information.

Machine Options#

If your machine requires additional configuration options, add a machine options entry point:

plover.gui_qt.machine_options =
  plover_my_plugin.machine:ExampleMachine = plover_my_plugin.machine:ExampleMachineOption

Machine options plugins are implemented as Qt widget classes:

# plover_my_plugin/

from PyQt5.QtWidgets import QWidget

class ExampleMachineOption(QWidget):
  def setValue(self, value):

The process for developing these is similar to that for GUI tools. See Machine Options for more information.