Skip to content

veve-cli

GitHub →

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).

This documentation describes veve-cli v0.2.0. The binary command is veve.

Prerequisites

  • Pandoc must be installed (veve exits with a “Pandoc not found” error otherwise).
  • A PDF engine such as xelatex, lualatex, weasyprint, or prince is required for PDF output.

Install

macOS (Homebrew, recommended)

brew tap madstone-tech/tap
brew install veve

Linux (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@latest

On 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]
FlagShortTypeDefaultDescription
--output-ostring<input>.pdfOutput PDF file path
--theme-tstringdefaultTheme used for PDF styling
--engine-estringauto-detectedPDF engine: xelatex, lualatex, weasyprint, prince
--enable-remote-images-rbooltrueDownload and embed remote images
--remote-images-timeoutint10Per-image download timeout (seconds)
--remote-images-max-retriesint3Max retries for failed image downloads
--remote-images-temp-dirstringsystem tempTemp dir for downloaded images
--verboseboolfalseVerbose output
--quietboolfalseSuppress non-error output
--version-vboolShow 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              # batch

veve 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 academic

veve theme

Manage built-in and custom themes.

SubcommandDescription
listList 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 --force

Built-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:

VariableDescription
VEVE_DEFAULT_THEMEDefault theme
VEVE_PDF_ENGINEDefault PDF engine
VEVE_QUIETSuppress non-error output
VEVE_VERBOSEVerbose 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.