Nine rules · ODT · ODS · ODP · SARIF 2.1.0

Audit the accessibility of OpenDocument files.

odflens unzips an .odt, .ods, or .odp package, parses its XML, and reports the structural failures that break accessibility — without LibreOffice, Java, or a network.

curl -fsSL https://raw.githubusercontent.com/srivtx/odflens/main/install.sh | sh

Installs the odflens binary with Bun. It is not published to npm; bunx github:srivtx/odflens#main runs it without installing.

odflens fixtures/bad.odt
$ odflens fixtures/bad.odtbad.odt (odt)ERROR   ODF-ALT-003 [WCAG 1.1.1]: Image frame has no alternative text (svg:title or svg:desc). (bad.odt)WARNING ODF-HEAD-004 [WCAG 1.3.1]: Heading outline levels skip a level (e.g. h1 followed by h3). (bad.odt)ERROR   ODF-LANG-001 [WCAG 3.1.1]: Document does not declare a language (dc:language or xml:lang / fo:language). (bad.odt)WARNING ODF-LINK-007 [WCAG 2.4.4]: Link text is a raw URL; use descriptive link text instead. (bad.odt)ERROR   ODF-TBL-006 [WCAG 1.3.1]: Table has rows but no header rows (table:table-header-rows). (bad.odt)ERROR   ODF-TITLE-002: Document metadata has no non-empty dc:title. (bad.odt)Totals: 4 error(s), 2 warning(s), 0 info

What it catches

odflens reads a document the way an assistive tool would: it opens the package, walks the XML, and reports the structural failures that leave it unusable. Rules are scoped to the document kind — odflens detects ODT, ODS, or ODP and runs only the checks that apply, so a spreadsheet is never judged by the text-document heading outline.

A document with no language
Without a declared language a screen reader cannot pronounce the text correctly. odflens looks for dc:language or xml:lang.
Metadata with no title
A missing dc:title leaves the document unnamed in a window, tab, or file list.
An image with no description
An image or embedded object with no svg:title or svg:desc is announced as nothing useful.
Headings that skip a level
A jump from one heading level to a deeper one breaks the outline a screen reader uses to navigate (ODT).
A table with no header rows
A table whose rows are not marked as headers loses the relationship between each cell and its labels (ODT).
Link text that is just a URL
A raw URL as link text says nothing about where the link goes. Images loaded over the network are flagged too.

Quick start

Install once, then point it at a file or a directory. The exit code is the CI gate.

quick start
# install the binary$ curl -fsSL https://raw.githubusercontent.com/srivtx/odflens/main/install.sh | sh# audit one file$ odflens report.odt# audit every document in a directory, and fail CI on warnings$ odflens --dir public/docs --fail-on warning

Every flag, exit code, and the TypeScript API are in Usage.

Playground

Audit a real .odt, .ods, or .odp file, or run a bundled sample. Everything runs in your browser; nothing is uploaded.

Runs entirely in your browser. Nothing is uploaded.

Choose or drop an .odt, .ods, or .odp file

It never leaves this tab.

No document audited yet.

Documentation

The landing page is the pitch. The details live on four short pages.

Rules
The nine rule codes, how they are scoped to ODT, ODS, or ODP, and the static pipeline behind a run.
Usage
Every CLI flag, the exit-code scheme, JSON output, and the TypeScript library API.
CI
SARIF 2.1.0 and GitHub code scanning, with a workflow you can paste.
FAQ
Scope, limitations, and how odflens compares to the existing ODF tooling.