All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog using the reStructuredText format instead of Markdown. This project adheres to Semantic Versioning as of version 0.7.0.

Note: this project had no release versions between 0.6.6b1 and 0.7.0. Notable changes made between these versions are documented in the commit history and will be placed under headings in this file over time.

0.35.0 - 2022-03-19


  • Add get_speaker() function for retrieving the specified or default text-to-speech (speaker) implementation.

  • Add eSpeak and CMU Flite text-to-speech implementations.


  • Detach text-to-speech functionality from the Natlink and SAPI 5 engine back-ends and make it available via the get_speaker() function.

  • Change Kaldi, CMU Pocket Sphinx and text-input engine back-ends to use the default or specified text-to-speech implementation for engine.speak().

  • Use xdotool for mouse functions on X11 if pynput is not installed.

  • Remove the pynput requirement on Linux.

  • Remove the requirement to upper-case mimicked dictated words with some engine back-ends.


  • Fix incorrect handling of inactive grammars by CMU Pocket Sphinx back-end.

  • Remove dictation element limitation effecting most engine back-ends.

0.34.1 - 2022-02-24


  • Fix a problem with the behaviour of the X11Window.close() method.

0.34.0 - 2021-12-09


  • Change Kaldi back-end to enable local-only pronunciation generation by default.

  • Change accessibility sub-package to use AT-SPI if X11 is detected.

  • Give X11 precedence over other platforms in initialization modules.

  • Remove deprecation notices for the dragonfly.timer interface (since it works fine).


  • Fix Kaldi marking of whether retained utterance has dictation.

  • Fix a word pronunciation generation bug with the Kaldi back-end (thanks @daanzu).

  • Fix problems caused by relative import statements in the library by using the absolute form instead.

  • Improve X11 detection by checking the DISPLAY environment variable.

0.33.0 - 2021-10-01


  • Change command-line interface (CLI) to allow using multiple engine options arguments.

  • Change load-directory CLI command to accept more than one directory.

  • Remove English-language alternatives for the integer two.

  • Set the Kaldi engine back-end as unavailable to old Python versions.

  • Set the Kaldi engine option auto_add_to_user_lexicon to False by default.


  • Fix a bug that occurs when using non-matching glob patterns as command module files (CLI).

  • Fix a few bugs with the CLI engine options argument.

0.32.1 - 2021-09-06


  • Fix a bug with Text action default pause values.

  • Fix various bugs with keyboard input actions on Windows.

0.32.0 - 2021-06-26


  • Add Clipboard.synchronized_changes() context manager.

  • Add Clipboard.wait_for_change() class method.


  • Disable Kaldi debug logging workaround for Windows Key action bug.

  • Make Clipboard class instances comparable based on content difference.


  • Add missing logger names and default levels into

  • Fix bug caused by storing an internal lark grammar in a text file.

  • Fix bug caused by storing the required KaldiAG version in a text file.

  • Fix bug with mouse button emulation on Windows.

  • Fix bug with the open/close mechanism of the Windows Clipboard class.

  • Fix incorrect and messy Key action code for handling unknown keys.

  • Fix incorrect handling of extended scan codes on Windows (keyboard input).

0.31.2 - 2021-05-15


  • Fix a number of bugs and other issues with keyboard input functionality on Windows.

0.31.1 - 2021-05-09


  • Fix AttributeError bug in natlink file.

0.31.0 - 2021-05-04


  • Adjust order of preferred SR engine implementations in get_engine() to prefer Kaldi over SAPI 5 and Sphinx.

  • Change clipboard toolkit to support retrieving copied files (format_hdrop) on X11.

  • Change clipboard toolkit to support setting and retrieving the three X selections using the xsel program (X11).

  • Change get_engine() to log an info message for initialized engines.

  • Change the Choice element class to allow using list/tuple choices.

  • Make various improvements to the Kaldi engine back-end and bump required Kaldi-Active-Grammar version to 2.1.0. (thanks @daanzu).


  • Fix a number of Kaldi engine back-end bugs (thanks @daanzu).

  • Fix leak of file open() without close in dragonfly/ (thanks @wolfmanstout).

  • Fix problem with the default action used by the Paste action class.

  • Fix the Windows keyboard code so that letter and number keys can be pressed using the Key and Text actions, regardless of the active keyboard layout.


  • Remove Google cloud speech-to-text functionality from the Kaldi engine back-end (unneeded dependency).

