diff --git a/docz/data/engines.xls b/docz/data/engines.xls
index 87b202a..26d5428 100644
--- a/docz/data/engines.xls
+++ b/docz/data/engines.xls
@@ -303,7 +303,7 @@
| ✔ |
✔ |
✔ |
- |
+ ✘ |
✔ |
✔ |
diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md
index bfca571..b3b1386 100644
--- a/docz/docs/03-demos/42-engines/01-duktape.md
+++ b/docz/docs/03-demos/42-engines/01-duktape.md
@@ -1116,12 +1116,40 @@ This demo was tested in the following deployments:
|:-------------|:--------|:-----------|
| `darwin-x64` | `2.2.1` | 2026-01-21 |
| `darwin-arm` | `2.2.1` | 2026-01-23 |
-| `win11-x64` | `2.2.1` | 2025-04-17 |
+| `win11-x64` | `2.2.1` | 2026-02-02 |
+| `win11-arm` | `2.2.1` | 2026-02-02 |
| `linux-x64` | `2.2.1` | 2026-01-08 |
| `linux-arm` | `2.2.1` | 2025-04-18 |
:::
+:::caution pass
+
+The `ducc` crate cannot compile Duktape from source in Windows on ARM, so the
+x64 Rust toolchain must be used through the X64 compatibility layer.
+
+
+ Windows on ARM steps (click to show)
+
+The following commands switch to the X64 toolchain:
+
+```pwsh
+rustup toolchain install stable-x86_64-pc-windows-msvc --force-non-host
+rustup default stable-x86_64-pc-windows-msvc --force-non-host
+```
+
+---
+
+The following command switches back to the native toolchain:
+
+```pwsh
+rustup default stable
+```
+
+
+
+:::
+
1) Create a new project:
```bash
diff --git a/docz/docs/03-demos/42-engines/index.md b/docz/docs/03-demos/42-engines/index.md
index aa45d91..f8ef9e8 100644
--- a/docz/docs/03-demos/42-engines/index.md
+++ b/docz/docs/03-demos/42-engines/index.md
@@ -100,6 +100,9 @@ Asterisks (✱) in the Windows columns mark tests that were run in Windows
Subsystem for Linux (WSL). In some cases, community efforts have produced forks
with native Windows support.
+Crosses (✘) mark tests for Windows on ARM that use the X64 compatibility layer.
+Proper Windows x64 binaries were cross-compiled and run in Windows on ARM.
+
Blank cells mark untested or unsupported configurations. With cross-compilation,
V8 can run natively in Windows on ARM. The `win11-arm` platform is not tested
since the official build infrastructure does not support Windows on ARM and the
diff --git a/docz/docs/09-miscellany/05-contributing.md b/docz/docs/09-miscellany/05-contributing.md
index 0e20cbc..e1e3150 100644
--- a/docz/docs/09-miscellany/05-contributing.md
+++ b/docz/docs/09-miscellany/05-contributing.md
@@ -41,10 +41,10 @@ These instructions were tested on the following platforms:
| Platform | Architecture | Test Date |
|:------------------------------|:-------------|:-----------|
-| Linux (Ubuntu Linux x64) | `linux-x64` | 2025-07-06 |
+| Linux (Ubuntu Linux x64) | `linux-x64` | 2026-02-02 |
| Linux (Debian Linux AArch64) | `linux-arm` | 2025-01-14 |
| MacOS 15.6 (x64) | `darwin-x64` | 2026-01-21 |
-| MacOS 15.2 (ARM64) | `darwin-arm` | 2025-03-07 |
+| MacOS 15.7 (ARM64) | `darwin-arm` | 2026-02-02 |
| Windows 11 (x64) + WSL Ubuntu | `win11-x64` | 2025-06-20 |
| Windows 11 (ARM) + WSL Ubuntu | `win11-arm` | 2025-02-23 |
@@ -734,6 +734,20 @@ Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/)
^^^^^^^^^^^^^^^^^^^^ URL
```
+:::info pass
+
+The local server is configured to start on port 8000. If another service is
+listening on that port, the process will fail to start.
+
+If the other process cannot be stopped, run the server manually. The following
+snippet starts a server on port 9999:
+
+```bash
+npx -y http-server -p 9999 tests
+```
+
+:::
+
11) Open a browser window and access the displayed URL.
## Development
diff --git a/tests/engines/duktape-rust.ps1 b/tests/engines/duktape-rust.ps1
new file mode 100755
index 0000000..ad2ef0a
--- /dev/null
+++ b/tests/engines/duktape-rust.ps1
@@ -0,0 +1,37 @@
+#!/usr/bin/env pwsh
+# https://docs.sheetjs.com/docs/demos/engines/duktape#rust-demo
+
+$oldDir = Get-Location
+$tempDir = Join-Path -Path $env:TEMP -ChildPath "sheetjs-duk-rs"
+if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force }
+New-Item -ItemType Directory -Path $tempDir | Out-Null
+Set-Location -Path $tempDir
+
+cargo new sheetjs-duk-rs
+Set-Location -Path "sheetjs-duk-rs"
+
+$version = "0.20.3"
+Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-$version/package/dist/shim.min.js" -OutFile "src\shim.min.js"
+Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-$version/package/dist/xlsx.full.min.js" -OutFile "src\xlsx.full.min.js"
+Invoke-WebRequest -Uri "https://docs.sheetjs.com/pres.numbers" -OutFile "pres.numbers"
+Invoke-WebRequest -Uri "https://docs.sheetjs.com/duk/main.rs" -OutFile "src\main.rs"
+
+cargo add ducc base64
+
+# On Windows ARM, ducc-sys fails to compile Duktape from source (intptr type detection issue).
+# Use x64 Rust toolchain through Windows ARM x64 emulation (similar to Bun's approach).
+$isWindowsArm = $env:PROCESSOR_ARCHITECTURE -eq "ARM64"
+if ($isWindowsArm) {
+ # Install x64 toolchain with --force-non-host to allow cross-compilation
+ rustup toolchain install stable-x86_64-pc-windows-msvc --force-non-host
+ rustup default stable-x86_64-pc-windows-msvc --force-non-host
+ cargo run -- pres.numbers
+ rustup default stable
+} else {
+ cargo run -- pres.numbers
+}
+
+npx -y xlsx-cli sheetjsw.xlsb
+
+Set-Location $oldDir
+Remove-Item -Path $tempDir -Recurse -Force
\ No newline at end of file
diff --git a/tests/mobile/capacitor.ps1 b/tests/mobile/capacitor.ps1
new file mode 100644
index 0000000..b0c315b
--- /dev/null
+++ b/tests/mobile/capacitor.ps1
@@ -0,0 +1,6 @@
+# https://docs.sheetjs.com/docs/demos/mobile/capacitor
+
+Write-Host "These tests must be run manually. You can find the demo at:"
+Write-Host ""
+Write-Host " https://docs.sheetjs.com/docs/demos/mobile/capacitor"
+Write-Host ""
\ No newline at end of file
diff --git a/tests/mobile/capacitor.sh b/tests/mobile/capacitor.sh
new file mode 100755
index 0000000..a2e6cee
--- /dev/null
+++ b/tests/mobile/capacitor.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/mobile/capacitor
+
+echo "These tests must be run manually. You can find the demo at:"
+echo ""
+echo " https://docs.sheetjs.com/docs/demos/mobile/capacitor"
+echo ""
\ No newline at end of file
diff --git a/tests/mobile/flutter.ps1 b/tests/mobile/flutter.ps1
new file mode 100644
index 0000000..0339d49
--- /dev/null
+++ b/tests/mobile/flutter.ps1
@@ -0,0 +1,6 @@
+# https://docs.sheetjs.com/docs/demos/mobile/flutter
+
+Write-Host "These tests must be run manually. You can find the demo at:"
+Write-Host ""
+Write-Host " https://docs.sheetjs.com/docs/demos/mobile/flutter"
+Write-Host ""
\ No newline at end of file
diff --git a/tests/mobile/flutter.sh b/tests/mobile/flutter.sh
new file mode 100755
index 0000000..04172e5
--- /dev/null
+++ b/tests/mobile/flutter.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/mobile/flutter
+
+echo "These tests must be run manually. You can find the demo at:"
+echo ""
+echo " https://docs.sheetjs.com/docs/demos/mobile/flutter"
+echo ""
\ No newline at end of file
diff --git a/tests/mobile/ionic.ps1 b/tests/mobile/ionic.ps1
new file mode 100644
index 0000000..d9d818e
--- /dev/null
+++ b/tests/mobile/ionic.ps1
@@ -0,0 +1,6 @@
+# https://docs.sheetjs.com/docs/demos/mobile/ionic
+
+Write-Host "These tests must be run manually. You can find the demo at:"
+Write-Host ""
+Write-Host " https://docs.sheetjs.com/docs/demos/mobile/ionic"
+Write-Host ""
\ No newline at end of file
diff --git a/tests/mobile/ionic.sh b/tests/mobile/ionic.sh
new file mode 100755
index 0000000..67f996d
--- /dev/null
+++ b/tests/mobile/ionic.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/mobile/ionic
+
+echo "These tests must be run manually. You can find the demo at:"
+echo ""
+echo " https://docs.sheetjs.com/docs/demos/mobile/ionic"
+echo ""
\ No newline at end of file
diff --git a/tests/mobile/lynx.ps1 b/tests/mobile/lynx.ps1
new file mode 100644
index 0000000..5fb1717
--- /dev/null
+++ b/tests/mobile/lynx.ps1
@@ -0,0 +1,6 @@
+# https://docs.sheetjs.com/docs/demos/mobile/lynx
+
+Write-Host "These tests must be run manually. You can find the demo at:"
+Write-Host ""
+Write-Host " https://docs.sheetjs.com/docs/demos/mobile/lynx"
+Write-Host ""
\ No newline at end of file
diff --git a/tests/mobile/lynx.sh b/tests/mobile/lynx.sh
new file mode 100755
index 0000000..53a5ceb
--- /dev/null
+++ b/tests/mobile/lynx.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/mobile/lynx
+
+echo "These tests must be run manually. You can find the demo at:"
+echo ""
+echo " https://docs.sheetjs.com/docs/demos/mobile/lynx"
+echo ""
\ No newline at end of file
diff --git a/tests/mobile/nativescript.ps1 b/tests/mobile/nativescript.ps1
new file mode 100644
index 0000000..b0951e9
--- /dev/null
+++ b/tests/mobile/nativescript.ps1
@@ -0,0 +1,6 @@
+# https://docs.sheetjs.com/docs/demos/mobile/nativescript
+
+Write-Host "These tests must be run manually. You can find the demo at:"
+Write-Host ""
+Write-Host " https://docs.sheetjs.com/docs/demos/mobile/nativescript"
+Write-Host ""
\ No newline at end of file
diff --git a/tests/mobile/nativescript.sh b/tests/mobile/nativescript.sh
new file mode 100755
index 0000000..96c0d20
--- /dev/null
+++ b/tests/mobile/nativescript.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/mobile/nativescript
+
+echo "These tests must be run manually. You can find the demo at:"
+echo ""
+echo " https://docs.sheetjs.com/docs/demos/mobile/nativescript"
+echo ""
\ No newline at end of file
diff --git a/tests/mobile/quasar.ps1 b/tests/mobile/quasar.ps1
new file mode 100644
index 0000000..a641c73
--- /dev/null
+++ b/tests/mobile/quasar.ps1
@@ -0,0 +1,6 @@
+# https://docs.sheetjs.com/docs/demos/mobile/quasar
+
+Write-Host "These tests must be run manually. You can find the demo at:"
+Write-Host ""
+Write-Host " https://docs.sheetjs.com/docs/demos/mobile/quasar"
+Write-Host ""
\ No newline at end of file
diff --git a/tests/mobile/quasar.sh b/tests/mobile/quasar.sh
new file mode 100755
index 0000000..9a7962f
--- /dev/null
+++ b/tests/mobile/quasar.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/mobile/quasar
+
+echo "These tests must be run manually. You can find the demo at:"
+echo ""
+echo " https://docs.sheetjs.com/docs/demos/mobile/quasar"
+echo ""
\ No newline at end of file
diff --git a/tests/mobile/reactnative.ps1 b/tests/mobile/reactnative.ps1
new file mode 100644
index 0000000..e1d8c9f
--- /dev/null
+++ b/tests/mobile/reactnative.ps1
@@ -0,0 +1,6 @@
+# https://docs.sheetjs.com/docs/demos/mobile/reactnative
+
+Write-Host "These tests must be run manually. You can find the demo at:"
+Write-Host ""
+Write-Host " https://docs.sheetjs.com/docs/demos/mobile/reactnative"
+Write-Host ""
\ No newline at end of file
diff --git a/tests/mobile/reactnative.sh b/tests/mobile/reactnative.sh
new file mode 100755
index 0000000..5c71fd7
--- /dev/null
+++ b/tests/mobile/reactnative.sh
@@ -0,0 +1,7 @@
+#!/bin/bash
+# https://docs.sheetjs.com/docs/demos/mobile/reactnative
+
+echo "These tests must be run manually. You can find the demo at:"
+echo ""
+echo " https://docs.sheetjs.com/docs/demos/mobile/reactnative"
+echo ""
\ No newline at end of file