diff --git a/docz/docs/02-getting-started/01-installation/04-amd.md b/docz/docs/02-getting-started/01-installation/04-amd.md
index 2ff3d3e..bd5e123 100644
--- a/docz/docs/02-getting-started/01-installation/04-amd.md
+++ b/docz/docs/02-getting-started/01-installation/04-amd.md
@@ -21,8 +21,8 @@ Each standalone release script is available at .
 
 When referencing by file name, AMD loaders typically omit the file extension.
 
-The actual file name is `xlsx.full.min.js`, but the examples will refer to the
-script as `xlsx.full.min`.
+The actual file name is `xlsx.full.min.js`, but the examples identify the script
+using the name `xlsx.full.min`
 
 :::
 
diff --git a/docz/docs/03-demos/07-data/19-alasql.md b/docz/docs/03-demos/07-data/19-alasql.md
index 046185e..e138f1b 100644
--- a/docz/docs/03-demos/07-data/19-alasql.md
+++ b/docz/docs/03-demos/07-data/19-alasql.md
@@ -29,7 +29,7 @@ This demo was tested in the following environments:
 
 | Environment         | AlaSQL |    Date    |
 |:--------------------|:-------|:----------:|
-| NodeJS              | 3.1.0  | 2023-07-24 |
+| NodeJS              | 3.1.0  | 2023-10-26 |
 | Standalone (Chrome) | 3.0.0  | 2023-08-20 |
 
 :::
diff --git a/docz/docs/03-demos/42-engines/01-duktape.md b/docz/docs/03-demos/42-engines/01-duktape.md
index cd83bf6..a65cf50 100644
--- a/docz/docs/03-demos/42-engines/01-duktape.md
+++ b/docz/docs/03-demos/42-engines/01-duktape.md
@@ -119,7 +119,7 @@ This demo was tested in the following deployments:
 
 | Architecture | Version | Date       |
 |:-------------|:--------|:-----------|
-| `darwin-x64` | `2.7.0` | 2023-07-24 |
+| `darwin-x64` | `2.7.0` | 2023-10-26 |
 | `darwin-arm` | `2.7.0` | 2023-10-18 |
 | `win10-x64`  | `2.7.0` | 2023-07-24 |
 | `win11-arm`  | `2.7.0` | 2023-09-26 |
@@ -293,23 +293,40 @@ may not work on every platform.
 
 ### Perl
 
-The Perl binding for Duktape is available on CPAN:
+The Perl binding for Duktape is available as `JavaScript::Duktape` on CPAN.
+
+The Perl binding does not have raw `Buffer` ops, so Base64 strings are used.
+
+#### Perl Demo
+
+:::note
+
+This demo was tested in the following deployments:
+
+| Architecture | Version | Date       |
+|:-------------|:--------|:-----------|
+| `darwin-x64` | `2.5.0` | 2023-10-26 |
+
+:::
+
+0) Ensure `perl` and `cpan` are installed and available on the system path.
+
+1) Install the `JavaScript::Duktape` library:
 
 ```bash
 cpan install JavaScript::Duktape
 ```
 
-The Perl binding does not have raw `Buffer` ops, so Base64 strings are used.
-With the [ExtendScript](/docs/getting-started/installation/extendscript) build:
+2) Save the following codeblock to `SheetJSDuk.pl`:
 
-```perl SheetJSDuk.pl
+```perl title="SheetJSDuk.pl"
 # usage: perl SheetJSDuk.pl path/to/file
 use JavaScript::Duktape;
 use File::Slurp;
 use MIME::Base64 qw( encode_base64 decode_base64 );
 
 # Initialize
-my $js = JavaScript::Duktape->new( max_memory => 1024 * 1024 * 1024 );
+my $js = JavaScript::Duktape->new( max_memory => 256 * 1024 * 1024 );
 $js->eval("var global = (function(){ return this; }).call(null);");
 
 # Load the ExtendScript build
