diff --git a/docz/docs/02-getting-started/02-examples/06-loader.md b/docz/docs/02-getting-started/02-examples/06-loader.md
index 616c05a..4e7da7f 100644
--- a/docz/docs/02-getting-started/02-examples/06-loader.md
+++ b/docz/docs/02-getting-started/02-examples/06-loader.md
@@ -37,7 +37,7 @@ This demo was tested in the following configurations:
|:------------------------------------------------------------------|:-------------|:-----------|
| NVIDIA RTX PRO 6000 (96 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `win11-x64` | 2025-11-15 |
| NVIDIA RTX PRO 6000 (96 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | 2025-11-15 |
-| NVIDIA RTX 5090 (32 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `win11-x64` | 2025-11-15 |
+| NVIDIA RTX 5090 (32 GB VRAM) + Ryzen Z2 (32 GB RAM) | `win11-x64` | 2026-01-25 |
| NVIDIA RTX 5090 (32 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | 2025-11-15 |
| AMD AI PRO R9700 (32 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | 2026-01-17 |
| AMD AI PRO R9700 (32 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `linux-x64` | 2026-01-17 |
diff --git a/docz/docs/03-demos/01-math/21-pandas.md b/docz/docs/03-demos/01-math/21-pandas.md
index 3da8fae..a2a7f75 100644
--- a/docz/docs/03-demos/01-math/21-pandas.md
+++ b/docz/docs/03-demos/01-math/21-pandas.md
@@ -41,7 +41,7 @@ This demo was tested in the following deployments:
| Architecture | JS Engine | Pandas | Python | Date |
|:-------------|:----------------|:-------|:-------|:-----------|
| `darwin-x64` | Duktape `2.7.0` | 2.2.3 | 3.13.1 | 2025-03-31 |
-| `darwin-arm` | Duktape `2.7.0` | 2.2.3 | 3.13.2 | 2025-03-30 |
+| `darwin-arm` | Duktape `2.7.0` | 2.3.3 | 3.9.6 | 2026-01-25 |
| `win11-x64` | Duktape `2.7.0` | 2.2.3 | 3.11.9 | 2025-04-28 |
| `win11-arm` | Duktape `2.7.0` | 2.2.3 | 3.13.2 | 2025-02-23 |
| `linux-x64` | Duktape `2.7.0` | 2.1.4 | 3.12.3 | 2025-06-16 |
@@ -542,14 +542,14 @@ The Pandas example requires a few slight changes to work with Polars:
This demo was tested in the following deployments:
-| Architecture | JS Engine | Polars | Python | Date |
-|:-------------|:----------------|:--------|:-------|:-----------|
-| `darwin-x64` | Duktape `2.7.0` | 1.26.0 | 3.13.1 | 2025-03-31 |
-| `darwin-arm` | Duktape `2.7.0` | 1.26.0 | 3.13.2 | 2025-03-30 |
-| `win11-x64` | Duktape `2.7.0` | 1.28.1 | 3.11.9 | 2025-04-28 |
-| `win11-arm` | Duktape `2.7.0` | 1.23.0 | 3.13.2 | 2025-02-23 |
-| `linux-x64` | Duktape `2.7.0` | 1.30.0 | 3.12.3 | 2025-06-16 |
-| `linux-arm` | Duktape `2.7.0` | 1.22.0 | 3.11.2 | 2025-02-16 |
+| Architecture | JS Engine | Polars | Python | Date |
+|:-------------|:----------------|:-------|:-------|:-----------|
+| `darwin-x64` | Duktape `2.7.0` | 1.26.0 | 3.13.1 | 2025-03-31 |
+| `darwin-arm` | Duktape `2.7.0` | 1.36.1 | 3.9.6 | 2026-01-25 |
+| `win11-x64` | Duktape `2.7.0` | 1.28.1 | 3.11.9 | 2025-04-28 |
+| `win11-arm` | Duktape `2.7.0` | 1.23.0 | 3.13.2 | 2025-02-23 |
+| `linux-x64` | Duktape `2.7.0` | 1.30.0 | 3.12.3 | 2025-06-16 |
+| `linux-arm` | Duktape `2.7.0` | 1.22.0 | 3.11.2 | 2025-02-16 |
:::
diff --git a/docz/docs/03-demos/17-mobile/07-lynx.md b/docz/docs/03-demos/17-mobile/07-lynx.md
index fae3085..11105a7 100644
--- a/docz/docs/03-demos/17-mobile/07-lynx.md
+++ b/docz/docs/03-demos/17-mobile/07-lynx.md
@@ -13,6 +13,7 @@ import current from '/version.js';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import CodeBlock from '@theme/CodeBlock';
+import Link from '@docusaurus/Link';
export const r = {style: {color:"red"}};
export const g = {style: {color:"green"}};
@@ -257,7 +258,8 @@ curl -o ./src/App.tsx https://docs.sheetjs.com/lynx/App.tsx
```bash
curl -o ./src/App.css https://docs.sheetjs.com/lynx/App.css
```
-
+
+
5) Start the development server:
diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md
index be22466..90a85d0 100644
--- a/docz/docs/03-demos/42-engines/01-duktape.md
+++ b/docz/docs/03-demos/42-engines/01-duktape.md
@@ -406,7 +406,7 @@ This demo was tested in the following deployments:
| Architecture | Version | PHP | Date |
|:-------------|:--------|:---------|:-----------|
| `darwin-x64` | `2.7.0` | `8.4.11` | 2026-01-21 |
-| `darwin-arm` | `2.7.0` | `8.4.4` | 2025-02-25 |
+| `darwin-arm` | `2.7.0` | `8.4.8` | 2026-01-23 |
| `linux-x64` | `2.7.0` | `8.3.6` | 2025-04-21 |
| `linux-arm` | `2.7.0` | `8.2.26` | 2025-02-15 |
@@ -548,7 +548,7 @@ This demo was tested in the following deployments:
| Architecture | Version | Python | Date |
|:-------------|:--------|:---------|:-----------|
| `darwin-x64` | `2.7.0` | `3.13.7` | 2026-01-21 |
-| `darwin-arm` | `2.7.0` | `3.12.3` | 2025-03-30 |
+| `darwin-arm` | `2.7.0` | `3.12.3` | 2026-01-23 |
| `linux-x64` | `2.7.0` | `3.12.3` | 2025-04-21 |
| `linux-arm` | `2.7.0` | `3.11.2` | 2025-02-15 |
@@ -1017,8 +1017,8 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:--------|:-----------|
-| `darwin-x64` | `2.2.0` | 2026-02-21 |
-| `darwin-arm` | `2.2.0` | 2025-03-30 |
+| `darwin-x64` | `2.2.0` | 2026-01-21 |
+| `darwin-arm` | `2.2.0` | 2026-01-23 |
| `linux-x64` | `2.2.0` | 2025-04-21 |
| `linux-arm` | `2.2.0` | 2025-02-15 |
@@ -1113,7 +1113,7 @@ This demo was tested in the following deployments:
| Architecture | Version | Date |
|:-------------|:--------|:-----------|
| `darwin-x64` | `2.2.1` | 2026-01-21 |
-| `darwin-arm` | `2.2.1` | 2025-03-31 |
+| `darwin-arm` | `2.2.1` | 2026-01-23 |
| `win11-x64` | `2.2.1` | 2025-04-17 |
| `linux-x64` | `2.2.1` | 2026-01-08 |
| `linux-arm` | `2.2.1` | 2025-04-18 |
diff --git a/docz/docs/03-demos/42-engines/05-jint.md b/docz/docs/03-demos/42-engines/05-jint.md
index 66beecc..400c806 100644
--- a/docz/docs/03-demos/42-engines/05-jint.md
+++ b/docz/docs/03-demos/42-engines/05-jint.md
@@ -164,7 +164,7 @@ This demo was tested in the following deployments:
| Architecture | Jint | Date |
|:-------------|:--------|:-----------|
| `darwin-x64` | `4.5.0` | 2026-01-21 |
-| `darwin-arm` | `4.2.0` | 2025-02-13 |
+| `darwin-arm` | `4.5.0` | 2026-01-23 |
| `win11-x64` | `4.2.2` | 2026-04-28 |
| `win11-arm` | `4.2.0` | 2025-02-23 |
| `linux-x64` | `4.2.2` | 2025-06-16 |
diff --git a/docz/docs/03-demos/42-engines/09-hermes.md b/docz/docs/03-demos/42-engines/09-hermes.md
index b7a4413..ee475d1 100644
--- a/docz/docs/03-demos/42-engines/09-hermes.md
+++ b/docz/docs/03-demos/42-engines/09-hermes.md
@@ -365,7 +365,7 @@ This demo was tested in the following deployments:
| Architecture | Git Commit | Date |
|:-------------|:-----------|:-----------|
| `darwin-x64` | `8ef11b4` | 2025-03-31 |
-| `darwin-arm` | `8ef11b4` | 2025-09-03 |
+| `darwin-arm` | `f45c6bc` | 2026-01-23 |
| `linux-x64` | `8ef11b4` | 2025-04-21 |
| `linux-arm` | `388376f` | 2025-02-15 |
@@ -586,9 +586,15 @@ cp ./build_release/jsi/libjsi.so .
+:::note pass
+
+Some Hermes releases build static libraries, rendering this step unnecessary.
+
+:::
+
```bash
-cp ./build_release/API/hermes/libhermes.dylib .
-cp ./build_release/jsi/libjsi.dylib .
+if [ -e ./build_release/API/hermes/libhermes.dylib ]; then cp ./build_release/API/hermes/libhermes.dylib .; fi
+if [ -e ./build_release/jsi/libjsi.dylib ]; then cp ./build_release/jsi/libjsi.dylib .; fi
```
@@ -848,7 +854,7 @@ This demo was tested in the following deployments:
| Architecture | Hermes | Date |
|:-------------|:---------|:-----------|
| `darwin-x64` | `0.13.0` | 2025-03-31 |
-| `darwin-arm` | `0.13.0` | 2025-04-23 |
+| `darwin-arm` | `0.13.0` | 2026-01-23 |
| `win11-x64` | `0.13.0` | 2025-04-28 |
| `win11-arm` | `0.13.0` | 2025-02-23 |
| `linux-x64` | `0.13.0` | 2025-04-21 |
diff --git a/docz/docs/08-api/05-write-options.md b/docz/docs/08-api/05-write-options.md
index 8ab8074..55cc2ff 100644
--- a/docz/docs/08-api/05-write-options.md
+++ b/docz/docs/08-api/05-write-options.md
@@ -8,6 +8,7 @@ import current from '/version.js';
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
import CodeBlock from '@theme/CodeBlock';
+import Link from '@docusaurus/Link';
The main SheetJS method for writing workbooks is `write`. It accepts a SheetJS
[workbook object](/docs/csf/book) and returns the file data stored in common
@@ -135,7 +136,7 @@ The write functions accept an options argument:
## Supported Output Formats
-
+
For broad compatibility with third-party tools, SheetJS CE supports many output
formats. The writer will select the file type based on the `bookType` option:
diff --git a/docz/docs/09-miscellany/06-security.md b/docz/docs/09-miscellany/06-security.md
index bb4fdf2..23a80ff 100644
--- a/docz/docs/09-miscellany/06-security.md
+++ b/docz/docs/09-miscellany/06-security.md
@@ -25,6 +25,15 @@ Metadata standards. XLSX files must reference `http://purl.org/dc/elements/1.1/`
Any tool that generates XML files must generate URLs to domains outside of the
control of the vendor.
+### JavaScript Links
+
+Excel and other spreadsheet tools support hyperlinks using the `javascript:`
+protocol. When exporting to HTML, they will not sanitize or strip these URLs.
+
+**Microsoft does not currently believe this is a vulnerability!**
+
+The SheetJS HTML exporter mirrors established behavior.
+
### Non-ASCII Characters
XLS, CSV and other legacy file formats use system-specific encodings. Excel and
diff --git a/docz/static/hermes/Makefile b/docz/static/hermes/Makefile
index 3b5bd4e..362da32 100644
--- a/docz/static/hermes/Makefile
+++ b/docz/static/hermes/Makefile
@@ -1,5 +1,5 @@
# Note: The official Hermes documentation includes zero guidance on embedding.=
-# Tested against commit 8ef11b45d7b078434605658421efb34cf436c005 on darwin-x64
+# Tested against commit f45c6bcb2d6e6516b25abbf6c5964f9dc95c5761 on darwin-x64
# History https://git.sheetjs.com/sheetjs/docs.sheetjs.com/commits/branch/master/docz/static/hermes/Makefile
MYCC=llvm-g++
@@ -33,8 +33,8 @@ clean-all: clean
sheetjs-hermes: sheetjs-hermes.cpp init
$(MYCC) $< -o $@ -std=gnu++17 \
-Ihermes/include/ -Ihermes/API/ -Ihermes/API/jsi -Ihermes/public \
- -Lbuild_release/API/hermes/ -lsynthTrace -lsynthTraceParser \
- -lhermes \
+ -Lbuild_release/API/hermes/ -lsynthTrace -lsynthTraceParser \
+ -lhermesapi \
-Lbuild_release/lib/VM/ -lhermesVMRuntime \
-Lbuild_release/lib/BCGen/HBC/ -lhermesHBCBackend \
-Lbuild_release/lib/BCGen/ -lhermesBackend \
@@ -53,16 +53,16 @@ sheetjs-hermes: sheetjs-hermes.cpp init
-Lbuild_release/lib/CompilerDriver/ -lhermesCompilerDriver \
-Lbuild_release/lib/ConsoleHost/ -lhermesConsoleHost \
-Lbuild_release/lib/DependencyExtractor/ -lhermesDependencyExtractor \
- -Lbuild_release/lib/FlowParser/ -lhermesFlowParser \
-Lbuild_release/lib/FrontEndDefs/ -lhermesFrontEndDefs \
-Lbuild_release/lib/Inst/ -lhermesInst \
- -Lbuild_release/lib/InternalBytecode/ -lhermesInternalBytecode \
-Lbuild_release/lib/Platform/ -lhermesPlatform \
-Lbuild_release/lib/Platform/Intl/ -lhermesBCP47Parser \
-Lbuild_release/lib/Regex/ -lhermesRegex \
-Lbuild_release/lib/Support/ -lhermesSupport \
+ -Lbuild_release/lib/Sema/ -lhermesSema \
+ -Lbuild_release/lib/InternalJavaScript/ -lhermesInternalUnit -lhermesInternalBytecode \
+ -Lbuild_release/external/boost/boost_1_86_0/libs/context/ -lboost_context \
-Lbuild_release/public/hermes/Public -lhermesPublic \
- -Lhermes/external/flowparser/ -lflowparser-mac \
-Lbuild_release/external/dtoa/ -ldtoa \
$(POSTAMBLE)
@@ -71,5 +71,5 @@ sheetjs-hermes.cpp:
.PHONY: init
init:
- if [ ! -e hermes ]; then git clone https://github.com/facebook/hermes.git; cd hermes; git checkout 8ef11b45d7b078434605658421efb34cf436c005; cd ..; fi
+ if [ ! -e hermes ]; then git clone https://github.com/facebook/hermes.git; cd hermes; git checkout f45c6bcb2d6e6516b25abbf6c5964f9dc95c5761; cd ..; fi
if [ ! -e build_release ]; then cmake -S hermes -B build_release -G Ninja -DCMAKE_BUILD_TYPE=Release -DHERMES_BUILD_APPLE_FRAMEWORK=OFF; cmake --build ./build_release; fi
\ No newline at end of file
diff --git a/tests/engines/hermes.sh b/tests/engines/hermes.sh
index 24adaf4..b2afd1d 100755
--- a/tests/engines/hermes.sh
+++ b/tests/engines/hermes.sh
@@ -12,17 +12,22 @@ curl -LO https://docs.sheetjs.com/hermes/sheetjs-hermes.cpp
make init
# CMake 4 workaround
-rm -rf build_release
-cp hermes/CMakeLists.txt hermes/CMakeLists.bak
-awk 'NR != 42' hermes/CMakeLists.txt
-make init
+#rm -rf build_release
+#cp hermes/CMakeLists.txt hermes/CMakeLists.bak
+#awk 'NR != 42' hermes/CMakeLists.txt
+#make init
make sheetjs-hermes
curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
-curl -LO https://sheetjs.com/pres.numbers
+curl -LO https://docs.sheetjs.com/pres.numbers
-cp ./build_release/API/hermes/libhermes.* .
-cp ./build_release/jsi/libjsi.* .
+# Linux
+if [ -e ./build_release/API/hermes/libhermes.so ]; then cp ./build_release/API/hermes/libhermes.so .; fi
+if [ -e ./build_release/jsi/libjsi.so ]; then cp ./build_release/jsi/libjsi.so .; fi
+
+# macOS
+if [ -e ./build_release/API/hermes/libhermes.dylib ]; then cp ./build_release/API/hermes/libhermes.dylib .; fi
+if [ -e ./build_release/jsi/libjsi.dylib ]; then cp ./build_release/jsi/libjsi.dylib .; fi
./sheetjs-hermes pres.numbers; echo $?
diff --git a/tests/math/pandas.sh b/tests/math/pandas.sh
new file mode 100755
index 0000000..2e6f4af
--- /dev/null
+++ b/tests/math/pandas.sh
@@ -0,0 +1,39 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/math/pandas
+
+OS=$(uname -s)
+
+cd /tmp
+rm -rf sheetjs-pandas
+mkdir sheetjs-pandas
+cd sheetjs-pandas
+
+curl -LO https://duktape.org/duktape-2.7.0.tar.xz
+tar -xJf duktape-2.7.0.tar.xz
+cd duktape-2.7.0
+make -f Makefile.sharedlibrary
+cd ..
+
+OS="$(uname -s)"
+
+case "$OS" in
+ Darwin) LIB_NAME="libduktape.207.20700.so" ;;
+ Linux) LIB_NAME="libduktape.so.207.20700" ;;
+ *) echo "Unsupported OS: $OS"; exit 1 ;;
+esac
+
+cp "duktape-2.7.0/$LIB_NAME" .
+
+curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js
+curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
+
+curl -LO https://docs.sheetjs.com/pres.numbers
+curl -LO https://docs.sheetjs.com/pandas/sheetjs.py
+curl -LO https://docs.sheetjs.com/pandas/SheetJSPandas.py
+
+sed "s#libduktape.207.20700.so#$LIB_NAME#g" sheetjs.py > sheetjs.py.tmp
+mv sheetjs.py.tmp sheetjs.py
+
+python3 SheetJSPandas.py pres.numbers || python SheetJSPandas.py pres.numbers
+
+npx -y xlsx-cli SheetJSPandas.xlsb
diff --git a/tests/math/polars.sh b/tests/math/polars.sh
new file mode 100755
index 0000000..19a59be
--- /dev/null
+++ b/tests/math/polars.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/math/pandas
+
+OS=$(uname -s)
+
+cd /tmp
+rm -rf sheetjs-polars
+mkdir sheetjs-polars
+cd sheetjs-polars
+
+curl -LO https://duktape.org/duktape-2.7.0.tar.xz
+tar -xJf duktape-2.7.0.tar.xz
+cd duktape-2.7.0
+make -f Makefile.sharedlibrary
+cd ..
+
+OS="$(uname -s)"
+
+case "$OS" in
+ Darwin) LIB_NAME="libduktape.207.20700.so" ;;
+ Linux) LIB_NAME="libduktape.so.207.20700" ;;
+ *) echo "Unsupported OS: $OS"; exit 1 ;;
+esac
+
+cp "duktape-2.7.0/$LIB_NAME" .
+
+curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js
+curl -LO https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js
+
+curl -LO https://docs.sheetjs.com/pres.numbers
+curl -LO https://docs.sheetjs.com/pandas/sheetjs.py
+curl -LO https://docs.sheetjs.com/pandas/SheetJSPandas.py
+
+sed "s#libduktape.207.20700.so#$LIB_NAME#g" sheetjs.py > sheetjs.py.tmp
+mv sheetjs.py.tmp sheetjs.py
+
+sed "s#from pandas import read_csv#from polars import read_csv#g" sheetjs.py > sheetjs.py.tmp
+mv sheetjs.py.tmp sheetjs.py
+
+sed 's#json = df.to_json(orient="records")#json = df.write_json()#g' sheetjs.py > sheetjs.py.tmp
+mv sheetjs.py.tmp sheetjs.py
+
+sed 's#print(df.info())#print(df)#g' SheetJSPandas.py > SheetJSPandas.py.tmp
+mv SheetJSPandas.py.tmp SheetJSPandas.py
+
+sed 's#SheetJSPandas.xlsb#SheetJSPolars.xlsb#g' SheetJSPandas.py > SheetJSPandas.py.tmp
+mv SheetJSPandas.py.tmp SheetJSPandas.py
+
+python3 SheetJSPandas.py pres.numbers || python SheetJSPandas.py pres.numbers
+
+npx -y xlsx-cli SheetJSPolars.xlsb
diff --git a/tests/tutorials/export/bun.sh b/tests/tutorials/export/bun.sh
index 3bc931b..5dc2c5f 100755
--- a/tests/tutorials/export/bun.sh
+++ b/tests/tutorials/export/bun.sh
@@ -1,5 +1,5 @@
#!/bin/bash
-# https://docs.sheetjs.com/docs/getting-started/installation/deno
+# https://docs.sheetjs.com/docs/getting-started/installation/bun
cd /tmp
rm -rf sheetjs-bun