Metadata-Version: 2.5
Name: onekit-tools
Version: 0.6.3
Summary: One simple toolkit. An offline CLI and Python processing library.
Project-URL: Homepage, https://onekit.org
Project-URL: Repository, https://github.com/mattiapiazzalunga/onekit
Project-URL: License, https://github.com/mattiapiazzalunga/onekit/blob/main/LICENSE
Project-URL: Documentation, https://onekit.org/docs/
Project-URL: Issues, https://github.com/mattiapiazzalunga/onekit/issues
Project-URL: Requests, https://onekit.org/requests/
Author-email: Mattia Piazzalunga <hello@mattiapiazzalunga.com>
License-Expression: LicenseRef-PolyForm-Shield-1.0.0
License-File: LICENSE
License-File: NOTICE
Keywords: cli,conversion,diff,pdf,privacy,utilities
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Topic :: Utilities
Requires-Python: >=3.11
Provides-Extra: all
Requires-Dist: asn1crypto==1.5.1; extra == 'all'
Requires-Dist: brotli<2,>=1.2.1; (sys_platform != 'win32' or platform_machine != 'ARM64') and extra == 'all'
Requires-Dist: defusedxml<0.8,>=0.7.1; extra == 'all'
Requires-Dist: defusedxml==0.7.1; extra == 'all'
Requires-Dist: fonttools<5,>=4.67; extra == 'all'
Requires-Dist: json5<1,>=0.14; extra == 'all'
Requires-Dist: jsonschema<5,>=4.26; extra == 'all'
Requires-Dist: license-expression==30.4.4; extra == 'all'
Requires-Dist: markdown-it-py<5,>=4.2; extra == 'all'
Requires-Dist: markdownify<2,>=1.2.3; extra == 'all'
Requires-Dist: numpy<3,>=2.3; extra == 'all'
Requires-Dist: olefile==0.47; extra == 'all'
Requires-Dist: openpyxl<4,>=3.1.5; extra == 'all'
Requires-Dist: pillow<14,>=13; extra == 'all'
Requires-Dist: pycryptodome<4,>=3.24.1; extra == 'all'
Requires-Dist: pypdf<7,>=6.21.2; extra == 'all'
Requires-Dist: pypdfium2<6,>=5.14; extra == 'all'
Requires-Dist: pytesseract<0.4,>=0.3.13; extra == 'all'
Requires-Dist: python-barcode==0.16.1; extra == 'all'
Requires-Dist: python-docx<2,>=1.2; extra == 'all'
Requires-Dist: python-pptx<2,>=1.0.2; extra == 'all'
Requires-Dist: pyyaml<7,>=6.0.3; extra == 'all'
Requires-Dist: reportlab<5,>=4.4; extra == 'all'
Requires-Dist: resvg-py==0.5.0; extra == 'all'
Requires-Dist: ruff<0.18,>=0.17; extra == 'all'
Requires-Dist: segno<2,>=1.6.6; extra == 'all'
Requires-Dist: stream-inflate==0.0.12; extra == 'all'
Requires-Dist: stream-unzip==0.0.91; extra == 'all'
Requires-Dist: stream-zip==0.0.84; extra == 'all'
Requires-Dist: tomli-w<2,>=1.2; extra == 'all'
Requires-Dist: xmlschema<5,>=4.2; extra == 'all'
Requires-Dist: zxing-cpp<4,>=3.1.1; extra == 'all'
Provides-Extra: background
Requires-Dist: numpy<3,>=2.3; extra == 'background'
Requires-Dist: onnxruntime<2,>=1.23.2; extra == 'background'
Requires-Dist: pillow<14,>=13; extra == 'background'
Requires-Dist: pooch<2,>=1.8.2; extra == 'background'
Provides-Extra: barcode
Requires-Dist: pillow<14,>=13; extra == 'barcode'
Requires-Dist: python-barcode==0.16.1; extra == 'barcode'
Requires-Dist: zxing-cpp<4,>=3.1.1; extra == 'barcode'
Provides-Extra: converters
Requires-Dist: defusedxml<0.8,>=0.7.1; extra == 'converters'
Requires-Dist: openpyxl<4,>=3.1.5; extra == 'converters'
Requires-Dist: pillow<14,>=13; extra == 'converters'
Requires-Dist: pypdf<7,>=6.21.2; extra == 'converters'
Requires-Dist: pyyaml<7,>=6.0.3; extra == 'converters'
Requires-Dist: reportlab<5,>=4.4; extra == 'converters'
Requires-Dist: resvg-py==0.5.0; extra == 'converters'
Provides-Extra: devtools
Requires-Dist: defusedxml<0.8,>=0.7.1; extra == 'devtools'
Requires-Dist: json5<1,>=0.14; extra == 'devtools'
Requires-Dist: jsonschema<5,>=4.26; extra == 'devtools'
Requires-Dist: pyyaml<7,>=6.0.3; extra == 'devtools'
Requires-Dist: ruff<0.18,>=0.17; extra == 'devtools'
Requires-Dist: tomli-w<2,>=1.2; extra == 'devtools'
Requires-Dist: xmlschema<5,>=4.2; extra == 'devtools'
Provides-Extra: documents
Requires-Dist: markdown-it-py<5,>=4.2; extra == 'documents'
Requires-Dist: markdownify<2,>=1.2.3; extra == 'documents'
Requires-Dist: openpyxl<4,>=3.1.5; extra == 'documents'
Requires-Dist: python-docx<2,>=1.2; extra == 'documents'
Requires-Dist: python-pptx<2,>=1.0.2; extra == 'documents'
Provides-Extra: fonts
Requires-Dist: brotli<2,>=1.2.1; (sys_platform != 'win32' or platform_machine != 'ARM64') and extra == 'fonts'
Requires-Dist: fonttools<5,>=4.67; extra == 'fonts'
Provides-Extra: images
Requires-Dist: numpy<3,>=2.3; extra == 'images'
Requires-Dist: pillow<14,>=13; extra == 'images'
Provides-Extra: licenses
Requires-Dist: brotli<2,>=1.2.1; (sys_platform != 'win32' or platform_machine != 'ARM64') and extra == 'licenses'
Requires-Dist: defusedxml==0.7.1; extra == 'licenses'
Requires-Dist: fonttools<5,>=4.67; extra == 'licenses'
Requires-Dist: license-expression==30.4.4; extra == 'licenses'
Requires-Dist: olefile==0.47; extra == 'licenses'
Requires-Dist: pillow<14,>=13; extra == 'licenses'
Requires-Dist: pypdf<7,>=6.21.2; extra == 'licenses'
Provides-Extra: ocr
Requires-Dist: pytesseract<0.4,>=0.3.13; extra == 'ocr'
Provides-Extra: pdf
Requires-Dist: pillow<14,>=13; extra == 'pdf'
Requires-Dist: pypdf<7,>=6.21.2; extra == 'pdf'
Requires-Dist: pypdfium2<6,>=5.14; extra == 'pdf'
Requires-Dist: reportlab<5,>=4.4; extra == 'pdf'
Provides-Extra: pdfa
Requires-Dist: charset-normalizer>=3.5.2; extra == 'pdfa'
Requires-Dist: click>=8.4.2; extra == 'pdfa'
Requires-Dist: colorama>=0.4.6; extra == 'pdfa'
Requires-Dist: fonttools<5,>=4.67; extra == 'pdfa'
Requires-Dist: lxml>=6.1.1; extra == 'pdfa'
Requires-Dist: numpy<2.4,>=2.3; extra == 'pdfa'
Requires-Dist: pikepdf[pdfa]==10.17.0; extra == 'pdfa'
Requires-Dist: tqdm==4.70.1; extra == 'pdfa'
Provides-Extra: qrcode
Requires-Dist: pillow<14,>=13; extra == 'qrcode'
Requires-Dist: python-barcode==0.16.1; extra == 'qrcode'
Requires-Dist: segno<2,>=1.6.6; extra == 'qrcode'
Requires-Dist: zxing-cpp<4,>=3.1.1; extra == 'qrcode'
Provides-Extra: security
Requires-Dist: pycryptodome<4,>=3.24.1; extra == 'security'
Requires-Dist: stream-inflate==0.0.12; extra == 'security'
Requires-Dist: stream-unzip==0.0.91; extra == 'security'
Requires-Dist: stream-zip==0.0.84; extra == 'security'
Provides-Extra: signing
Requires-Dist: pyhanko<1,>=0.34; extra == 'signing'
Provides-Extra: test
Requires-Dist: build<2,>=1.6; extra == 'test'
Requires-Dist: hatchling==1.32.4; extra == 'test'
Requires-Dist: pip-audit<3,>=2.10; extra == 'test'
Requires-Dist: pip-licenses<6,>=5.5; extra == 'test'
Requires-Dist: pytest<10,>=9.1; extra == 'test'
Requires-Dist: ruff<0.18,>=0.17; extra == 'test'
Provides-Extra: transcription
Requires-Dist: faster-whisper<2,>=1.2.1; extra == 'transcription'
Provides-Extra: verification
Requires-Dist: asn1crypto==1.5.1; extra == 'verification'
Requires-Dist: pycryptodome<4,>=3.24.1; extra == 'verification'
Requires-Dist: pypdf<7,>=6.21.2; extra == 'verification'
Provides-Extra: video
Requires-Dist: yt-dlp-ejs==0.8.0; extra == 'video'
Requires-Dist: yt-dlp<2027,>=2026.8.19; extra == 'video'
Description-Content-Type: text/markdown