@@ -325,15 +342,31 @@ $js->eval("log('SheetJS library version ' + XLSX.version);");
 my $raw_data = encode_base64(read_file($ARGV[0], { binmode => ':raw' }), "");
 $js->set("b64", $raw_data);
 $js->eval(qq{
-  global.wb = XLSX.read(b64, {type: "base64"});
+  global.wb = XLSX.read(b64, {type: "base64", WTF:1});
   global.ws = wb.Sheets[wb.SheetNames[0]];
+  void 0;
 });
 
 # Print first worksheet CSV
-my $csv = $js->eval('XLSX.utils.sheet_to_csv(global.ws)');
-print $csv
+$js->eval('log(XLSX.utils.sheet_to_csv(global.ws))');
 
 # Write XLSB file
 my $xlsb = $js->eval("XLSX.write(global.wb, {type:'base64', bookType:'xlsb'})");
 write_file("SheetJSDuk.xlsb", decode_base64($xlsb));
-```
\ No newline at end of file
+```
+
+3) Download the SheetJS ExtendScript build and test file:
+
+{`\
+curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.extendscript.js
+curl -LO https://sheetjs.com/pres.xlsx`}
+
+
+4) Run the script:
+
+```bash
+perl SheetJSDuk.pl pres.xlsx
+```
+
+If the script succeeded, the data in the test file will be printed in CSV rows.
+The script will also export `SheetJSDuk.xlsb`.
\ No newline at end of file
diff --git a/docz/docs/03-demos/42-engines/03-rhino.md b/docz/docs/03-demos/42-engines/03-rhino.md
index 649a7f4..eeb0e9c 100644
--- a/docz/docs/03-demos/42-engines/03-rhino.md
+++ b/docz/docs/03-demos/42-engines/03-rhino.md
@@ -120,21 +120,26 @@ This string can be loaded into the JS engine and processed:
 
 :::note
 
-This demo was tested on 2023-07-26 using Rhino 1.7.14.
+This demo was tested on 2023-10-26 against Rhino 1.7.14.
 
 :::
 
-0) Ensure Java is installed.  Create a folder for the project, download the
-[JAR](https://repo1.maven.org/maven2/org/mozilla/rhino/1.7.14/rhino-1.7.14.jar)
-and rename to `rhino.jar`:
+0) Ensure Java is installed.
+
+1) Create a folder for the project:
 
 ```bash
 mkdir sheetjs-java
 cd sheetjs-java
+```
+
+2) Download the Rhino JAR and rename to `rhino.jar`:
+
+```
 curl -L -o rhino.jar https://repo1.maven.org/maven2/org/mozilla/rhino/1.7.14/rhino-1.7.14.jar
 ```
 
-1) Download the SheetJS Standalone script and the test file. Save both files in
+3) Download the SheetJS Standalone script and the test file. Save both files in
 the project directory:
 
 
@@ -147,14 +152,14 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
 curl -LO https://sheetjs.com/pres.xlsx`}
 
 
-2) Download [`SheetJSRhino.zip`](pathname:///rhino/SheetJSRhino.zip) and unzip
+4) Download [`SheetJSRhino.zip`](pathname:///rhino/SheetJSRhino.zip) and unzip
 
 ```bash
 curl -LO https://docs.sheetjs.com/rhino/SheetJSRhino.zip
 unzip SheetJSRhino.zip
 ```
 
-3) Save the following code to `SheetJSRhino.java`:
+5) Save the following code to `SheetJSRhino.java`:
 
 ```java title="SheetJSRhino.java"
 /* sheetjs (C) 2013-present  SheetJS -- https://sheetjs.com */
@@ -184,14 +189,14 @@ public class SheetJSRhino {
 }
 ```
 
-4) Assemble `SheetJS.jar` from the demo code:
+6) Assemble `SheetJS.jar` from the demo code:
 
 ```bash
 javac -cp .:rhino.jar SheetJSRhino.java
 jar -cf SheetJS.jar SheetJSRhino.class com/sheetjs/*.class xlsx.full.min.js
 ```
 
