Reference
CLI reference
Every overfull command and flag, exit codes, the --json output of each command, and the JSON report schema with an example.
overfull init [thesis|paper|slides] [dir] [--force] [--no-git] [--json]
overfull build [main.tex] [--engine auto|local|docker] [--image name] [--verbose] [--force]
[--json] [--config file]
overfull check [--checks a,b] [--profile p] [--offline] [--fail-on error|warning|never]
[--json | --markdown | --annotations] [--verbose]
[--pdf file] [--log file] [--aux file] [--bib a.bib,b.bib]
[--mailto address] [--no-verapdf] [--engine auto|local|docker] [--image name]
[--config file]
overfull cite <doi | arXiv:id | "title"> [--bib file] [--key k] [--author name] [--year yyyy]
[--dry-run] [--json] [--mailto addr] [--config file]
overfull pages <range> [--pdf file] [--out dir] [--dpi n] [--json] [--config file]
overfull diff [--base ref] [--main file] [--out file] [--engine auto|local|docker] [--json]
[--config file]
overfull explain <rule> [--json]
overfull explain --list [--json]
overfull doctor [--json] [--config file]
overfull --version prints the version (3.0.0). overfull <command> --help (or
-h) prints the options of one command.
Every command takes --json and then prints JSON on stdout. See
JSON output for the shape of each one.
Commands read overfull.yml in the current directory for the main file, job
name, bibliography, profile and checks. Flags override it for one run. See
Configuration.
init
overfull init paper my-paper
Copies a template (thesis, paper or slides) into dir. The template
defaults to thesis and dir to ./<template>. overfull init my-thesis
creates the thesis template in my-thesis. Each template includes
overfull.yml, a Makefile, a GitHub workflow, AGENTS.md and skills.
| Flag | Effect |
|---|---|
--force |
Copy into a directory that is not empty. Existing files are overwritten. |
--no-git |
Do not run git init. By default a new project outside a Git repository gets git init -b main and, when user.name and user.email are set, an initial commit. |
--json |
Print {template, dir, git}. |
build
overfull build
overfull build main.tex --engine docker
Compiles the document with latexmk, then checks the build log and the PDF
(the build and output checks) and prints the report. main.tex defaults to
main in overfull.yml.
--engine auto (the default) uses a local latexmk if one is found and the
Docker image otherwise. local and docker force one. Without a .latexmkrc,
Overfull runs latexmk -lualatex. If the project has a .latexmkrc (all
templates do), latexmk follows it.
| Flag | Effect |
|---|---|
--engine e |
auto (default), local or docker. |
--image name |
Docker image. Overrides $OVERFULL_IMAGE and build.image. |
--verbose, -v |
Show latexmk output and the fix for each problem. |
--force |
Rebuild even when nothing changed since the last build. |
--json |
Print the report as JSON, the same shape as overfull check --json (schema below). |
--config file |
Config file (default overfull.yml). |
When no source changed since the last good build (the main file, the .bib
files, the other inputs latexmk recorded, and .latexmkrc), and the log shows
nothing left to rerun, build does not start latexmk. It prints
<main> is up to date on stderr and reports on the existing log and PDF. Use
--force to run latexmk anyway (it passes -g).
Output goes to build.outDir from overfull.yml (passed as -outdir and
-auxdir), else the $out_dir of a .latexmkrc, else the project folder.
Only build projects you trust: a .latexmkrc is Perl code that latexmk runs.
Without --image, the image is $OVERFULL_IMAGE if set, else build.image
from overfull.yml, else ghcr.io/amet13/overfull:3. Exit codes: 0 built,
1 build failed, 2 usage error. With --json, a build that fails before LaTeX
writes a log prints {"error": {"code": "build-failed", "message", "exitCode"}}.
check
overfull check
overfull check --json
overfull check --checks build,output --fail-on warning
overfull check --profile arxiv
Runs the checks on the output of the last build. It reads <jobname>.log,
<jobname>.pdf and <jobname>.aux and the .bib files, and does not build
anything.
| Flag | Effect |
|---|---|
--checks a,b |
Run only these checks: build, output, references, accessibility, venue. |
--profile p |
Use this venue profile instead of the one in overfull.yml: generic, thesis, paper, arxiv, double-blind. |
--offline |
Do not look references up online. The references check is skipped. Missing keys and .bib syntax errors are still reported. |
--fail-on level |
error (default), warning or never. |
--json |
Print the report as JSON (schema below). |
--markdown |
Print a Markdown summary, for PR comments and job summaries. |
--annotations |
Print GitHub workflow annotations. |
--verbose, -v |
Show why each problem happened and how to fix it. |
--pdf file |
PDF to check (default <jobname>.pdf). |
--log file |
Build log (default <jobname>.log). |
--aux file |
.aux file (default <jobname>.aux). |
--bib a.bib,b.bib |
Bibliography files (default: bib in overfull.yml, else the files named in main.tex). |
--mailto address |
Contact address for CrossRef’s polite pool. |
--no-verapdf |
Do not run veraPDF, even if it is installed. |
--engine e |
Where veraPDF and pdffonts run when they are not installed: auto (the Overfull image, when Docker already has it), docker or local. |
--image name |
Docker image for veraPDF and pdffonts. Default: $OVERFULL_IMAGE, else ghcr.io/amet13/overfull:3. |
--config file |
Config file (default overfull.yml). |
Use only one of --json, --markdown and --annotations. If verapdf is on
the PATH, the accessibility check runs it (PDF/UA-2, falling back to PDF/UA-1
for PDFs older than 2.0). Without it, the check reports verapdf-not-run as
info.
check never uses build.image from overfull.yml. A project that is only
checked must not choose which container image runs on your machine, so the
image comes from --image, $OVERFULL_IMAGE or the default. (build, diff
and pages do use build.image; only build projects you trust.)
cite
overfull cite 10.1145/3442188.3445922
overfull cite arXiv:1706.03762 --key vaswani2017
overfull cite "Attention Is All You Need" --dry-run
Looks up a DOI, an arXiv id or a title in CrossRef, doi.org, arXiv and DBLP, and
appends a BibTeX entry built from the indexed record to the bibliography. OpenAlex
is also searched for titles when the OPENALEX_API_KEY environment variable is
set. Prints the citation key as its last line.
| Flag | Effect |
|---|---|
--bib file |
Write to this file (default: the first file in bib, else references.bib). |
--key k |
Use this citation key. |
--author name |
Narrow a title query to works with this author surname. |
--year yyyy |
Narrow a title query to works from this year (±1). |
--dry-run |
Print the entry, write nothing. |
--json |
Print {key, entry, source, confidence, added, bib}. Ambiguous and not-found results have their own shapes (see below). |
--mailto addr |
Contact address for CrossRef’s polite pool. |
--config file |
Config file (default overfull.yml). |
The file given with --bib (or the first bib file) must be inside the project,
also after resolving symlinks.
Every entry cite writes ends with a provenance marker:
x-overfull = {cite doi.org 2026-11-09 514dc6c201be}
The last part is a hash over the entry’s type, key, title, authors, year, DOI and
eprint. It makes later edits evident. It is not authentication: anyone can
recompute it. With references.requireCite, an entry without an intact marker
is reported as reference-unproven. See References.
If no confident match is found, nothing is written and the command exits with 1.
If the work is already in the bibliography (same DOI, same arXiv id, or same key
and title), nothing is written, the existing key is printed and the command exits
with 0. cite never edits or replaces an existing entry. If --key names a key
that a different entry already uses, the command exits with 2.
Short or shared titles are ambiguous: for example, several works are titled
“Literate Programming”. Then cite lists the candidates with their DOIs, writes
nothing and exits with 1. Cite the right one by DOI, or rerun with --author
or --year:
overfull cite "Literate programming" --author Knuth
pages
overfull pages 3
overfull pages 2-4 --dpi 150 --out .overfull/pages
Renders PDF pages to PNG images and prints their paths. The range is a page
(3), a range (2-5), a list (1,4,7) or an open range (8-, to the last
page). Useful for agents that can read images, and for quick looks. It uses
pdftoppm if installed, otherwise the Docker image.
| Flag | Effect |
|---|---|
--pdf file |
Render this PDF (default <jobname>.pdf). |
--out dir |
Write images here (default .overfull/pages; files are named page-<n>.png). Must be inside the project, also after resolving symlinks. |
--dpi n |
Resolution (default 110). |
--json |
Print {pages: [{page, file}]}. |
--config file |
Config file (default overfull.yml). |
diff
overfull diff --base main
overfull diff --base submitted-v1 --main main.tex
Builds a PDF with changes since a Git ref highlighted, using latexdiff. Use it
to review an agent’s pull request or to send a marked-up revision to reviewers.
Prints the path of the PDF. The project must be in a Git repository.
| Flag | Effect |
|---|---|
--base ref |
Revision to compare with. Default: the merge base with origin/main, else HEAD~1. |
--main file |
Main .tex file (default main in overfull.yml). |
--out file |
Output PDF (default overfull-diff.pdf). Must be inside the project, also after resolving symlinks. |
--engine e |
auto (default), local or docker. |
--json |
Print {pdf, base, sha, complete}. complete is false when the diff document had LaTeX errors and the PDF may be incomplete. |
--config file |
Config file (default overfull.yml). |
explain
overfull explain undefined-reference
overfull explain --list
overfull explain verapdf-8-2-5-26 --json
Prints what a rule means and how to fix it. Every rule id in a report can be
explained. veraPDF failures have ids of the form verapdf-<clause>. An unknown
id prints suggestions and exits with 2 (with --json, as a usage error).
| Flag | Effect |
|---|---|
--list |
List every rule id with its check and title. |
--json |
Print the rule (or, with --list, an array of all rules) as JSON. |
doctor
overfull doctor
overfull doctor --json
Reports which tools are available (Node.js, latexmk, LuaLaTeX, Biber, poppler,
veraPDF, latexdiff, Git, Docker), whether the Docker image is pulled, whether
api.crossref.org is reachable, whether overfull.yml is valid, and what is
disabled without each missing tool. It exits with 1 when nothing can build the
document: no local TeX Live (latexmk) and no usable Docker image. Other missing
tools only limit what can run, and the exit code stays 0. --json prints
{"canBuild", "message", "items": [{"name", "ok", "detail", "needFor"?}]}.
--config file checks a different config file.
Exit codes
| Code | Meaning |
|---|---|
| 0 | Success. For check: pass, or warnings without --fail-on warning; always 0 with --fail-on never. doctor: 0 when something can build the document. |
| 1 | Problems found. For check: at least one error (or warning with --fail-on warning). For build: the build failed. For cite: no confident match, or an ambiguous title. For pages and diff: rendering or building the PDF failed. For doctor: nothing can build the document. |
| 2 | Usage error (bad flag, missing file, unknown rule or profile, invalid overfull.yml) or internal error. Set OVERFULL_DEBUG=1 for a stack trace. |
Under --json, a usage or internal error is also JSON on stdout (see below), with
the same exit code 2.
JSON output
Every command prints JSON on stdout with --json:
| Command | Output |
|---|---|
check, build |
A Report (below). |
init |
{template, dir, git}; git is a note, or null. |
cite |
{key, entry, source, confidence, added, bib}. Ambiguous title: {ambiguous: true, message, candidates}. No match or no network: {found: false, query, searched, failures, message}. Both exit with 1. |
pages |
{pages: [{page, file}]}. |
diff |
{pdf, base, sha, complete}. |
explain <rule> |
{id, check, severity, title, summary, fix, corpus?}. With --list, an array of these. |
doctor |
{canBuild, message, items: [{name, ok, detail, needFor?}]}. |
Failures that the command itself reports (a failed build, a page that cannot be
rendered, a diff that cannot be built) print {"error": {"code", "message"}} and
exit with 1. The codes are build-failed (also exitCode), render-failed (also
page) and diff-failed. Usage errors (bad flag, missing file, unknown rule,
invalid overfull.yml) and internal errors print
{"error": {"code": "usage" | "internal", "message"}} and exit with 2. A script
can read stdout as JSON in every case and use the exit code for the verdict.
overfull check --json and overfull build --json print a Report. The schema
is stable; fields may be added, never renamed.
{
"tool": "overfull",
"version": "3.0.0",
"target": "paper.pdf",
"status": "fail",
"checks": [
{
"check": "build",
"status": "pass",
"summary": "Build succeeded (paper.pdf, 8 pages)",
"problems": []
},
{
"check": "references",
"status": "fail",
"summary": "11 of 12 references verified (1 not found)",
"stats": { "error": 0, "mismatch": 0, "notFound": 1, "total": 12, "unverifiable": 0, "verified": 11 },
"problems": [
{
"rule": "reference-not-found",
"check": "references",
"severity": "error",
"message": "`lee2023deep` was not found in CrossRef, dblp or arXiv",
"location": { "file": "references.bib", "line": 88 },
"detail": "Searched CrossRef, dblp or arXiv: no similar record. The reference may be mistyped or may not exist; Overfull cannot tell which.",
"fix": "Check the DOI and title against the publisher page, or re-add it from real metadata with `overfull cite \"Deep Graph Transformers\"`. If it is real but unindexed, add `note = {overfull: skip}`.",
"data": { "key": "lee2023deep", "status": "not-found" }
}
]
},
{
"check": "accessibility",
"status": "skipped",
"skippedReason": "No paper.pdf — run `overfull build` first",
"problems": []
}
]
}
Keys are written in this order. Optional fields are left out when empty, and
the object keys inside stats and data are sorted. The example is shortened:
a real report has one entry per check that ran.
| Field | Type | Notes |
|---|---|---|
tool |
"overfull" |
|
version |
string | Overfull version. |
target |
string? | The PDF that was checked, or the main file when there is no PDF. |
status |
pass | warn | fail |
Worst status of the checks that ran. Skipped checks do not count. |
checks[].check |
string | build, output, references, accessibility, venue. |
checks[].status |
pass | warn | fail | skipped |
skipped has skippedReason. |
checks[].summary |
string? | Short human summary. |
checks[].skippedReason |
string? | Present when status is skipped. |
checks[].stats |
object? | Counters. |
problems[].rule |
string | Stable kebab-case id. See overfull explain --list. |
problems[].check |
string | The check that reported it. |
problems[].severity |
error | warning | info |
|
problems[].message |
string | One line. |
problems[].location |
{ file?, line?, page? } |
File paths are relative to the project root. |
problems[].detail |
string? | Why it happened. |
problems[].fix |
string? | What to do. |
problems[].related |
number? | Follow-on problems folded into this one. |
problems[].evidence |
string? | Raw log lines or bib entry. |
problems[].data |
object? | Machine-readable extras (keys, measurements). |