0.30.1 - 2021-03-30


  • Fix incorrect dictation formatting for DNS letters (thanks @wolfmanstout).

  • Fix incorrect handling of input strings in DNS dictation formatting classes.

0.30.0 - 2021-03-20


  • Add Clipboard class methods: get_available_formats() and convert_format_content().


  • Change the Clipboard classes so they have a consistent API across platforms.

  • Change the German integer element content to support compound words in range 20-99, including when used as part of larger numbers.

  • Change the Paste action class to make use of the Clipboard class changes.

  • Change the X11Window class to filter out unhelpful xdotool BadWindow error messages.

  • Change the internal integer builder classes to support replacing or adding alternative recognition words for numbers.


  • Fix a bug with the pyperclip Clipboard.copy_to_system() method.

  • Fix diction.formatter logger name to match (thanks @wolfmanstout).

  • Fix incorrect handling of None in the Clipboard classes (thanks @MarkRx).

  • Fix issues with German integers in the millions and with the words “ein” and “eins”.

  • Fix smart casting for command-line interface (CLI) to handle other possible exceptions for some inputs (thanks @daanzu).

0.29.0 - 2020-12-31


  • Add example command module (thanks @LexiconCode).

  • Add smart type casting to CLI loader engine parameter options (thanks @daanzu).

  • Improve error message when X11 can’t be detected (thanks @dasnessie)


  • Fix Kaldi grammar loading/unloading while in phrase (thanks @daanzu).

  • Fix recognition observer bug with the KaldiEngine.mimic() method.

0.28.1 - 2020-11-15


  • Fix DNS dictation bug where formatting can be applied incorrectly.

0.28.0 - 2020-10-24


  • Add methods for setting Rule and Grammar contexts after instantiation (thanks @Timoses).

  • Add warning messages on adding the same exported rule to multiple grammars.

  • Change default values for Kaldi vad_padding_end_ms and vad_complex_padding_end_ms engine config arguments (thanks @daanzu).

  • Set DPI awareness automatically when dragonfly is imported (Windows only) (thanks @wolfmanstout).


  • Add missing Grammar.remove_list() method.

  • Add missing validation and type checks into the ContextAction class.

  • Fix SAPI5 engine processing issues with window title context changes.

  • Fix various Kaldi engine bugs and other issues (thanks @daanzu).

0.27.1 - 2020-09-18


  • Add missing debug logging for the FuncContext class (thanks @Timoses).


  • Fix two bugs with the Monitor class for X11 (Linux).

0.27.0 - 2020-09-09


  • Add Kaldi support for special user-modifiable Dictation elements (thanks @daanzu).


  • Bump required KaldiAG version to 1.8.0 for various improvements. See KaldiAG release notes (thanks @daanzu).

  • Change X11Window.maximize() method to use Extended Window Manager Hints instead of a hardcoded shortcut.

  • Add the wmctrl command-line program as a new required X11 session dependency for properly maximizing X11 windows via maximization hints.

  • Improve Kaldi engine error messages for failed compilation (thanks @daanzu).

  • Reorganize, fix and improve various parts of the documentation.


  • Fix Repetition element so the max argument is an exclusive bound (thanks @starwarswii).

  • Fix Windows bug where the printscreen key cannot be pressed.

0.26.0 - 2020-08-08


  • Add useful audio-related initialization arguments to Kaldi engine back-end (thanks @daanzu).


  • Bump required Kaldi-Active-Grammar version to 1.7.0 fix bugs.

  • Change the get_engine() function to stop overriding the default (first) engine if another engine is initialized.


  • Add missing high numbers to short integer elements (thanks @mrob95).

  • Fix Python 2.7 bug where StartApp action args may only use ASCII characters.

  • Fix bug with BasicRule where it can only be used as a derived class.

  • Fix various Kaldi engine bugs and documentation issues (thanks @daanzu).

0.25.1 - 2020-07-29


  • Fix Kaldi & Sphinx recognition delays on macOS by optimizing window attribute checks in those engine back-ends.

0.25.0 - 2020-07-20


  • Add BasicRule class for defining commands using elements directly.

  • Add Kaldi engine support for recognition confidence information, plus various new engine arguments (thanks @daanzu).

  • Add convenience method Window.matches(context) (thanks @daanzu).


  • Move SAPI 5 engine process_grammars_context() method into the EngineBase class.

  • Update required versions for lark-parser and KaldiAG version.


  • Add missing WordParserDns11 entry for the special em dash word.

  • Add partial fix for dictation-related DNS recognition failures.

  • Change the Windows Clipboard class to poll for clipboard access like the cross-platform class does.

  • Fix CLI error reporting and file pattern matching issues.

  • Fix bug causing Win32Window.set_foreground() to fail sometimes.

  • Fix bug in the NatlinkEngine.disconnect() method.

  • Fix some Kaldi engine bugs.


  • Remove old and unused compile() method from ElementBase (thanks @kb100).

