Made with 💜 in Evanston, IL at the Northwestern Inclusive Technology Lab
V11 is a cross-platform framework for building assistive scripts, workflows, and plugins. It is built on top of V8 and Node.JS to provide a lightweight and easy to learn interface for querying and manipulating native accessibility APIs, while also relieving you of cross-platform nightmares when building for multiple operating systems.
V11 is currently in a Developer Preview and will have a beta release later this spring
For stability reasons, this API currently showcases the MacOS implementation of V11. The beta release will include support for all major platforms (mac, windows, linux). For an early preview of whats to come please reach out to the project's lead: Tommy McHugh at [email protected].
Make sure to install:
Once these have installed, run the following commands
npm install -g node-gyp
node-gyp install
On macOS, you might also have to install XCode and install command line tools by running
xcode-select --install
V11 uses the Bazel build system for compiling the project. This allows the project to rely on a single build system for building all cross-platform components. Once you have installed Bazel you can generate the V11 developer-mode javascript library by running:
git clone https://github.com/InclusiveTechNU/v11.git && cd v11
bazel build //v11/typescript:v11_lib_node_dev
The output library can be imported into a Node project using the following statement:
const v11 = require('./bazel-bin/v11/typescript/v11.js');
Note: There are a few prerequisites that will embeded within a future release of V11. Make sure to have Node.JS, Yarn, and Pip installed. Otherwise you might have some fun errors.
V11 is inspired by the DOM to make modifying the accessibility tree easy. Here's a simple example to mute a track in GarageBand.
const v11 = require('v11');
const gb = v11.system.getApplicationByName("GarageBand");
const mute = gb.getElementsByLabel("Mute")[0];
mute.actions.press();
V11 supports more than just performing accessibility actions. In fact, you can even listen for them too. Here's an example of how to listen for textbox entry in TextEdit.
const v11 = require('v11');
const notes = v11.system.getApplicationByName("TextEdit");
notes.getElementsByType("textarea")[0].addEventListener('value', () => {
console.log("hey");
});
You can learn about the current stable API here. We are continually adding features to improve accessibility modifications and querying so check back often! You can also see some simple examples of V11 scripts here. Additionally, we provide a boilerplate project to help you get setup here.
Good luck and happy coding!
We welcome contributions of all kinds from filing issues and bug or typo fixes to large feature implementations. Our team is trying to build the premiere tool for developing assistive services on all platforms, so we need your help!
If you have ideas or want to start working on a contribution, file an issue and submit a pull request.
Read more in the CONTRIBUTING.md file.
This project is supported by NSF Award 1901456