<!-- Copyright 2026 Mattia Piazzalunga -->
<!-- SPDX-License-Identifier: LicenseRef-PolyForm-Shield-1.0.0 -->

Languages: [English](README.md) · [Italiano](docs/locales/it/README.md) · [Français](docs/locales/fr/README.md) · [Español](docs/locales/es/README.md) · [Deutsch](docs/locales/de/README.md) · [Русский](docs/locales/ru/README.md) · [中文](docs/locales/zh/README.md).

<p align="center">
  <a href="https://onekit.org"><img src="https://raw.githubusercontent.com/mattiapiazzalunga/onekit/main/images/logo.png" alt="OneKit logo" width="112" height="112"></a>
</p>
<h1 align="center">OneKit</h1>
<p align="center">One simple toolkit. Your files stay yours.</p>
<p align="center"><a href="https://github.com/mattiapiazzalunga/onekit/stargazers"><img alt="GitHub stars" src="https://img.shields.io/github/stars/mattiapiazzalunga/onekit"></a> <a href="https://pypi.org/project/onekit-tools/"><img alt="PyPI" src="https://img.shields.io/pypi/v/onekit-tools"></a> <img alt="PolyForm-Shield-1.0.0" src="https://img.shields.io/badge/license-PolyForm_Shield_1.0.0-blue"> <img alt="Python 3.11+" src="https://img.shields.io/badge/python-3.11%2B-blue"></p>

