AnyWhichWay, LLC

Changing Possible


AnyWhichWay provides a variety of open source JavaScript repositories.

At AnyWhichWay we love reactive programming, some of our developers started using it in the 1980s on LISP machines and DEC VAXs! Check out our front-end and back-end reactive frameworks Lightview and Watchlight below.

Our president, Simon Blackwell, also has experience in higher education and provides strategic consulting to ed tech companies and universities.


Small, simple, powerful web UI and micro front end creation …

Great ideas from Svelte, React, Vue and Riot combined into one small tool: < 6.5K (minified/gzipped)

1) Single file and template components. 2) Sandboxed remote components and micro front ends. 3) Debug mode and unit testable components using standard JavaScript debuggers. 4) No pre-deployment transpilation/compilation required. 5) SPA, and MPA friendly … short steps away from SEO friendly. 6) Svelte like variable usage, i.e. write your state modifying code like normal code. 7) TypeScript like runtime type checking of variables in components. 8) Automatic import, export, cross-component sync, or reactive response to attributes/props/variables. 9) Automatic form variable creation and binding. 10) Attribute directives like l-if, and a single powerful l-for that handles array and object keys, values, and entries. 11) String template literals for content and attribute value replacement with optional reactivity. 12) No virtual DOM. The Lightview dependency tracker laser targets just those nodes that need updates.

Documentation is available at [](] and source is available at NPM or Github.


Watchlight provides a range of approaches to support reactive programming beyond the DOM and user interface with a light-weight JavaScript module (14K minified, 4.6K gzipped).

1) Event listeners on any reactive object via addEventListener. 1) Observers via functions wrapping reactive objects, e.g. observer(() => console.log( will log the name every time it changes. Unlike event listeners, they can monitor multiple objects at the same time. 1) Inference rules similar to Drools or Rools and modeled after the Promise paradigm. 1) Spreadsheets … no reactive library would be complete without them.

The spreadsheet is headless, sparse and n-dimensional. It is provided as a separate file, ./sheet.js and is not included in the 4.5K size stated above. Sheet is currently 5.5K minified and 2K gzipped.

Watchlight does not use any intermediate languages or transpilation; hence, you can debug all of your code as written using a standard JavaScript debugger.

Documentation is available at [](] and source is available at NPM or Github.


Faster than fast, smaller than micro … a nano speed and size (780 Brotili bytes) memoize for single and multiple argument functions.

The devs caiogondim and planttheidea have produced great memoizers. We analyzed their code to see if we could build something faster than fast-memoize and smaller than micro-memoize while adding back some of the functionality of moize removed in micro-memoize. We think we have done it … but credit to them … we just merged the best ideas in both and e liminated excess code.

During development we also discovered that despite its popularity and goal to be the fastest possible memoizer, fast-memoize is actually quite slow when it comes to multiple argument functions because it uses JSON.stringify to generate a single key generator for all arguments and only memoizes out to 3 arguments. This is not to say it should not be used, it also seems to have the cleanest software architecture and it may be theoretically possible to write a high-speed multi-argument plugin. And, MANY people are very happy with it.

nano-memoize doesn’t have a lot of GitHub stars, but it has reached over 157K weekly downloads on NPM and issues are actively addressed. Also available on Github.


Like nano-memoize, we believe this is the fastest JavaScript function of its kind, although not the smallest. Intersector supports the intersection of arrays containing primitive data, objects, or mixed types at 2x to 3x the speed of other approaches. Available at NPM or Github.


Integrated performance testing for Mocha based unit testing.

Benchtest provides a performance testing wrapper around the Mocha unit test runner. It can be used as a light weight, not as quite as powerful, but far easier to configure alternative to the stellar Benchmark JS library.

Benchtest set-up can be done in as little as three lines of code for Node projects.

const benchtest = require("benchtest");
mocha.afterEach(function () { benchtest.test(this.currentTest); });
mocha.after(() =>{log:"md"}));

Available at NPM or Github.


Small, focused full-text indexing and search for any JavaScript application.

Txi does just two things:

It creates a full text index of strings or JavaScript objects passed to it and associates entries with an id also passed in.

It supports index searching and returns a rank ordered list of matches including the id to be used by the calling application to retrieve the original data.

Txi indexes are just JSON objects that can be saved and restored like any other JSON object.

By default, txi minimizes false positives and false negatives by using a scoring mechanism that takes into account stems, misspellings, trigrams, and disemvoweled versions of words. This can be tuned to reduce memory usage if desired.

Available at NPM or Github.


Send email to [email protected]