A browser extension for Chrome/Chromium and Firefox that turns your SoloKeys 2 device into a password manager with built-in TOTP support for 2FA authentication.
- 🔐 Device-based TOTP: All secrets stored securely on your SoloKeys 2 hardware key
- 🌐 Site Detection: Automatically detects matching credentials for current website
- 📱 QR Code Scanning: Easily add credentials by scanning QR codes
- 👆 Touch Support: Handles touch-required credentials with on-screen guidance
- 🔒 PIN Protection: Supports PIN-protected credentials
- 📝 Manual Entry: Add credentials manually with Base32 secrets
- ⚡ Quick Access: Generate OTP codes directly from the extension popup
- 📋 Auto-copy: Optionally auto-copy generated codes to clipboard
- Visit the Chrome Web Store (link TBD after publishing)
- Click "Add to Chrome"
- Follow the installation prompts
- Build the Firefox package with
node build.js --firefoxormake firefox - For local testing, open
about:debugging#/runtime/this-firefox - Click "Load Temporary Add-on" and select
dist-firefox/manifest.json - For release use, sign the generated
.xpiwithWEB_EXT_API_KEY=... WEB_EXT_API_SECRET=... npm run sign:firefox
Option A - Quick Install:
# Clone and build
git clone <repository-url>
cd chrome-solokeys-totp
make build
./install.shOption B - Manual Steps:
- Clone or download this repository
- Build the extension:
# With Make (if available) make build # Or with Node.js node build.js
- Load the Chrome build from
dist/viachrome://extensions/, or load the Firefox build fromdist-firefox/viaabout:debugging#/runtime/this-firefox - The extension icon should appear in your browser toolbar
Option C - Using CRX File:
# Build CRX package
make crx
# Then drag solokeys-vault-*.crx onto chrome://extensions/ page
# (Developer mode must be enabled)- Chrome/Chromium or Firefox Desktop
- SoloKeys 2 device with firmware supporting the Vault app
- USB connection to your SoloKeys device
- Click the SoloKeys Vault icon in your browser toolbar
- Click "Connect SoloKeys" to authorize the extension to access your device
- Select your SoloKeys device from the browser dialog
Via QR Code (Recommended):
- Go to the options page (right-click icon → Options)
- Click the "Add Credential" tab
- Click "Scan QR" and point your camera at the 2FA QR code
- Adjust settings (touch required, PIN protected) if needed
- Click "Add Credential"
Via Manual Entry:
- Open the options page
- Enter the credential name (use format:
Service:username@domain) - Paste the secret key from your service's 2FA setup
- Configure algorithm, digits, and protection options
- Click "Add Credential"
From Popup:
- Click the SoloKeys Vault icon
- Click on any credential from the list
- The OTP code will be displayed with a countdown timer
- Click "Copy to Clipboard" or the code will auto-copy (if enabled)
From Website:
- When visiting a site with matching credentials, an indicator appears on OTP input fields
- Click the SoloKeys indicator to select a credential
- The code is automatically filled into the input field
To set or change your SoloKeys PIN:
- Open the options page
- Navigate to the "PIN Management" tab
- Follow the instructions to set or change your PIN
- Secrets never leave the device: All TOTP secrets are stored securely on your SoloKeys 2 hardware
- PIN verification: Optional PIN protection for sensitive credentials
- Touch confirmation: Optional physical touch requirement for credential use
- No browser storage: Credentials are never stored in browser storage, always fetched fresh from device
- Make sure your SoloKeys is plugged in
- Click "Connect SoloKeys" and select your device from the browser dialog
- Try reconnecting the device
- Some credentials are PIN-protected
- Enter your PIN in the popup or options page
- Some credentials require physical button press
- Press the button on your SoloKeys device when prompted
- Ensure you've granted camera permission to the extension
- Try in a well-lit environment
- Make sure the QR code is clearly visible
This extension communicates with SoloKeys 2 devices using:
- WebHID API: For USB HID communication
- CTAPHID Protocol: For device communication
- ISO 7816 APDU: Command structure
- OATH Protocol: TOTP/HOTP implementation (vendor command 0x70)
LIST(0xA1): List all credentialsCALCULATE(0xA2): Generate OTP codePUT(0x01): Add new credentialDELETE(0x02): Remove credentialVERIFY_PIN(0xB2): Verify device PINSET_PIN(0xB4): Set initial PINCHANGE_PIN(0xB3): Change existing PIN
chrome-solokeys-totp/
├── manifest.json # Extension manifest
├── background/ # Service worker
│ └── service-worker.js # Device management & OATH protocol
├── popup/ # Extension popup UI
│ ├── popup.html
│ └── popup.js
├── options/ # Options page
│ ├── options.html
│ └── options.js
├── content/ # Content script
│ └── content.js # Site detection & field enhancement
├── lib/ # Shared libraries
│ ├── ctaphid.js # CTAPHID/WebHID communication
│ ├── apdu.js # ISO 7816 APDU
│ ├── tlv.js # TLV encoding
│ ├── oath.js # OATH protocol
│ └── utils.js # Utility functions
└── icons/ # Extension icons
- Node.js 14+ (for build scripts)
- Chrome/Chromium or Firefox Desktop for testing
# Install dependencies (optional, for enhanced ZIP creation)
npm install
# Build both browser packages
make build
# or
node build.js
# Create the Chrome package only
make zip
# or
node build.js --chrome
# Create the Firefox package only
make firefox
# or
node build.js --firefox
# Sign the Firefox release package
WEB_EXT_API_KEY=... WEB_EXT_API_SECRET=... npm run sign:firefox
# Create CRX for manual installation
make crx
# or
node build.js --chrome --crxnode build.js- Build Chrome and Firefox packagesnode build.js --chrome- Build Chrome outputs onlynode build.js --firefox- Build Firefox outputs onlynode build.js --crx- Build both browsers and add a Chrome CRXnode build.js --validate- Validate extension without buildingnode build.js --clean- Clean build artifactsmake package- Build both browsers and a Chrome CRX
Method 1: Chrome Web Store (Recommended for distribution)
- Build the extension:
make build - Upload
solokeys-vault-chrome-v<version>.zipto Chrome Web Store Developer Dashboard - Follow the publishing process
- Share the extension ID with users
Method 2: Firefox Package
- Build the extension:
make firefox - Load
dist-firefox/manifest.jsonviaabout:debugging#/runtime/this-firefoxfor local testing - Sign
solokeys-vault-firefox-v<version>.xpivianpm run sign:firefoxfor release distribution
Firefox release builds for normal Firefox channels must be signed. The repo includes a signing helper based on Mozilla's web-ext sign.
npm install
npm run build:firefox
WEB_EXT_API_KEY=... WEB_EXT_API_SECRET=... npm run sign:firefoxThis writes a normalized signed artifact as solokeys-vault-firefox-v<version>-signed.xpi.
Method 3: Developer Mode (For testing)
- Build:
make build - Chrome/Chromium: open
chrome://extensions/, enable "Developer mode", then loaddist/ - Firefox: open
about:debugging#/runtime/this-firefox, then loaddist-firefox/manifest.json
Method 4: Automated Installation Helper
# Run the install script
./install.sh
# Or limit output to one browser
./install.sh --chrome
./install.sh --firefoxMethod 5: Manual CRX Installation
- Build:
make crx - Open Chrome →
chrome://extensions/ - Enable "Developer mode"
- Drag and drop the
.crxfile onto the page
# 1. Validate extension structure
make validate
# 2. Build for testing
make build
# 3. Load dist/ in Chrome or dist-firefox/manifest.json in Firefox
# 4. Make changes and rebuild
make build
# 5. Create distribution package
make package
# 6. Clean build artifacts when done
make cleanMIT License - See LICENSE file for details
- Based on the SoloKeys OATH protocol used by Vault
- Inspired by the SoloKeys GUI application
- Uses jsQR library for QR code scanning