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.
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.
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.
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:
If you test it on another model, please open an issue or PR to add it here.
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
# 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
python gui.py
The GUI provides scanner discovery, scan settings (DPI, color, brightness, contrast, output format), live preview, and save-to-file.
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.
The protocol is straightforward:
+OK 200 (ready) or -NG 401 (busy)0x82 = end of page, 0x80 = end of scanThe 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.
freethescan.py — CLI tool and scanner protocol library
gui.py — tkinter GUI with preview
LICENSE — MIT
README.md — this file
The scanner protocol was independently reverse-engineered by several people before this project. Their work was invaluable in understanding how Brother scanners communicate:
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.
MIT.
1 commits
Python
98.5%
Makefile
1.5%
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.
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.
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.
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:
If you test it on another model, please open an issue or PR to add it here.
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
# 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
python gui.py
The GUI provides scanner discovery, scan settings (DPI, color, brightness, contrast, output format), live preview, and save-to-file.
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.
The protocol is straightforward:
+OK 200 (ready) or -NG 401 (busy)0x82 = end of page, 0x80 = end of scanThe 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.
freethescan.py — CLI tool and scanner protocol library
gui.py — tkinter GUI with preview
LICENSE — MIT
README.md — this file
The scanner protocol was independently reverse-engineered by several people before this project. Their work was invaluable in understanding how Brother scanners communicate:
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.
MIT.
1 commits
Python
98.5%
Makefile
1.5%