veve-cli
veve (the veve-cli project) is a fast, cross-platform CLI that converts Markdown files to PDF,
powered by Pandoc. It supports built-in and custom CSS themes, multiple PDF
rendering engines (auto-detected), automatic embedding of remote images, Unicode/emoji handling, and
full Unix pipe composability (stdin/stdout).
veve.Prerequisites
- Pandoc must be installed (veve exits with a “Pandoc not found” error otherwise).
- A PDF engine such as
xelatex,lualatex,weasyprint, orprinceis required for PDF output.
Install
macOS (Homebrew, recommended)
brew tap madstone-tech/tap
brew install veveLinux (prebuilt binary)
curl -sL https://github.com/madstone-tech/veve-cli/releases/latest/download/veve_Linux_x86_64.tar.gz | tar xz
sudo mv veve /usr/local/bin/From Go
go install github.com/madstone-tech/veve-cli/cmd/veve@latestOn Windows, download the latest .zip from
GitHub Releases and add it to your PATH.
Command reference
veve [input]
Convert a Markdown file to PDF. The root command acts as an implicit convert. With no argument and
piped stdin, input is read from stdin; output can be written to stdout.
veve [input] [flags]| Flag | Short | Type | Default | Description |
|---|---|---|---|---|
--output | -o | string | <input>.pdf | Output PDF file path |
--theme | -t | string | default | Theme used for PDF styling |
--engine | -e | string | auto-detected | PDF engine: xelatex, lualatex, weasyprint, prince |
--enable-remote-images | -r | bool | true | Download and embed remote images |
--remote-images-timeout | int | 10 | Per-image download timeout (seconds) | |
--remote-images-max-retries | int | 3 | Max retries for failed image downloads | |
--remote-images-temp-dir | string | system temp | Temp dir for downloaded images | |
--verbose | bool | false | Verbose output | |
--quiet | bool | false | Suppress non-error output | |
--version | -v | bool | Show version |
veve README.md # → README.pdf
veve input.md -o output.pdf --theme dark
veve input.md -e xelatex # explicit engine for unicode/emoji
cat input.md | veve > output.pdf # stdin → stdout
ls *.md | xargs veve # batchveve convert [input]
Explicit conversion command. Requires exactly one input file (does not read implicit stdin); accepts the same conversion flags as the root command.
veve convert report.md -o report.pdf --theme academicveve theme
Manage built-in and custom themes.
| Subcommand | Description |
|---|---|
list | List all available themes (NAME, AUTHOR, DESCRIPTION, TYPE) |
add <name> <path-or-url> | Install a custom theme from a local CSS file or an HTTPS URL |
remove <name> [--force] | Uninstall a custom theme (-f/--force skips the prompt; built-ins can’t be removed) |
veve theme list
veve theme add corporate ./themes/corporate.css
veve theme add fancy https://example.com/fancy.css
veve theme remove corporate --forceBuilt-in themes: default, dark, academic.
veve completion [bash|zsh|fish]
Generate a shell completion script (written to stdout).
source <(veve completion bash)
veve completion zsh > "${fpath[1]}/_veve"Configuration
veve reads a TOML config from ~/.config/veve/veve.toml; environment variables override the file:
| Variable | Description |
|---|---|
VEVE_DEFAULT_THEME | Default theme |
VEVE_PDF_ENGINE | Default PDF engine |
VEVE_QUIET | Suppress non-error output |
VEVE_VERBOSE | Verbose output |
Exit codes
0 success · 1 general error · 2 invalid arguments · 64 missing input file ·
65 Pandoc not installed · 66 theme not found · 67 invalid theme · 70 PDF generation failed ·
71 file creation failed.