Rust-native OOXML engines with collaboration and agent editing at the core.
WebAssembly for browsers. Headless APIs for servers. Native Rust where you need it.
| package | registry | what it does |
|---|---|---|
betteroffice-docx |
crates.io | typed Rust API for opening, editing, laying out, and saving DOCX documents |
@betteroffice/docx |
npm | framework-free .docx editor core — parsing, CRDT editing, and page layout in Rust through WebAssembly |
@betteroffice/docx-react |
npm | drop-in React .docx editor |
betteroffice-docx |
PyPI | Python API for reading, editing, laying out, and rasterizing DOCX documents |
DOCX layout omits hidden content by default. Set showHiddenText: true in YrsRenderEnv to reveal it without changing the document's hidden formatting.
Standard legacy VML horizontal rules render in DOCX and retain their source XML through editing and saving. DrawingML plus shapes render with their authored adjustments. Elliptical pictures render with crops and borders. Other picture presets retain rectangular rendering; soft-edge effects are unsupported.
| package | registry | what it does |
|---|---|---|
betteroffice-xlsx |
crates.io | typed Rust API for opening, editing, calculating, rendering, and saving XLSX workbooks |
@betteroffice/xlsx |
npm | framework-free spreadsheet core powered by the Rust engine through WebAssembly |
@betteroffice/xlsx-react |
npm | drop-in React spreadsheet editor |
betteroffice-xlsx |
PyPI | Python API for opening, recalculating, styling, rendering, and saving XLSX workbooks |
| package | registry | what it does |
|---|---|---|
betteroffice-pptx |
crates.io | typed Rust API for opening, editing, rendering, and saving PPTX presentations |
@betteroffice/pptx |
npm | framework-free .pptx editor core — slide model, masters, and rendering in Rust through WebAssembly |
@betteroffice/pptx-react |
npm | drop-in React .pptx editor |
betteroffice-pptx |
PyPI | Python API for reading, editing, saving, and laying out PPTX presentations |
The browser React editor renders supported bitmap-only WMF wrappers. Custom browser image loaders can use presentationImageBlob(bytes) from @betteroffice/pptx for the same limited WMF support.
Visio drawings (.vsdx) and templates (.vstx) open in the source-available VSDX core, which is not yet published. Stencils (.vssx) and macro-enabled files are not supported.
The editor puts a flat command bar and a searchable thirty-two shape gallery over a focusable canvas: gallery shapes drag onto it and land where they are dropped, and the canvas offers in-place shape text editing, keyboard undo and redo, Delete or Backspace, arrow-key nudge with a larger Shift step, and Escape to clear the selection or cancel a drag, plus a right-click context menu for delete and z-order arrange, with the arrange commands in submenus.
What to install for which language, with a first example each: npm, crates.io, PyPI.
crates/— the Rust enginespackages/— the TypeScript editor packagesbindings/— the Python bindingsapps/web— betteroffice.dev (Next.js on Cloudflare Workers)apps/docs— documentation
bun install
bun run build:xlsx-wasm # compile the ignored spreadsheet wasm asset
bun run build:docx-wasm # compile the ignored document wasm assets
bun run dev # web app
bun run rust:check # fmt + clippy + tests for the enginesUse the Office visual quality harness to export Word, PowerPoint, and Excel references, compare local renders, or refresh the fidelity scores with the manual action.
Generated by the Visual fidelity action.
| Format | Latest published version | SSIM | Scored/total | Latest commit | SSIM | Scored/total |
|---|---|---|---|---|---|---|
| DOCX | 0.1.0 | 0.6487 | 64/64 | 5bed9528 | 0.7538 | 64/64 |
| PPTX | 0.0.4 | 0.8478 | 9/9 | a35d4baa | 0.8769 | 9/9 |
| XLSX | 0.1.0 | 0.7163 | 4/8 | a35d4baa | 0.7695 | 8/8 |
SSIM is the mean page-penalized grayscale score at 150 DPI, without resampling or alignment correction. DOCX uses recorded page bounds with at most a one-pixel edge adjustment. Missing or extra pages are penalized. All formats use pinned CDN fonts. XLSX uses recorded print ranges and scale; its score measures range rendering, not automatic print pagination. Means cover successful comparisons only; failed or missing comparisons have no score. Compare coverage alongside SSIM because the channels may score different subsets.
Contributions are welcome. We ask for a one-time signature of the Contributor License Agreement on your first pull request (corporate version).
Apache-2.0 — third-party attribution in THIRD-PARTY-NOTICES.md.