The convert page: drop files, and the target list is built from what they actually are — each entry shows the engine chain and its loss tag.
Cirax turns your Linux machine into a conversion hub. One command reaches every format — not because Cirax reimplements codecs, but because it routes between the best engines ever written (FFmpeg, libvips, ImageMagick, LibreOffice, Pandoc, Calibre, 7-Zip, qpdf…) and chains them automatically. Files never leave your disk. Ever.
The Problem
- Every online converter is a data breach waiting to happen. Your contracts, IDs, medical scans and family photos, uploaded to an anonymous ad-riddled server.
- Local tools are islands. ffmpeg alone has a 40-page manual; LibreOffice won't talk to ImageMagick; your HEIC stays HEIC.
- Format-pair explosions. 109 formats × 109 formats = 11,881 possible converters. Nobody writes those.
The Product
$ # what used to require three websites and a leap of faith:
$ cirax convert report.docx preview.png
● converting report.docx: application/vnd...document → image/png
(libreoffice → pdftoppm, lossy)
$ # speech to subtitles, offline:
$ cirax convert talk.mp3 talk.srt
$ # AI-grade OCR — a 1.3B-parameter vision model, fully local:
$ cirax convert scan.png text.txt
Core Features
- Chain router — a Dijkstra search over a 109-format graph picks the best
chain of engines for any pair, ranked by fidelity (
losslessbeatslossy) and tagged before it runs. - 58 engines, one grammar — a declarative YAML registry wraps each engine; adding a format is a stanza, not a pull request.
- Sandboxed by default — every job runs in a bubblewrap jail: no network, read-only filesystem, writes confined to the workspace.
- Local AI OCR — GLM-OCR (MIT, ~1.3B params) via Ollama: layout-aware text + Markdown, zero cloud.
- Blender & Piper engines —
.blend→ GLB/FBX/OBJ/STL/PLY headless, and offline text-to-speech (see docs/ENGINES.md) - Same-format ops — strip EXIF/GPS, fix line endings, transcode charsets.
- Watch & serve — convert folders as files land in them, or drive it from a local web UI / plain curl.
Quick Start
Installation
| Channel | Command |
|---|---|
| PyPI | uv tool install cirax (or pipx install cirax) |
| curl | curl -fsSL https://raw.githubusercontent.com/baselanaya/Cirax/main/install.sh | sh |
| npm | npm i -g @baselanaya/cirax |
| Windows | Cirax-Setup-win64.exe from Releases (desktop app + CLI). Engines: cirax doctor --show-missing prints scoop/winget commands; extra engines in scoop bucket add cirax https://github.com/baselanaya/Cirax |
| Desktop (Linux) | grab the .deb / .rpm / .AppImage from Releases |
| macOS | Cirax-macos.dmg from Releases (experimental — unsigned, right-click → Open) |
Cirax itself is tiny — the engines are your system packages. cirax doctor --show-missing prints exactly what to install.
First conversion
cirax doctor # capability matrix of this machine
cirax plan report.docx # every reachable target, with routes
cirax convert report.docx preview.png
Desktop app
Drag, drop, convert. The GUI speaks to the same sandboxed pipeline as the CLI and ships in every release artifact.
Engine installation
| Domain | pacman packages |
|---|---|
| Images | libvips imagemagick libheif libjxl libavif libwebp oxipng pngquant |
| Video / Audio | ffmpeg mkvtoolnix-cli sox opus-tools gifsicle |
| Office | libreoffice-still pandoc |
| Ebooks | calibre |
qpdf ghostscript poppler img2pdf ocrmypdf |
|
| Archives | 7zip zstd unar libisoburn |
| Data | jq go-yq miller duckdb |
| RAW / Vector | darktable inkscape librsvg potrace |
| 3D / Disks / GIS | assimp qemu-img gdal |
| AI | ollama + ollama pull glm-ocr |
Architecture
flowchart LR
A[CLI / GUI / Web / Watch] --> B[Job Engine]
B --> C{Router}
C --> D[Engine Registry YAML]
C --> E[Engine 1]
C --> F[Engine 2]
C --> G[Engine n]
E --> H[(bwrap jail)]
F --> H
G --> H
H --> I[Output]
The complete machine-readable format map lives at docs/FORMATS.md (auto-generated from the registry).
Inputs are detected with file(1) + an extension table; the router searches
the capability graph up to three hops through pivot formats (PDF, PNG, WAV,
JSON…); a job engine runs the chain inside a sandbox with per-engine
concurrency, progress parsing and guaranteed cleanup.
Cirax vs. Online Converters
| Online converters | Cirax | |
|---|---|---|
| Your files | uploaded to someone's server | never leave the disk |
| Format pairs | a hand-picked menu | the closure of 58 engines (chains) |
| Fidelity | whatever it feels like | tagged lossless/lossy before running |
| OCR / AI | extra fee, extra upload | GLM-OCR locally, after one ollama pull |
| Works offline | no | completely |
| Sandboxing | n/a | bubblewrap, no network, per job |
Supported Platforms
| Platform | Status | Notes |
|---|---|---|
| Linux x86_64 (Arch, Ubuntu, Fedora…) | ✅ supported | engines via your package manager |
| AppImage / deb / rpm | ✅ released | desktop app + CLI in every release |
| Windows / macOS | ❌ not yet | engine discovery needs porting |
Contributing
Fork → branch (feat/…) → PR. Adding a conversion engine is a YAML stanza —
see README section on engines in the docs and the
existing specs under src/cirax/data/engines/.
Adding an Engine
Drop a YAML stanza in src/cirax/data/engines/ — inputs, outputs, a command
template, optional per-format flags and presets — and the router picks it up.
No code.
- engine: mycodec
binary: mycodec
package: mycodec
presets:
web: {flags: {image/myfmt: "-q 70"}}
routes:
- from: [image/png]
to: [image/myfmt]
lossless: true
priority: 90
command: "mycodec encode {input} {flags} {output}"
Built by Basel Anaya — Maximlabs.co
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cirax-0.10.2.tar.gz.
File metadata
- Download URL: cirax-0.10.2.tar.gz
- Upload date:
- Size: 15.1 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f5fc80e1e3630394fe8e8b285cd4ea23a5cbe3cd25ebdb9a0aafd3a7aa7f0aa5
|
|
| MD5 |
aa19d37b92fe12955f0be8dfd0141eb8
|
|
| BLAKE2b-256 |
1b9bc382d1d494e36efb4334c2cc1d4284ee85ecf052f599780ed270fb8b9fda
|
Provenance
The following attestation bundles were made for cirax-0.10.2.tar.gz:
Publisher:
publish.yml on baselanaya/Cirax
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cirax-0.10.2.tar.gz -
Subject digest:
f5fc80e1e3630394fe8e8b285cd4ea23a5cbe3cd25ebdb9a0aafd3a7aa7f0aa5 - Sigstore transparency entry: 2701591793
- Sigstore integration time:
-
Permalink:
baselanaya/Cirax@9d0b151a9d0273b3110da8a6931e39e0c5bca96a -
Branch / Tag:
refs/tags/v0.10.2 - Owner: https://github.com/baselanaya
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9d0b151a9d0273b3110da8a6931e39e0c5bca96a -
Trigger Event:
push
-
Statement type:
File details
Details for the file cirax-0.10.2-py3-none-any.whl.
File metadata
- Download URL: cirax-0.10.2-py3-none-any.whl
- Upload date:
- Size: 51.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3289808cde2d9c7fbc62cffcd65663f616aa2c48ca62f1bef53230fb8473452f
|
|
| MD5 |
ed6f673842dadb34c65cb505dfef574f
|
|
| BLAKE2b-256 |
9713e2066ff1b6b214151de3f6b2673d8242f02040df995e04f393707ba8bd7e
|
Provenance
The following attestation bundles were made for cirax-0.10.2-py3-none-any.whl:
Publisher:
publish.yml on baselanaya/Cirax
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cirax-0.10.2-py3-none-any.whl -
Subject digest:
3289808cde2d9c7fbc62cffcd65663f616aa2c48ca62f1bef53230fb8473452f - Sigstore transparency entry: 2701591892
- Sigstore integration time:
-
Permalink:
baselanaya/Cirax@9d0b151a9d0273b3110da8a6931e39e0c5bca96a -
Branch / Tag:
refs/tags/v0.10.2 - Owner: https://github.com/baselanaya
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@9d0b151a9d0273b3110da8a6931e39e0c5bca96a -
Trigger Event:
push
-
Statement type: