Skip to content
Collaborative text editor (like Google Docs or CoderPad) with integrated semi-anonymizing voice chat intended to help reduce bias in technical communication.
TypeScript HTML CSS JavaScript
Branch: master
Clone or download

README.md

Blindpad

The publicly hosted version of Blindpad is available here: blindpad.github.io.

What is Blindpad?

Blindpad is an open source collaborative text editor (like Google Docs or CoderPad) with integrated semi-anonymizing voice chat intended to help reduce bias in technical communication.  In particular it can be used to extend the concept of “blind auditions” to software programming and technical design interviews.  It is inspired by economists Claudia Goldin (Harvard) and Cecilia Rouse (Princeton) who concluded in their 1997 paper that the introduction of blind auditions in professional orchestras is likely responsible for about one-third of the 250% increase in female membership between 1970 and the mid 1990s.

For more information:

Blindpad

How does it work?

Semi-anonymizing voice chat

Before joining a pad the app has an simple (one-time) audio calibration screen where the user is asked to read a few phrases.  During this process Blindpad attempts to measure the fundamental frequency of the user’s voice.  With this information Blindpad can perform a slight pitch-shift to an ambiguous frequency in the range where many male and female voices overlap.  This can help reduce bias in an interview setting (potentially in both directions) although studies have shown that pitch is not the only factor that human brains use to classify the gender of a speaker.

Multi-way blind

All participants in a pad are anonymized: usernames are randomly generated pseudonyms and no account sign-up is necessary.

Peer-to-peer and ephemeral

Blindpad users connect directly to each other using peer-to-peer technology (via the WebRTC API).  This makes Blindpad fairly inexpensive to host (and thus free to use) and guarantees no intermediary exists that needs to know a user’s real identity or contact information.

Reducing “stereotype threat”

The typical user flow avoids stereotype threat as much as possible by removing the focus from the user’s identity and placing it on the workspace.  Besides the name, the core app doesn’t provide any indication of a special purpose beyond similar text editors.

No special configuration

Applicant Tracking Systems or recruiting coordinators need only decide on a URL to share with with all parties before an interview.

How can I use Blindpad?

A public version of Blindpad is hosted at blindpad.github.io.  Blindpad can be hosted on your own servers quite easily: you only need to serve the static content and host a small (~100 line) NodeJS signaler (used for peer discovery).

What’s the long-term goal of the project?

The overarching goal of the project is to build a community capable of producing, hosting, and maintaining excellent free tooling that reduces bias in evaluation and communication.  This is a really hard problem and while a perfect solution might not be possible incremental progress is straightforward.

An important next step would be to produce (or lobby for) anonymizing plugins for popular Applicant Tracking Systems (like Greenhouse, Lever, Jobvite, and Taleo).  With sufficient resources we could also start to produce an open-source ATS designed from the ground up to anonymize certain steps of the hiring process.

How can I contribute to the project?

If you’d like to support the project financially you can click here to donate. Donations will be used to upgrade the public hosted version of Blindpad and to fund ongoing development.

If you’re inclined to contribute creatively (with code or design help) feel free to check out the repository, read over the project’s roadmap, and/or submit a pull request.

Lastly: if you have any ideas or feature requests on how to make the app more successful feel free to open an issue on Github.

What should I do if I have a problem or run into a bug?

For all problems please open an issue on Github. If possible please try to include simple steps to reproduce the problem.

Who developed Blindpad?

Blindpad was developed by Ryan Noon. It leverages many other open source projects, including Typescript, Angular2, and libraries by @mikolalysenko and @nkohari.  See comments in the code for full attribution.  Blindpad is free software under the Apache License.

Setting up the code

# clone the repo
git clone git@github.com:blindpad/blindpad.git

# install dependencies
npm install

There's an npm script for all of the common operations.

# start a local dev server for the app (using the public signaler by default)
npm run dev-app

# do a development build of the app and signaler
npm run build

# do a production build of the app and signaler
npm run prod

# run available unit tests (focused mostly on audio processing)
npm run test

See Protocol.ts and Auth.ts for configuring your installation: they hold all of the options you'll need to setup a signaler and point a frontend at it. If anything isn't clear please file an issue.

Roadmap

  • Better hosting for the public version.
  • Standard in-app textual chat / messaging.
  • Investigate improved robustness and flood protection on the signaler.
  • Recovery after network outage: restart the pad if the user detects that the swarm has timed them out. (Or gray-out the screen and prompt the user to refresh).
  • Listen for dead audio, show an alert about the Chrome + Mac bug and prompt the user to refresh.
  • Audit for accessibility / screenreader support.
  • Translation into other languages.
  • Undo doesn't work as most users would expect (you can undo remote changes). Possible solution with Codemirror is linked documents (where each remote user object symbolically has their own). See here.

Long-term ideas

  • Drop resource files to share in the workspace.
  • Run certain languages in the browser via emscripten ports (where available).
  • Some form of more advanced voice anonymization (more subtle gender quirks?, non-native accent modulation?).
  • Anonymizing video chat (using some sort of mo-cap or masking?).
You can’t perform that action at this time.