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.80
SSIM vs Word — Japanese blind
benchmark (50 never-seen docs)
0.90
SSIM vs Word — English blind
benchmark (48 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-C50 (manifest ranks 21-25, frozen 2026-07-29 before any measurement); this is its first pixel measurement, 2026-08-31. Word itself fails to export 2 of the 50, so every engine is scored on the same 48. Oxi reproduces Word’s page count on 48 of 48 — the only engine measured that matches every document, against ONLYOFFICE’s 42 and LibreOffice’s 43. On within-page pixels ONLYOFFICE is 0.005 ahead (0.908 vs 0.903) and LibreOffice is a near-tie at 0.892, Oxi ahead on 25 of 48. Once page-count misses are charged the order widens: penalized means are SILURUS 0.741, eigenpal 0.723, BetterOffice 0.619, GenOffice 0.570, OfficeCLI 0.486, against Oxi’s 0.903. Engines: Microsoft Word (Microsoft 365 16.0.20131.20154) as ground truth, ONLYOFFICE 9.3.1.8, LibreOffice 26.2.1.2, SILURUS @silurus/ooxml 0.83.1, eigenpal @eigenpal/docx-editor-react 1.9.0, BetterOffice @betteroffice/docx 0.1.0, GenOffice v0.1.0, OfficeCLI 1.0.145 — all at 150 DPI. OfficeCLI is measured with --render html, its own layout engine: its default --render auto delegates to Word on a host that has Word installed, scoring 0.996 against Word because it is Word.

English blind set — 48 never-touched documents, per-document mean SSIM vs Word (2026-08-31)

ONLYOFFICEpage count matches Word on 42/48 · v9.3.1.8
0.908
Oxipage count matches Word on 48/48 — best measured
0.903
LibreOfficepage count matches Word on 43/48 · v26.2.1.2
0.892
SILURUSpage count matches Word on 35/48 · v0.83.1
0.791
eigenpalpage count matches Word on 35/48 · v1.9.0
0.768
BetterOfficepage count matches Word on 26/48 · v0.1.0
0.761
OfficeCLIpage count matches Word on 17/48 · v1.0.145 · own HTML engine
0.753
GenOfficepage count matches Word on 17/48 · v0.1.0
0.740
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ LibreOffice better ↓ legal: Oxi 0.730 / LibreOffice 0.903 legal: Oxi 0.863 / LibreOffice 0.875 forms: Oxi 0.845 / LibreOffice 0.901 forms: Oxi 0.836 / LibreOffice 0.976 forms: Oxi 0.974 / LibreOffice 0.946 legal: Oxi 0.831 / LibreOffice 0.855 forms: Oxi 0.850 / LibreOffice 0.974 forms: Oxi 0.994 / LibreOffice 0.911 reports: Oxi 0.670 / LibreOffice 0.754 reports: Oxi 0.623 / LibreOffice 0.933 reports: Oxi 0.665 / LibreOffice 0.689 reports: Oxi 0.861 / LibreOffice 0.878 policies: Oxi 0.965 / LibreOffice 0.922 reports: Oxi 0.751 / LibreOffice 0.863 policies: Oxi 0.625 / LibreOffice 0.801 policies: Oxi 0.942 / LibreOffice 0.840 policies: Oxi 0.814 / LibreOffice 0.826 policies: Oxi 0.697 / LibreOffice 0.739 educational: Oxi 0.768 / LibreOffice 0.814 educational: Oxi 0.562 / LibreOffice 0.559 educational: Oxi 0.688 / LibreOffice 0.929 educational: Oxi 0.871 / LibreOffice 0.852 correspondence: Oxi 0.977 / LibreOffice 0.818 correspondence: Oxi 0.960 / LibreOffice 0.941 correspondence: Oxi 0.756 / LibreOffice 0.967 correspondence: Oxi 0.644 / LibreOffice 0.758 correspondence: Oxi 0.657 / LibreOffice 0.757 educational: Oxi 0.679 / LibreOffice 0.940 technical: Oxi 0.915 / LibreOffice 0.985 technical: Oxi 0.799 / LibreOffice 0.855 technical: Oxi 0.957 / LibreOffice 0.967 technical: Oxi 0.893 / LibreOffice 0.966 administrative: Oxi 0.970 / LibreOffice 0.994 administrative: Oxi 0.892 / LibreOffice 0.828 legal: Oxi 0.925 / LibreOffice 0.805 administrative: Oxi 0.973 / LibreOffice 0.740 administrative: Oxi 0.900 / LibreOffice 0.897 administrative: Oxi 0.967 / LibreOffice 0.972 technical: Oxi 0.752 / LibreOffice 0.892 creative: Oxi 0.989 / LibreOffice 0.943 creative: Oxi 0.993 / LibreOffice 0.992 creative: Oxi 0.744 / LibreOffice 0.958 creative: Oxi 0.997 / LibreOffice 0.997 creative: Oxi 0.876 / LibreOffice 0.958 reference: Oxi 0.965 / LibreOffice 0.964 reference: Oxi 0.996 / LibreOffice 0.986 reference: Oxi 0.785 / LibreOffice 0.904 reference: Oxi 0.801 / LibreOffice 0.967 reference: Oxi 0.724 / LibreOffice 0.747 legal: Oxi 0.944 / LibreOffice 0.742 vs LibreOffice — Oxi ahead on 17/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.730 / ONLYOFFICE 0.878 legal: Oxi 0.863 / ONLYOFFICE 0.900 forms: Oxi 0.845 / ONLYOFFICE 0.970 forms: Oxi 0.836 / ONLYOFFICE 0.990 forms: Oxi 0.974 / ONLYOFFICE 0.990 legal: Oxi 0.831 / ONLYOFFICE 0.943 forms: Oxi 0.850 / ONLYOFFICE 0.824 forms: Oxi 0.994 / ONLYOFFICE 0.910 reports: Oxi 0.670 / ONLYOFFICE 0.919 reports: Oxi 0.623 / ONLYOFFICE 0.930 reports: Oxi 0.665 / ONLYOFFICE 0.963 reports: Oxi 0.861 / ONLYOFFICE 0.898 policies: Oxi 0.965 / ONLYOFFICE 0.977 reports: Oxi 0.751 / ONLYOFFICE 0.914 policies: Oxi 0.625 / ONLYOFFICE 0.874 policies: Oxi 0.942 / ONLYOFFICE 0.991 policies: Oxi 0.814 / ONLYOFFICE 0.829 policies: Oxi 0.697 / ONLYOFFICE 0.745 educational: Oxi 0.768 / ONLYOFFICE 0.934 educational: Oxi 0.562 / ONLYOFFICE 0.865 educational: Oxi 0.688 / ONLYOFFICE 0.655 educational: Oxi 0.871 / ONLYOFFICE 0.840 correspondence: Oxi 0.977 / ONLYOFFICE 0.987 correspondence: Oxi 0.960 / ONLYOFFICE 0.977 correspondence: Oxi 0.756 / ONLYOFFICE 0.848 correspondence: Oxi 0.644 / ONLYOFFICE 0.981 correspondence: Oxi 0.657 / ONLYOFFICE 0.658 educational: Oxi 0.679 / ONLYOFFICE 0.947 technical: Oxi 0.915 / ONLYOFFICE 0.997 technical: Oxi 0.799 / ONLYOFFICE 0.788 technical: Oxi 0.957 / ONLYOFFICE 0.988 technical: Oxi 0.893 / ONLYOFFICE 0.962 administrative: Oxi 0.970 / ONLYOFFICE 0.998 administrative: Oxi 0.892 / ONLYOFFICE 0.832 legal: Oxi 0.925 / ONLYOFFICE 0.811 administrative: Oxi 0.973 / ONLYOFFICE 0.975 administrative: Oxi 0.900 / ONLYOFFICE 0.885 administrative: Oxi 0.967 / ONLYOFFICE 0.980 technical: Oxi 0.752 / ONLYOFFICE 0.760 creative: Oxi 0.989 / ONLYOFFICE 0.985 creative: Oxi 0.993 / ONLYOFFICE 0.906 creative: Oxi 0.744 / ONLYOFFICE 0.797 creative: Oxi 0.997 / ONLYOFFICE 0.997 creative: Oxi 0.876 / ONLYOFFICE 0.702 reference: Oxi 0.965 / ONLYOFFICE 0.973 reference: Oxi 0.996 / ONLYOFFICE 0.996 reference: Oxi 0.785 / ONLYOFFICE 0.960 reference: Oxi 0.801 / ONLYOFFICE 0.963 reference: Oxi 0.724 / ONLYOFFICE 0.738 legal: Oxi 0.944 / ONLYOFFICE 0.757 vs ONLYOFFICE — Oxi ahead on 13/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.730 / SILURUS 0.734 legal: Oxi 0.863 / SILURUS 0.777 forms: Oxi 0.845 / SILURUS 0.809 forms: Oxi 0.836 / SILURUS 0.832 forms: Oxi 0.974 / SILURUS 0.883 legal: Oxi 0.831 / SILURUS 0.816 forms: Oxi 0.850 / SILURUS 0.863 forms: Oxi 0.994 / SILURUS 0.911 reports: Oxi 0.670 / SILURUS 0.666 reports: Oxi 0.623 / SILURUS 0.629 reports: Oxi 0.665 / SILURUS 0.662 reports: Oxi 0.861 / SILURUS 0.699 policies: Oxi 0.965 / SILURUS 0.845 reports: Oxi 0.751 / SILURUS 0.729 policies: Oxi 0.625 / SILURUS 0.790 policies: Oxi 0.942 / SILURUS 0.837 policies: Oxi 0.814 / SILURUS 0.824 policies: Oxi 0.697 / SILURUS 0.725 educational: Oxi 0.768 / SILURUS 0.622 educational: Oxi 0.562 / SILURUS 0.528 educational: Oxi 0.871 / SILURUS 0.775 correspondence: Oxi 0.977 / SILURUS 0.871 correspondence: Oxi 0.960 / SILURUS 0.722 correspondence: Oxi 0.756 / SILURUS 0.865 correspondence: Oxi 0.644 / SILURUS 0.637 correspondence: Oxi 0.657 / SILURUS 0.662 educational: Oxi 0.679 / SILURUS 0.682 technical: Oxi 0.915 / SILURUS 0.915 technical: Oxi 0.799 / SILURUS 0.780 technical: Oxi 0.957 / SILURUS 0.959 technical: Oxi 0.893 / SILURUS 0.869 administrative: Oxi 0.970 / SILURUS 0.924 administrative: Oxi 0.892 / SILURUS 0.810 legal: Oxi 0.925 / SILURUS 0.800 administrative: Oxi 0.973 / SILURUS 0.600 administrative: Oxi 0.900 / SILURUS 0.659 administrative: Oxi 0.967 / SILURUS 0.915 technical: Oxi 0.752 / SILURUS 0.726 creative: Oxi 0.989 / SILURUS 0.864 creative: Oxi 0.993 / SILURUS 0.896 creative: Oxi 0.744 / SILURUS 0.763 creative: Oxi 0.997 / SILURUS 0.965 creative: Oxi 0.876 / SILURUS 0.685 reference: Oxi 0.965 / SILURUS 0.917 reference: Oxi 0.996 / SILURUS 0.943 reference: Oxi 0.785 / SILURUS 0.750 reference: Oxi 0.801 / SILURUS 0.747 reference: Oxi 0.724 / SILURUS 0.716 vs SILURUS — Oxi ahead on 37/48 SILURUS SSIM (per document) Oxi SSIM
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ BetterOffice better ↓ legal: Oxi 0.730 / BetterOffice 0.698 legal: Oxi 0.863 / BetterOffice 0.732 forms: Oxi 0.845 / BetterOffice 0.701 forms: Oxi 0.836 / BetterOffice 0.844 forms: Oxi 0.974 / BetterOffice 0.885 legal: Oxi 0.831 / BetterOffice 0.790 forms: Oxi 0.850 / BetterOffice 0.843 forms: Oxi 0.994 / BetterOffice 0.909 policies: Oxi 0.965 / BetterOffice 0.775 policies: Oxi 0.625 / BetterOffice 0.683 policies: Oxi 0.942 / BetterOffice 0.682 policies: Oxi 0.814 / BetterOffice 0.804 policies: Oxi 0.697 / BetterOffice 0.700 educational: Oxi 0.768 / BetterOffice 0.603 educational: Oxi 0.562 / BetterOffice 0.511 educational: Oxi 0.688 / BetterOffice 0.709 educational: Oxi 0.871 / BetterOffice 0.786 correspondence: Oxi 0.977 / BetterOffice 0.828 correspondence: Oxi 0.960 / BetterOffice 0.681 correspondence: Oxi 0.756 / BetterOffice 0.783 correspondence: Oxi 0.644 / BetterOffice 0.666 correspondence: Oxi 0.657 / BetterOffice 0.755 educational: Oxi 0.679 / BetterOffice 0.745 administrative: Oxi 0.970 / BetterOffice 0.892 administrative: Oxi 0.892 / BetterOffice 0.722 legal: Oxi 0.925 / BetterOffice 0.779 administrative: Oxi 0.973 / BetterOffice 0.672 administrative: Oxi 0.900 / BetterOffice 0.659 administrative: Oxi 0.967 / BetterOffice 0.778 creative: Oxi 0.989 / BetterOffice 0.875 creative: Oxi 0.993 / BetterOffice 0.898 creative: Oxi 0.744 / BetterOffice 0.754 creative: Oxi 0.997 / BetterOffice 0.942 creative: Oxi 0.876 / BetterOffice 0.645 reference: Oxi 0.965 / BetterOffice 0.912 reference: Oxi 0.996 / BetterOffice 0.931 reference: Oxi 0.801 / BetterOffice 0.738 reference: Oxi 0.724 / BetterOffice 0.725 vs BetterOffice — Oxi ahead on 28/38 BetterOffice 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.730 / eigenpal 0.673 legal: Oxi 0.863 / eigenpal 0.662 forms: Oxi 0.845 / eigenpal 0.814 forms: Oxi 0.836 / eigenpal 0.798 forms: Oxi 0.974 / eigenpal 0.894 legal: Oxi 0.831 / eigenpal 0.783 forms: Oxi 0.850 / eigenpal 0.847 forms: Oxi 0.994 / eigenpal 0.910 reports: Oxi 0.670 / eigenpal 0.632 reports: Oxi 0.623 / eigenpal 0.626 reports: Oxi 0.665 / eigenpal 0.701 reports: Oxi 0.861 / eigenpal 0.694 policies: Oxi 0.965 / eigenpal 0.745 reports: Oxi 0.751 / eigenpal 0.693 policies: Oxi 0.625 / eigenpal 0.649 policies: Oxi 0.942 / eigenpal 0.792 policies: Oxi 0.814 / eigenpal 0.814 policies: Oxi 0.697 / eigenpal 0.718 educational: Oxi 0.768 / eigenpal 0.601 educational: Oxi 0.562 / eigenpal 0.447 educational: Oxi 0.688 / eigenpal 0.658 educational: Oxi 0.871 / eigenpal 0.754 correspondence: Oxi 0.977 / eigenpal 0.872 correspondence: Oxi 0.960 / eigenpal 0.756 correspondence: Oxi 0.756 / eigenpal 0.732 correspondence: Oxi 0.644 / eigenpal 0.639 correspondence: Oxi 0.657 / eigenpal 0.631 educational: Oxi 0.679 / eigenpal 0.714 technical: Oxi 0.915 / eigenpal 0.893 technical: Oxi 0.799 / eigenpal 0.779 technical: Oxi 0.957 / eigenpal 0.942 technical: Oxi 0.893 / eigenpal 0.854 administrative: Oxi 0.970 / eigenpal 0.875 administrative: Oxi 0.892 / eigenpal 0.839 legal: Oxi 0.925 / eigenpal 0.794 administrative: Oxi 0.973 / eigenpal 0.795 administrative: Oxi 0.900 / eigenpal 0.652 administrative: Oxi 0.967 / eigenpal 0.776 technical: Oxi 0.752 / eigenpal 0.725 creative: Oxi 0.989 / eigenpal 0.906 creative: Oxi 0.993 / eigenpal 0.895 creative: Oxi 0.744 / eigenpal 0.756 creative: Oxi 0.997 / eigenpal 0.952 creative: Oxi 0.876 / eigenpal 0.656 reference: Oxi 0.965 / eigenpal 0.941 reference: Oxi 0.996 / eigenpal 0.977 reference: Oxi 0.785 / eigenpal 0.766 reference: Oxi 0.801 / eigenpal 0.736 reference: Oxi 0.724 / eigenpal 0.702 vs eigenpal — Oxi ahead on 43/49 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.953 / GenOffice 0.939 legal: Oxi 0.859 / GenOffice 0.861 forms: Oxi 0.954 / GenOffice 0.870 forms: Oxi 0.935 / GenOffice 0.882 legal: Oxi 0.810 / GenOffice 0.750 legal: Oxi 0.811 / GenOffice 0.752 forms: Oxi 0.919 / GenOffice 0.818 forms: Oxi 0.642 / GenOffice 0.613 legal: Oxi 0.813 / GenOffice 0.736 reports: Oxi 0.934 / GenOffice 0.880 forms: Oxi 0.815 / GenOffice 0.795 reports: Oxi 0.998 / GenOffice 0.989 reports: Oxi 0.567 / GenOffice 0.571 reports: Oxi 0.649 / GenOffice 0.624 policies: Oxi 0.603 / GenOffice 0.706 reports: Oxi 0.757 / GenOffice 0.715 policies: Oxi 0.957 / GenOffice 0.872 educational: Oxi 0.809 / GenOffice 0.764 policies: Oxi 0.810 / GenOffice 0.730 educational: Oxi 0.794 / GenOffice 0.796 policies: Oxi 0.770 / GenOffice 0.740 educational: Oxi 0.508 / GenOffice 0.564 educational: Oxi 0.628 / GenOffice 0.585 correspondence: Oxi 0.964 / GenOffice 0.883 correspondence: Oxi 0.676 / GenOffice 0.570 educational: Oxi 0.710 / GenOffice 0.753 correspondence: Oxi 0.866 / GenOffice 0.753 correspondence: Oxi 0.729 / GenOffice 0.718 correspondence: Oxi 0.918 / GenOffice 0.786 technical: Oxi 0.674 / GenOffice 0.666 technical: Oxi 0.846 / GenOffice 0.678 technical: Oxi 0.963 / GenOffice 0.896 technical: Oxi 0.850 / GenOffice 0.659 administrative: Oxi 0.599 / GenOffice 0.600 administrative: Oxi 0.944 / GenOffice 0.900 technical: Oxi 0.879 / GenOffice 0.936 administrative: Oxi 0.978 / GenOffice 0.982 administrative: Oxi 0.761 / GenOffice 0.750 creative: Oxi 0.828 / GenOffice 0.692 creative: Oxi 0.798 / GenOffice 0.781 administrative: Oxi 0.809 / GenOffice 0.701 creative: Oxi 0.738 / GenOffice 0.573 reference: Oxi 0.897 / GenOffice 0.705 reference: Oxi 0.573 / GenOffice 0.714 creative: Oxi 0.609 / GenOffice 0.639 creative: Oxi 0.928 / GenOffice 0.811 reference: Oxi 0.644 / GenOffice 0.695 reference: Oxi 0.926 / GenOffice 0.922 reference: Oxi 0.957 / GenOffice 0.857 policies: Oxi 0.764 / GenOffice 0.705 vs GenOffice — Oxi ahead on 38/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; every bar is the 2026-08-31 measurement at the version 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 blind-C50 (ranks 16-20, frozen 2026-08-31 before any measurement); this is its first measurement, and the previous Japanese blind set was demoted to the development corpus the same day. Oxi leads on pixels (0.802), but by 0.012-0.015 over SILURUS (0.790) and LibreOffice (0.788) — a modest margin on 50 documents, not a decisive one. ONLYOFFICE places more page breaks correctly (40/50 against Oxi’s 35/50), so Oxi does not lead on both. Engine rankings do not transfer between languages — ONLYOFFICE is first in English and fifth in Japanese, SILURUS fourth in English and second in Japanese — which is why a blind set is kept per language. Two independently frozen sets measured the same day on the same binary (blind-B50 / blind-C50) scored 0.842 and 0.802, matching Word’s page count on 45/50 and 35/50. That 0.040 is set difficulty, not engine change: a single blind number carries about ±0.02.

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

Oxipage count matches Word on 35/50
0.802
SILURUSpage count matches Word on 32/50 · v0.83.1
0.790
LibreOfficepage count matches Word on 33/50 · v26.2.1.2
0.788
OfficeCLIpage count matches Word on 22/50 · v1.0.145 · own HTML engine
0.748
ONLYOFFICEpage count matches Word on 40/50 — best measured · v9.3.1.8
0.743
GenOfficepage count matches Word on 10/50 · v0.1.0
0.732
eigenpalpage count matches Word on 35/50 · v1.9.0
0.705
0.4 0.4 0.6 0.6 0.8 0.8 1.0 1.0 Oxi better ↑ LibreOffice better ↓ legal: Oxi 0.953 / LibreOffice 0.941 legal: Oxi 0.859 / LibreOffice 0.893 forms: Oxi 0.954 / LibreOffice 0.940 forms: Oxi 0.935 / LibreOffice 0.940 legal: Oxi 0.810 / LibreOffice 0.805 legal: Oxi 0.811 / LibreOffice 0.804 forms: Oxi 0.919 / LibreOffice 0.948 forms: Oxi 0.642 / LibreOffice 0.631 legal: Oxi 0.813 / LibreOffice 0.740 reports: Oxi 0.934 / LibreOffice 0.988 forms: Oxi 0.815 / LibreOffice 0.834 reports: Oxi 0.998 / LibreOffice 0.987 reports: Oxi 0.567 / LibreOffice 0.523 reports: Oxi 0.649 / LibreOffice 0.641 policies: Oxi 0.603 / LibreOffice 0.612 reports: Oxi 0.757 / LibreOffice 0.724 policies: Oxi 0.957 / LibreOffice 0.861 educational: Oxi 0.809 / LibreOffice 0.773 policies: Oxi 0.810 / LibreOffice 0.760 educational: Oxi 0.794 / LibreOffice 0.788 policies: Oxi 0.770 / LibreOffice 0.748 educational: Oxi 0.508 / LibreOffice 0.570 educational: Oxi 0.628 / LibreOffice 0.682 correspondence: Oxi 0.964 / LibreOffice 0.935 correspondence: Oxi 0.676 / LibreOffice 0.702 educational: Oxi 0.710 / LibreOffice 0.663 correspondence: Oxi 0.866 / LibreOffice 0.753 correspondence: Oxi 0.729 / LibreOffice 0.710 correspondence: Oxi 0.918 / LibreOffice 0.763 technical: Oxi 0.674 / LibreOffice 0.702 technical: Oxi 0.846 / LibreOffice 0.647 technical: Oxi 0.963 / LibreOffice 0.990 technical: Oxi 0.850 / LibreOffice 0.727 administrative: Oxi 0.599 / LibreOffice 0.612 administrative: Oxi 0.944 / LibreOffice 0.889 technical: Oxi 0.879 / LibreOffice 0.916 administrative: Oxi 0.978 / LibreOffice 0.987 administrative: Oxi 0.761 / LibreOffice 0.739 creative: Oxi 0.828 / LibreOffice 0.858 creative: Oxi 0.798 / LibreOffice 0.779 administrative: Oxi 0.809 / LibreOffice 0.720 creative: Oxi 0.738 / LibreOffice 0.712 reference: Oxi 0.897 / LibreOffice 0.763 reference: Oxi 0.573 / LibreOffice 0.809 creative: Oxi 0.609 / LibreOffice 0.927 creative: Oxi 0.928 / LibreOffice 0.819 reference: Oxi 0.644 / LibreOffice 0.713 reference: Oxi 0.926 / LibreOffice 0.960 reference: Oxi 0.957 / LibreOffice 0.823 policies: Oxi 0.764 / LibreOffice 0.814 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.953 / ONLYOFFICE 0.916 legal: Oxi 0.859 / ONLYOFFICE 0.851 forms: Oxi 0.954 / ONLYOFFICE 0.863 forms: Oxi 0.935 / ONLYOFFICE 0.905 legal: Oxi 0.810 / ONLYOFFICE 0.820 legal: Oxi 0.811 / ONLYOFFICE 0.813 forms: Oxi 0.919 / ONLYOFFICE 0.762 forms: Oxi 0.642 / ONLYOFFICE 0.620 legal: Oxi 0.813 / ONLYOFFICE 0.826 reports: Oxi 0.934 / ONLYOFFICE 0.875 forms: Oxi 0.815 / ONLYOFFICE 0.808 reports: Oxi 0.998 / ONLYOFFICE 0.979 reports: Oxi 0.567 / ONLYOFFICE 0.526 reports: Oxi 0.649 / ONLYOFFICE 0.676 policies: Oxi 0.603 / ONLYOFFICE 0.605 reports: Oxi 0.757 / ONLYOFFICE 0.870 policies: Oxi 0.957 / ONLYOFFICE 0.605 educational: Oxi 0.809 / ONLYOFFICE 0.707 policies: Oxi 0.810 / ONLYOFFICE 0.729 educational: Oxi 0.794 / ONLYOFFICE 0.750 policies: Oxi 0.770 / ONLYOFFICE 0.693 educational: Oxi 0.508 / ONLYOFFICE 0.506 educational: Oxi 0.628 / ONLYOFFICE 0.567 correspondence: Oxi 0.964 / ONLYOFFICE 0.956 correspondence: Oxi 0.676 / ONLYOFFICE 0.757 educational: Oxi 0.710 / ONLYOFFICE 0.651 correspondence: Oxi 0.866 / ONLYOFFICE 0.687 correspondence: Oxi 0.729 / ONLYOFFICE 0.731 correspondence: Oxi 0.918 / ONLYOFFICE 0.703 technical: Oxi 0.674 / ONLYOFFICE 0.674 technical: Oxi 0.846 / ONLYOFFICE 0.700 technical: Oxi 0.963 / ONLYOFFICE 0.974 technical: Oxi 0.850 / ONLYOFFICE 0.659 administrative: Oxi 0.599 / ONLYOFFICE 0.588 administrative: Oxi 0.944 / ONLYOFFICE 0.850 technical: Oxi 0.879 / ONLYOFFICE 0.800 administrative: Oxi 0.978 / ONLYOFFICE 0.955 administrative: Oxi 0.761 / ONLYOFFICE 0.720 creative: Oxi 0.828 / ONLYOFFICE 0.769 creative: Oxi 0.798 / ONLYOFFICE 0.694 administrative: Oxi 0.809 / ONLYOFFICE 0.680 creative: Oxi 0.738 / ONLYOFFICE 0.673 reference: Oxi 0.897 / ONLYOFFICE 0.888 reference: Oxi 0.573 / ONLYOFFICE 0.748 creative: Oxi 0.609 / ONLYOFFICE 0.835 creative: Oxi 0.928 / ONLYOFFICE 0.846 reference: Oxi 0.644 / ONLYOFFICE 0.725 reference: Oxi 0.926 / ONLYOFFICE 0.945 reference: Oxi 0.957 / ONLYOFFICE 0.790 policies: Oxi 0.764 / ONLYOFFICE 0.736 vs ONLYOFFICE — Oxi ahead on 36/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.953 / SILURUS 0.941 legal: Oxi 0.859 / SILURUS 0.846 forms: Oxi 0.954 / SILURUS 0.872 forms: Oxi 0.935 / SILURUS 0.853 legal: Oxi 0.810 / SILURUS 0.884 legal: Oxi 0.811 / SILURUS 0.827 forms: Oxi 0.919 / SILURUS 0.785 forms: Oxi 0.642 / SILURUS 0.637 legal: Oxi 0.813 / SILURUS 0.766 reports: Oxi 0.934 / SILURUS 0.928 forms: Oxi 0.815 / SILURUS 0.809 reports: Oxi 0.998 / SILURUS 0.986 reports: Oxi 0.649 / SILURUS 0.613 policies: Oxi 0.603 / SILURUS 0.638 reports: Oxi 0.757 / SILURUS 0.733 policies: Oxi 0.957 / SILURUS 0.858 educational: Oxi 0.809 / SILURUS 0.870 policies: Oxi 0.810 / SILURUS 0.730 educational: Oxi 0.794 / SILURUS 0.767 policies: Oxi 0.770 / SILURUS 0.759 educational: Oxi 0.508 / SILURUS 0.536 educational: Oxi 0.628 / SILURUS 0.556 correspondence: Oxi 0.964 / SILURUS 0.918 correspondence: Oxi 0.676 / SILURUS 0.591 educational: Oxi 0.710 / SILURUS 0.812 correspondence: Oxi 0.866 / SILURUS 0.744 correspondence: Oxi 0.729 / SILURUS 0.711 correspondence: Oxi 0.918 / SILURUS 0.790 technical: Oxi 0.674 / SILURUS 0.711 technical: Oxi 0.846 / SILURUS 0.706 technical: Oxi 0.963 / SILURUS 0.921 technical: Oxi 0.850 / SILURUS 0.652 administrative: Oxi 0.599 / SILURUS 0.597 administrative: Oxi 0.944 / SILURUS 0.853 technical: Oxi 0.879 / SILURUS 0.875 administrative: Oxi 0.978 / SILURUS 0.987 administrative: Oxi 0.761 / SILURUS 0.708 creative: Oxi 0.828 / SILURUS 0.701 creative: Oxi 0.798 / SILURUS 0.766 administrative: Oxi 0.809 / SILURUS 0.710 creative: Oxi 0.738 / SILURUS 0.774 reference: Oxi 0.897 / SILURUS 0.921 reference: Oxi 0.573 / SILURUS 0.666 creative: Oxi 0.609 / SILURUS 0.695 creative: Oxi 0.928 / SILURUS 0.884 reference: Oxi 0.644 / SILURUS 0.712 reference: Oxi 0.926 / SILURUS 0.949 reference: Oxi 0.957 / SILURUS 0.837 policies: Oxi 0.764 / SILURUS 0.692 vs SILURUS — Oxi ahead on 35/49 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.953 / eigenpal 0.907 legal: Oxi 0.859 / eigenpal 0.831 forms: Oxi 0.954 / eigenpal 0.858 forms: Oxi 0.935 / eigenpal 0.838 legal: Oxi 0.810 / eigenpal 0.743 legal: Oxi 0.811 / eigenpal 0.746 forms: Oxi 0.919 / eigenpal 0.783 forms: Oxi 0.642 / eigenpal 0.582 legal: Oxi 0.813 / eigenpal 0.689 reports: Oxi 0.934 / eigenpal 0.861 forms: Oxi 0.815 / eigenpal 0.801 reports: Oxi 0.998 / eigenpal 0.978 reports: Oxi 0.567 / eigenpal 0.538 reports: Oxi 0.649 / eigenpal 0.613 policies: Oxi 0.603 / eigenpal 0.688 reports: Oxi 0.757 / eigenpal 0.709 policies: Oxi 0.957 / eigenpal 0.598 educational: Oxi 0.809 / eigenpal 0.811 policies: Oxi 0.810 / eigenpal 0.586 educational: Oxi 0.794 / eigenpal 0.716 policies: Oxi 0.770 / eigenpal 0.679 educational: Oxi 0.508 / eigenpal 0.492 educational: Oxi 0.628 / eigenpal 0.563 correspondence: Oxi 0.964 / eigenpal 0.917 correspondence: Oxi 0.676 / eigenpal 0.493 educational: Oxi 0.710 / eigenpal 0.624 correspondence: Oxi 0.866 / eigenpal 0.673 correspondence: Oxi 0.729 / eigenpal 0.690 correspondence: Oxi 0.918 / eigenpal 0.709 technical: Oxi 0.674 / eigenpal 0.632 technical: Oxi 0.846 / eigenpal 0.649 technical: Oxi 0.963 / eigenpal 0.893 technical: Oxi 0.850 / eigenpal 0.640 administrative: Oxi 0.599 / eigenpal 0.542 administrative: Oxi 0.944 / eigenpal 0.849 technical: Oxi 0.879 / eigenpal 0.811 administrative: Oxi 0.978 / eigenpal 0.947 administrative: Oxi 0.761 / eigenpal 0.680 creative: Oxi 0.828 / eigenpal 0.654 creative: Oxi 0.798 / eigenpal 0.674 administrative: Oxi 0.809 / eigenpal 0.628 creative: Oxi 0.738 / eigenpal 0.567 reference: Oxi 0.897 / eigenpal 0.884 reference: Oxi 0.573 / eigenpal 0.762 creative: Oxi 0.609 / eigenpal 0.611 creative: Oxi 0.928 / eigenpal 0.819 reference: Oxi 0.644 / eigenpal 0.677 reference: Oxi 0.926 / eigenpal 0.915 reference: Oxi 0.957 / eigenpal 0.788 policies: Oxi 0.764 / eigenpal 0.691 vs eigenpal — Oxi ahead on 45/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.953 / GenOffice 0.939 legal: Oxi 0.859 / GenOffice 0.861 forms: Oxi 0.954 / GenOffice 0.870 forms: Oxi 0.935 / GenOffice 0.882 legal: Oxi 0.810 / GenOffice 0.750 legal: Oxi 0.811 / GenOffice 0.752 forms: Oxi 0.919 / GenOffice 0.818 forms: Oxi 0.642 / GenOffice 0.613 legal: Oxi 0.813 / GenOffice 0.736 reports: Oxi 0.934 / GenOffice 0.880 forms: Oxi 0.815 / GenOffice 0.795 reports: Oxi 0.998 / GenOffice 0.989 reports: Oxi 0.567 / GenOffice 0.571 reports: Oxi 0.649 / GenOffice 0.624 policies: Oxi 0.603 / GenOffice 0.706 reports: Oxi 0.757 / GenOffice 0.715 policies: Oxi 0.957 / GenOffice 0.872 educational: Oxi 0.809 / GenOffice 0.764 policies: Oxi 0.810 / GenOffice 0.730 educational: Oxi 0.794 / GenOffice 0.796 policies: Oxi 0.770 / GenOffice 0.740 educational: Oxi 0.508 / GenOffice 0.564 educational: Oxi 0.628 / GenOffice 0.585 correspondence: Oxi 0.964 / GenOffice 0.883 correspondence: Oxi 0.676 / GenOffice 0.570 educational: Oxi 0.710 / GenOffice 0.753 correspondence: Oxi 0.866 / GenOffice 0.753 correspondence: Oxi 0.729 / GenOffice 0.718 correspondence: Oxi 0.918 / GenOffice 0.786 technical: Oxi 0.674 / GenOffice 0.666 technical: Oxi 0.846 / GenOffice 0.678 technical: Oxi 0.963 / GenOffice 0.896 technical: Oxi 0.850 / GenOffice 0.659 administrative: Oxi 0.599 / GenOffice 0.600 administrative: Oxi 0.944 / GenOffice 0.900 technical: Oxi 0.879 / GenOffice 0.936 administrative: Oxi 0.978 / GenOffice 0.982 administrative: Oxi 0.761 / GenOffice 0.750 creative: Oxi 0.828 / GenOffice 0.692 creative: Oxi 0.798 / GenOffice 0.781 administrative: Oxi 0.809 / GenOffice 0.701 creative: Oxi 0.738 / GenOffice 0.573 reference: Oxi 0.897 / GenOffice 0.705 reference: Oxi 0.573 / GenOffice 0.714 creative: Oxi 0.609 / GenOffice 0.639 creative: Oxi 0.928 / GenOffice 0.811 reference: Oxi 0.644 / GenOffice 0.695 reference: Oxi 0.926 / GenOffice 0.922 reference: Oxi 0.957 / GenOffice 0.857 policies: Oxi 0.764 / GenOffice 0.705 vs GenOffice — Oxi ahead on 38/50 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 — 61 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.

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-C50 set (first measured 2026-08-31) Oxi scores 0.903 per document and reproduces Word’s page count on 48 of 48 documents — the only engine measured that matches every one; ONLYOFFICE is marginally ahead on pixels (0.908, 42/48) and LibreOffice close behind (0.892, 43/48). On the Japanese blind-C50 set Oxi leads on pixels at 0.802, ahead of SILURUS (0.790) and LibreOffice (0.788), though ONLYOFFICE places more page breaks correctly there (40/50 against Oxi’s 35). 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.