All notable changes to convertr are documented here.
Public API — the following are considered stable and subject to semantic versioning:
- CLI flags and subcommand names
- Exit codes (0 success · 1 error · 2 CLI usage · 3 no route · 4 partial batch · 5 missing backend)
- Plugin protocol (
convertr-NAME capabilities/convertr-NAME convert) pkg/pluginGo types
Internal packages (internal/) are not part of the public API.
- Pandoc backend now passes explicit
--from/--toflags on every call, preventing format misdetection when the file extension doesn't match actual content (e.g. HTML saved as.doc) - i18n language detection from
$LANGenvironment variable now persists through command execution (previously reset to English byPersistentPreRunE) - PDF output with Cyrillic (and other non-Latin scripts) is now readable out of the box:
xelatex/lualatexreceives-V mainfont/-V monofont/-V sansfontwith OS-appropriate defaults plus-V geometry:margin=2cm. User-supplied values via--named pandoc.mainfont=...or-V …inextra_argsalways win [backend.*] extra_argsfromconfig.tomlare now actually applied duringconvert— previously the config was not loaded and only the CLI--namedflags took effect- Router no longer picks backends whose binaries are missing. Capabilities are filtered by
backend.IsAvailable(from, to)at graph-build time; two backends declaring the same edge (e.g.xlsx → csvvia csvkit and libreoffice) resolve cleanly instead of aborting mid-conversion. csvkit implements per-edge availability (in2csv/xlsx2csv vs csvjson) - LibreOffice backend now passes
-env:UserInstallation=…(single-dash bootstrap variable) instead of--env:…, which LibreOffice 7.x+ rejects
- PDF engine auto-detection now prefers fontspec-aware engines:
xelatex→lualatex→pdflatex textutilbackend (macOS-only)Costraised from 1 to 3 so that the cross-platformpandocroute wins by default;textutilstays available as a fallback when pandoc is absent
[fonts]config section —mainfont,monofont,sansfontused by PDF-producing backends.convertr config initseeds the section with values chosen for the host OS (PT Serif/Menlo/Helvetica Neue on macOS, DejaVu family on Linux, Times New Roman/Consolas/Segoe UI on Windows)- 11 new formats in the registry:
typst,ipynb,fb2,bibtex,csljson,mediawiki,dokuwiki,jira,textile,docbook,opml - 21 new pandoc edges covering Typst, Jupyter notebooks, presentations (
md ↔ pptx), wiki dialects (mediawiki,dokuwiki,jira,textile), bibliography (bibtex ↔ csljson), andfb2/docbook/opml/rtf → md convertr doctornow checksasciidoctorand the csvkit family (in2csv/xlsx2csv/csvjson), with a combined install hint that works whichever tool you prefer--mkdirflag: automatically create the output directory without prompting- Multi-input directory detection: when multiple input files are given, the output path is treated as a directory even without a trailing
/ - Interactive
Create it? [y/N]prompt when the output directory is missing and running in a TTY --named key=valueflag (repeatable): pass backend-specific named options from the CLI without usingextra_args--strip-metaflag: strip file metadata (EXIF, ID3, document properties) — supported by imagemagick (-strip), ffmpeg (-map_metadata -1), pandoc (--strip-comments)- i18n completeness: all CLI flag descriptions, error messages, subcommand descriptions, and progress output are now fully translated into English and Russian
- Backend named options — new per-backend
--namedkeys:ffmpeg:ffmpeg.video_codec,ffmpeg.audio_codec,ffmpeg.fps,ffmpeg.audio_rate,ffmpeg.gif_fps,ffmpeg.gif_scalepandoc:pandoc.toc,pandoc.standalone,pandoc.highlight,pandoc.template,pandoc.pdf_engineimagemagick:imagemagick.resize,imagemagick.density,imagemagick.depthfiglet:figlet.font(previously hardcoded tostandard)yq:yq.sort_keys,yq.indentcsvkit:csvkit.sheet,csvkit.delimiterasciidoctor:asciidoctor.toc,asciidoctor.attribute
--workers/-jvalue is now forwarded to ffmpeg as-threadsfor multi-threaded encoding
Initial release.
Core pipeline
- Dijkstra routing through the backend capability graph (maxHops = 4)
- Atomic writes via
os.CreateTemp+os.Rename - Per-job temp directories, parallel pool via
errgroup+semaphore - Error policies:
skip|stop|retry(exponential backoff with jitter) - Conflict policies:
overwrite|skip|rename|error - Input sources: file, glob, directory (recursive), stdin
Backends
pandoc— document and markup formats (md, html, docx, odt, rst, epub, tex, org, pdf)ffmpeg— video ↔ video, audio ↔ audio, video → gif, video → audioimagemagick— raster images, svg, heic, aviflibreoffice— Office formats with per-process isolationjq— JSON pretty-print, minify, transformyq— YAML ↔ JSON ↔ TOMLtesseract— OCR: jpg/png/tiff → txtcsvkit— xlsx ↔ csv, csv → jsonasciidoctor— adoc → html, adoc → pdffiglet— txt → ascii arttextutil— doc/rtf → txt/html (macOS only)plugin— externalconvertr-*executables via capabilities protocol
Commands
convertr FILE -o OUT— convert files (default command)convertr doctor— check backend availability and versionsconvertr formats [--dot]— list formats and conversion graphconvertr watch SRC -o DST --to FORMAT— watch mode with debounce and delete policiesconvertr config print|init|validate— configuration managementconvertr plugins list|test— plugin discovery and testingconvertr info FILE— file metadata via ffprobe/exiftool/fileconvertr version— print version
Configuration
- TOML config at
~/.config/convertr/config.toml [defaults],[backend.NAME],[profile.NAME]sectionsCONVERTR_*environment variable overrides- Named profiles via
--profile
Progress reporting
- In-place TUI progress bar (interactive TTY)
- Plain text one-line-per-job (non-TTY)
- JSON Lines (
--json/CI=1)
i18n
- English and Russian locales bundled
--langflag and auto-detection from environment
Distribution
- goreleaser config for macOS (arm64/amd64) and Linux (amd64)
- Homebrew tap:
mark1708/tap/convertrpublished from https://github.com/Mark1708/homebrew-tap scripts/install-deps-macos.shandscripts/install-deps-linux.sh