Skip to content

Releases: mzyy94/AirScap

v1.5.0 AirScap

Choose a tag to compare

@mzyy94 mzyy94 released this 20 May 14:52

What's Changed

Improvements

  • OCR accuracy upgrade (ndlocr-lite v1.2.0) — Bumped the bundled ndlocr-lite submodule to upstream v1.2.0 and switched PARSeq weights to the newer 24x* / r8data-202604 set (input height 16 → 24). DEIM preprocessing was aligned with the upstream rollback to bilinear resize, and detection boxes are now clipped to the padded image bounds to match upstream behavior. Existing deployments must update both the binary and the model files together — the new binary expects the new filenames and the old binary cannot read the new ones.
  • Bilinear chroma upsampling for YCbCr JPEG decoding — JPEG images from the scanner are decoded with proper bilinear chroma upsampling instead of nearest-neighbor, eliminating the colored-block artifacts that previously appeared along text edges and faint borders in 4:2:0 / 4:2:2 scans. This also improves OCR accuracy on color-mode scans.
  • PIL/libjpeg-exact YCbCr → RGB conversion — The YCbCr-to-RGB color matrix and rounding now match PIL / libjpeg byte-for-byte. Decoded pixels are bit-identical to the reference Python pipeline, which removes a long tail of sub-pixel OCR mismatches and makes regression tests reproducible across platforms.

Full Changelog: v1.4.0...v1.5.0

AirScap v1.4.0

Choose a tag to compare

@mzyy94 mzyy94 released this 03 May 12:48

What's Changed

New Features

  • Built-in OCR for searchable PDFs — AirScap now embeds an ONNX Runtime based OCR engine (NDL OCR Lite — DEIM layout detection + PARSeq character recognition) and can produce PDFs with a transparent searchable text layer. OCR is opt-in via AIRSCAP_OCR_MODEL_DIR and runs entirely in-process; no external ocrmypdf / Tesseract install is required.
  • Per-flow OCR toggles in the Web UI — Two independent switches were added to the Web UI: one applies OCR to PDFs returned to AirScan / eSCL clients, the other applies OCR to button-scan PDFs (saved locally / FTP / Paperless-ngx). The card is shown only when an OCR engine is available.
  • Standalone OCR PDF CLI — New cmd/ndlocr-pdf command applies OCR to an existing PDF or to scanned page images, useful for batch-processing without going through the scanner.

Improvements

  • ONNX Runtime auto-detection — On startup, AirScap searches the standard system paths (ONNXRUNTIME_LIB, /opt/homebrew/lib, /usr/local/lib, /usr/lib, etc.) for libonnxruntime.dylib / libonnxruntime.so so users typically do not need to set the runtime path manually.
  • Graceful OCR fallback — If model loading fails, OCR is silently disabled and AirScap continues to serve plain (non-searchable) PDFs. If OCR fails on a single page, the engine logs a warning and falls back to a plain PDF for that scan.
  • Embedded metrics-only font — The OCR text layer uses a metrics-only TrueType font compiled into the binary, so the searchable layer renders correctly without shipping a full Japanese font and without bloating the PDF.

Internal

  • CER-based accuracy regression tests — Added Character Error Rate tests for the OCR engine to prevent quality regressions when models or preprocessing change.
  • ndlocr-lite vendored as a submodule — The reference Python implementation is included for parity testing and as a source of weights / configuration files used by the Go engine.

Full Changelog: v1.3.1...v1.4.0

AirScap v1.3.1

Choose a tag to compare

@mzyy94 mzyy94 released this 03 May 12:47

What's Changed

Bug Fixes

  • Avoid scanner firmware hang during multi-page scans — Removed the READ_PIXELSIZE SCSI query that was issued after every page transfer. Real-device testing showed that issuing this command during a scan session causes the iX500 firmware to hang (typically around the 3rd query) and renders both the data and control channels unresponsive. The official mobile app does not issue this command during scanning, so removing it brings AirScap behavior in line with the reference implementation.
  • Save partial results when a scan fails midway — When the scanner stalls or errors after returning some pages, the pages that were successfully received are now saved (PDF / individual files / FTP / Paperless) instead of being discarded. The job still reports the underlying error, so partial scans no longer silently lose data.
  • Recover from stuck scan jobs — Replaced the global sync.Mutex that guarded scan execution with a deadline-based ScanGuard. If a scan goroutine hangs or panics for any reason, subsequent button presses (or Web UI scan triggers) are accepted again after a timeout instead of being permanently rejected with scan already in progress.
  • Multi-feed error recovery — Improved handling of multi-feed (重送) detection so the session is correctly torn down and reported, rather than leaving the scan loop in an inconsistent state.

Documentation

  • PIXELSIZE protocol caveat — Added a CAUTION block to protocol.md / protocol.en.md explaining that READ_PIXELSIZE (SCSI READ DataType=0x80) must not be sent during a scan session, with a note that the firmware crash is reproducible on real hardware.

