uplint
File Safety & Integrity CLI — validate files, detect blank content, and scan for viruses in one command.
uplint inspects files the way a strict upload pipeline would: it checks that a file's real structure matches its extension, flags blank or empty documents, and (with ClamAV) scans for malware — locally or across an S3 bucket.
Installation
pip install uplint
To enable S3 bucket scanning, install the optional extra:
pip install "uplint[s3]"
Requires Python 3.11+. Virus scanning requires a running ClamAV daemon (clamd).
Quick start
# Validate a single file
uplint validate report.pdf
# Scan a whole directory
uplint scan ./uploads
# Watch a directory and validate new files as they arrive
uplint watch ./incoming
# Scan an S3 bucket (requires the [s3] extra)
uplint s3-scan my-bucket --prefix uploads/
Commands
| Command | What it does |
|---|---|
uplint validate <file> |
Validate a single file's structure, content, and (optionally) malware. |
uplint scan <dir> |
Recursively validate every file in a directory. |
uplint s3-scan <bucket> |
Validate objects in an S3 bucket (needs uplint[s3]). |
uplint watch <dir> |
Watch a directory and validate files as they are added or changed. |
Run uplint --help or uplint <command> --help for all options.
What it checks
- Structural validation — the file's binary structure matches its declared type (a
.pdfreally is a PDF, a.jpghas valid JPEG markers, and so on), catching corrupt files and polyglots. - Blank / empty detection — PDFs with no readable text, spreadsheets with no data rows, single-color images, and whitespace-only text files.
- Virus scanning — malware, embedded scripts, and known exploit patterns via ClamAV.
Output & exit codes
Results print as a table by default, or as JSON with --json for CI/CD. uplint exits non-zero when any file fails validation, so it drops straight into a pipeline:
uplint scan ./uploads --json || exit 1
Documentation
Full docs, including S3 tuning and CI/CD integration, live at https://docs.uplint.dev.
License
MIT — see LICENSE.
Metadata
Release files for uplint 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| uplint-0.1.0.tar.gz | 19.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| uplint-0.1.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 42.3 kB
Release files / uplint-0.1.0.tar.gz
| Download URL | uplint-0.1.0.tar.gz |
|---|---|
| Size | 19.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9a8343662ce649720e50d3bdec94f2af833b94ac209116eafe4fd9a06c1777d1
|
|
BLAKE2b-256 checksum How to use checksums |
1a3feba1b522f11bb6b5788a6b299018081b1e5d0ded47e9ddf845a7130de8fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|
Release files / uplint-0.1.0-py3-none-any.whl
| Download URL | uplint-0.1.0-py3-none-any.whl |
|---|---|
| Size | 22.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
244ea6e7dbd7ff67531ab27e50f4da0897b95c2faf57f3539bea28a7dcfb7c98
|
|
BLAKE2b-256 checksum How to use checksums |
02e07c6ab3de421868e8fcfbed3f79a6748649e535ff979635b596cbf27b0101
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.6
|