Reference
FAQ
Scope, limits, and where odflens fits next to the tools you already use.
Questions
Does it need LibreOffice or Java?
No. odflens is pure TypeScript: it unzips the package with fflate and parses the XML directly, so it runs headless on any machine that has Bun, including CI containers without an office suite.
Are my documents uploaded anywhere?
No. There is no network code at all. The CLI parses files locally, and the browser playground uses the same bundle in-page, so nothing leaves your machine.
Which formats are covered?
ODT (text), ODS (spreadsheet), and ODP (presentation). Kind detection reads the package mimetype and falls back to the body element. Language, title, alt-text, link-text, and remote-image checks run for all three; the heading-outline and table-header checks run for ODT, where they apply.
How does it fit into CI?
Run odflens --dir public/docs --quiet as a gate, or emit SARIF with --sarif and upload it with github/codeql-action/upload-sarif. --fail-on warning|info|none controls the exit threshold.
Why not just use AccessODF?
AccessODF is a LibreOffice GUI extension in Java, at 0.1.0 Beta, last filed in 2011. It needs a desktop suite and cannot run headless, which makes it unusable as an automated gate.
What do the exit codes mean?
0 means no findings at or above --fail-on; 1 means there are. 2 is invalid usage or a document that cannot be read or parsed as ODF (reported as an error-level ODF-000). 3 is a file or report that could not be read or written.
Limitations
Static XML analysis
odflens is static XML analysis. It does not render or convert the document, so it cannot judge visual presentation or colour contrast. It reads the ODF package directly and matches element local names, so it does not validate against the full ODF schema. Remote images are flagged, not fetched, and there is no network code. Embedded foreign content is out of scope.
How it compares
.odt, .ods, or .odp package.