The way it works is it generates an NFA for a rule. You can define sets of sounds, some of which can be multiple characters long, and also define distinctive features, which allows you to define how sounds change by adding or removing them, but also allows you to match groups of sounds based on combinations of distinctive features. It builds up these ad-hoc sets of sounds and produces a prefix tree, which it uses as a template to build the NFA. Finally, the NFA is converted to a DFA for performance. It takes a while (the console app is much faster than the browser demo), but the rules run many, many times, so they need to be fast. It's essentially a special purpose regex engine. I'm working on bug fixes and some enhancements for now, but it basically works.