Oxi logo Oxi

A browser-native .docx rendering engine,
measured against Microsoft Word — pixel by pixel.

Oxi opens Word documents in the browser with Word-faithful layout. Built from scratch in Rust + WebAssembly, verified page-by-page against Microsoft Word with SSIM. Open source, no server, and your files never leave your device.

Free · No account · Runs entirely in your browser

0.90
SSIM vs Word — Japanese blind
benchmark (50 never-seen docs)
0.90
SSIM vs Word — English blind
benchmark (50 never-seen docs)
100%
parse success on real
government .docx files
0
bytes uploaded —
everything runs client-side

Layout accuracy is measured, not asserted

Every claim below comes from a reproducible measurement pipeline, published in the repository.

Engineering deep dive: Why modern font metrics cannot reproduce Word pagination — how Oxi measured GDI integer rounding and implemented the result in Rust.

English blind set — 50 never-seen documents

English is measured the hard way: a frozen blind benchmark of 50 documents from the public docx-corpus that are never used as fix targets. The current set is blind-I50 (the next unclaimed SHA-256 ranks per type, frozen 2026-10-25 before any measurement, rule in pipeline_data/FROZEN_BLIND_I.md); this is its first and only measurement, and every engine was at its latest public release that day. Oxi is second on pixels at 0.903, 0.006 behind ONLYOFFICE (0.909) and ahead of WordCraft (0.885) and LibreOffice (0.864), and reproduces Word’s page count on the most documents: 47 of 50 against ONLYOFFICE’s 42. Document by document the picture is less flattering: ONLYOFFICE is closer to Word on 37 of 50 and WordCraft on 34, while Oxi beats LibreOffice on 30 — Oxi’s mean holds up because its bad documents are less bad, not because it wins the typical one. Charging every page an engine adds or drops as zero, the penalized means are ONLYOFFICE 0.888, Oxi 0.883, WordCraft 0.857, LibreOffice 0.828, Polaris Office 0.813, SILURUS 0.806, GenOffice 0.747, ibisOffice 0.706, eigenpal 0.704, BetterOffice 0.636, OfficeCLI 0.443. Ground truth is Microsoft Word (Microsoft 365 16.0.20430.20182) at 150 DPI, one fresh Word process per document. Polaris Office is driven through its own window (it has no command line); the six English documents it would not export on two attempts count as not rendered.

Word’s saved page breaks. Word writes <w:lastRenderedPageBreak/> where its own render started each page, and Oxi’s parser can read it, which other engines do not. To rule out that hint, the blind-I numbers above were re-run with the same frozen engine on copies with every marker removed (2026-10-28): English 0.903 / 0.883 / 47 of 50 and Japanese 0.905 / 0.899 / 47 of 50, the same as published. Benchmarks now run with the marker hidden by default (OXI_IGNORE_LRPB=1).

English blind set — 50 never-touched documents, per-document mean SSIM vs Word (2026-10-25)