Full Changelog: v1.3.0...v1.3.1

AirScap v1.3.0

Choose a tag to compare

@mzyy94 mzyy94 released this 24 Feb 15:21

What's Changed

Improvements

  • Correct DPI detection for PDF output — PDF page sizes are now calculated from actual DPI embedded in image data (JPEG JFIF APP0 / TIFF IFD XResolution) instead of using the requested DPI. This fixes incorrect page dimensions when the scanner returns images at a different resolution than requested.
  • Scan preview enhancements — Preview modal now shows image metadata (pixel size, DPI, file size) in the footer. Pagination controls moved to footer to maximize image display area.
  • TIFF preview fallback — When the browser cannot render TIFF images (e.g. Chrome), a download prompt is shown instead of a broken image.
  • Per-page MIME detection — Scan preview now detects MIME type from image magic bytes per page.
  • Scanner error reporting — Generic scanner errors (ScanErrGeneric) are now displayed in the Web UI alongside paper jam, cover open, and multi-feed errors.
  • ADF status resilience — When CheckADFStatus network call fails, cached ADF error state (JAM, cover open, etc.) is still reported in both eSCL and Web UI responses.

Internal

  • Unknown scan status flag detection — Logs a warning when unrecognized ADF status bits are detected, aiding future protocol analysis.

Full Changelog: v1.2.0...v1.3.0

AirScap v1.2.0

Choose a tag to compare

@mzyy94 mzyy94 released this 22 Feb 15:47

What's Changed

New Features

  • Native PDF output — eSCL clients can now receive PDF directly from the server without relying on go-mfp's filter conversion. Supports both color and B/W CCITT Group 4 compressed PDF output natively.
  • Wi-Fi signal strength in Web UI — Web UI now displays the scanner's Wi-Fi connection status with color-coded signal strength indicators (strong/normal/weak/disconnected) in both English and Japanese.

Improvements

  • Pure Go build (CGO-free) — Removed libjpeg/libpng C library dependencies. The build is now fully static with CGO_ENABLED=0, simplifying cross-compilation and deployment.
  • Reject incompatible format requests — Scan requests for formats not supported by the scanner (e.g. requesting color output for a B/W-only configuration) are now rejected with a proper error instead of silently falling back to filter conversion.
  • Color Encoding protocol fix — Fixed the VENS scan config marshalling to use the correct default compression argument, improving compatibility with the scanner's native protocol.
  • Protocol specification update — Synchronized protocol.md / protocol.en.md with the current implementation to accurately reflect compression arguments and color encoding behavior.

Internal

  • Captured packet based test cases — Added 15 test functions with packet data extracted from actual pcap captures, verifying parse and marshal round-trips for all major VENS packet types.

Full Changelog: v1.1.0...v1.2.0

AirScap v1.1.0

Choose a tag to compare

@mzyy94 mzyy94 released this 22 Feb 02:13

What's Changed

New Features

  • JPEG quality control — Added a compression quality slider (1–5) to Web UI button scan settings. Allows balancing image quality vs file size for JPEG output.

Improvements

  • B/W PDF optimization — 1-bit black & white PDFs now use 1-bit paletted PNG, significantly reducing file size.
  • eSCL ScanImageInfo support — Implemented the ScanImageInfo endpoint (eSCL §11.2), returning actual image dimensions after scanning.
  • Scan progress reporting — Added ImagesCompleted to eSCL job status, so macOS Image Capture and other clients now show proper page-by-page scan progress instead of "Warming up".

Full Changelog: v1.0.0...v1.1.0

AirScap v1.0.0

Choose a tag to compare

@mzyy94 mzyy94 released this 21 Feb 09:10

AirScan bridge for legacy Wi-Fi ScanSnap scanners.

The ScanSnap Connect Application has been discontinued and ScanSnap Home has dropped support for the iX500, leaving no way to scan over Wi-Fi. AirScap brings your ScanSnap back to life by bridging the proprietary VENS protocol to standard eSCL (AirScan), making it work with any modern scan client out of the box.

Highlights

  • Driver-free scanning — Works with macOS Image Capture, Linux SANE (sane-airscan), and Windows Scan (WSD)
  • Zero configuration — Auto-discovers your ScanSnap on the network and connects automatically
  • Versatile scanning — Color / grayscale / B&W, simplex & duplex, PDF / JPEG / TIFF output, blank page removal, bleed-through reduction
  • Physical button support — Press the scanner button to scan and save to a local folder, FTP server, or Paperless-ngx
  • Web UI — Configure settings and monitor scanner status from your browser (English / Japanese)
  • Single binary — Built in Go with zero runtime dependencies. Ships with a systemd service unit for easy deployment

Tested Environment

Developed and tested with ScanSnap iX500 on macOS Image Capture. Other ScanSnap models using the VENS protocol may work but have not been verified.

See the README for full installation and configuration instructions.

Full Changelog: https://github.com/mzyy94/AirScap/commits/v1.0.0