0.24.0 - 2020-05-21


  • Add optional ‘results’ arguments to recognition and grammar callbacks that expose internal engine results objects for Natlink and SAPI 5 SR engines.

  • Add support for quoted words in rules, which can potentially fix certain recognition issues with Dragon.


  • Change the setup_log() function to output log messages to stderr.

  • Make Dictation-only rules work with the Sphinx engine again.

  • Make keyboard input faster on X11 by passing ‘–delay 0’ as an argument to Xdotool.

  • Update, fix and improve various parts of the documentation.

  • Use the old Win32 Clipboard class on Windows instead of the cross-platform class.


  • Fix sdist package installs by including missing files like version.txt (thanks @thatch).

  • Fix the Win32 Clipboard class handling of empty clipboard errors and the CF_TEXT format.

  • Raise an error if args were passed to get_engine() but silently ignored (thanks @shervinemami).

0.23.2 - 2020-04-11


  • Add missing __str__ visualization method for UnsafeActionSeries.

  • Add missing catch for IOErrors in the Function.__str__() method.

  • Fix __str__ visualization methods that break Unicode support.

  • Fix some bugs with how Dragonfly command modules are loaded.

0.23.1 - 2020-04-09


  • Add temporary mitigation for Windows keyboard action processing bug specific to the Kaldi engine (thanks @daanzu).

0.23.0 - 2020-04-06


  • Add get_current_engine() function that doesn’t initialize an engine.

  • Add is_primary and name properties to all Monitor classes.

  • Change SAPI5 engine backend to use the recognizer language selected in the options window instead of “en”.

  • Reword confusing Natlink warning message shown when Dragon isn’t running.

  • Update and fix various parts of the documentation.


  • Add automatic fix for the NatlinkEngine class that allows threads to work properly after the first grammar is loaded.

  • Change Dragonfly monitor lists to always have the primary monitor with coordinates (0, 0) first on the list.

  • Fix Mouse action bug with negative absolute screen coordinates that made monitors tricky to access sometimes.

  • Fix bug where X11Window.executable may return None in certain circumstances.

  • Support AppContext edge cases where window executables or titles aren’t valid (thanks @shervinemami).

0.22.0 - 2020-03-20


  • Add __str__ method to essential action classes for visualization (thanks @dmakarov).

  • Change the Dictation element’s value to be a list of recognized words instead of a DictationContainer object if the ‘format’ constructor argument is False. Previously, the ‘format’ argument did nothing.

  • Make various improvements to Dragonfly’s documentation.

  • Make various improvements to the Kaldi engine’s audio code (thanks @daanzu).


  • Add code to verify that natlink is on the Python path before initializing the engine (thanks @LexiconCode).

  • Fix Python 2.7 console output encoding errors in on_recognition() callbacks in CLI and module loaders.

  • Fix a minor bug in DictListRef’s constructor.

  • Fix bugs where X11 Keyboard and Window class sub-processes can exit early.

  • Fix encoding bug with the string representation of BoundAction.

  • Fix some Python 3.x bugs with the Natlink engine and its tests (thanks @mrob95).

  • Make DarwinWindow get_window_module/pid methods error safe (thanks @dmakarov).

0.21.1 - 2020-02-24


  • Add set_exclusive() alias methods to Grammar & EngineBase classes to make some older grammars work again.

  • Fix a few issues related to the Impossible and Empty elements (thanks @caspark and @daanzu).

  • Fix Win32 modifier bug where the control key could be released if held down when Window.set_foreground() is called.

  • Make all engine mimic() methods fail properly when given empty input.