-5) Test the program:
+7) Test the program:
 
 ```bash
 java -cp .:SheetJS.jar:rhino.jar SheetJSRhino pres.xlsx
diff --git a/docz/docs/03-demos/42-engines/04-jsc.md b/docz/docs/03-demos/42-engines/04-jsc.md
index 68fce44..3bf1ea9 100644
--- a/docz/docs/03-demos/42-engines/04-jsc.md
+++ b/docz/docs/03-demos/42-engines/04-jsc.md
@@ -133,7 +133,7 @@ This demo was tested in the following environments:
 
 | Architecture | Swift   | Date       |
 |:-------------|:--------|:-----------|
-| `darwin-x64` | `5.8.1` | 2023-07-24 |
+| `darwin-x64` | `5.9.0` | 2023-10-26 |
 | `darwin-arm` | `5.9.0` | 2023-10-18 |
 
 :::
@@ -146,14 +146,22 @@ This example requires MacOS + Swift and will not work on Windows or Linux!
 
 :::
 
-0) Ensure Xcode is installed.  Create a folder for the project:
+0) Ensure Swift is installed by running the following command in the terminal:
+
+```bash
+swiftc --version
+```
+
+If the command is not found, install Xcode.
+
+1) Create a folder for the project:
 
 ```bash
 mkdir sheetjswift
 cd sheetjswift
 ```
 
-1) Download the SheetJS Standalone script and the test file. Save both files in
+2) Download the SheetJS Standalone script and the test file. Save both files in
 the project directory:
 
 
@@ -166,7 +174,7 @@ curl -LO https://cdn.sheetjs.com/xlsx-${current}/package/dist/xlsx.full.min.js
 curl -LO https://sheetjs.com/pres.numbers`}
 
 
