A hardware password manager that types your passwords when you touch it with an enrolled finger.
- 6-capture enrollment - Touch ID style enrollment for better accuracy
- Dual Keyboard Support - USB HID or BLE Keyboard (switchable via web UI)
- WiFi AP Configuration - Configure via web interface at 192.168.4.1
- USB Serial Configuration - Alternative USB-based config (no WiFi interference)
- 10 finger support - Map passwords to specific fingers on left/right hands
- Re-enrollment protection - Re-enrolling a finger overwrites the previous entry
- ESP32-S3 & ESP32-C6 support - Works with both chips
| Component | Description |
|---|---|
| Seeed XIAO ESP32-S3 | Recommended - USB HID + WiFi + BLE |
| Seeed XIAO ESP32-C6 | Alternative - BLE only, WiFi 6 |
| R502-A | Capacitive fingerprint sensor with RGB LED |
See hardware/README.md for wiring diagram and details.
![]() |
![]() |
|---|---|
| Interior assembly | Wiring detail |
| R502-A Pin | ESP32-S3 Pin | GPIO | Description |
|---|---|---|---|
| VCC (Red) | 3V3 | - | Power |
| GND (Black) | GND | - | Ground |
| TXD (Yellow) | D5 | 6 | Sensor TX → ESP32 RX |
| RXD (Green) | D4 | 5 | Sensor RX ← ESP32 TX |
| VT (White) | 3V3 | - | Touch power (always on) |
| R502-A Pin | ESP32-C6 Pin | GPIO | Description |
|---|---|---|---|
| VCC (Red) | 3V3 | - | Power |
| GND (Black) | GND | - | Ground |
| TXD (Yellow) | D7 | 17 | Sensor TX → ESP32 RX |
| RXD (Green) | D6 | 16 | Sensor RX ← ESP32 TX |
| VT (White) | 3V3 | - | Touch power (always on) |
For serial-based configuration without WiFi interference:
- ESP32-S3: Uses native USB CDC Serial @ 115200 baud (requires correct USB Mode settings)
- ESP32-C6: Uses native USB CDC Serial @ 115200 baud
- No additional wiring required - just USB-C cable
- Web Serial API interface in browser (Chrome/Edge)
- See docs/serial-configuration.md for details
- Build - See docs/assembly.md
- Flash - Upload firmware with correct settings:
See Programming Guide for details
arduino-cli compile --fqbn esp32:esp32:XIAO_ESP32S3:USBMode=default,CDCOnBoot=default firmware/firmware.ino arduino-cli upload -p /dev/cu.usbmodem1101 --fqbn esp32:esp32:XIAO_ESP32S3:USBMode=default,CDCOnBoot=default firmware/firmware.ino
- Configure - Open
firmware/config.htmlin Chrome/Edge → Click "Connect Device" - Enroll - Tap a finger on the hand diagram, set name and password
- Use - Touch enrolled finger to type password
TouchPass/
├── firmware/ # ESP32 source code
│ ├── firmware.ino # Main firmware
│ ├── modules/ # Modular components
│ ├── webpage.h # Embedded web UI
│ ├── config.html # USB Serial configuration interface
│ └── sketch.json # Arduino config
├── hardware/ # Wiring, schematics, PCB (future)
├── enclosure/ # 3D printable case
├── docs/ # Documentation
│ ├── assembly.md # Build instructions
│ ├── programming-guide.md # Flashing & setup
│ ├── serial-configuration.md # USB config guide
│ └── images/ # Photos & screenshots
├── LICENSE # MIT License
└── README.md # This file
- Arduino IDE or arduino-cli
- ESP32 board support package (v3.x)
- ESP32-BLE-Keyboard library
The ESP32-BLE-Keyboard library needs modification to coexist with USBHIDKeyboard. Edit BleKeyboard.h:
- Wrap KEY_* constants with
#ifndef KEY_LEFT_CTRLguard - Wrap KeyReport typedef with
#ifndef _KEYREPORT_DEFINEDguard
Also edit USBHIDKeyboard.h in the ESP32 core library:
- Wrap KeyReport typedef with
#ifndef _KEYREPORT_DEFINEDguard
See docs/library-patches.md for details.
ESP32-S3 (XIAO):
cd firmware
arduino-cli compile --fqbn esp32:esp32:XIAO_ESP32S3:USBMode=default,CDCOnBoot=default firmware.ino
arduino-cli upload -p /dev/cu.usbmodem1101 --fqbn esp32:esp32:XIAO_ESP32S3:USBMode=default,CDCOnBoot=default firmware.inoCRITICAL: Must use USBMode=default (TinyUSB) and CDCOnBoot=default (Enabled) for Web Serial API compatibility.
See Programming Guide for detailed explanation.
ESP32-C6:
cd firmware
arduino-cli compile --fqbn esp32:esp32:XIAO_ESP32C6:PartitionScheme=huge_app .
arduino-cli upload -p /dev/cu.usbmodem* --fqbn esp32:esp32:XIAO_ESP32C6:PartitionScheme=huge_app .Note: If the USB port disappears, hold BOOT button while plugging in USB.
- Power on the device (blue breathing LED = WiFi on, LED off = WiFi off)
- Touch enrolled finger on sensor
- Password is typed automatically via USB or Bluetooth keyboard
Option 1: WiFi (Web Interface)
- Connect to WiFi network "TouchPass" (password:
touchpass) - Open http://192.168.4.1 in any browser
- Tap a finger on the hand diagram to enroll or edit
- Set name, password, and optional "press Enter" setting
Option 2: USB Serial Configuration (Recommended)
- Connect via USB-C cable to your computer
- Open
firmware/config.htmlin Chrome or Edge - Click "Connect Device" and select TouchPass
- Visual interface for enrollment and configuration
- No WiFi interference with fingerprint sensor
- Uses Web Serial API (see docs/serial-configuration.md)
|  |  |
|---|---|
| Main configuration interface | Finger enrollment dialog |
Hold any finger on sensor for 5 seconds to toggle WiFi on/off.
- Open web interface at http://192.168.4.1
- Click on the keyboard status in the top bar (shows "USB" or "BLE")
- Confirm the switch - device will restart
| Pattern | Color | Meaning |
|---|---|---|
| Breathing | Blue | WiFi enabled, standby |
| Off | - | WiFi disabled, standby |
| Breathing | Blue | Enrolling - waiting for finger |
| Flash | Green | Capture success |
| Solid | Green | Finger recognized |
| Solid | Red | Unknown finger / error |
| Feature | ESP32-S3 | ESP32-C6 |
|---|---|---|
| USB HID Keyboard | ✓ | ✗ |
| BLE Keyboard | ✓ | ✓ |
| WiFi | ✓ (needs antenna) | ✓ (built-in) |
| Default Mode | USB | BLE |
ESP32-S3 WiFi Note: The XIAO ESP32-S3 requires an external antenna connected to the U.FL connector for reliable WiFi.
Contributions welcome!
- Report bugs or suggest features via Issues
- Submit PRs for code improvements
- Design a 3D printable case
- Improve documentation
- Passwords stored in plain text in flash memory
- WiFi configuration requires physical proximity
- Standard USB HID / BLE HID (no encryption)
- Physical device access = password access
- Consider disabling WiFi after configuration (hold finger 5s)



