Skip to main content

One-binary CLI bundling 26 everyday utilities — image/video/PDF conversion, background removal, OCR, QR codes, hashing, downloads, and more

Project description

polytool

One CLI, 26 everyday utilities. Image format conversion, background removal, video/audio conversion, PDF tooling, OCR, QR codes, hashing, downloads, and more — all behind one binary called pt.

CI

Install

The fastest way (no Python prerequisite — uv brings its own):

# 1. install uv (Windows PowerShell)
irm https://astral.sh/uv/install.ps1 | iex

# 2. install polytool (slim — fast, ~80 MB)
uv tool install polytool

# or, install everything (image/video/PDF/yt-dlp/screenshots/AI background removal)
uv tool install 'polytool[full]'
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install 'polytool[full]'

Note for PowerShell users: quote 'polytool[full]' — the brackets are shell glob characters.

After install, both polytool and the short alias pt are on your PATH.

Quick start

pt qr gen "https://github.com/k6w/polytool" -o qr.png
pt img convert photo.heic -o photo.jpg
pt img bg-remove portrait.jpg                  # transparent PNG
pt vid gif clip.mp4                            # animated gif
pt vid extract-audio movie.mp4                 # mp3
pt pdf merge a.pdf b.pdf -o merged.pdf
pt pdf to-images doc.pdf --dpi 200
pt dl get 'https://www.youtube.com/watch?v=...'
pt enc hash sha256 release.zip
pt enc base64 encode README.md
pt data convert config.yaml --to json
pt gen password --length 32
pt gen uuid v7
pt color convert "#3366ff"
pt convert unit "100 km" --to mi
pt convert timestamp 1715200000
pt text slugify "Hello, World!"
pt cron explain "0 9 * * MON"
pt net http GET https://api.github.com
pt file dedupe ./Downloads
pt file archive ./project -o project.7z

Run pt --help to see all groups, or pt <group> --help for any group's verbs (each verb's help has runnable Examples).

Documentation

Full reference for every verb, argument, and option lives in docs/:

Feature reference (all 26 verbs)

Group Verbs
pt img convert (png/jpg/webp/avif/heic/svg/bmp/tiff), resize, compress, bg-remove, watermark, ascii, exif, palette, ocr
pt vid convert, trim, extract-audio, gif
pt pdf merge, split, compress, extract-text, to-images, from-images, ocr
pt dl get (yt-dlp wrapper, audio-only mode), info
pt data convert (json↔yaml↔toml↔csv↔xml), pretty, validate
pt enc hash (md5/sha1/sha256/sha512/blake2b/xxhash), base64, url, html, jwt-decode, jwt-verify
pt qr gen (png/svg/pdf/eps/terminal), wifi (Wi-Fi join code), decode
pt gen password, uuid (v1/v3/v4/v5/v7), lorem
pt file rename, dedupe, bigfiles, organize, archive (zip/tar/tar.gz/7z)
pt net port-check, ip-info, http
pt clip copy, paste
pt shot screen, web (Playwright), install
pt color convert (hex/rgb/hsl/hsv/cmyk)
pt convert unit, timestamp, base
pt text diff, wc, case (snake/kebab/camel/pascal/...), slugify, md-to-html, md-preview
pt cron explain, next

Slim vs full install

The default install ships only lightweight utilities (data, enc, gen, color, convert, text, qr-gen, cron, net, clip, file). Heavy/optional features are grouped behind extras so you only pull what you need:

Extra Adds Approx. size
[img] Pillow + HEIC/AVIF/SVG plugins, EXIF, palette, ASCII, watermark ~50 MB
[vid] ffmpeg-python + bundled ffmpeg (auto-downloaded) ~70 MB on first use
[pdf] pypdf, pikepdf, pdfplumber, PyMuPDF ~80 MB
[dl] yt-dlp ~10 MB
[shot] mss, Playwright (Chromium installed via pt shot install) ~150 MB
[ai] rembg + ONNX runtime (170 MB U2-Net model on first run) ~250 MB
[ocr] pytesseract / easyocr (PyTorch) ~1 GB if easyocr
[qr-decode] pyzbar (system libzbar on Linux) ~5 MB
[archive] py7zr ~5 MB
[full] all of the above ~1.5 GB

Verbs that need an extra you haven't installed print a friendly hint:

This command needs the 'ai' extra.
Install with: uv tool install 'polytool[ai]'

Troubleshooting

pt img convert *.svg fails on Windows

We use resvg-py (a pre-built Rust wheel) instead of cairosvg precisely to avoid the Cairo DLL pain. Reinstall the [img] extra to pull it in.

pt vid wants ffmpeg

We prefer a system ffmpeg if it's on PATH, and fall back to imageio-ffmpeg's bundled binary (auto-downloads ~70 MB on first call). Install ffmpeg system-wide with winget install ffmpeg / brew install ffmpeg / apt install ffmpeg to skip the bundled download.

pt img bg-remove is downloading something

First run pulls the U2-Net ONNX model (~170 MB) into ~/.u2net/. Set U2NET_HOME to relocate.

pt qr decode says pyzbar missing

On Linux, install the system library: sudo apt-get install libzbar0 (Debian/Ubuntu) or sudo dnf install zbar (Fedora). Then reinstall [qr-decode].

pt shot web fails on first run

Chromium isn't installed yet. Run pt shot install (which is shorthand for python -m playwright install chromium).

pt img ocr says Tesseract not found

The default tesseract engine needs the system Tesseract binary. Either install it (winget install --id UB-Mannheim.TesseractOCR on Windows, brew install tesseract, apt install tesseract-ocr) or pass --engine easyocr to use a self-contained PyTorch OCR.

Brackets in uv tool install 'polytool[full]'

PowerShell parses unquoted brackets — always wrap the spec in single quotes.

Contributing

git clone https://github.com/k6w/polytool
cd polytool
uv sync --extra dev --extra img --extra vid --extra pdf --extra dl --extra shot --extra archive --extra qr-decode
uv run pre-commit install
uv run pytest
uv run ruff check .

Conventional Commits required (feat:, fix:, chore:, docs:, test:, ci:, build:).

Each user-facing verb must:

  • Include a runnable Examples: block in its --help.
  • Read from path or stdin (-) where it's semantic.
  • Default --output to next-to-source for files, stdout for text.
  • Raise PolytoolError(msg, hint=...) on user errors (rendered as a red panel).
  • Ship at least one happy-path and one error-path test.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

polytool-0.1.0.tar.gz (33.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

polytool-0.1.0-py3-none-any.whl (42.4 kB view details)

Uploaded Python 3

File details

Details for the file polytool-0.1.0.tar.gz.

File metadata

  • Download URL: polytool-0.1.0.tar.gz
  • Upload date:
  • Size: 33.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for polytool-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0a23d04f85bfb37db890207f66ce6c48145d69d1cdcf7efb63a2ece611fba18e
MD5 959fd25884173fb94b6f899691512b46
BLAKE2b-256 e68084834a4eef66ccc60aa1d09b1fee00b1eb4599e330c18361441e86f2d6fd

See more details on using hashes here.

File details

Details for the file polytool-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: polytool-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 42.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.7 {"installer":{"name":"uv","version":"0.11.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for polytool-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 92c4b09c3a6368981a02f7f75fbc62f2d44e37191a5ae5b4c386ec195fcce73f
MD5 d8c59bd7e4049926c35518ee83996690
BLAKE2b-256 ff84b15b11151c5c62d03b6a0b19c0375211e9e65a4992a87307f7edd65ca396

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page