ONLYOFFICEpage count matches Word on 42/50 · v10.0.0 · 49 of 50 rendered
0.909
Oxipage count matches Word on 47/50
0.903
WordCraftpage count matches Word on 41/50 · v0.10.0
0.885
LibreOfficepage count matches Word on 39/50 · v26.8.1.1
0.864
SILURUSpage count matches Word on 41/50 · v0.89.4
0.842
Polaris Officepage count matches Word on 35/50 · v11.115 · 44 of 50 rendered
0.830
GenOfficepage count matches Word on 35/50 · v28cee5ca
0.815
ibisOfficepage count matches Word on 33/50 · v0.8.4
0.783
OfficeCLIpage count matches Word on 14/50 · v1.0.158
0.770
BetterOfficepage count matches Word on 26/50 · v0.4.3
0.767
eigenpalpage count matches Word on 33/50 · v1.9.0
0.756
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ LibreOffice better ↓ legal: Oxi 0.979 / LibreOffice 0.987 legal: Oxi 0.967 / LibreOffice 0.968 forms: Oxi 0.938 / LibreOffice 0.979 forms: Oxi 0.747 / LibreOffice 0.793 forms: Oxi 0.984 / LibreOffice 0.881 forms: Oxi 0.976 / LibreOffice 0.973 forms: Oxi 0.765 / LibreOffice 0.793 reports: Oxi 0.959 / LibreOffice 0.934 legal: Oxi 0.980 / LibreOffice 0.849 reports: Oxi 0.920 / LibreOffice 0.765 reports: Oxi 0.978 / LibreOffice 0.958 reports: Oxi 0.960 / LibreOffice 0.922 policies: Oxi 0.955 / LibreOffice 0.946 reports: Oxi 0.787 / LibreOffice 0.956 policies: Oxi 0.985 / LibreOffice 0.853 legal: Oxi 0.972 / LibreOffice 0.803 policies: Oxi 0.914 / LibreOffice 0.859 policies: Oxi 0.945 / LibreOffice 0.926 educational: Oxi 0.761 / LibreOffice 0.730 educational: Oxi 0.901 / LibreOffice 0.880 educational: Oxi 0.983 / LibreOffice 0.771 educational: Oxi 0.970 / LibreOffice 0.969 correspondence: Oxi 0.963 / LibreOffice 0.968 correspondence: Oxi 0.915 / LibreOffice 0.874 policies: Oxi 0.777 / LibreOffice 0.879 correspondence: Oxi 0.986 / LibreOffice 0.994 correspondence: Oxi 0.978 / LibreOffice 0.922 correspondence: Oxi 0.542 / LibreOffice 0.643 educational: Oxi 0.858 / LibreOffice 0.761 technical: Oxi 0.736 / LibreOffice 0.882 technical: Oxi 0.948 / LibreOffice 0.869 technical: Oxi 0.937 / LibreOffice 0.938 administrative: Oxi 0.925 / LibreOffice 0.779 administrative: Oxi 0.835 / LibreOffice 0.841 administrative: Oxi 0.982 / LibreOffice 0.926 administrative: Oxi 0.989 / LibreOffice 0.989 legal: Oxi 0.973 / LibreOffice 0.777 technical: Oxi 0.840 / LibreOffice 0.671 creative: Oxi 0.986 / LibreOffice 0.994 administrative: Oxi 0.770 / LibreOffice 0.687 creative: Oxi 0.875 / LibreOffice 0.772 creative: Oxi 0.828 / LibreOffice 0.836 creative: Oxi 0.954 / LibreOffice 0.984 creative: Oxi 0.963 / LibreOffice 0.986 reference: Oxi 0.844 / LibreOffice 0.522 reference: Oxi 0.755 / LibreOffice 0.924 reference: Oxi 0.870 / LibreOffice 0.822 reference: Oxi 0.878 / LibreOffice 0.626 reference: Oxi 0.967 / LibreOffice 0.859 technical: Oxi 0.938 / LibreOffice 0.976 vs LibreOffice — Oxi ahead on 30/50 LibreOffice SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ ONLYOFFICE better ↓ legal: Oxi 0.979 / ONLYOFFICE 0.982 legal: Oxi 0.967 / ONLYOFFICE 0.989 forms: Oxi 0.938 / ONLYOFFICE 0.927 forms: Oxi 0.747 / ONLYOFFICE 0.820 forms: Oxi 0.984 / ONLYOFFICE 0.992 forms: Oxi 0.976 / ONLYOFFICE 0.989 forms: Oxi 0.765 / ONLYOFFICE 0.790 reports: Oxi 0.959 / ONLYOFFICE 0.989 legal: Oxi 0.980 / ONLYOFFICE 0.850 reports: Oxi 0.920 / ONLYOFFICE 0.983 reports: Oxi 0.978 / ONLYOFFICE 0.996 reports: Oxi 0.960 / ONLYOFFICE 0.961 reports: Oxi 0.787 / ONLYOFFICE 0.945 policies: Oxi 0.985 / ONLYOFFICE 0.831 legal: Oxi 0.972 / ONLYOFFICE 0.803 policies: Oxi 0.914 / ONLYOFFICE 0.983 policies: Oxi 0.945 / ONLYOFFICE 0.973 educational: Oxi 0.761 / ONLYOFFICE 0.778 educational: Oxi 0.901 / ONLYOFFICE 0.967 educational: Oxi 0.983 / ONLYOFFICE 0.600 educational: Oxi 0.970 / ONLYOFFICE 0.982 correspondence: Oxi 0.963 / ONLYOFFICE 0.835 correspondence: Oxi 0.915 / ONLYOFFICE 0.983 policies: Oxi 0.777 / ONLYOFFICE 0.854 correspondence: Oxi 0.986 / ONLYOFFICE 0.994 correspondence: Oxi 0.978 / ONLYOFFICE 0.984 correspondence: Oxi 0.542 / ONLYOFFICE 0.924 educational: Oxi 0.858 / ONLYOFFICE 0.800 technical: Oxi 0.736 / ONLYOFFICE 0.799 technical: Oxi 0.948 / ONLYOFFICE 0.945 technical: Oxi 0.937 / ONLYOFFICE 0.943 administrative: Oxi 0.925 / ONLYOFFICE 0.936 administrative: Oxi 0.835 / ONLYOFFICE 0.987 administrative: Oxi 0.982 / ONLYOFFICE 0.970 administrative: Oxi 0.989 / ONLYOFFICE 0.989 legal: Oxi 0.973 / ONLYOFFICE 0.779 technical: Oxi 0.840 / ONLYOFFICE 0.653 creative: Oxi 0.986 / ONLYOFFICE 0.997 administrative: Oxi 0.770 / ONLYOFFICE 0.784 creative: Oxi 0.875 / ONLYOFFICE 0.975 creative: Oxi 0.828 / ONLYOFFICE 0.829 creative: Oxi 0.954 / ONLYOFFICE 0.980 creative: Oxi 0.963 / ONLYOFFICE 0.992 reference: Oxi 0.844 / ONLYOFFICE 0.870 reference: Oxi 0.755 / ONLYOFFICE 0.948 reference: Oxi 0.870 / ONLYOFFICE 0.752 reference: Oxi 0.878 / ONLYOFFICE 0.974 reference: Oxi 0.967 / ONLYOFFICE 0.972 technical: Oxi 0.938 / ONLYOFFICE 0.974 vs ONLYOFFICE — Oxi ahead on 12/49 ONLYOFFICE SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ SILURUS better ↓ legal: Oxi 0.979 / SILURUS 0.965 legal: Oxi 0.967 / SILURUS 0.920 forms: Oxi 0.938 / SILURUS 0.713 forms: Oxi 0.747 / SILURUS 0.782 forms: Oxi 0.984 / SILURUS 0.971 forms: Oxi 0.976 / SILURUS 0.828 forms: Oxi 0.765 / SILURUS 0.771 reports: Oxi 0.959 / SILURUS 0.941 legal: Oxi 0.980 / SILURUS 0.847 reports: Oxi 0.920 / SILURUS 0.788 reports: Oxi 0.978 / SILURUS 0.927 reports: Oxi 0.960 / SILURUS 0.886 policies: Oxi 0.955 / SILURUS 0.969 reports: Oxi 0.787 / SILURUS 0.824 policies: Oxi 0.985 / SILURUS 0.828 legal: Oxi 0.972 / SILURUS 0.798 policies: Oxi 0.914 / SILURUS 0.882 policies: Oxi 0.945 / SILURUS 0.886 educational: Oxi 0.761 / SILURUS 0.751 educational: Oxi 0.901 / SILURUS 0.898 educational: Oxi 0.983 / SILURUS 0.605 educational: Oxi 0.970 / SILURUS 0.836 correspondence: Oxi 0.963 / SILURUS 0.830 correspondence: Oxi 0.915 / SILURUS 0.901 policies: Oxi 0.777 / SILURUS 0.873 correspondence: Oxi 0.986 / SILURUS 0.975 correspondence: Oxi 0.978 / SILURUS 0.912 correspondence: Oxi 0.542 / SILURUS 0.537 educational: Oxi 0.858 / SILURUS 0.696 technical: Oxi 0.736 / SILURUS 0.752 technical: Oxi 0.948 / SILURUS 0.965 technical: Oxi 0.937 / SILURUS 0.919 administrative: Oxi 0.925 / SILURUS 0.851 administrative: Oxi 0.835 / SILURUS 0.833 administrative: Oxi 0.982 / SILURUS 0.837 administrative: Oxi 0.989 / SILURUS 0.896 legal: Oxi 0.973 / SILURUS 0.769 technical: Oxi 0.840 / SILURUS 0.643 creative: Oxi 0.986 / SILURUS 0.980 administrative: Oxi 0.770 / SILURUS 0.746 creative: Oxi 0.875 / SILURUS 0.972 creative: Oxi 0.828 / SILURUS 0.831 creative: Oxi 0.954 / SILURUS 0.912 creative: Oxi 0.963 / SILURUS 0.961 reference: Oxi 0.844 / SILURUS 0.866 reference: Oxi 0.755 / SILURUS 0.868 reference: Oxi 0.870 / SILURUS 0.845 reference: Oxi 0.878 / SILURUS 0.753 reference: Oxi 0.967 / SILURUS 0.686 technical: Oxi 0.938 / SILURUS 0.871 vs SILURUS — Oxi ahead on 39/50 SILURUS SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ eigenpal better ↓ legal: Oxi 0.979 / eigenpal 0.834 legal: Oxi 0.967 / eigenpal 0.767 forms: Oxi 0.938 / eigenpal 0.686 forms: Oxi 0.747 / eigenpal 0.734 forms: Oxi 0.984 / eigenpal 0.867 forms: Oxi 0.976 / eigenpal 0.822 forms: Oxi 0.765 / eigenpal 0.730 reports: Oxi 0.959 / eigenpal 0.755 legal: Oxi 0.980 / eigenpal 0.839 reports: Oxi 0.920 / eigenpal 0.752 reports: Oxi 0.978 / eigenpal 0.888 reports: Oxi 0.960 / eigenpal 0.618 policies: Oxi 0.955 / eigenpal 0.867 reports: Oxi 0.787 / eigenpal 0.676 policies: Oxi 0.985 / eigenpal 0.840 legal: Oxi 0.972 / eigenpal 0.788 policies: Oxi 0.914 / eigenpal 0.800 policies: Oxi 0.945 / eigenpal 0.772 educational: Oxi 0.761 / eigenpal 0.650 educational: Oxi 0.901 / eigenpal 0.881 educational: Oxi 0.983 / eigenpal 0.604 educational: Oxi 0.970 / eigenpal 0.597 correspondence: Oxi 0.963 / eigenpal 0.738 correspondence: Oxi 0.915 / eigenpal 0.783 policies: Oxi 0.777 / eigenpal 0.840 correspondence: Oxi 0.986 / eigenpal 0.829 correspondence: Oxi 0.978 / eigenpal 0.806 correspondence: Oxi 0.542 / eigenpal 0.557 educational: Oxi 0.858 / eigenpal 0.683 technical: Oxi 0.736 / eigenpal 0.600 technical: Oxi 0.948 / eigenpal 0.703 technical: Oxi 0.937 / eigenpal 0.858 administrative: Oxi 0.925 / eigenpal 0.732 administrative: Oxi 0.835 / eigenpal 0.832 administrative: Oxi 0.982 / eigenpal 0.804 administrative: Oxi 0.989 / eigenpal 0.960 legal: Oxi 0.973 / eigenpal 0.759 technical: Oxi 0.840 / eigenpal 0.635 creative: Oxi 0.986 / eigenpal 0.827 administrative: Oxi 0.770 / eigenpal 0.611 creative: Oxi 0.875 / eigenpal 0.863 creative: Oxi 0.828 / eigenpal 0.767 creative: Oxi 0.954 / eigenpal 0.626 creative: Oxi 0.963 / eigenpal 0.911 reference: Oxi 0.844 / eigenpal 0.766 reference: Oxi 0.755 / eigenpal 0.658 reference: Oxi 0.870 / eigenpal 0.802 reference: Oxi 0.878 / eigenpal 0.592 reference: Oxi 0.967 / eigenpal 0.641 technical: Oxi 0.938 / eigenpal 0.851 vs eigenpal — Oxi ahead on 48/50 eigenpal SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ GenOffice better ↓ legal: Oxi 0.979 / GenOffice 0.923 legal: Oxi 0.967 / GenOffice 0.885 forms: Oxi 0.938 / GenOffice 0.716 forms: Oxi 0.747 / GenOffice 0.723 forms: Oxi 0.984 / GenOffice 0.869 forms: Oxi 0.976 / GenOffice 0.926 forms: Oxi 0.765 / GenOffice 0.781 reports: Oxi 0.959 / GenOffice 0.890 legal: Oxi 0.980 / GenOffice 0.892 reports: Oxi 0.920 / GenOffice 0.797 reports: Oxi 0.978 / GenOffice 0.944 reports: Oxi 0.960 / GenOffice 0.722 policies: Oxi 0.955 / GenOffice 0.859 reports: Oxi 0.787 / GenOffice 0.742 policies: Oxi 0.985 / GenOffice 0.819 legal: Oxi 0.972 / GenOffice 0.793 policies: Oxi 0.914 / GenOffice 0.870 policies: Oxi 0.945 / GenOffice 0.776 educational: Oxi 0.761 / GenOffice 0.618 educational: Oxi 0.901 / GenOffice 0.912 educational: Oxi 0.983 / GenOffice 0.891 educational: Oxi 0.970 / GenOffice 0.834 correspondence: Oxi 0.963 / GenOffice 0.738 correspondence: Oxi 0.915 / GenOffice 0.836 policies: Oxi 0.777 / GenOffice 0.818 correspondence: Oxi 0.986 / GenOffice 0.895 correspondence: Oxi 0.978 / GenOffice 0.909 correspondence: Oxi 0.542 / GenOffice 0.602 educational: Oxi 0.858 / GenOffice 0.746 technical: Oxi 0.736 / GenOffice 0.651 technical: Oxi 0.948 / GenOffice 0.771 technical: Oxi 0.937 / GenOffice 0.937 administrative: Oxi 0.925 / GenOffice 0.851 administrative: Oxi 0.835 / GenOffice 0.837 administrative: Oxi 0.982 / GenOffice 0.815 administrative: Oxi 0.989 / GenOffice 0.903 legal: Oxi 0.973 / GenOffice 0.786 technical: Oxi 0.840 / GenOffice 0.659 creative: Oxi 0.986 / GenOffice 0.948 administrative: Oxi 0.770 / GenOffice 0.824 creative: Oxi 0.875 / GenOffice 0.921 creative: Oxi 0.828 / GenOffice 0.828 creative: Oxi 0.954 / GenOffice 0.645 creative: Oxi 0.963 / GenOffice 0.941 reference: Oxi 0.844 / GenOffice 0.768 reference: Oxi 0.755 / GenOffice 0.773 reference: Oxi 0.870 / GenOffice 0.822 reference: Oxi 0.878 / GenOffice 0.668 reference: Oxi 0.967 / GenOffice 0.810 technical: Oxi 0.938 / GenOffice 0.860 vs GenOffice — Oxi ahead on 40/50 GenOffice SSIM (per document) Oxi SSIM
Top: per-engine mean — the dashed edge marks Microsoft Word itself (1.00). SILURUS is the closest architectural peer (Rust + WebAssembly rendering to a canvas, like Oxi); ONLYOFFICE and LibreOffice are mature native suites; BetterOffice (a Rust + WebAssembly editor suite) and eigenpal (an Apache-2.0 ProseMirror-based DOM renderer) joined the comparison on 2026-07-27 and GenOffice (Genspark's Apache-2.0 AI office suite) on 2026-08-06, and WordCraft and ibisOffice (Rust office suites that export a PDF from their own command line) on 2026-10-25; every bar is the 2026-10-25 measurement at the latest release printed on it, against the same frozen ground truth. Bottom: every dot is one document, with Oxi on the vertical axis; dots above the dashed diagonal are documents where Oxi is closer to Word. The blind set is measured but never fixed against, so this is first-sight generalization, published as-is.

Japanese blind set — 50 never-seen documents

Japanese is measured to the same standard. The current set is jaBlind-I50 (frozen 2026-10-25 before any measurement; the public manifest has no Japanese technical documents left, so those five slots went to the next entries across the other types by the rule declared in advance — all five are forms). Oxi leads on pixels (0.905) by 0.057 over Polaris Office (0.848, which comes within one document of Oxi on page breaks) and 0.074 over LibreOffice (0.831), and is closer to Word than Polaris Office on 40 of 50 documents, than LibreOffice on 43, than WordCraft on 43 and than ONLYOFFICE on 48; it also places the most page breaks where Word does (47/50). Engine rankings do not transfer between languages — ONLYOFFICE is first in English and ninth in Japanese — which is why a blind set is kept per language. Earlier Japanese sets scored 0.842 / 0.802 / 0.802 / 0.857 on the engines of their day; this one is the first above 0.90 — one sample, so the usual ±0.02 applies.

Japanese blind set — 50 never-touched documents, per-document mean SSIM vs Word (2026-10-25)

Oxipage count matches Word on 47/50
0.905
Polaris Officepage count matches Word on 46/50 · v11.115
0.848
LibreOfficepage count matches Word on 41/50 · v26.8.1.1
0.831
WordCraftpage count matches Word on 37/50 · v0.10.0
0.827
GenOfficepage count matches Word on 34/50 · v28cee5ca · 49 of 50 rendered
0.825
SILURUSpage count matches Word on 31/50 · v0.89.4 · 48 of 50 rendered
0.821
ibisOfficepage count matches Word on 41/50 · v0.8.4
0.819
OfficeCLIpage count matches Word on 32/50 · v1.0.158
0.810
ONLYOFFICEpage count matches Word on 38/50 · v10.0.0
0.790
BetterOfficepage count matches Word on 34/50 · v0.4.3
0.785
eigenpalpage count matches Word on 36/50 · v1.9.0
0.768
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ LibreOffice better ↓ legal: Oxi 0.965 / LibreOffice 0.958 legal: Oxi 0.992 / LibreOffice 0.987 legal: Oxi 0.987 / LibreOffice 0.887 legal: Oxi 0.973 / LibreOffice 0.915 forms: Oxi 0.936 / LibreOffice 0.909 forms: Oxi 0.926 / LibreOffice 0.751 forms: Oxi 0.915 / LibreOffice 0.811 legal: Oxi 0.903 / LibreOffice 0.914 forms: Oxi 0.871 / LibreOffice 0.814 forms: Oxi 0.983 / LibreOffice 0.927 forms: Oxi 0.926 / LibreOffice 0.813 forms: Oxi 0.824 / LibreOffice 0.813 forms: Oxi 0.981 / LibreOffice 0.962 forms: Oxi 0.955 / LibreOffice 0.836 reports: Oxi 0.800 / LibreOffice 0.747 forms: Oxi 0.877 / LibreOffice 0.823 reports: Oxi 0.885 / LibreOffice 0.713 reports: Oxi 0.712 / LibreOffice 0.600 policies: Oxi 0.952 / LibreOffice 0.985 policies: Oxi 0.972 / LibreOffice 0.825 policies: Oxi 0.936 / LibreOffice 0.669 policies: Oxi 0.940 / LibreOffice 0.882 educational: Oxi 0.982 / LibreOffice 0.928 reports: Oxi 0.946 / LibreOffice 0.939 educational: Oxi 0.866 / LibreOffice 0.717 educational: Oxi 0.927 / LibreOffice 0.841 educational: Oxi 0.908 / LibreOffice 0.821 correspondence: Oxi 0.951 / LibreOffice 0.806 correspondence: Oxi 0.964 / LibreOffice 0.805 correspondence: Oxi 0.718 / LibreOffice 0.721 correspondence: Oxi 0.927 / LibreOffice 0.775 correspondence: Oxi 0.835 / LibreOffice 0.675 administrative: Oxi 0.950 / LibreOffice 0.917 administrative: Oxi 0.985 / LibreOffice 0.982 administrative: Oxi 0.892 / LibreOffice 0.720 administrative: Oxi 0.917 / LibreOffice 0.952 reports: Oxi 0.814 / LibreOffice 0.662 administrative: Oxi 0.915 / LibreOffice 0.826 creative: Oxi 0.967 / LibreOffice 0.882 creative: Oxi 0.995 / LibreOffice 0.969 creative: Oxi 0.670 / LibreOffice 0.652 creative: Oxi 0.941 / LibreOffice 0.771 reference: Oxi 0.837 / LibreOffice 0.777 reference: Oxi 0.979 / LibreOffice 0.921 educational: Oxi 0.803 / LibreOffice 0.835 reference: Oxi 0.983 / LibreOffice 0.987 creative: Oxi 0.789 / LibreOffice 0.813 reference: Oxi 0.955 / LibreOffice 0.908 reference: Oxi 0.732 / LibreOffice 0.683 policies: Oxi 0.896 / LibreOffice 0.718 vs LibreOffice — Oxi ahead on 43/50 LibreOffice SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ ONLYOFFICE better ↓ legal: Oxi 0.965 / ONLYOFFICE 0.881 legal: Oxi 0.992 / ONLYOFFICE 0.936 legal: Oxi 0.987 / ONLYOFFICE 0.898 legal: Oxi 0.973 / ONLYOFFICE 0.910 forms: Oxi 0.936 / ONLYOFFICE 0.961 forms: Oxi 0.926 / ONLYOFFICE 0.659 forms: Oxi 0.915 / ONLYOFFICE 0.808 legal: Oxi 0.903 / ONLYOFFICE 0.828 forms: Oxi 0.871 / ONLYOFFICE 0.796 forms: Oxi 0.983 / ONLYOFFICE 0.921 forms: Oxi 0.926 / ONLYOFFICE 0.798 forms: Oxi 0.824 / ONLYOFFICE 0.765 forms: Oxi 0.981 / ONLYOFFICE 0.877 forms: Oxi 0.955 / ONLYOFFICE 0.824 reports: Oxi 0.800 / ONLYOFFICE 0.704 forms: Oxi 0.877 / ONLYOFFICE 0.823 reports: Oxi 0.885 / ONLYOFFICE 0.724 reports: Oxi 0.712 / ONLYOFFICE 0.607 policies: Oxi 0.952 / ONLYOFFICE 0.934 policies: Oxi 0.972 / ONLYOFFICE 0.582 policies: Oxi 0.936 / ONLYOFFICE 0.606 policies: Oxi 0.940 / ONLYOFFICE 0.808 educational: Oxi 0.982 / ONLYOFFICE 0.925 reports: Oxi 0.946 / ONLYOFFICE 0.707 educational: Oxi 0.866 / ONLYOFFICE 0.612 educational: Oxi 0.927 / ONLYOFFICE 0.839 educational: Oxi 0.908 / ONLYOFFICE 0.821 correspondence: Oxi 0.951 / ONLYOFFICE 0.791 correspondence: Oxi 0.964 / ONLYOFFICE 0.818 correspondence: Oxi 0.718 / ONLYOFFICE 0.705 correspondence: Oxi 0.927 / ONLYOFFICE 0.820 correspondence: Oxi 0.835 / ONLYOFFICE 0.694 administrative: Oxi 0.950 / ONLYOFFICE 0.908 administrative: Oxi 0.985 / ONLYOFFICE 0.954 administrative: Oxi 0.892 / ONLYOFFICE 0.684 administrative: Oxi 0.917 / ONLYOFFICE 0.811 reports: Oxi 0.814 / ONLYOFFICE 0.569 administrative: Oxi 0.915 / ONLYOFFICE 0.718 creative: Oxi 0.967 / ONLYOFFICE 0.864 creative: Oxi 0.995 / ONLYOFFICE 0.972 creative: Oxi 0.670 / ONLYOFFICE 0.629 creative: Oxi 0.941 / ONLYOFFICE 0.779 reference: Oxi 0.837 / ONLYOFFICE 0.760 reference: Oxi 0.979 / ONLYOFFICE 0.825 educational: Oxi 0.803 / ONLYOFFICE 0.843 reference: Oxi 0.983 / ONLYOFFICE 0.895 creative: Oxi 0.789 / ONLYOFFICE 0.685 reference: Oxi 0.955 / ONLYOFFICE 0.887 reference: Oxi 0.732 / ONLYOFFICE 0.640 policies: Oxi 0.896 / ONLYOFFICE 0.688 vs ONLYOFFICE — Oxi ahead on 48/50 ONLYOFFICE SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ SILURUS better ↓ legal: Oxi 0.965 / SILURUS 0.945 legal: Oxi 0.992 / SILURUS 0.941 legal: Oxi 0.987 / SILURUS 0.902 legal: Oxi 0.973 / SILURUS 0.968 forms: Oxi 0.936 / SILURUS 0.906 forms: Oxi 0.926 / SILURUS 0.700 forms: Oxi 0.915 / SILURUS 0.802 legal: Oxi 0.903 / SILURUS 0.907 forms: Oxi 0.871 / SILURUS 0.788 forms: Oxi 0.983 / SILURUS 0.970 forms: Oxi 0.926 / SILURUS 0.823 forms: Oxi 0.824 / SILURUS 0.784 forms: Oxi 0.981 / SILURUS 0.874 forms: Oxi 0.955 / SILURUS 0.882 reports: Oxi 0.800 / SILURUS 0.719 forms: Oxi 0.877 / SILURUS 0.822 reports: Oxi 0.885 / SILURUS 0.715 reports: Oxi 0.712 / SILURUS 0.631 policies: Oxi 0.952 / SILURUS 0.951 policies: Oxi 0.972 / SILURUS 0.650 policies: Oxi 0.936 / SILURUS 0.684 policies: Oxi 0.940 / SILURUS 0.851 reports: Oxi 0.946 / SILURUS 0.792 educational: Oxi 0.866 / SILURUS 0.688 educational: Oxi 0.927 / SILURUS 0.840 educational: Oxi 0.908 / SILURUS 0.822 correspondence: Oxi 0.951 / SILURUS 0.765 correspondence: Oxi 0.964 / SILURUS 0.802 correspondence: Oxi 0.718 / SILURUS 0.718 correspondence: Oxi 0.927 / SILURUS 0.761 correspondence: Oxi 0.835 / SILURUS 0.721 administrative: Oxi 0.950 / SILURUS 0.959 administrative: Oxi 0.985 / SILURUS 0.977 administrative: Oxi 0.892 / SILURUS 0.724 administrative: Oxi 0.917 / SILURUS 0.954 reports: Oxi 0.814 / SILURUS 0.670 administrative: Oxi 0.915 / SILURUS 0.781 creative: Oxi 0.967 / SILURUS 0.921 creative: Oxi 0.995 / SILURUS 0.963 creative: Oxi 0.670 / SILURUS 0.655 creative: Oxi 0.941 / SILURUS 0.833 reference: Oxi 0.837 / SILURUS 0.760 reference: Oxi 0.979 / SILURUS 0.962 educational: Oxi 0.803 / SILURUS 0.769 reference: Oxi 0.983 / SILURUS 0.962 creative: Oxi 0.789 / SILURUS 0.730 reference: Oxi 0.955 / SILURUS 0.931 reference: Oxi 0.732 / SILURUS 0.724 vs SILURUS — Oxi ahead on 44/48 SILURUS SSIM (per document) Oxi SSIM

BetterOffice 0.1.0 is absent from the Japanese chart: its English pass completed, but the Japanese pass produced no output at all. Recorded as incomplete rather than estimated.

0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ eigenpal better ↓ legal: Oxi 0.965 / eigenpal 0.871 legal: Oxi 0.992 / eigenpal 0.933 legal: Oxi 0.987 / eigenpal 0.893 legal: Oxi 0.973 / eigenpal 0.912 forms: Oxi 0.936 / eigenpal 0.874 forms: Oxi 0.926 / eigenpal 0.665 forms: Oxi 0.915 / eigenpal 0.823 legal: Oxi 0.903 / eigenpal 0.764 forms: Oxi 0.871 / eigenpal 0.798 forms: Oxi 0.983 / eigenpal 0.918 forms: Oxi 0.926 / eigenpal 0.792 forms: Oxi 0.824 / eigenpal 0.751 forms: Oxi 0.981 / eigenpal 0.874 forms: Oxi 0.955 / eigenpal 0.808 reports: Oxi 0.800 / eigenpal 0.402 forms: Oxi 0.877 / eigenpal 0.786 reports: Oxi 0.885 / eigenpal 0.708 reports: Oxi 0.712 / eigenpal 0.649 policies: Oxi 0.952 / eigenpal 0.903 policies: Oxi 0.972 / eigenpal 0.596 policies: Oxi 0.936 / eigenpal 0.587 policies: Oxi 0.940 / eigenpal 0.791 educational: Oxi 0.982 / eigenpal 0.925 reports: Oxi 0.946 / eigenpal 0.709 educational: Oxi 0.866 / eigenpal 0.603 educational: Oxi 0.927 / eigenpal 0.834 educational: Oxi 0.908 / eigenpal 0.805 correspondence: Oxi 0.951 / eigenpal 0.755 correspondence: Oxi 0.964 / eigenpal 0.814 correspondence: Oxi 0.718 / eigenpal 0.704 correspondence: Oxi 0.927 / eigenpal 0.788 correspondence: Oxi 0.835 / eigenpal 0.658 administrative: Oxi 0.950 / eigenpal 0.904 administrative: Oxi 0.985 / eigenpal 0.952 administrative: Oxi 0.892 / eigenpal 0.681 administrative: Oxi 0.917 / eigenpal 0.821 reports: Oxi 0.814 / eigenpal 0.606 administrative: Oxi 0.915 / eigenpal 0.705 creative: Oxi 0.967 / eigenpal 0.859 creative: Oxi 0.995 / eigenpal 0.951 creative: Oxi 0.670 / eigenpal 0.579 creative: Oxi 0.941 / eigenpal 0.687 reference: Oxi 0.837 / eigenpal 0.744 reference: Oxi 0.979 / eigenpal 0.813 educational: Oxi 0.803 / eigenpal 0.759 reference: Oxi 0.983 / eigenpal 0.883 creative: Oxi 0.789 / eigenpal 0.677 reference: Oxi 0.955 / eigenpal 0.869 reference: Oxi 0.732 / eigenpal 0.574 policies: Oxi 0.896 / eigenpal 0.657 vs eigenpal — Oxi ahead on 50/50 eigenpal SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ GenOffice better ↓ legal: Oxi 0.965 / GenOffice 0.959 legal: Oxi 0.992 / GenOffice 0.968 legal: Oxi 0.987 / GenOffice 0.898 legal: Oxi 0.973 / GenOffice 0.952 forms: Oxi 0.936 / GenOffice 0.888 forms: Oxi 0.926 / GenOffice 0.750 forms: Oxi 0.915 / GenOffice 0.797 legal: Oxi 0.903 / GenOffice 0.837 forms: Oxi 0.871 / GenOffice 0.795 forms: Oxi 0.983 / GenOffice 0.966 forms: Oxi 0.926 / GenOffice 0.852 forms: Oxi 0.824 / GenOffice 0.739 forms: Oxi 0.981 / GenOffice 0.934 forms: Oxi 0.955 / GenOffice 0.884 reports: Oxi 0.800 / GenOffice 0.393 forms: Oxi 0.877 / GenOffice 0.815 reports: Oxi 0.885 / GenOffice 0.743 reports: Oxi 0.712 / GenOffice 0.594 policies: Oxi 0.952 / GenOffice 0.970 policies: Oxi 0.972 / GenOffice 0.633 policies: Oxi 0.936 / GenOffice 0.732 policies: Oxi 0.940 / GenOffice 0.906 educational: Oxi 0.982 / GenOffice 0.945 reports: Oxi 0.946 / GenOffice 0.787 educational: Oxi 0.866 / GenOffice 0.680 educational: Oxi 0.927 / GenOffice 0.847 educational: Oxi 0.908 / GenOffice 0.833 correspondence: Oxi 0.951 / GenOffice 0.788 correspondence: Oxi 0.964 / GenOffice 0.821 correspondence: Oxi 0.718 / GenOffice 0.819 correspondence: Oxi 0.927 / GenOffice 0.775 correspondence: Oxi 0.835 / GenOffice 0.707 administrative: Oxi 0.950 / GenOffice 0.954 administrative: Oxi 0.985 / GenOffice 0.962 administrative: Oxi 0.892 / GenOffice 0.747 administrative: Oxi 0.917 / GenOffice 0.857 administrative: Oxi 0.915 / GenOffice 0.834 creative: Oxi 0.967 / GenOffice 0.928 creative: Oxi 0.995 / GenOffice 0.969 creative: Oxi 0.670 / GenOffice 0.646 creative: Oxi 0.941 / GenOffice 0.857 reference: Oxi 0.837 / GenOffice 0.782 reference: Oxi 0.979 / GenOffice 0.960 educational: Oxi 0.803 / GenOffice 0.780 reference: Oxi 0.983 / GenOffice 0.955 creative: Oxi 0.789 / GenOffice 0.813 reference: Oxi 0.955 / GenOffice 0.937 reference: Oxi 0.732 / GenOffice 0.693 policies: Oxi 0.896 / GenOffice 0.740 vs GenOffice — Oxi ahead on 45/49 GenOffice SSIM (per document) Oxi SSIM
Top: per-engine mean — the dashed edge marks Microsoft Word itself (1.00). Bottom: every dot is one document, with Oxi on the vertical axis; dots above the dashed diagonal are documents where Oxi is closer to Word. The blind set is measured but never fixed against, so this is first-sight generalization, published as-is.

PowerPoint blind set — 48 never-seen decks

The same discipline, applied to .pptx: 50 decks sampled at random (seed declared before fetching) from the public noxneural/pptx_collection_templates dataset, scored against Microsoft PowerPoint’s own render at 150 DPI — two corrupt files no engine opens are excluded, leaving 48. First measured at 0.679 on 2026-08-13, the renderer reached 0.953 on 2026-08-20 — ahead of LibreOffice (0.913; paired difference +0.040 ± 0.005, |t| = 8.7, Oxi ahead on 44 of the 48 decks) and ONLYOFFICE (0.908) — with every engine matching PowerPoint’s slide count on all 48, every single deck improving over that week, and the worst deck now at 0.880.

PPTX blind set — 48 never-seen decks, per-deck mean SSIM vs PowerPoint (2026-08-20)

Oxislide count matches PowerPoint on 48/48
0.953
LibreOfficeslide count matches on 48/48 · v26.2.1.2
0.913
ONLYOFFICEslide count matches on 48/48 · v9.3.1.8
0.908

Excel — formulas and VBA in the browser

The .xlsx engine ships a dependency-graph formula engine — 215 functions, recalculation diffed against Excel’s own cached results across 285 real workbooks — and a client-side VBA host that runs workbook macros in the browser: Range / Worksheet / Workbook operations, Sort, AutoFilter, Find, Copy/PasteSpecial and WorksheetFunction, 95 members across 11 host objects, each derived from and verified against real Excel COM behaviour (82 scripted A/B comparisons). Macro edits write back differentially — the original ZIP is preserved, and a no-edit save is byte-identical.

Engineering deep dive: Reproducing VBA's object lifetimes in Rust with Drop — how the interpreter runs Class_Terminate at the exact moment Excel does.

How the fidelity is earned

  • 100% clean-room: no disassembly or binary analysis. Specifications come only from published standards (OOXML — ISO/IEC 29500 / ECMA-376) and black-box observation of Word's output via the COM API.
  • Dual font engine: Word's layout inherits GDI's integer-pixel metrics, so Oxi reproduces GDI exactly for .docx — and uses DirectWrite's floating-point metrics for formats without that legacy.
  • Continuous regression gates: every change is checked against the full corpus — pagination match, element positions, and pixel SSIM.

Details and reproduction scripts: README — Layout Accuracy · docs/layout_accuracy.md

First-class Japanese typography

Most Word-compatible renderers treat Japanese layout as an afterthought. For Oxi it is a measured target.

  • Kinsoku shori (禁則処理) — JIS X 4051 line-breaking: prohibited line-start/line-end characters, punctuation compression, hanging punctuation (ぶら下げ).
  • Vertical writing (縦書き) — vertical text sections with right-to-left column flow, plus tate-chu-yoko (縦中横) for horizontal-in-vertical runs.
  • Ruby (ルビ / furigana), warichu (割注) two-line inline notes, and emphasis marks (圏点).
  • Character grid (docGrid) — Word's Japanese line-grid and character-pitch model, reproduced to the point.
  • Hanko (判子) — Japanese digital stamp generation (round, square, oval) with PAdES PDF signatures.

The measurement corpus itself is Japanese-first: ministry regulations, government application forms, and employment contracts — the documents where Japanese layout is hardest.

Technology

Rust + WebAssembly, a format-agnostic intermediate representation, and zero server dependency.

Why it matters now

Public-sector organizations across Europe — France's DINUM directive, Switzerland's Federal Chancellery, Germany's OpenDesk deployments — are actively reducing Microsoft Office dependency in 2026. Every one of those migrations hits the same wall: existing .docx files must keep looking exactly as they do in Word. Oxi's goal is to dissolve that problem with a rendering engine whose Word fidelity is continuously measured, not promised.

Architecture

  • Client-side only: parsing, layout, rendering and editing run in WebAssembly in your browser. No server infrastructure, no upload, zero hosting cost per document.
  • Format-agnostic IR: Document → Page → Block (Paragraph | Table | Image) → Run. Neither OOXML nor ODF "owns" the model, so round-trips don't degrade.
  • Round-trip editing: the original ZIP is preserved and only changed XML text nodes are patched — never rebuilt from scratch.
  • Open fonts only: no proprietary fonts are bundled; open-licensed fonts are metric-matched to their Microsoft counterparts.
  • Embeddable: a wasm-bindgen JavaScript API (parse_document, layout_document, edit_docx, …) callable from any web app.

License

Core engine crates are MPL-2.0 (file-level copyleft — embeddable in proprietary products, unlike AGPL). WebAssembly and Python bindings are MIT OR Apache-2.0. Contributions are DCO-only, no CLA.

Frequently asked questions

Is Oxi free to use?

Yes. Oxi is open source — MPL-2.0 core, MIT OR Apache-2.0 bindings — and the web demo is free with no account.

Are my documents uploaded to a server?

No. Everything runs inside your browser via WebAssembly. Files are never transmitted anywhere, which makes Oxi suitable for confidential and personal documents.

How accurate is Oxi compared with Microsoft Word?

Oxi’s layout is measured against Microsoft Word page by page with pixel-level SSIM, on frozen blind benchmarks of never-seen documents that are never used as fix targets. On the English blind-I50 set (frozen and measured 2026-10-25, every engine at its latest release) Oxi scores 0.903 per document and reproduces Word’s page count on 47 of 50, the most of any engine; ONLYOFFICE is slightly ahead on pixels (0.909, 42/50) and LibreOffice behind (0.864, 39/50). On the Japanese blind-I50 set Oxi leads at 0.905, ahead of Polaris Office (0.848) and LibreOffice (0.831), and places the most page breaks correctly (47/50). Engine rankings do not transfer between languages, which is why a blind set is kept per language. See the accuracy section for the comparison charts and methodology.

Which file formats does Oxi support?

Oxi focuses on Word .docx: full page layout and round-trip editing. Reproducing Word's .docx rendering faithfully is the mission — everything else comes after.

Can I embed Oxi in my own product?

Yes. MPL-2.0's file-level copyleft plus permissive bindings mean Oxi can be embedded in commercial and proprietary products.

Does Oxi work offline?

Once the page and the WebAssembly module are loaded, all document processing is local — no network connection is needed to open, render or edit files.