💦🤘 A mimetic poly-alloy of the Quicksilver scoring algorithm, essentially LiquidMetal. </Schwarzenegger Voice>
JavaScript HTML
Latest commit 0954d16 Mar 26, 2015 @rmm5t Added square cash
Failed to load latest commit information.
test Fixed test suite so that it runs in IE7 Apr 21, 2012
vendor Added jsLitmus.js to vendor dir Dec 18, 2011
.gitignore Cleaned up gitignore Dec 18, 2011
LICENSE.txt Bumped version to 1.3.0 Aug 19, 2014
README.markdown Added square cash Mar 26, 2015
liquidmetal.js Bumped version to 1.3.0 Aug 19, 2014
package.json Bumped version to 1.3.0 Aug 19, 2014



A mimetic poly-alloy of the Quicksilver scoring algorithm, essentially LiquidMetal. </Schwarzenegger Voice>

Flex matching short abbreviations against longer strings is a boon in productivity for typists. Applications like Quicksilver, Alfred, LaunchBar, and Launchy have made this method of keyboard entry a popular one. It's time to bring this same functionality to web controls. LiquidMetal makes scoring long strings against abbreviations easy.

How You Can Help

Square Cash Gratipay Book a Codementor session

If you like this project, buy me a coffee, donate via Gratipay, or book a session with me on Codementor.

Bitcoin: 1rmm5tv6f997JK5bLcGbRCZyVjZUPkQ2m


Include the library:

<script src="liquidmetal.js" type="text/javascript"></script>

Score any string against an abbreviation:

LiquidMetal.score("FooBar",  "foo")   //=> 0.950
LiquidMetal.score("FooBar",  "fb")    //=> 0.917
LiquidMetal.score("Foo Bar", "fb")    //=> 0.929
LiquidMetal.score("Foo Bar", "baz")   //=> 0.0
LiquidMetal.score("Foo Bar", "")      //=> 0.8

All scores fall between a range of 0.0 (no match) to 1.0 (perfect match).

Inspired By


  • To satisfy my own requirements for the jquery.flexselect plugin
  • The Quicksilver algorithm doesn't give proper weight to abbreviations that match the first character of the scored string.
  • The Quicksilver algorithm is extremely slow for certain length string/abbreviation combinations because of its use of recursion. While slightly slower for shorter length string/abbreviation combinations, LiquidMetal outperforms the Quicksilver algorithm by orders of magnitude under other conditions.
  • The javascript version of the Quicksilver algorithm (Quicksilver.js) is case sensitive and doesn't give added weight to camel case strings; whereas, LiquidMetal is case insensitive and does give added weight to uppercase letters in camel case strings.


  • More tests
  • Consider tweaking the scores for "trailing" characters
  • Improve implementation of highest score matching (LiquidMetal currently returns the highest scoring match for an abbreviation, but is inefficient)
  • See if it's possible to tune the performance further


Ryan McGeary (@rmm5t)


MIT License

Copyright (c) 2009-2014, Ryan McGeary (ryan -[at]- mcgeary [dot] org)