Case study
iX500 Scan: a macOS client for the reverse-engineered ScanSnap Wi-Fi protocol
Replaces ScanSnap Home for a Fujitsu/PFU ScanSnap iX500 on macOS with a SwiftUI app and Python service that scan over Wi-Fi through the community-reverse-engineered VENS protocol, or over USB through SANE, and produce searchable PDFs. It vendors bramheerink’s GPL-2.0 driver, extends it for macOS, and documents further handshake and hardware-status fields, including the scan-button bit. Results are author-reported; the repository publishes no tests or captures.
Requirements and limitations
- Reviewed commit 24a5f7c (three commits, all dated 2026-10-15) targets the Fujitsu/PFU ScanSnap iX500. README says ScanSnap Home 3.7 is no longer maintained and hangs on macOS 27; the project offers Wi-Fi scanning started by the device’s scan button, a USB path through SANE, and searchable PDFs with rotation, cropping, blank-page removal and OCR. No release build is published, and other ScanSnap models are not claimed.
- The Wi-Fi path needs the user’s own iX500 and two values that README says only ScanSnap Home knows: the scanner’s 12-character pairing key and the paired computer’s 8-byte HostID. They are obtained once from ScanSnap Home’s own connection to that scanner; the repository includes no vendor software, firmware or captures.
- Building needs macOS 14+, Xcode 15+ (Swift tools 5.10), the system Python 3 with Pillow, and Homebrew sane-backends, ocrmypdf, img2pdf and tesseract-lang. build.sh bundles the Python service and vendored driver into an ad-hoc-signed app that runs the service with /usr/bin/python3.
- The protocol work extends bramheerink/scansnap, whose VENS specification says it was reverse-engineered from captures of ScanSnap Home talking to an iX500. README adds handshake fields for the paired HostID, local time and UTC offset, hardware-status bits for an empty feeder and the scan button, and a session timeout of about 40 s, and notes that Wi-Fi images always arrive as 300 dpi colour, rotated 180° with scanner background. No automated tests, captures or comparisons with ScanSnap Home output are published; this review ran neither the app nor a scanner.
- GPL-2.0, matching the vendored driver at commit 5706688, whose file header records the author’s changes. This is an unofficial client, not recovered vendor source or firmware. The repository’s draft social posts credit an evening with Claude Code for closing the remaining protocol gaps; no REA use is stated.
About this entry
- Type
- Case study
- Category
- Independent reconstruction cases
- Relationship
- Independent reconstruction project
- Targets
- App · Protocol
Sources reviewed
The description was reviewed against primary sources. This does not establish runtime testing, security auditing or verified compatibility.
Primary sources
- README.md GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- vens/PROTOCOL GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- vens/README.md GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- vens/scansnap.py GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- scansnapd.py GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- app/Package.swift GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- app/build.sh GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- app/Sources/IX500Scan/ScannerService.swift GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- social/texte.md GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- LICENSE GitHub · jonaswagnr/ix500-scan · Revision 24a5f7c
- LICENSE GitHub · bramheerink/scansnap · Revision 5706688