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.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:languageorxml:lang. - Metadata with no title
- A missing
dc:titleleaves the document unnamed in a window, tab, or file list. - An image with no description
- An image or embedded object with no
svg:titleorsvg:descis 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.
# 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 file handy? Audit a bundled sample.
Each sample is a real ODF package with intentional issues.
No document audited yet.
| Severity | Rule | WCAG | Location | Message |
|---|
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.