0.21.0 - 2020-02-15


  • Add optional recursive mode to CommandModuleDirectory class.

  • Add new load and load-directory CLI commands as alternatives to module loader scripts.

  • Add new on_end() and on_post_recognition() recognition observers with optional parameters (thanks @daanzu).

  • Add Window.set_focus() method for focusing windows without raising them (only supported on X11).

  • Add ‘focus_only’ argument to BringApp and FocusWindow actions to support focusing windows without raising them (only supported on X11).


  • Add context manager to ListBase class for optimized list updates.

  • Add missing CommandModule properties and methods to CommandModuleDirectory class.

  • Change ActionBase class to catch all exceptions raised during execution, not just ActionErrors (thanks @daanzu).

  • Change ActionSeries class to stop execution if errors occur. The ActionSeries.stop_on_failures attribute, UnsafeActionSeries class and the ‘|’ and ‘|=’ operators can be used to have the previous behaviour.

  • Change Kaldi retain support to allow retaining only specifically chosen recognitions (thanks @daanzu).

  • Change on_recognition() recognition observer to allow optional rule and node parameters on functions (thanks @daanzu).

  • Change test command to support running the test suites with different pytest options (thanks @daanzu).

  • Change the StartApp action to use the macOS ‘open’ program if applicable.

  • Clean up and enhance log messages and dependency checks done in the is_engine_available() and get_engine() functions (thanks @LexiconCode).

  • Use application IDs instead of application names to differentiate between different application processes on macOS (thanks @dmakarov).


  • Fix Dragonfly’s CLI so glob patterns are expanded where necessary (i.e. if using cmd.exe on Windows).

  • Fix Kaldi version number checking (thanks @daanzu).

  • Fix Python 2/3 bool incompatibility with dictation containers (thanks @daanzu).

  • Fix bug with CommandModuleDirectory ‘excludes’ constructor parameter.

  • Fix bug with the command-line interface where the ‘command’ argument wasn’t required.

  • Fix Function action deprecation warning in Python 3.

0.20.0 - 2020-01-03


  • Add DarwinWindow class for macOS using ‘py-applescript’ (thanks to various Aenea contributors).

  • Add Kaldi engine support for defining your own, external engine to use for dictation elements (thanks @daanzu).

  • Add Kaldi engine support for weights on individual rule elements (thanks @daanzu).

  • Add support for special specifiers in Compound specs (thanks @daanzu).


  • Change Kaldi default model directory to ‘kaldi_model’ (thanks @daanzu).

  • Change dragonfly’s CLI test command to accept zero file arguments.

  • Clean up code in grammar, actions and windows sub-packages.

  • Improve overall Kaldi engine recognition accuracy (thanks @daanzu).

  • Make a few minor Windows-related speed optimizations (thanks @Versatilus).


  • Add missing DNS parser entry for the special “numeral” word.

  • Fix a Windows bug where the wrong mouse buttons will be pressed if the primary/secondary buttons are inverted.

  • Fix a bug with dragonfly’s CLI ‘test’ command where grammars weren’t properly unloaded.

  • Fix on_recognition() observer callback for the natlink engine.

  • Fix various Kaldi engine bugs (thanks @daanzu).

  • Fix for newer Python versions.


  • Remove basic Kaldi module loader ‘’.

0.19.1 - 2019-11-28


  • Change the Key action to accept all escaped or encoded characters as key names on Windows.

  • Fix a bug where the Key/Text ‘use_hardware’ argument is ignored.

