TurboVPB is a free browser extension that speeds up phone banking with EveryAction's Open Virtual Phone Bank (OpenVPB), VAN, VoteBuilder, and BlueVote.
Get the extension at turbovpb.com.
⭐ If you find TurboVPB helpful, please leave a review in the Chrome Web Store or Mozilla Add-Ons to help others find it too! ⭐
The TurboVPB extension parses contact details from the virtual phone bank page and sends them to a static site loaded on the caller's phone. Messages are encrypted between the extension and the static site such that the server cannot read the contact details.
To connect the extension and mobile page, the user scans a QR code generated by the extension with their phone. The link encoded in the QR code points to https://turbovpb.com/connect and includes connection details in the URL fragment (hash), so the server never sees the encryption key.
TurboVPB never collects or stores the names, phone numbers, or any personal details of people contacted.
The project is a monorepo with three independent components:
- Extension (
extension/) - Browser extension for Chrome and Firefox, built with TypeScript, Preact, and WXT. Content scripts scrape contact details from supported phone bank platforms and manage the WebSocket connection. Includes a popup for call stats and an options page for message templates. - Relay Server (
server/) - Rust server (Axum, Tokio) that acts as a WebSocket pub/sub relay between the extension and the mobile page. It never sees decrypted contact data. Deployed to Fly.io. - Mobile Page - Static page served at
turbovpb.com/connectthat receives encrypted contacts, decrypts them in the browser, and displays them for easy calling/texting.
Phone Bank Page Relay Server Mobile Phone
┌────────────────┐ ┌─────────────┐ ┌──────────────┐
│ Extension │──WSS──▶│ WebSocket │──WSS──▶│ Static Page │
│ │ │ Pub/Sub │ │ │
│ Scrape contact │ │ │ │ Decrypt with │
│ Encrypt (AES) │ │ (encrypted │ │ key from URL │
│ Send via WS │ │ pass-thru) │ │ Display info │
└────────────────┘ └─────────────┘ └──────────────┘
│ ▲
└───── QR code (contains channel ID + key) ─────┘
TurboVPB uses a publish-subscribe pattern where the messages are end-to-end encrypted using symmetric encryption.
For each phone bank session, the extension uses the browser's SubtleCrypto.generateKey() method to create an AES-GCM encryption key with a 256-bit key.
The encryption key is passed to the static mobile site in the URL fragment/hash at the end of the URL encoded in the QR code.
In addition, the extension generates a random PubSub channel ID, which is also communicated to the mobile page in the connection URL.
Open an issue or email me at evan [at] turbovpb [dot] com.