diff --git a/docz/docs/03-demos/10-extensions/03-excelapi.md b/docz/docs/03-demos/10-extensions/03-excelapi.md
index 60194da..35f3fdf 100644
--- a/docz/docs/03-demos/10-extensions/03-excelapi.md
+++ b/docz/docs/03-demos/10-extensions/03-excelapi.md
@@ -17,40 +17,94 @@ It offers solutions for custom functions as well as task panes.
 Excel currently does not provide support for working with Apple Numbers files
 and some legacy file formats.  SheetJS fills the gap.
 
-This demo creates a new custom function to add much-needed functionality:
+This demo creates a new custom function `SHEETJS.EXTERN()` which tries to fetch
+an external spreadsheet and insert the data into the worksheet.
 
-- `SHEETJS.EXTERN()` tries to fetch an external spreadsheet and insert the data
-into the worksheet.
+
 
 This demo focuses on the basic mechanics.  Advanced topics like Excel Custom
 Function parameters are covered in the official Office JavaScript API docs.
-SheetJS worksheet metadata and other properties are covered in this doc site.
 
-## Creating a new Add-in
+:::note
 
-Initial Platform Setup (click to show)
+This demo was last tested on 2023 April 20 against Excel 365 (version 2303)
 
-The tool for generating Office Add-ins uses NodeJS and various libraries.
-Install [NodeJS LTS](https://nodejs.org/en/download/).  After installing NodeJS,
-install dependencies in a new PowerShell window:
+:::
+
+:::caution Excel Bugs
+
+There was a binary data bug affecting `fetch` and Excel.  It was resolved in
+version 2303. It is strongly encouraged to upgrade to the latest version of
+Excel 365 before running the demo.
+
+:::
+
+## Integration Details
+
+The [NodeJS module](/docs/getting-started/installation/nodejs) can be imported
+in an Excel Custom Functions project.
+
+The [`sheet_to_json`](/docs/api/utilities#json) helper function can generate
+arrays of arrays of values based on the worksheet data.  Excel custom functions
+transparently treat these as Dynamic Arrays.
+
+This example fetches a file, parses the data, and extracts the first worksheet:
+
+```js title="src\functions\functions.js"
+var XLSX = require("xlsx");
+
+/**
+ * Download file and write data
+ * @customfunction
+ * @param {string} url URL to fetch and parse
+ * @returns {any[][]} Worksheet data
+ */
+async function extern(url) {
+  try {
+    /* Fetch Data */
+    const res = await fetch(url);
+
+    /* Get Data */
+    const ab = await res.arrayBuffer();
+
+    /* Parse Data */
+    var wb = XLSX.read(ab);
+
+    /* get and return data */
+    var ws = wb.Sheets[wb.SheetNames[0]]; // get first worksheet
+    var aoa = XLSX.utils.sheet_to_json(ws, { header: 1 }); // array of arrays
+    return aoa;
+  } catch(e) { return [[e.message || e]]; } // pass error back to Excel
+}
+```
+
+## Complete Demo
+
+0) Clear the functions cache.  For the tested version of Excel:
+
+- Open File Explorer
+- Select the address bar and enter `%LOCALAPPDATA%\Microsoft\Office\16.0\Wef`
+- Delete `CustomFunctions` and empty Recycle Bin.
+
+1) Install [NodeJS LTS](https://nodejs.org/en/download/).
+
+2) Install dependencies in a new PowerShell window:
 
 ```powershell
 npm install -g yo bower generator-office
 ```
 
-Creating a new Project (click to show)
+3) Run `yo office` from the command line.  It will ask a few questions:
 
-Run `yo office` from the command line.  It will ask a few questions.
-
-- "Choose a project type": "Excel Custom Functions Add-in project"
+- "Choose a project type": "Excel Custom Functions using a Shared Runtime"
 
 - "Choose a script type": "JavaScript",
 
 - "What do you want to name your add-in?": "SheetJSImport"
 
-The script will create a new project and helpfully print the next steps:
+4) Start the dev process:
 
 ```powershell
 cd SheetJSImport
@@ -58,25 +112,33 @@ npm run build
 npm start
 ```
 
-Excel bug related to `fetch` (click to show)
-
-`fetch` is available to custom functions:
-
-```js
-async function extern() {
-  try {
-    const url = "https://sheetjs.com/pres.numbers"; // URL to download
-    const res = await fetch(url); // fetch data
-    const ab = await res.arrayBuffer(); // get data as an array buffer
-
-    // DO SOMETHING WITH THE DATA HERE
-
-  } catch(e) { return e; } // pass error back to Excel
-}
-```
-
-When fetching data, functions typically receive an `ArrayBuffer` which stores
-the file data.  This is readily parsed with `read`:
-
-```js
-var wb = XLSX.read(ab); // parse workbook
-```
-
-**This is how it should work**.
-
-At the time of writing, there are outstanding bugs in Excel with raw data.
-
-For the purposes of this demo, a Base64-encoded file will be used.  The
-workaround involves fetching that Base64 file, getting the text, and parsing
-with the [`base64` type:](/docs/api/parse-options#input-type)
-
-```js
-async function extern() {
-  try {
-    const url = "https://sheetjs.com/pres.numbers.b64"; // URL to download
-    const res = await fetch(url); // fetch data
-    const text = await res.text(); // get data as an array buffer
-
-    var wb = XLSX.read(text, { type: "base64" });
-    // DO SOMETHING WITH THE DATA HERE
-
-  } catch(e) { return e; } // pass error back to Excel
-}
-```
-
-Base64-encoded files can be generated with PowerShell:
-
-```powershell
-[convert]::ToBase64String([System.IO.File]::ReadAllBytes((Resolve-Path "path\to\file"))) > file.b64
-```
-
-