sylvinus/freethescan

Free the Scan ! Driver-less, universal, multi-platform scanning app

0

stars

1

commits

Python

primary language

May 11, 2026

updated

README

freethescan

Driverless network scanner. Pure Python. No blobs. Works forever.

Your scanner still works. The manufacturer just stopped talking to it. freethescan talks directly to your scanner over the network — no proprietary drivers, no binary blobs, no software that expires when the next OS update ships.

The problem

You have a perfectly good multifunction printer with a scanner. You update your OS. Scanning stops working. The manufacturer says your model is "no longer supported." The hardware is fine. The glass is clean. The light bar still moves.

The only thing that broke was the proprietary driver that sat between your computer and the scanner.

The fix

freethescan bypasses all of that. It speaks the scanner's native network protocol directly — a simple TCP conversation on port 54921. No kernel extensions, no binary blobs, no architecture-specific libraries. Just Python and your network.

It runs on macOS (Intel and Apple Silicon), Linux (x86, ARM, Raspberry Pi), and Windows. If your machine can run Python, it can scan.

Supported scanners

Currently supports Brother network scanners that use the brscan4 protocol. This covers most Brother MFC and DCP models from the last ~15 years, including models that Brother has officially dropped support for.

Tested on:

  • Brother MFC-J6920DW (macOS Tahoe 26.3, ARM64)

If you test it on another model, please open an issue or PR to add it here.

Install

pip install Pillow

That's it. Pillow is the only dependency. tkinter ships with Python.

For auto-discovery of scanners on the network (optional):

pip install zeroconf

CLI usage

# Grayscale scan at 300 DPI
freethescan 192.168.1.50

# Color scan to JPEG
freethescan 192.168.1.50 --color -o photo.jpg

# Scan to PDF
freethescan 192.168.1.50 --pdf -o document.pdf

# High-res color PDF
freethescan 192.168.1.50 --color --dpi 600 --pdf -o hires.pdf

# Using a .local hostname
freethescan brw40490f5d007f.local --color

# Low-res quick scan
freethescan 192.168.1.50 --dpi 100 -o quick.png

# Verbose output (debug protocol)
freethescan 192.168.1.50 -v

GUI usage

python gui.py

The GUI provides scanner discovery, scan settings (DPI, color, brightness, contrast, output format), live preview, and save-to-file.

Finding your scanner's IP

Your scanner's IP is usually shown on its LCD panel under network settings. You can also find it with:

# macOS
dns-sd -G v4 brw____________.local

# Linux
avahi-resolve-host-name brw____________.local

# Or just ping it
ping brw____________.local

The brw____________ hostname is printed on a label on the scanner itself.

How it works

The protocol is straightforward:

  1. Open a TCP connection to port 54921 on the scanner
  2. Scanner responds with +OK 200 (ready) or -NG 401 (busy)
  3. Send a lease request with resolution and color mode
  4. Scanner responds with its capabilities (scan area, DPI, ADF status)
  5. Send a scan request with area, compression, brightness, contrast
  6. Receive chunked image data (raw pixels or JPEG)
  7. 0x82 = end of page, 0x80 = end of scan

The protocol is text-based commands wrapped in escape sequences, with binary image data in chunked transfer. No encryption, no authentication, no DRM. The scanner just sends you the pixels.

Project structure

freethescan.py   — CLI tool and scanner protocol library
gui.py           — tkinter GUI with preview
LICENSE          — MIT
README.md        — this file

Acknowledgments

The scanner protocol was independently reverse-engineered by several people before this project. Their work was invaluable in understanding how Brother scanners communicate:

Contributing

If you have a scanner that doesn't work with freethescan, the best thing you can do is run with -v and share the output. The protocol is similar across Brother models but there are small variations in response formats.

If you have a non-Brother scanner and want to add support for its protocol, PRs welcome. The architecture is designed to be extended.

License

MIT.

Contributors

sylvinus

1 commits

sylvinus/freethescan

