diff --git a/docz/data/engines.xls b/docz/data/engines.xls
index 26f7687..9c4422c 100644
--- a/docz/data/engines.xls
+++ b/docz/data/engines.xls
@@ -202,8 +202,8 @@
| C |
✔ |
✔ |
- ✱ |
- ✱ |
+ ✔ |
+ ✔ |
✔ |
✔ |
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 4e7da7f..14e68d0 100644
--- a/docz/docs/02-getting-started/02-examples/06-loader.md
+++ b/docz/docs/02-getting-started/02-examples/06-loader.md
@@ -33,52 +33,53 @@ SheetJS Loader to answer questions based on data from a XLS workbook.
This demo was tested in the following configurations:
-| Platform | Architecture | Date |
-|:------------------------------------------------------------------|:-------------|:-----------|
-| 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 (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 |
-| AMD RX 9070 XT (16 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `win11-x64` | 2026-01-17 |
-| AMD RX 9070 XT (16 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | 2026-01-17 |
-| AMD RX 7900 XTX (24 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | 2025-11-15 |
-| AMD RX 7900 XTX (24 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `linux-x64` | 2025-11-15 |
-| Intel Arc B580 (12 GB VRAM) + Ryzen Z1 Extreme (24 GB RAM) | `win11-x64` | 2025-11-15 |
-| Intel Arc B580 (12 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `linux-x64` | 2025-11-15 |
-| AMD RYZEN AI MAX+ 395 + Radeon 8060S (128 GB unified memory) | `linux-x64` | 2025-11-15 |
-| AMD RYZEN AI MAX+ 395 + Radeon 8060S (128 GB unified memory) | `win11-x64` | 2025-11-15 |
-| Apple M4 Max 16-Core CPU + 40-Core GPU (48 GB unified memory) | `darwin-arm` | 2025-11-15 |
+| Platform | Architecture | Backend | Date |
+|:---------------------------------------------------------------------|:-------------|:------------|:-----------|
+| NVIDIA RTX PRO 6000 (96 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `win11-x64` | Ollama | 2025-11-15 |
+| NVIDIA RTX PRO 6000 (96 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | Ollama | 2025-11-15 |
+| NVIDIA RTX 5090 (32 GB VRAM) + Ryzen AI Z2 Extreme (24 GB RAM) | `win11-x64` | `llama.cpp` | 2026-05-05 |
+| NVIDIA RTX 5090 (32 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | Ollama | 2025-11-15 |
+| AMD AI PRO R9700 (32 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | Ollama | 2026-01-17 |
+| AMD AI PRO R9700 (32 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `linux-x64` | Ollama | 2026-01-17 |
+| AMD RX 9070 XT (16 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `win11-x64` | Ollama | 2026-01-17 |
+| AMD RX 9070 XT (16 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | Ollama | 2026-01-17 |
+| AMD RX 7900 XTX (24 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | Ollama | 2025-11-15 |
+| AMD RX 7900 XTX (24 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `linux-x64` | Ollama | 2025-11-15 |
+| Intel Arc B580 (12 GB VRAM) + Ryzen Z1 Extreme (24 GB RAM) | `win11-x64` | Ollama | 2025-11-15 |
+| Intel Arc B580 (12 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `linux-x64` | Ollama | 2025-11-15 |
+| AMD RYZEN AI MAX+ 395 + Radeon 8060S (128 GB unified memory) | `linux-x64` | Ollama | 2025-11-15 |
+| AMD RYZEN AI MAX+ 395 + Radeon 8060S (128 GB unified memory) | `win11-x64` | Ollama | 2025-11-15 |
+| Apple M4 Max 16-Core CPU + 40-Core GPU (48 GB unified memory) | `darwin-arm` | Ollama | 2025-11-15 |
SheetJS users have verified this demo in other configurations:
Other tested configurations (click to show)
-| Platform | Architecture | Demo |
+| Platform | Architecture | Backend |
|:---------------------------------------------------------------------|:-------------|:------------|
-| NVIDIA L40 (48 GB VRAM) + i9-13900K (32 GB RAM) | `linux-x64` | LangChainJS |
-| NVIDIA RTX 4090 (24 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 4090 (24 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | LangChainJS |
-| NVIDIA RTX 4080 SUPER (16 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 4080 SUPER (16 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | LangChainJS |
-| NVIDIA RTX 4070 Ti SUPER (16 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 4070 Ti (12 GB VRAM) + Ryzen 7 5800x (64 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 4060 (8 GB VRAM) + Ryzen 7 5700g (32 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 3090 (24 GB VRAM) + Ryzen 9 3900XT (128 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 3080 (12 GB VRAM) + Ryzen 7 5800X (32 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 3070 (8 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | LangChainJS |
-| NVIDIA RTX 3060 (12 GB VRAM) + i5-11400 (32 GB RAM) | `win10-x64` | LangChainJS |
-| NVIDIA RTX 2080 (12 GB VRAM) + i7-9700K (16 GB RAM) | `win10-x64` | LangChainJS |
-| NVIDIA RTX 2070 (8 GB VRAM) + Ryzen 7 3700x (80 GB RAM) | `linux-x64` | LangChainJS |
-| NVIDIA RTX 2060 (6 GB VRAM) + Ryzen 5 3600 (32 GB RAM) | `win10-x64` | LangChainJS |
-| NVIDIA GTX 1080 (8 GB VRAM) + Ryzen 7 5800x (64 GB RAM) | `win10-x64` | LangChainJS |
-| NVIDIA GTX 1070 (8 GB VRAM) + Ryzen 7 7700x (32 GB RAM) | `win11-x64` | LangChainJS |
-| AMD RX 6800 XT (16 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | LangChainJS |
-| Apple M4 10-Core CPU + 10-Core GPU (24 GB unified memory) | `darwin-arm` | LangChainJS |
-| Apple M3 Ultra 28-Core CPU + 60-Core GPU (96 GB unified memory) | `darwin-arm` | LangChainJS |
-| Apple M2 Max 12-Core CPU + 30-Core GPU (32 GB unified memory) | `darwin-arm` | LangChainJS |
+| NVIDIA L40 (48 GB VRAM) + i9-13900K (32 GB RAM) | `linux-x64` | Ollama |
+| NVIDIA RTX 5090 (32 GB VRAM) + Ryzen AI Z2 Extreme (24 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 4090 (24 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 4090 (24 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | Ollama |
+| NVIDIA RTX 4080 SUPER (16 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 4080 SUPER (16 GB VRAM) + Ryzen Z2 Go (32 GB RAM) | `linux-x64` | Ollama |
+| NVIDIA RTX 4070 Ti SUPER (16 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 4070 Ti (12 GB VRAM) + Ryzen 7 5800x (64 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 4060 (8 GB VRAM) + Ryzen 7 5700g (32 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 3090 (24 GB VRAM) + Ryzen 9 3900XT (128 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 3080 (12 GB VRAM) + Ryzen 7 5800X (32 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 3070 (8 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | Ollama |
+| NVIDIA RTX 3060 (12 GB VRAM) + i5-11400 (32 GB RAM) | `win10-x64` | Ollama |
+| NVIDIA RTX 2080 (12 GB VRAM) + i7-9700K (16 GB RAM) | `win10-x64` | Ollama |
+| NVIDIA RTX 2070 (8 GB VRAM) + Ryzen 7 3700x (80 GB RAM) | `linux-x64` | Ollama |
+| NVIDIA RTX 2060 (6 GB VRAM) + Ryzen 5 3600 (32 GB RAM) | `win10-x64` | Ollama |
+| NVIDIA GTX 1080 (8 GB VRAM) + Ryzen 7 5800x (64 GB RAM) | `win10-x64` | Ollama |
+| NVIDIA GTX 1070 (8 GB VRAM) + Ryzen 7 7700x (32 GB RAM) | `win11-x64` | Ollama |
+| AMD RX 6800 XT (16 GB VRAM) + Ryzen Z1 Extreme (16 GB RAM) | `win11-x64` | Ollama |
+| Apple M4 10-Core CPU + 10-Core GPU (24 GB unified memory) | `darwin-arm` | Ollama |
+| Apple M3 Ultra 28-Core CPU + 60-Core GPU (96 GB unified memory) | `darwin-arm` | Ollama |
+| Apple M2 Max 12-Core CPU + 30-Core GPU (32 GB unified memory) | `darwin-arm` | Ollama |
@@ -86,7 +87,6 @@ Special thanks to the following users for testing with multiple configurations:
- [Asadbek Karimov](https://asadk.dev/)
- [Rasmus Tengstedt](https://tengstedt.dev/)
-- [Joban Dhillon](https://dhillon.dev/)
:::
@@ -735,26 +735,42 @@ a [sample cars dataset](pathname:///cd.xls) and displays the results.
:::caution pass
-This demo was tested using the Phi-4[^9] in Ollama.
+This demo was tested with the Phi-4[^9] open model, using up to 10GB VRAM.
-The tested model used up to 10GB VRAM. It is strongly recommended to run the
-demo on a GPU with at least 12GB VRAM or a newer Apple Silicon Mac with at least
-32GB unified memory.
+It is strongly recommended to run the demo on a GPU with at least 12GB VRAM or a
+computer with at least 32GB memory.
:::
-0) Install pre-requisites:
+0) Install prerequisites:
-- [NodeJS LTS (version 20+)](https://nodejs.org/)
-- [Ollama](https://ollama.com/download)
+- [NodeJS LTS (version 24+)](https://nodejs.org/)
+- LLM Server
-:::note pass
+:::info pass
-Ollama should be installed on the same platform as NodeJS. If NodeJS is run
-within WSL, Ollama should also be installed within WSL.
+The LLM server should be installed on the same platform as NodeJS. If NodeJS is
+run within WSL, the LLM server should also be installed within WSL.
:::
+:::note Recommendation
+
+`llama.cpp` is strongly recommended for new deployments, as it supports exotic
+deployments. The learning curve has flattened in recent years.
+
+Previous iterations of this demo used Ollama. It is easier to deploy Ollama in
+common scenarios including Apple Silicon Macs, but support for newer hardware
+and models typically lags `llama.cpp`.
+
+:::
+
+
+
+
+Binary packages are available at https://ollama.com/download . They generally
+work for Apple Silicon Macs and for Windows and Linux machines with NVIDIA GPUs.
+
:::danger pass
Intel ARC GPUs require the Intel Extension for PyTorch (IPEX) and a special
@@ -896,6 +912,61 @@ separate terminal window.
:::
+
+
+
+[The "Quick Start" section](https://github.com/ggml-org/llama.cpp#quick-start)
+of the `llama.cpp` documentation recommends pre-built binaries.
+
+Package managers typically include generic versions that support CPU inference
+and Vulkan. They do not typically support CUDA, ROCm/HIP, or SYCL. It is
+strongly recommended to manually download and run a specific release:
+
+
+ NVIDIA Instructions on Windows (click to show)
+
+In a new PowerShell window, run `nvidia-smi` and look for "CUDA version". It
+will be in the first row of the table:
+
+```text title="Sample output when last tested"
++-----------------------------------------------------------------------------------------+
+| NVIDIA-SMI 596.36 Driver Version: 596.36 CUDA Version: 13.2 |
++-----------------------------------------+------------------------+----------------------+
+```
+
+In [the "Releases" section](https://github.com/ggml-org/llama.cpp/releases),
+download the "Windows x64 (CUDA)" and "CUDA DLLs" for the matching CUDA version.
+
+For example, when this demo was last tested, `nvidia-smi` listed CUDA 13.2. This
+corresponds to the "Windows x64 (CUDA 13)" release and the "CUDA 13.1 DLLs":
+
+```pwsh
+cd ~/Downloads
+mkdir llama
+cd llama
+curl.exe -LO https://github.com/ggml-org/llama.cpp/releases/download/b9012/llama-b9012-bin-win-cuda-13.1-x64.zip
+Expand-Archive llama-*.zip -DestinationPath "."
+curl.exe -LO https://github.com/ggml-org/llama.cpp/releases/download/b9033/cudart-llama-bin-win-cuda-13.1-x64.zip
+Expand-Archive cudart-*.zip -DestinationPath "."
+```
+
+If `llama.cpp` can detect relevant GPUs, `./llama-cli.exe --list-devices` will
+list a CUDA device under "Available devices". The following output was captured
+on a machine with a RTX 5090:
+
+```text title="Devices detected by llama.cpp"
+> ./llama-cli.exe --list-devices
+...
+Available devices:
+// highlight-next-line
+ CUDA0: NVIDIA GeForce RTX 5090 (32606 MiB, 30994 MiB free)
+```
+
+
+
+
+
+
After installing dependencies, start a new terminal session.
1) Create a new project:
@@ -942,7 +1013,7 @@ npm i --save https://sheet.lol/balls/xlsx-${current}.tgz`}
4) Install dependencies:
```bash
-npm i --save @langchain/core@1.1.15 langchain@1.2.10 @langchain/classic@1.0.9 @langchain/ollama@1.2.0 peggy@5.0.6
+npm i --save @langchain/core@1.1.15 langchain@1.2.10 @langchain/classic@1.0.9 @langchain/ollama@1.2.0 @langchain/openai@1.2.0 peggy@5.0.6
```
:::note pass
@@ -951,7 +1022,7 @@ In some test runs, there were error messages relating to dependency and peer
dependency versions. The `--force` flag will suppress version mismatch errors:
```bash
-npm i --save @langchain/core@1.1.15 langchain@1.2.10 @langchain/classic@1.0.9 @langchain/ollama@1.2.0 peggy@5.0.6 --force
+npm i --save @langchain/core@1.1.15 langchain@1.2.10 @langchain/classic@1.0.9 @langchain/ollama@1.2.0 @langchain/openai@1.2.0 peggy@5.0.6 --force
```
:::
@@ -978,7 +1049,10 @@ curl.exe -LO https://docs.sheetjs.com/cd.xls
:::
-6) Install the `phi4:14b` model using Ollama:
+6) Install the `phi4:14b` model:
+
+
+
```bash
ollama pull phi4:14b
@@ -987,7 +1061,7 @@ ollama pull phi4:14b
Additional steps for Intel GPUs and AMD Strix Halo (click to show)
-A different embedding model must be used on Intel GPUs:
+A different embedding model must be used on Intel GPUs and AMD Strix Halo:
A) Install the `nomic-embed-text:latest` model through Ollama:
@@ -1005,7 +1079,80 @@ const embeddings = new OllamaEmbeddings({ baseUrl: "http://127.0.0.1:11434", mod
-7) Run the demo script
+7) Run the demo script:
+
+
+
+
+[The official `phi-4-gguf` repo](https://huggingface.co/microsoft/phi-4-gguf)
+includes `llama.cpp`-compatible weights. `Q4_K` weights should be downloaded to
+the same folder as the `llama.cpp` package.
+
+[`nomic-embed-text`](https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF)
+is the recommended embedding model. The `Q8_0` weights should be downloaded.
+
+```bash
+cd ~/Downloads/llama
+curl -LO https://huggingface.co/microsoft/phi-4-gguf/resolve/main/phi-4-Q4_K.gguf
+curl -LO https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q8_0.gguf
+```
+
+:::note pass
+
+In PowerShell, the command may fail with a parameter error:
+
+```
+Invoke-WebRequest : A parameter cannot be found that matches parameter name 'LO'.
+```
+
+`curl.exe` must be invoked directly:
+
+```pwsh
+cd ~/Downloads/llama
+curl.exe -LO https://huggingface.co/microsoft/phi-4-gguf/resolve/main/phi-4-Q4_K.gguf
+curl.exe -LO https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q8_0.gguf
+```
+
+:::
+
+7) Serve the generation model with `llama-server` in a separate window:
+
+```bash title="Serve Phi4 (in a new window)"
+cd ~/Downloads/llama
+./llama-server -m ./phi-4-Q4_K.gguf -ngl 99 --host 0.0.0.0 --port 11434
+```
+
+8) Serve the embedding model with `llama-server` in a new window:
+
+```bash title="Serve nomic-embed-text (in a new window)"
+cd ~/Downloads/llama
+./llama-server -m ./nomic-embed-text-v1.5.Q8_0.gguf -ngl 99 --host 0.0.0.0 --port 11433 --embeddings
+```
+
+8) Edit `query.mjs` to use the local OpenAI-compatible servers:
+
+```js title="query.mjs (snippet, edit highlighted line)"
+// highlight-start
+import { ChatOpenAI, OpenAIEmbeddings } from "@langchain/openai";
+// highlight-end
+import { MemoryVectorStore } from "@langchain/classic/vectorstores/memory";
+
+// ...
+
+console.log(`Using model ${model}`);
+
+// highlight-start
+const llm = new ChatOpenAI({ apiKey: "not-needed", configuration: { baseURL: "http://127.0.0.1:11434/v1" }, model });
+const embeddings = new OpenAIEmbeddings({ apiKey: "not-needed", configuration: { baseURL: "http://127.0.0.1:11433/v1" }, model: "nomic-embed-text:latest"});
+// highlight-end
+
+// ...
+```
+
+9) Run the demo script:
+
+
+
```bash
node query.mjs
diff --git a/docz/docs/03-demos/20-cli/03-nexe.md b/docz/docs/03-demos/20-cli/03-nexe.md
index 458fd5a..ceebf5f 100644
--- a/docz/docs/03-demos/20-cli/03-nexe.md
+++ b/docz/docs/03-demos/20-cli/03-nexe.md
@@ -40,7 +40,7 @@ This demo was tested in the following deployments:
| `darwin-x64` | `5.0.0-beta.4` | `14.15.3` | Pre-built | 2026-01-21 |
| `darwin-arm` | `5.0.0-beta.4` | `20.18.0` | Compiled | 2026-03-07 |
| `win11-x64` | `5.0.0-beta.4` | `14.15.3` | Pre-built | 2026-03-08 |
-| `win11-arm` | `4.0.0-rc.6` | `22.14.0` | Compiled | 2025-02-23 |
+| `win11-arm` | `5.0.0-beta.4` | `22.14.0` | Compiled | 2026-05-05 |
| `linux-x64` | `5.0.0-beta.4` | `14.15.3` | Pre-built | 2026-01-18 |
| `linux-arm` | `5.0.0-beta.4` | `24.14.0` | Compiled | 2026-03-07 |
@@ -144,6 +144,16 @@ npx -y nexe xlsx-cli.js --build --make="-j8" --target=windows-arm64-22.14.0 --ve
Common error messages:
+_MSB4126_
+
+```
+error MSB4126: The specified solution configuration "Release|x64" is invalid.
+```
+
+`nexe` will not detect the correct platform from PowerShell. To ensure the build
+targets ARM64, run from "ARM64 Native Tools Command Prompt".
+
+
_"Python was not found"_
```
diff --git a/docz/docs/03-demos/20-cli/05-pkg.md b/docz/docs/03-demos/20-cli/05-pkg.md
index 3e58a00..b78647a 100644
--- a/docz/docs/03-demos/20-cli/05-pkg.md
+++ b/docz/docs/03-demos/20-cli/05-pkg.md
@@ -40,7 +40,7 @@ This demo was tested in the following deployments:
| `darwin-x64` | `5.8.1` | `18.5.0` | 2026-01-21 |
| `darwin-arm` | `5.8.1` | `18.5.0` | 2026-03-07 |
| `win11-x64` | `5.8.1` | `18.5.0` | 2026-03-08 |
-| `win11-arm` | `5.8.1` | `18.5.0` | 2025-02-23 |
+| `win11-arm` | `5.8.1` | `18.5.0` | 2026-05-05 |
| `linux-x64` | `5.8.1` | `18.5.0` | 2026-01-18 |
| `linux-arm` | `5.8.1` | `18.5.0` | 2026-03-07 |
diff --git a/docz/docs/03-demos/20-cli/11-nodesea.md b/docz/docs/03-demos/20-cli/11-nodesea.md
index 6b21019..baf35bc 100644
--- a/docz/docs/03-demos/20-cli/11-nodesea.md
+++ b/docz/docs/03-demos/20-cli/11-nodesea.md
@@ -161,7 +161,7 @@ This demo was tested in the following deployments:
| `darwin-x64` | `24.13.0` | 2026-01-21 |
| `darwin-arm` | `20.18.0` | 2026-03-13 |
| `win11-x64` | `24.13.0` | 2026-03-08 |
-| `win11-arm` | `22.14.0` | 2025-02-23 |
+| `win11-arm` | `22.14.0` | 2026-05-05 |
| `linux-x64` | `24.11.0` | 2026-03-08 |
| `linux-arm` | `24.14.0` | 2026-03-07 |
@@ -289,7 +289,7 @@ codesign --remove-signature ./sheet2csv
In PowerShell, the `Get-Command` command displays the location to `node.exe`:
```powershell
-PS C:\sheetjs-sea> get-command node
+PS C:\sheetjs-sea> Get-Command node
CommandType Name Version Source
----------- ---- ------- ------
@@ -300,7 +300,7 @@ Application node.exe 20.12.0.0 C:
Copy the program (listed in the "Source" column) to `sheet2csv.exe`:
```powershell
-copy "C:\Program Files\nodejs\node.exe" sheet2csv.exe
+copy "$((Get-Command node).Source)" sheet2csv.exe
```
9) Remove the code signature.
@@ -433,6 +433,8 @@ If the Windows SDK is installed but the command fails, run the comand in the
:::
+:::note pass
+
If the certificate is self-signed, there may be an error:
```
@@ -442,6 +444,8 @@ SignTool Error: A certificate chain processed, but terminated in a root
This error is expected.
+:::
+
diff --git a/docz/docs/03-demos/20-cli/12-bunsea.md b/docz/docs/03-demos/20-cli/12-bunsea.md
index cfefeb5..ba59231 100644
--- a/docz/docs/03-demos/20-cli/12-bunsea.md
+++ b/docz/docs/03-demos/20-cli/12-bunsea.md
@@ -82,7 +82,7 @@ This demo was last tested in the following deployments:
| `darwin-x64` | `1.3.6` | 2026-01-21 |
| `darwin-arm` | `1.3.10` | 2026-03-07 |
| `win11-x64` | `1.3.10` | 2026-03-08 |
-| `win11-arm` | `1.2.3` | 2025-02-23 |
+| `win11-arm` | `1.3.11` | 2026-05-05 |
| `linux-x64` | `1.3.10` | 2026-03-08 |
| `linux-arm` | `1.3.10` | 2026-03-07 |
diff --git a/docz/docs/03-demos/20-cli/13-denosea.md b/docz/docs/03-demos/20-cli/13-denosea.md
index 4c7a5c6..df56db9 100644
--- a/docz/docs/03-demos/20-cli/13-denosea.md
+++ b/docz/docs/03-demos/20-cli/13-denosea.md
@@ -105,7 +105,7 @@ This demo was last tested in the following deployments:
| `darwin-x64` | `2.6.5` | 2026-01-21 |
| `darwin-arm` | `2.7.4` | 2026-03-07 |
| `win11-x64` | `2.7.4` | 2026-03-08 |
-| `win11-arm` | `2.2.1` | 2025-02-23 |
+| `win11-arm` | `2.7.11` | 2026-05-05 |
| `linux-x64` | `2.7.4` | 2026-03-08 |
| `linux-arm` | `2.7.4` | 2026-03-07 |
diff --git a/docz/docs/03-demos/30-cloud/01-salesforce.md b/docz/docs/03-demos/30-cloud/01-salesforce.md
index 6590b58..dfee2f5 100644
--- a/docz/docs/03-demos/30-cloud/01-salesforce.md
+++ b/docz/docs/03-demos/30-cloud/01-salesforce.md
@@ -33,7 +33,7 @@ This demo was tested in the following deployments:
| Lightning API | Date |
|:--------------|:-----------|
-| `62.0` | 2025-05-27 |
+| `66.0` | 2026-05-05 |
:::
@@ -43,7 +43,7 @@ The Salesforce developer tools embed telemetry. It can be disabled by setting
the environment variable `SF_DISABLE_TELEMETRY` to `true` or running a command:
```bash
-npx @salesforce/cli config set disable-telemetry=true --global
+npx -y @salesforce/cli config set disable-telemetry=true --global
```
:::
@@ -317,13 +317,13 @@ This demo was built on a "Developer Edition" account. At the time of writing, an
2) Disable telemetry:
```bash
-npx @salesforce/cli config set disable-telemetry=true --global
+npx -y @salesforce/cli config set disable-telemetry=true --global
```
3) Confirm the CLI tool works by checking version information:
```bash
-npx @salesforce/cli --version
+npx -y @salesforce/cli --version
```
:::note pass
@@ -331,7 +331,7 @@ npx @salesforce/cli --version
When the demo was last tested, the command printed
```
-@salesforce/cli/2.89.8 win32-x64 node-v24.1.0
+@salesforce/cli/2.129.8 darwin-arm64 node-v24.11.1
```
:::
@@ -339,17 +339,39 @@ When the demo was last tested, the command printed
4) Log into the org from the CLI tool:
```bash
-npx @salesforce/cli org login web
+npx -y @salesforce/cli org login web
```
This will open a web browser. Sign in and authorize the application.
+After authorizing the app, the terminal window will show a confirmation:
+
+```
+Successfully authorized USERNAME with org ID ORGID
+```
+
+:::note pass
+
+The "Developer Edition" account username is not the same as the email used to
+register for the free account!
+
+The correct username can be found in the email authorization flow:
+
+1) Access the mail Salesforce gateway at https://login.salesforce.com/
+
+2) Click "Log In with Email" and enter the original email address and password.
+
+3) Wait for a verification email from `noreply@salesforce.com`. The correct
+username will be included in the message body.
+
+:::
+
### Create Project
5) Create the "SheetForce" sample project with the `project generate` command:
```bash
-npx @salesforce/cli project generate -n SheetForce
+npx -y @salesforce/cli template generate project -n SheetForce
```
Enter the project directory:
@@ -361,7 +383,7 @@ cd SheetForce
6) Create a LWC component with the `lightning generate component` command:
```bash
-npx @salesforce/cli lightning generate component --type lwc -n sheetComponent -d force-app/main/default/lwc
+npx -y @salesforce/cli template generate lightning component --type lwc -n sheetComponent -d force-app/main/default/lwc
```
7) Replace `force-app\main\default\lwc\sheetComponent\sheetComponent.html` with
@@ -380,7 +402,7 @@ with the following XML:
```xml title="force-app\main\default\lwc\sheetComponent\sheetComponent.js-meta.xml (replace highlighted lines)"
- 62.0
+ 66.0
true
SheetForce
@@ -398,7 +420,7 @@ with the following XML:
Username. For example, if the Username was `SF@USER.NAME`, the command is:
```bash
-npx @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
+npx -y @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
```
10) Find the new component:
@@ -499,6 +521,18 @@ builder main view to add it to the page.
Click "Save".
+:::note pass
+
+In some test runs, there was a warning popup when "SheetForce" was selected.
+
+> Select an insertion point for the component, either in an empty region, or
+> before or after another component.
+
+Click "Add Component(s) Here" in the main panel. The button will be replaced
+with a blue bar. Click "SheetForce" once and it will be added to the page.
+
+:::
+
13) Activate the page.
When the "Page Saved" modal is displayed, click "Activate".
@@ -567,7 +601,7 @@ mv xlsx.full.min.js force-app/main/default/staticresources/sheetjs.js
18) Deploy the project again with the same command from step 9:
```bash
-npx @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
+npx -y @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
```
Replace `SF@USER.NAME` with the unique Username.
@@ -580,7 +614,8 @@ npx @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
A) In the Salesforce site, click on the gear icon in the top-right corner of the
page and select "Setup" (Setup for current app).
-B) Type "Static" in the left sidebar search box. Click "Static Resources"
+B) Type "Static" in the left sidebar search box. Click "Static Resources" in the
+"Custom Code" section.
:::caution pass
@@ -643,7 +678,7 @@ This template references the `version` property.
22) Deploy the project again with the same command from step 9:
```bash
-npx @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
+npx -y @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
```
Replace `SF@USER.NAME` with the unique Username.
@@ -714,7 +749,7 @@ export default class SheetComponent extends LightningElement {
26) Deploy the project again with the same command from step 9:
```bash
-npx @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
+npx -y @salesforce/cli project deploy start -d force-app -o SF@USER.NAME
```
Replace `SF@USER.NAME` with the unique Username.
diff --git a/docz/docs/03-demos/32-extensions/03-excelapi.md b/docz/docs/03-demos/32-extensions/03-excelapi.md
index 96e9402..ec358aa 100644
--- a/docz/docs/03-demos/32-extensions/03-excelapi.md
+++ b/docz/docs/03-demos/32-extensions/03-excelapi.md
@@ -40,7 +40,7 @@ This demo was tested in the following deployments:
| OS and Version | Architecture | Excel | Date |
|:---------------|:-------------|:-----------|:-----------|
| macOS 15.3 | `darwin-x64` | 16.95.4 | 2025-04-17 |
-| macOS 14.5 | `darwin-arm` | 16.96.1 | 2025-04-24 |
+| macOS 14.5 | `darwin-arm` | 16.106.3 | 2026-05-05 |
| Windows 11 | `win11-x64` | 365 (2506) | 2025-06-17 |
| Windows 11 | `win11-arm` | 365 (2503) | 2025-04-24 |
@@ -129,12 +129,24 @@ export async function extern(url) {
## Complete Demo
-0) Clear the functions cache. For the tested version of Excel for Windows:
+0) Clear the functions cache.
+
+For the tested version of Excel for Windows:
- Open File Explorer
- Select the address bar and enter `%LOCALAPPDATA%\Microsoft\Office\16.0\Wef`
- Delete the `CustomFunctions` folder (if it exists) and empty Recycle Bin.
+For the tested version of Excel for Mac:
+
+- Open the Terminal app
+- Run the following command to open the `Wef` folder:
+
+```bash
+open ~/Library/Containers/com.microsoft.Excel/Data/Library/Application\ Support/Microsoft/Office/16.0/Wef
+```
+- Delete the `CustomFunctions` folder (if it exists) and empty Trash.
+
:::caution pass
**This will delete all custom functions associated with the user account!**
@@ -241,6 +253,19 @@ npm run stop
npm start
```
+:::note pass
+
+In some test runs, the stop command failed with an error:
+
+```
+Debugging is being stopped...
+Unable to kill process id 69420: Error: kill ESRCH
+```
+
+The error can be ignored.
+
+:::
+
### Integrating the SheetJS Library
10) Install the SheetJS library in the project:
@@ -305,6 +330,42 @@ npm start
6) Click "Clear Web Cache" and wait a few moments.
+---
+
+If the previous steps fail, the `CustomFunctions` folders should be wiped:
+
+7) Stop the development process:
+
+```bash
+npm run stop
+```
+
+8) Close the Excel app by right-clicking Excel in the Dock and selecting "Quit".
+
+9) Stop the development process one more time:
+
+```bash
+npm run stop
+```
+
+10) Kill any errant `webpack` processes:
+
+```bash
+pkill webpack
+```
+
+11) Remove the `CustomFunctions` folder:
+
+```bash
+rm -rf ~/Library/Containers/com.microsoft.Excel/Data/Library/Application\ Support/Microsoft/Office/16.0/Wef/CustomFunctions
+```
+
+12) Restart the development process:
+
+```bash
+npm start
+```
+
:::
### Fetching Files from the Internet
diff --git a/docz/docs/03-demos/42-engines/05-jint.md b/docz/docs/03-demos/42-engines/05-jint.md
index ecea295..19cb1b9 100644
--- a/docz/docs/03-demos/42-engines/05-jint.md
+++ b/docz/docs/03-demos/42-engines/05-jint.md
@@ -165,7 +165,7 @@ This demo was tested in the following deployments:
|:-------------|:--------|:-----------|
| `darwin-x64` | `4.5.0` | 2026-01-21 |
| `darwin-arm` | `4.6.3` | 2026-03-22 |
-| `win11-x64` | `4.2.2` | 2026-04-28 |
+| `win11-x64` | `4.6.3` | 2026-05-05 |
| `win11-arm` | `4.6.3` | 2026-03-22 |
| `linux-x64` | `4.2.2` | 2025-06-16 |
| `linux-arm` | `4.5.0` | 2026-03-07 |
diff --git a/docz/docs/03-demos/42-engines/25-mujs.md b/docz/docs/03-demos/42-engines/25-mujs.md
index 6a91aa9..8a1faef 100644
--- a/docz/docs/03-demos/42-engines/25-mujs.md
+++ b/docz/docs/03-demos/42-engines/25-mujs.md
@@ -324,27 +324,44 @@ This demo was tested in the following deployments:
|:-------------|:--------|:-----------|
| `darwin-x64` | `1.3.8` | 2026-01-20 |
| `darwin-arm` | `1.3.8` | 2026-01-20 |
-| `win11-x64` | `1.3.8` | 2026-03-08 |
-| `win11-arm` | `1.3.5` | 2025-02-23 |
+| `win11-x64` | `1.3.8` | 2026-05-05 |
+| `win11-arm` | `1.3.8` | 2026-05-05 |
| `linux-x64` | `1.3.8` | 2026-03-07 |
| `linux-arm` | `1.3.8` | 2026-01-10 |
:::
-:::caution pass
+0) Install development dependencies.
-MuJS distributions do not include native Windows projects. The `win11-x64` and
-`win11-arm` tests were run entirely within Windows Subsystem for Linux.
+
+
-When building in Debian Linux or WSL, `libreadline-dev` and `build-essential`
-must be installed:
+On Debian and Ubuntu, `libreadline-dev` and `build-essential` must be installed:
```bash
sudo apt-get install libreadline-dev build-essential
```
+
+
+
+Visual Studio with "Desktop development with C++" workload must be installed.
+
+:::info pass
+
+**This demo must be run in PowerShell within a "Native Tools Command Prompt"!**
+
+In Windows for ARM, after launching "ARM64 Native Tools Command Prompt", run
+`powershell` to enter a session with access to Visual Studio compiler tools.
+
+In x64 Windows, after launching "x64 Native Tools Command Prompt for VS", run
+`powershell` to enter a session with access to Visual Studio compiler tools.
+
:::
+
+
+
1) Make a project directory:
```bash
@@ -354,6 +371,9 @@ cd sheetjs-mu
2) Build the MuJS shared library from source:
+
+
+
```bash
curl -LO https://mujs.com/downloads/mujs-1.3.8.zip
unzip mujs-1.3.8.zip
@@ -362,24 +382,83 @@ make release
cd ..
```
-3) Copy the `mujs.h` header file and `libmujs.a` library to the project folder:
+
+
+
+The `Makefile` in the MuJS distribution is not compatible with MSVC tools. The
+included `one.c` amalgamation can be compiled:
+
+```powershell
+Invoke-WebRequest -Uri "https://mujs.com/downloads/mujs-1.3.8.zip" -OutFile "mujs-1.3.8.zip"
+Expand-Archive -Path "mujs-1.3.8.zip" -DestinationPath "." -Force
+cd mujs-1.3.8
+cl /O2 /W3 /I. /c one.c /Fo:mujs.obj
+lib /OUT:libmujs.lib mujs.obj
+cd ..
+```
+
+
+
+
+3) Copy the `mujs.h` header file and library to the project folder:
+
+
+
```bash
cp mujs-1.3.8/build/release/libmujs.a mujs-1.3.8/mujs.h .
```
+
+
+
+```powershell
+cd mujs-1.3.8
+Copy-Item libmujs.lib, mujs.h -Destination ..
+cd ..
+```
+
+
+
+
4) Download [`SheetJSMu.c`](pathname:///mujs/SheetJSMu.c):
+
+
+
```bash
curl -LO https://docs.sheetjs.com/mujs/SheetJSMu.c
```
+
+
+
+```powershell
+Invoke-WebRequest -Uri "https://docs.sheetjs.com/mujs/SheetJSMu.c" -OutFile "SheetJSMu.c"
+```
+
+
+
+
5) Build the application:
+
+
+
```bash
gcc -o SheetJSMu SheetJSMu.c -L. -lmujs -lm -lc -std=c89 -Wall
```
+
+
+
+```powershell
+cl /O2 /W3 /Fe:SheetJSMu.exe SheetJSMu.c libmujs.lib
+```
+
+
+
+
6) Download the SheetJS Standalone script, shim script and test file. Move all
three files to the project directory:
@@ -389,12 +468,27 @@ three files to the project directory:
pres.xlsb
+
+
+
{`\
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/shim.min.js
curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
curl -LO https://docs.sheetjs.com/pres.xlsb`}
+
+
+
+```powershell
+Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js" -OutFile "shim.min.js"
+Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js" -OutFile "xlsx.full.min.js"
+Invoke-WebRequest -Uri "https://sheetjs.com/pres.xlsb" -OutFile "pres.xlsb"
+```
+
+
+
+
7) Run the application:
```bash
diff --git a/tests/cli/nexe.ps1 b/tests/cli/nexe.ps1
index db9cb2c..7a470f1 100644
--- a/tests/cli/nexe.ps1
+++ b/tests/cli/nexe.ps1
@@ -1,6 +1,8 @@
#!/usr/bin/env pwsh
# https://docs.sheetjs.com/docs/demos/cli/nexe
+$ErrorActionPreference = "Stop"
+
$oldDir = Get-Location
$tempDir = Join-Path -Path $env:TEMP -ChildPath "sheetjs-nexe"
if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force }
diff --git a/tests/cli/pkg.ps1 b/tests/cli/pkg.ps1
index cb7d14c..548bafb 100644
--- a/tests/cli/pkg.ps1
+++ b/tests/cli/pkg.ps1
@@ -1,6 +1,8 @@
#!/usr/bin/env pwsh
# https://docs.sheetjs.com/docs/demos/cli/pkg
+$ErrorActionPreference = "Stop"
+
$oldDir = Get-Location
$tempDir = Join-Path -Path $env:TEMP -ChildPath "sheetjs-pkg"
if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force }
diff --git a/tests/engines/mujs.ps1 b/tests/engines/mujs.ps1
new file mode 100755
index 0000000..19fe022
--- /dev/null
+++ b/tests/engines/mujs.ps1
@@ -0,0 +1,76 @@
+#!/usr/bin/env pwsh
+# https://docs.sheetjs.com/docs/demos/engines/mujs
+
+$ErrorActionPreference = "Stop"
+$ARCH = $env:PROCESSOR_ARCHITECTURE
+
+switch ($ARCH) {
+ "AMD64" { $batFile = "vcvars64.bat" }
+ "ARM64" { $batFile = "vcvarsarm64.bat" }
+ default { Write-Error "Unsupported architecture: $ARCH"; exit 1 }
+}
+
+$oldDir = Get-Location
+$tempDir = Join-Path -Path $env:TEMP -ChildPath "sheetjs-mujs"
+if (Test-Path -Path $tempDir) { Remove-Item -Path $tempDir -Recurse -Force }
+New-Item -ItemType Directory -Path $tempDir | Out-Null
+Set-Location -Path $tempDir
+
+# NOTE: This effectuates "Native Tools Command Prompt" for CMake/MSVC
+$vsVersions = @("2022", "2019", "18")
+$vsEditions = @("Community", "Professional", "Enterprise", "BuildTools")
+
+foreach ($vsVersion in $vsVersions) {
+ foreach ($vsEdition in $vsEditions) {
+ $vcbasePath = "${env:ProgramFiles}\Microsoft Visual Studio\$vsVersion\$vsEdition"
+ $vcvarsPath = Join-Path $vcbasePath "VC\Auxiliary\Build\$batFile"
+ if (Test-Path -Path $vcvarsPath) { break }
+ }
+ if (Test-Path -Path $vcvarsPath) { break }
+}
+
+Push-Location "$vcbasePath"
+cmd.exe /c "`"$vcvarsPath`" && set" | ForEach-Object { if ($_ -match '^([^=]+)=(.*)$') {
+ $name = $matches[1]
+ $value = $matches[2]
+
+ if ($name -ne 'PATH') {
+ Set-Item -Path "Env:$name" -Value $value
+ } else {
+ $env:PATH = "$value;$env:PATH"
+ }
+} }
+Pop-Location
+
+# Download and extract MuJS
+Invoke-WebRequest -Uri "https://mujs.com/downloads/mujs-1.3.8.zip" -OutFile "mujs-1.3.8.zip"
+Expand-Archive -Path "mujs-1.3.8.zip" -DestinationPath "." -Force
+Remove-Item "mujs-1.3.8.zip"
+
+# Build MuJS library
+Push-Location (Get-ChildItem -Directory -Filter "mujs-*" | Select-Object -First 1).FullName
+cl /O2 /W3 /I. /c one.c /Fo:mujs.obj
+lib /OUT:libmujs.lib mujs.obj
+Copy-Item libmujs.lib, mujs.h -Destination $tempDir
+Pop-Location
+
+# Download SheetJSMu.c
+Invoke-WebRequest -Uri "https://docs.sheetjs.com/mujs/SheetJSMu.c" -OutFile "SheetJSMu.c"
+
+# Build SheetJSMu application
+cl /O2 /W3 /Fe:SheetJSMu.exe SheetJSMu.c libmujs.lib
+
+# Download SheetJS scripts and test file
+Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/shim.min.js" -OutFile "shim.min.js"
+Invoke-WebRequest -Uri "https://cdn.sheetjs.com/xlsx-latest/package/dist/xlsx.full.min.js" -OutFile "xlsx.full.min.js"
+Invoke-WebRequest -Uri "https://sheetjs.com/pres.xlsb" -OutFile "pres.xlsb"
+
+# Run the application
+.\SheetJSMu.exe pres.xlsb
+if ($LASTEXITCODE -ne 0) { throw "Execution failed" }
+
+# Wait for process to fully exit and file handles to release
+Start-Sleep -Milliseconds 1000
+
+Set-Location $oldDir
+Remove-Item -Path $tempDir -Recurse -Force