0.19.0 - 2019-11-26


  • Add FocusWindow constructor arguments to select by index or filter by passed function (thanks @daanzu).

  • Add extra FocusWindow arguments to BringApp action to use for window matching.

  • Add Natlink engine support for retaining recognition data (thanks @daanzu).

  • Add RunCommand ‘hide_window’ argument for using the action class with GUI applications.

  • Add StartApp and BringApp ‘focus_after_start’ argument for raising started applications.

  • Add unified ‘engine.do_recognition()’ method for recognising in a loop from any engine.


  • Add much faster Lark-based parser for compound specs (thanks @mrob95).

  • Allow retaining Kaldi engine recognition metadata without audio data (thanks @daanzu).

  • Change Key action to allow typing Unicode on Windows.

  • Change StartApp and BringApp to allow a single list/tuple constructor argument.

  • Change dragonfly’s test suite to use pytest instead.

  • Change engine recognition loops to exit on engine.disconnect().

  • Change the base Rule class’s default ‘exported’ value to True (thanks @daanzu).

  • Implement the PlaySound action for other platforms using pyaudio.

  • Make other various optimisations and changes (thanks @mrob95).

  • Various improvements to the Kaldi engine (thanks @daanzu).


  • Change Key and Text actions to handle multiple keyboard layouts on Windows.

  • Change NatlinkEngine.mimic() to handle string arguments.

  • Change X11Window class to handle xdotool/xprop errors gracefully instead of panicking.

  • Fix Win32Window.get_matching_windows() and the FocusWindow action for recent Dragon versions.

  • Fix a few bugs with the RunCommand, StartApp and BringApp actions.

  • Fix bug with Kaldi retain audio support where the last dictation wasn’t retained (thanks @comodoro).

  • Fix engine bugs where grammars could not be loaded/unloaded during Grammar.process_begin() (thanks @mrob95).

  • Fix various bugs related to grammar exclusivity.


  • Remove no longer used EngineTestSuite class.

  • Remove unfinished command family app sub-package (

  • Remove unused Win32 dialog and control classes.

0.18.0 - 2019-10-13


  • Add grammar/rule weights support for the Kaldi backend (thanks @daanzu).

  • Add new functions for recognition state change callbacks.

  • Add optional –delay argument to Dragonfly’s test command (CLI).

  • Allow the passing of window attributes to text engine mimic (thanks @mrob95).


  • Add magic repr methods for debugging (thanks @mrob95).

  • Add pyobjc as a required package on Mac OS (for AppKit).

  • Improve Kaldi backend performance by parsing directly on the FST instead of with pyparsing (thanks @daanzu).

  • Make Kaldi backend work with Python 3 (thanks @daanzu).

  • Make other various improvements to the Kaldi backend (thanks @daanzu).

  • Make the Monitor class and list work on X11 (Linux) & Mac OS.

  • Make the Mouse action work on X11 (Linux) & Mac OS.

  • Move 3 monitor-related methods from Win32Window to BaseWindow.


  • Change Sphinx and text engines to not accept mimicking of non-exported rules (expected behaviour).

  • Fix CompoundRule bug where the ‘exported’ parameter was effectively ignored.

  • Fix Natlink engine bug where Canadian English isn’t recognised (thanks @dusty-phillips).

  • Fix Natlink engine for all variants of supported languages.

  • Fix case sensitivity bug with AppContext keyword arguments.

  • Fix quite a few bugs with the Kaldi backend (thanks @daanzu).

  • Fix two bugs with the text engine’s mimic method (thanks @mrob95).

0.17.0 - 2019-09-12


  • Add alpha support for the accessibility API on Linux (thanks @wolfmanstout).

  • Add keywords argument handling to AppContext class for matching window attributes other than titles and executables.

  • Add the ability to set formatting flags for natlink dictation containers (thanks @alexboche).


  • Add Python 3 compatible natlink compiler test (thanks @mrob95).

  • Add a note about installing the xdotool program in the Kaldi engine documentation (thanks @JasoonS).

  • Change the Sphinx engine to allow grammars with the same name (again).

  • Move dependency adding code from engine classes into Grammar methods (thanks @mrob95).

  • Remove extraneous trailing whitespace from 116 files (thanks @mrob95).

  • Remove redundant ‘grammar.engine = self’ lines from engine classes (thanks @mrob95).

  • Lots of Kaldi engine backend improvements & bug fixes (thanks @daanzu).

  • Remove keyboard-related messages sometimes printed at import time because similar messages are printed later anyway.

  • Update documentation sections on running dragonfly’s test suite.

  • Update documentation section on logging and logging handlers.


  • Add check to avoid preparing expensive debug logs when they will be discarded (thanks @wolfmanstout).

  • Add missing is_maximized property for Win32Window class.

  • Fix Python 3 support in a few places.

  • Fix a few problems with the Sphinx engine.

  • Fix case sensitivity bug with Window.get_matching_windows().

  • Fix minor bug with Win32.get_all_windows().

  • Fix various character encoding issues with dragonfly and its unit tests.

  • Log ‘Is X installed?’ messages in X11Window if xprop or xdotool are missing.

  • Re-raise errors due to missing xprop or xdotool programs instead of suppressing them.

0.16.1 - 2019-08-04


  • Add Dictation string formatting examples into documentation.

  • Add Kaldi informational messages during grammar loading pauses.


  • Clean up code style in engines/base/

  • Bump required kaldi-active-grammar version to 0.6.0.

  • Update Kaldi engine documentation (thanks @daanzu and @LexiconCode).


  • Fix Win32Window.set_foreground() failures by forcing the interpreter’s main thread to “receive” the last input event (press & release control).

  • Fix quite a few bugs with the Kaldi engine. (thanks @daanzu).

  • Make the Sphinx engine ignore unknown words in grammars instead of raising errors.

0.16.0 - 2019-07-21


  • Add FakeWindow class imported as ‘Window’ on unsupported platforms.

  • Add RPC methods for getting speech state & recognition history.

  • Add Window.get_matching_windows() and Window.get_window class methods.

  • Add X11Window class for interacting with windows on X11 (adapted from Aenea).

  • Add alternative dragonfly module loader for natlink.

  • Add documentation for X11 keyboard and window support.

  • Add enhancements to Dictation and DictationContainer objects (thanks @mrob95).

  • Add missing Integer Repeat factor example into documentation.

  • Add optional ‘–language’ argument to dragonfly’s ‘test’ command (CLI).

  • Add xdotool & libxdo keyboard implementations to replace pynput on X11 (adapted from Aenea).


  • Change the module to import the current platform’s Window class.

  • Improve Kaldi documentation and add an example demo script (thanks @daanzu).

  • Make and files run with all test suites and on all platforms.

  • Move some code from FocusWindow into Window classes.

  • Rename dragonfly’s Window class to Win32Window and move it into

  • Swap Repeat class’s constructor arguments so that ‘extra’ is first (backwards-compatible) (thanks @mrob95).

  • Unmock the Window, WaitWindow, FocusWindow, BringApp and StartApp classes for all platforms.

  • Update Kaldi engine backend with user lexicon support, microphone listing, other improvements and bug fixes (thanks @daanzu).


  • Fix DragonflyError raised if importing ShortIntegerContent whilst using a speaker language that isn’t English.

  • Fix Thread.isAlive() deprecation warnings in Python 3.7.

  • Fix import error in SAPI5 engine file (specific to Python 3).

  • Fix incorrect file names in the ‘plus’ module loaders.

  • Fix problem with building documentation when kaldi_active_grammar is installed.

  • Fix spec string decoding in the Text action class.

0.15.0 - 2019-06-24


  • Add new Kaldi engine backend for Linux & Windows, including documentation and module loaders (thanks @daanzu).

  • Add more featureful loader for WSR with sleep/wake functionality (thanks @daanzu).

  • Add FuncContext class that determines context activity by callable argument (thanks @daanzu).

  • Allow all timer manager callbacks to be manually disabled (used in tests).


  • Change RunCommand action to use a member for the process_command argument.

  • Change how Sapi5Compiler compiles Impossible elements (more impossible now).

  • Change sphinx engine install instructions and required dependency versions.

  • Change the dragonfly.timer._Timer class so that it works correctly for all supported engines and platforms via engine.create_timer().

  • Make local development documentation use read_the_docs theme (thanks @daanzu).

  • Move timer-related engine code into DelegateTimerManagerInterface so it is re-used by multiple engines.


  • Deprecate the old dragonfly.timer._Timer class.


  • Fix SAPI5 engine setting grammars as not exclusive (thanks @daanzu).

  • Fix SAPI5 window change detection and allow manually processing (thanks @daanzu).

  • Fix slow RPC response times for WSR and natlink by adjusting engine timer intervals.

  • Preserve Dragon mic state in the NatlinkEngine.speak() method (thanks @lexxish).


  • Remove sphinxwrapper Git sub-module from project.

0.14.1 - 2019-05-31


  • Change English integers to include “too” and “to” as equivalents for “two” (thanks @lexxish).

0.14.0 - 2019-05-21


  • Add documentation on dragonfly’s logging infrastructure.

  • Add dragonfly.rpc sub-package and usage example.

  • Add enable() and disable() methods to ThreadedTimerManager class.

  • Add optional “repeating” parameter to the multiplexing Timer class and engine.create_timer() method.

  • Add recognize_forever() method to WSR engine class.


  • Change AppContext class to allow lists of titles and executables (thanks @mrob95).

  • Change WSR engine to call timer functions on the main thread.

  • Change dragonfly stdout logging formatter to include the level name.

  • Make dragonfly’s multiplexing timer classes more thread safe.

  • Replace WSR module loader’s PumpWaitingMessages loop with engine.recognize_forever().

  • Simplify sphinx engine availability checks.


  • Fix WSR engine context bug with a hook for foreground window changes (thanks @tylercal).

  • Fix a bug with Monitor objects caused by incorrect coordinate calculations (thanks @tylercal).

  • Fix some example files that break if used with Python 3.

  • Stop calling setup_log() in a few dragonfly modules to avoid side effects.

  • Stop encoding to windows-1252 in a few places if using Python 3 (thanks @tylercal).

  • Stop erasing dragonfly’s logging file now that setup_log() isn’t always used.

0.13.0 - 2019-04-24


  • Add and document optional “remap_data” parameter to Function action to allow using extras with different names than the function argument names.

  • Add Key, Text and Paste action support for X11 and Mac OS using pynput.

  • Add modified ContextAction class from Aenea (thanks @calmofthestorm).

  • Add more flexible ShortIntegerRef class (thanks @mrob95).


  • Allow saying “oh” as well as “zero” for IntegerRefs.

  • Change the Sphinx engine to disallow multiple grammars with the same name.

  • Change the Text action’s default pause value to 0.005 seconds & make it configurable.

  • Rename Language Support doc page to Language Support & Sub-package.

  • Rename 3 example command modules to start with underscores.

  • Stop mocking Windows-only sendinput classes & functions on other platforms.

  • Update some documentation to mention that dragonfly’s module loaders will load from files matching “_*.py” rather than “*.py”.


  • Allow Text sub-classes to override the ‘_pause_default’ attribute.

  • Fix Sphinx engine bug where grammar searches could be overridden.

  • Fix some issues with dragonfly’s mocked actions.

0.12.0 - 2019-04-04


  • Add CONTRIBUTING.rst file.

  • Add Repetition ‘optimize’ parameter that should reduce grammar complexity.

  • Add SphinxEngine.default_search_result property.

  • Add SphinxEngine.write_transcript_files method.

  • Add WSR/SAPI5 retain audio support for saving recognition data (thanks @daanzu).

  • Add example script into dragonfly/examples.

  • Allow passing keyword arguments to get_engine() functions (thanks @daanzu).


  • Change Sphinx and text engines to call notify_recognition() before rule processing.

  • Change Sphinx engine to allow specifying default decoder search options other than “-lm”.

  • Change SphinxEngine.process_wave_file() method to yield recognised words.

  • Change the format of the Sphinx engine’s saved training data.

  • Disable the Sphinx engine’s built-in key phrases if the engine language isn’t English.

  • Disable writing Sphinx engine training data to files by default.

  • Erase dragonfly’s log file when creating the logging handler to avoid large files.

  • Make all Sphinx engine configuration optional.

  • Replace Sphinx engine’s PYAUDIO_STREAM_KEYWORD_ARGS config option with 4 new options.

  • Simplify Sphinx engine backend code and improve its performance.

  • Update Sphinx engine documentation to reflect the other changes.


  • Add rule processing error handling to the Sphinx and text engines.

  • Fix lots of bugs with the Sphinx engine backend.

  • Fix Sphinx engine’s support for exclusive grammars and multiplexing timers.

  • Minimise dropped audio frames when recording with the Sphinx engine.


  • Remove Sphinx engine’s file.

  • Remove the Sphinx engine’s support for Dictation elements for now.

  • Remove/hide some unnecessary public SphinxEngine methods and properties.

0.11.1 - 2019-02-22


  • Change the RunCommand action to allow the command argument to be a list to pass directly to subprocess.Popen instead of through shlex.split().


  • Fix the RunCommand action so it properly parses command strings using non-POSIX/Windows paths.

  • Fix minor issues with RunCommand’s string representation and error logging.

0.11.0 - 2019-01-30


  • Add additional tests to dragonfly’s test suites.

  • Add documentation for dragonfly’s timer classes.

  • Add new synchronous and process properties and error handling to the RunCommand action.

  • Add timer manager class for the text input and SAPI 5 engines.


  • Change default engine class for SAPI 5 engine backend to Sapi5InProcEngine.

  • Change logging framework to use ~/.dragonfly.log as the log file to make logging work on Windows and on other operating systems.

  • Change the Natlink test suite to run different tests for different DNS versions.

  • Change the default test suite to the “text” engine’s test suite and add it to the CI build.

  • Change so that all symbols can be referred to by their printable representation (thanks @wolfmanstout).

  • Make several changes to the SAPI 5 engine backend so it passes the relevant dragonfly tests.

  • Update how generates code used in

  • Update several documentation pages.

  • Use a RecognitionObserver in for user feedback when using Sapi5InProcEngine.


  • Add default implementation for the RunCommand.process_command method so that most commands don’t hang without an implementation.

  • Fix bug where the Text action intermittently ignores the hardware_apps override (thanks @wolfmanstout).

  • Fix some encoding bugs with the text input engine.

  • Fix various issues with dragonfly’s tests and test framework.


  • Remove old test files.

0.10.1 - 2019-01-06


  • Disable backwards-incompatible Unicode keyboard functionality by default for the Text action. Restoring the old behaviour requires deleting/modifying the ~/.dragonfly2-speech/settings.cfg file.

0.10.0 - 2018-12-28


  • Add configurable Windows Unicode keyboard support to the Text action (thanks @Versatilus).

  • Add Windows accessibility API support to Dragonfly (thanks @wolfmanstout).

  • Add a command-line interface for Dragonfly with a “test” command.

  • Add multi-platform RunCommand action.

  • Add text input engine backend.


  • Change default paste key for the Paste action to Shift+insert.

  • Change to log errors for untypeable characters.

  • Make backwards-incompatible change to the Text class where it no longer respects modifier keys being held down by default.

  • Move TestContext class from Pocket Sphinx engine tests into test/

  • Move command module classes from loader scripts into dragonfly/


  • Fix various Unicode and encoding issues (thanks @Versatilus).

0.9.1 - 2018-11-22


  • Various changes to documentation.

  • Make Arabic, Indonesian and Malaysian languages automatically load if required.


  • Fix a bug with dragonfly’s MagnitudeIntBuilder class specific to Python 3.x.

  • Replace all imports using ‘dragonfly.all’ with just ‘dragonfly’.

  • Fix a bug where mouse wheel scrolling fails with high repeat values (thanks @wolfmanstout).

  • Fix a few minor problems with the Pocket Sphinx engine.

  • Fix error handling and logging when initialising the WSR/SAPI5 engine.

0.9.0 - 2018-10-28


  • Add default VAD decoder config options to Pocket Sphinx engine config module.

  • Add documentation page on dragonfly’s supported languages.

  • Add repository core.autorclf settings for consistent file line endings.

  • Add scrolling and extra button support for dragonfly’s Mouse action (thanks @Versatilus).


  • Adjust pyperclip version requirements now that a bug is fixed.

  • Change error types raised in a few Rule class methods.

  • Change NatlinkEngine.speak() to turn on the mic after speech playback for consistency between Dragon versions.

  • Normalise all file line endings to Unix-style line feeds.


  • Make Read the Docs generate documentation from Python modules again.

0.8.0 - 2018-09-27


  • Add EngineBase.grammars property for retrieving loaded grammars.

  • Add MappingRule.specs property to allow retrieval of specs after initialisation.

  • Add checks in Sphinx engine for using unknown words in grammars and keyphrases.

  • Add configurable speech and hypothesis recording to Sphinx engine for model training.

  • Add Sphinx engine documentation page.


  • Change Sphinx engine module loader to use local engine config if it exists.

  • Change README to reference the new documentation page on the Sphinx engine.

  • Change documentation/ to allow the docs to be built locally.

  • Change package distribution name to dragonfly2 in order to upload releases to

  • Update README and documentation/installation.txt with instructions to install via pip.

  • Replace with README.rst because PyPI doesn’t easily support markdown any more.


  • Fix a bug with CompoundRule.spec.

  • Fix translation of RuleRef without explicit name in dragonfly2jsgf (thanks @daanzu).

  • Update virtual keyboard extended key support (thanks @Versatilus).

  • Add missing methods for WSR and Sphinx engines in test/element_tester.

  • Fix a few minor problems with the Sphinx engine.

  • Fix bug where newly-constructed rules were not inactivated (thanks @wolfmanstout).


  • Remove pyjsgf submodule as it can be installed via pip now.

  • Remove Sphinx engine’s README now that there is a documentation page.

  • Remove and stop using it in

0.7.0 - 2018-07-10


  • Add multi-platform Clipboard class that works on Windows, Linux, Mac OS X.

  • Support Unicode grammar specs and window titles.

  • Support alternate keyboard layouts.

  • Add additional speech recognition backend using CMU Pocket Sphinx.

  • Add optional Sphinx dependencies as pyjsgf and sphinxwrapper Git sub-modules.

  • Add additional unit tests for enhancements.

  • Add additional six and pyperclip dependencies in


  • Mock Windows-specific functionality for other platforms to allow importing.

  • Make pywin32 only required on Windows.

  • Made natlink optional in dragonfly/

  • Clean up code styling and semantic issues.

  • Convert code base to support Python 3.x as well as Python 2.7.

  • Update natlink links in documentation.


  • Make the Paste action work with the Unicode clipboard format (thanks @comodoro).

  • Fix issues with dragonfly’s monitor list and class.







0.6.6b1 - 2009-04-13


0.6.5 - 2009-04-08


0.6.4 - 2009-02-01


0.6.4-rc3 - 2008-12-06


0.6.4-rc2 - 2008-12-02


0.6.4-rc1 - 2008-11-12


0.6.1 - 2008-10-18

This release is the first in the Git version control system.