Free the Scan ! Driver-less, universal, multi-platform scanning app

0

stars

1

commits

Python

primary language

May 11, 2026

updated

README

freethescan

Driverless network scanner. Pure Python. No blobs. Works forever.

Your scanner still works. The manufacturer just stopped talking to it. freethescan talks directly to your scanner over the network — no proprietary drivers, no binary blobs, no software that expires when the next OS update ships.

The problem

You have a perfectly good multifunction printer with a scanner. You update your OS. Scanning stops working. The manufacturer says your model is "no longer supported." The hardware is fine. The glass is clean. The light bar still moves.

The only thing that broke was the proprietary driver that sat between your computer and the scanner.

The fix

freethescan bypasses all of that. It speaks the scanner's native network protocol directly — a simple TCP conversation on port 54921. No kernel extensions, no binary blobs, no architecture-specific libraries. Just Python and your network.

It runs on macOS (Intel and Apple Silicon), Linux (x86, ARM, Raspberry Pi), and Windows. If your machine can run Python, it can scan.

Supported scanners

Currently supports Brother network scanners that use the brscan4 protocol. This covers most Brother MFC and DCP models from the last ~15 years, including models that Brother has officially dropped support for.

Tested on:

  • Brother MFC-J6920DW (macOS Tahoe 26.3, ARM64)

If you test it on another model, please open an issue or PR to add it here.

Install

pip install Pillow

That's it. Pillow is the only dependency. tkinter ships with Python.

For auto-discovery of scanners on the network (optional):

pip install zeroconf

CLI usage

# Grayscale scan at 300 DPI
freethescan 192.168.1.50

# Color scan to JPEG
freethescan 192.168.1.50 --color -o photo.jpg

# Scan to PDF
freethescan 192.168.1.50 --pdf -o document.pdf

# High-res color PDF
freethescan 192.168.1.50 --color --dpi 600 --pdf -o hires.pdf

# Using a .local hostname
freethescan brw40490f5d007f.local --color

# Low-res quick scan
freethescan 192.168.1.50 --dpi 100 -o quick.png

# Verbose output (debug protocol)
freethescan 192.168.1.50 -v

GUI usage

python gui.py

The GUI provides scanner discovery, scan settings (DPI, color, brightness, contrast, output format), live preview, and save-to-file.

Finding your scanner's IP

Your scanner's IP is usually shown on its LCD panel under network settings. You can also find it with:

# macOS
dns-sd -G v4 brw____________.local

# Linux
avahi-resolve-host-name brw____________.local

# Or just ping it
ping brw____________.local

The brw____________ hostname is printed on a label on the scanner itself.

How it works

The protocol is straightforward:

  1. Open a TCP connection to port 54921 on the scanner
  2. Scanner responds with +OK 200 (ready) or -NG 401 (busy)
  3. Send a lease request with resolution and color mode
  4. Scanner responds with its capabilities (scan area, DPI, ADF status)
  5. Send a scan request with area, compression, brightness, contrast
  6. Receive chunked image data (raw pixels or JPEG)
  7. 0x82 = end of page, 0x80 = end of scan

The protocol is text-based commands wrapped in escape sequences, with binary image data in chunked transfer. No encryption, no authentication, no DRM. The scanner just sends you the pixels.

Project structure

freethescan.py   — CLI tool and scanner protocol library
gui.py           — tkinter GUI with preview
LICENSE          — MIT
README.md        — this file

Acknowledgments

The scanner protocol was independently reverse-engineered by several people before this project. Their work was invaluable in understanding how Brother scanners communicate:

Contributing

If you have a scanner that doesn't work with freethescan, the best thing you can do is run with -v and share the output. The protocol is similar across Brother models but there are small variations in response formats.

If you have a non-Brother scanner and want to add support for its protocol, PRs welcome. The architecture is designed to be extended.

License

MIT.

Contributors

sylvinus

1 commits

Languages

Python

98.5%

Makefile

1.5%