ODT export is now possible without LibreOffice — via odf-kit
This picks up where #102 left off.
Since Nextcloud Text is built on TipTap/ProseMirror, ODT export can now be implemented entirely in JavaScript with no server-side dependencies:
import { tiptapToOdt } from 'odf-kit'
// editor.getJSON() returns TipTap JSONContent
const bytes = await tiptapToOdt(editor.getJSON(), { pageFormat: 'A4' })
tiptapToOdt() converts TipTap/ProseMirror JSON directly to a spec-compliant .odt file. It runs entirely in the browser — no LibreOffice, no Pandoc, no external API calls. Document content never leaves the user's environment.
What's supported: headings, paragraphs, bold/italic/underline, lists (nested), tables, links, blockquotes, code blocks, horizontal rules, images (via pre-fetched bytes), custom node handler for app-specific extensions.
odf-kit is Apache 2.0, zero server-side dependencies, passes the OASIS ODF validator on every commit. There is also an odf-kit-service ExApp currently pending approval in the Nextcloud App Store, which exposes odf-kit over HTTP for server-side use cases.
Happy to help with integration if there's interest.
ODT export is now possible without LibreOffice — via odf-kit
This picks up where #102 left off.
Since Nextcloud Text is built on TipTap/ProseMirror, ODT export can now be implemented entirely in JavaScript with no server-side dependencies:
tiptapToOdt()converts TipTap/ProseMirror JSON directly to a spec-compliant.odtfile. It runs entirely in the browser — no LibreOffice, no Pandoc, no external API calls. Document content never leaves the user's environment.What's supported: headings, paragraphs, bold/italic/underline, lists (nested), tables, links, blockquotes, code blocks, horizontal rules, images (via pre-fetched bytes), custom node handler for app-specific extensions.
odf-kit is Apache 2.0, zero server-side dependencies, passes the OASIS ODF validator on every commit. There is also an odf-kit-service ExApp currently pending approval in the Nextcloud App Store, which exposes odf-kit over HTTP for server-side use cases.
Happy to help with integration if there's interest.