-2) Download the Swift scripts for the demo
+3) Download the Swift scripts for the demo
 
 - [`SheetJSCore.swift`](pathname:///swift/SheetJSCore.swift) Wrapper library
 - [`main.swift`](pathname:///swift/main.swift) Command-line script
@@ -177,13 +185,13 @@ curl -LO https://docs.sheetjs.com/swift/main.swift
 ```
 
 
-3) Build the `SheetJSwift` binary:
+4) Build the `SheetJSwift` program:
 
 ```bash
 swiftc SheetJSCore.swift main.swift -o SheetJSwift
 ```
 
-4) Test the program:
+5) Test the program:
 
 ```bash
 ./SheetJSwift pres.numbers
diff --git a/docz/docs/03-demos/42-engines/08-quickjs.md b/docz/docs/03-demos/42-engines/08-quickjs.md
index 4bdecdf..9aa5d39 100644
--- a/docz/docs/03-demos/42-engines/08-quickjs.md
+++ b/docz/docs/03-demos/42-engines/08-quickjs.md
@@ -262,7 +262,7 @@ This demo was tested in the following deployments:
 
 | Architecture | Git Commit | Date       |
 |:-------------|:-----------|:-----------|
-| `darwin-x64` | `2788d71`  | 2023-07-24 |
+| `darwin-x64` | `2788d71`  | 2023-10-26 |
 | `darwin-arm` | `2788d71`  | 2023-10-18 |
 | `win10-x64`  | `2788d71`  | 2023-10-09 |
 | `win11-arm`  | `2788d71`  | 2023-09-25 |
diff --git a/docz/docs/09-constellation/01-ssf.md b/docz/docs/09-constellation/01-ssf.md
index 1eb2d90..f64697f 100644
--- a/docz/docs/09-constellation/01-ssf.md
+++ b/docz/docs/09-constellation/01-ssf.md
@@ -1,5 +1,6 @@
 ---
 title: SSF Number Formatter
+hide_table_of_contents: true
 ---
 
 As explained in ["Number Formats"](/docs/csf/features/nf), modern spreadsheet
@@ -7,7 +8,7 @@ file formats separate "content" from "presentation". Instead of storing a
 formatted value like `$3.50`, applications will store the underlying value
 (`3.50`) and the number format (`$0.00`). Parsers are expected to render values.
 
-The SheetJS `SSF` ("SpreadSheet Formatter") library formats numbers according
+The SheetJS `SSF` ("SpreadSheet Format") library formats numbers according
 to the number formatting rules defined in Excel and other spreadsheet software[^1]
 
 A version of the library ships with the main file processing library. It is
@@ -19,6 +20,36 @@ The library is also available for standalone use on the SheetJS CDN[^5].
 The source code and project documentation is hosted on the SheetJS git server at
 
 
+## Live Demo
+
+The formatted text is calculated from the specified number format and value.
+Please [report an issue](https://git.sheetjs.com/sheetjs/sheetjs/issues) if a
+particular format is not supported.
+
+```jsx live
+function SheetJSSSF() {
+  const [fmt, setFmt] = React.useState("#,##0");
+  const [val, setVal] = React.useState(7262);
+
+  const format = (fmt, val) => { try {
+    return XLSX.SSF.format(fmt, val);
+  } catch(e) { return "ERROR: " + (e && e.message || e); } };
+
+  return (  );
+}
+```
+
 [^1]: The number formatting rules are sketched in ECMA-376. A rough grammar is defined in the MS-XLS specification.
 [^2]: See [`read` in "Reading Files"](/docs/api/parse-options)
 [^3]: See [`write` in "Writing Files"](/docs/api/write-options)
diff --git a/docz/docusaurus.config.js b/docz/docusaurus.config.js
index 6b44077..b67738d 100644
--- a/docz/docusaurus.config.js
+++ b/docz/docusaurus.config.js
@@ -181,9 +181,12 @@ const config = {
         { from: '/docs/demos/vue', to: '/docs/demos/frontend/vue/' },
         { from: '/docs/demos/bundler', to: '/docs/demos/frontend/bundler/' },
         { from: '/docs/demos/legacy', to: '/docs/demos/frontend/legacy/' },
+        { from: '/docs/demos/rollup', to: '/docs/demos/frontend/bundler/rollup/' },
         { from: '/docs/getting-started/demos/legacy', to: '/docs/demos/frontend/legacy/' },
+        { from: '/docs/getting-started/demos/bundler', to: '/docs/demos/frontend/bundler/' },
         /* cloud */
         { from: '/docs/demos/salesforce', to: '/docs/demos/cloud/salesforce/' },
+        { from: '/docs/getting-started/demos/salesforce', to: '/docs/demos/cloud/salesforce/' },
         { from: '/docs/demos/aws', to: '/docs/demos/cloud/aws/' },
         { from: '/docs/demos/azure', to: '/docs/demos/cloud/azure/' },
         { from: '/docs/demos/netsuite', to: '/docs/demos/cloud/netsuite/' },
@@ -214,6 +217,7 @@ const config = {
         { from: '/docs/getting-started/demos/network', to: '/docs/demos/net/network/' },
         /* local */
         { from: '/docs/demos/clipboard', to: '/docs/demos/local/clipboard/' },
+        { from: '/docs/getting-started/demos/clipboard', to: '/docs/demos/local/clipboard/' },
         { from: '/docs/demos/localfile', to: '/docs/demos/local/file/' },
         { from: '/docs/demos/data/indexeddb', to: '/docs/demos/local/indexeddb/' },
         { from: '/docs/demos/data/storageapi', to: '/docs/demos/local/storageapi/' },
diff --git a/docz/src/components/Playground.tsx b/docz/src/components/Playground.tsx
deleted file mode 100644
index 917c7f2..0000000
--- a/docz/src/components/Playground.tsx
+++ /dev/null
@@ -1,40 +0,0 @@
-import React from 'react';
-import useBaseUrl from '@docusaurus/useBaseUrl';
-
-import { CodePreview } from 'docusaurus-plugin-code-preview';
-
-/*
-export default function Playground(props) {
-  return (
-    
-  );
-}
-*/
-
-export default function Playground(props) {
-  return ;
-}