An offline Python toolkit with 230 tools for conversions, PDFs, images, archives, fonts, file inspection, encryption, developer utilities, OCR and comparisons. Use this CLI or the graphical interface at **[onekit.org](https://onekit.org)**.

**Source version:** `0.6.3`. Stable downloads exist only after the release workflow completes. The distribution is `onekit-tools`; the separately owned PyPI project called `onekit` is unrelated.

The [contact and media guide](docs/contact-media.md) covers standalone vCard generation, QR-to-vCard extraction, image upscaling, background removal, video compression/speed/GIF and local audio transcription.

License checks: inspect PDF, Word, PowerPoint, Excel, video, audio, images, fonts, EPUB, code/projects and datasets from files or public URLs. Analysis stays local; reports are **unverified estimates, not ownership certificates or permission to use**. See [license check usage and limits](docs/cli.md#local-license-and-copyright-estimates).

**Your CLI. Your agentic CLI.** Use OneKit yourself or let a local AI agent call it through a terminal or subprocess. Discover tools and requirements as JSON, pass explicit input/output paths and reuse saved `.1kit` workflows for repeatable file tasks. See [local agents and automation](docs/cli.md#local-agents-and-automation).

## Install

Python 3.11+ is required. The universal wheel supports Windows, macOS and Linux on x64/ARM64. Optional native libraries and external engines have additional platform requirements.

After publication:

```sh
python -m pip install onekit-tools
python -m pip install "onekit-tools[pdf,images,documents]"
onekit list
onekit doctor
```

From a source checkout:

```sh
python -m pip install -e ".[all,test]"
python -m onekit --help
python -m pytest -q
```

The base CLI has **no runtime dependencies**. Install only the extras you need. `all` includes the standard Python families; video downloading, background removal, transcription and cryptographic signing use the separate `video`, `background`, `transcription` and `signing` extras. Install native engines separately. For Node-based developer tools, install Node.js 24+ and run `onekit engines install`. The CLI prepares missing dependencies and external engines on first use. Background removal and transcription download model weights on first use, then reuse the local cache.

## Use

```sh
onekit run pdf-merge first.pdf second.pdf -o combined.pdf
onekit run pdf-extract-pages document.pdf --options '{"pages":"1,3-5"}' -o selected.pdf
onekit run image-convert image.png --options '{"format":"webp"}' -o image.webp
onekit run diff-notebook before.ipynb after.ipynb --options '{"mode":"code"}' -o changes.json
onekit run security-encrypt private-folder --ask-password -o private.zip
onekit run security-decrypt private.zip --ask-password -o restored
```

Options are JSON objects; pass them as one quoted shell argument. Use `--ask-password` for secrets. Existing outputs are preserved unless you pass `--force`.

`onekit list --group pdf`, `onekit list --json` and `onekit doctor TOOL_ID` expose contracts and requirements. Every tool has a directory under [tools](tools), containing metadata and a pointer to its shared implementation. See the [CLI guide](docs/cli.md) for options and limits.

## Toolkit

| Family | Capabilities |
| --- | --- |
| Converters | Markdown, HTML, LaTeX, PDF, Word, PowerPoint, images, Base64, Excel, CSV and JSON |
| PDF | Merge/split, page selection/order/removal, compression, repair, [direct text editing](docs/pdf-editing.md), text overlays, rotation, digital signatures, encryption/unlock, [local PDF/A conversion/validation](docs/pdfa.md) |
| Images | Extract embedded PDF images, compress, crop and change format |
| Media | Audio/video conversion through separately installed FFmpeg |
| Archives / fonts | ZIP/TAR variants; TTF/OTF containers and WOFF/WOFF2 |
| Inspector / security | Type signatures, structure, metadata, encoding, hashes, text counts; authenticated encrypted file/folder archives |
| Developer | Language-specific formatting, parser/compiler validation and selected minification |
| OCR | Scanned images/PDF to searchable PDF, Word, Markdown, LaTeX, HTML and JSON |
| Diff | Text, code, normalized JSON, notebooks, LaTeX, PDF and Word text |

## Pipelines and development

`onekit pipeline --steps workflow.1kit INPUTS -o OUTPUT` accepts a versioned `.1kit` workflow document. Each step receives prior outputs. Single-input steps map over multiple outputs; merge steps receive the collection. Incompatible types stop processing.

Report bugs and suggestions through [GitHub issues](https://github.com/mattiapiazzalunga/onekit/issues) or the [website request board](https://onekit.org/requests/). Contributors can find work in either place.

## Contribute to OneKit

Help build OneKit's open revolution: everyday tools for everyone, from hands-on tasks to workflows run by local AI agents. Contribute to make tools more efficient and effective: improve speed and memory use, fix incorrect results, add regression examples, or clarify documentation and agent workflows.

The core is Open Source (PolyForm Shield 1.0.0). Read the [contribution guide](https://github.com/mattiapiazzalunga/onekit/blob/main/CONTRIBUTING.md) and find a task in [GitHub issues](https://github.com/mattiapiazzalunga/onekit/issues), or suggest an improvement on the [request board](https://onekit.org/requests/).

## License and creator

Created by **[Mattia Piazzalunga](mailto:hello@mattiapiazzalunga.com)**. Copyright © 2026 Mattia Piazzalunga. Open Source (PolyForm Shield 1.0.0), licensed under [PolyForm Shield 1.0.0](LICENSE); see [NOTICE](NOTICE), [AUTHORS.txt](AUTHORS.txt) and [CONTRIBUTORS.txt](CONTRIBUTORS.txt). Third-party components retain their licenses. External engines are separate programs with their own redistribution obligations.

You may use, modify and redistribute the core for permitted purposes, including commercial and internal use. You may not use it to provide a product or service that competes with the software or with a product the licensor or its affiliates provides using the software; free offerings and different platforms or interfaces can also compete. When sharing copies, include the license text or its URL and any Required Notice lines supplied with the software. The full license governs, including its exceptions for new and discontinued products, patent terms and warranty disclaimer. Here, “Open Source (PolyForm Shield 1.0.0)” describes published source under these terms; the noncompete restriction means this is source-available software rather than unrestricted open source under the Open Source Definition. See [the licensing guide](docs/licenses.md).

Export and reimport workflows without processing input files:

```sh
onekit workflow export workflow.1kit -o exported-workflow.1kit
onekit workflow import workflow.1kit -o saved-workflow.1kit
onekit pipeline --steps saved-workflow.1kit input.json -o output.json
```

Standard barcodes are available in the QR codes & barcodes category and CLI: `text-to-barcode`, `scan-barcode`, `barcode-to-text`. Code 128, Code 39, EAN-13, EAN-8, UPC-A, ITF and ISBN-13 support PNG/SVG, configurable dimensions and check-digit validation. Install `onekit-tools[barcode]` or `onekit-tools[qrcode]`.

Permanent [PDF and image redaction](docs/redaction.md) is available through `pdf-redact` and `image-redact`. Selected regions become solid black pixels in newly encoded files. PDFs are rebuilt as image-only documents without original text, forms, comments, attachments or metadata; images become opaque PNGs without original metadata or hidden alpha pixels. Original files are left unchanged.

Add configurable PDF text watermarks with `pdf-watermark`: opacity, color, fonts, page ranges, visual positions, rotation and repeated grids. Text and graphics remain in the PDF. See the [watermark guide](docs/watermark.md).

## Contacts

- General questions and support: [support@onekit.org](mailto:support@onekit.org).
- Questions about the Open Source (PolyForm Shield 1.0.0) core and contributions: [developers@onekit.org](mailto:developers@onekit.org).
- Privacy, GDPR and personal-data requests: [privacy@onekit.org](mailto:privacy@onekit.org).
- Legal questions, licensing and permission requests: [legal@onekit.org](mailto:legal@onekit.org).
- Security vulnerabilities and abuse reports: [security@onekit.org](mailto:security@onekit.org).
