diff --git a/docz/docs/03-demos/12-static/02-gatsbyjs.md b/docz/docs/03-demos/12-static/02-gatsbyjs.md
index d61401c..aedfed5 100644
--- a/docz/docs/03-demos/12-static/02-gatsbyjs.md
+++ b/docz/docs/03-demos/12-static/02-gatsbyjs.md
@@ -13,6 +13,9 @@ import Tabs from '@theme/Tabs';
 import TabItem from '@theme/TabItem';
 import CodeBlock from '@theme/CodeBlock';
 
+export const r = {style: {color:"red"}};
+export const R = {style: {backgroundColor:"darkred"}};
+
 GatsbyJS is a framework for creating websites. It uses React components for page
 templates and GraphQL for loading data.
 
@@ -176,7 +179,7 @@ This demo was tested in the following environments:
 
 | GatsbyJS | Date       |
 |:---------|:-----------|
-| `5.12.1` | 2023-12-04 |
+| `5.13.4` | 2024-05-04 |
 | `4.25.8` | 2024-03-27 |
 
 :::
@@ -189,6 +192,25 @@ This demo was tested in the following environments:
 npx gatsby telemetry --disable
 ```
 
+:::info pass
+
+In NodeJS 22, the process displayed an error:
+
+
+ ERROR  UNKNOWN
+{`\n`}
+{`\n`}
+(node:25039) [DEP0040] DeprecationWarning: The `punycode` module is deprecated.
+Please use a userland alternative instead.
+(Use `node --trace-deprecation ...` to show where the warning was created)
+
+
+**This is a false report!**
+
+The error can be safely ignored.
+
+:::
+
 1) Create a template site:
 
 ```bash
@@ -333,11 +355,60 @@ Press the Execute Query button (`▶`) and data should show up in the right pane
 
 
 
+
+  Sample Output (click to show)
+
+In GatsbyJS version `5.13.4`, the raw output was:
+
+```json title="GraphQL query result from GatsbyJS 5.13.4"
+{
+  "data": {
+    "allPresXlsxSheet1": {
+      "edges": [
+        {
+          "node": {
+            "Name": "Bill Clinton",
+            "Index": 42
+          }
+        },
+        {
+          "node": {
+            "Name": "GeorgeW Bush",
+            "Index": 43
+          }
+        },
+        {
+          "node": {
+            "Name": "Barack Obama",
+            "Index": 44
+          }
+        },
+        {
+          "node": {
+            "Name": "Donald Trump",
+            "Index": 45
+          }
+        },
+        {
+          "node": {
+            "Name": "Joseph Biden",
+            "Index": 46
+          }
+        }
+      ]
+    }
+  },
+  "extensions": {}
+}
+```
+
+ 
+
 ### React page
 
 8) Create a new file `src/pages/pres.js` that uses the query and displays the result:
 
-```jsx title="src/pages/pres.js"
+```jsx title="src/pages/pres.js (create new file)"
 import { graphql } from "gatsby"
 import * as React from "react"
 
diff --git a/docz/docs/03-demos/23-data/29-pouchdb.md b/docz/docs/03-demos/23-data/29-pouchdb.md
index a296480..1d399c9 100644
--- a/docz/docs/03-demos/23-data/29-pouchdb.md
+++ b/docz/docs/03-demos/23-data/29-pouchdb.md
@@ -29,8 +29,12 @@ This demo was tested in the following environments:
 
 | PouchDB |    Date    |
 |:--------|:----------:|
-| `7.3.1` | 2023-12-04 |
-| `8.0.1` | 2023-12-04 |
+| `8.0.1` | 2024-05-04 |
+| `7.3.1` | 2024-05-04 |
+| `6.4.3` | 2024-05-04 |
+| `5.4.5` | 2024-05-04 |
+| `4.0.3` | 2024-05-04 |
+| `3.6.0` | 2024-05-04 |
 
 :::
 
@@ -131,11 +135,25 @@ The ZIP file should have `MD5` checksum `ac4da7cb0cade1be293ba222462f109c`:
 ```bash
 curl -LO https://github.com/nickcolley/getting-started-todo/archive/master.zip
 md5sum master.zip || md5 master.zip
-### the checksum will be printed
 ```
 
+:::note pass
+
 If the download is unavailable, a mirror is available at
-https://docs.sheetjs.com/pouchdb/master.zip
+https://docs.sheetjs.com/pouchdb/master.zip :
+
+```bash
+curl -LO https://docs.sheetjs.com/pouchdb/master.zip
+md5sum master.zip || md5 master.zip
+```
+
+:::
+
+The second command will display the checksum:
+
+```bash
+ac4da7cb0cade1be293ba222462f109c  master.zip
+```
 
 1) Unzip the `master.zip` file and enter the folder:
 
@@ -146,7 +164,7 @@ cd getting-started-todo-master
 
 2) Edit `index.html` to reference the SheetJS library and add a button:
 
-{`\
+{`\
   
 
     
@@ -157,19 +175,19 @@ cd getting-started-todo-master
 
 3) Near the end of `index.html`, look for a script tag referencing a CDN:
 
-```html title="index.html"
+```html title="index.html (find line)"
     
 ```
 
 Upgrade PouchDB by changing the `src` attribute to the production build[^10]:
 
-```html
+```html title="index.html (replace line)"
     
 ```
 
 4) Just before the end of `js/app.js`, add a `click` event listener:
 
-```js title="js/app.js"
+```js title="js/app.js (add highlighted lines)"
   if (remoteCouch) {
     sync();
   }
@@ -219,7 +237,7 @@ opened in a web browser.
 
 6) Access the URL from step 5 with a web browser.
 
-7) Add two items "Sheet" and "js". Mark "Sheet" as completed. The page should
+7) Add two items "js" and "Sheet". Mark "Sheet" as completed. The page should
 look like the following screenshot:
 
 
@@ -230,7 +248,7 @@ export named "SheetJSPouch.xlsx"
 9) Open the file in a spreadsheet editor. It should match the following table:
 
 | title | completed |
-|:------|:----------|
+|:------|:---------:|
 | Sheet |   TRUE    |
 | js    |   FALSE   |
 
diff --git a/docz/docs/03-demos/30-cloud/22-airtable.md b/docz/docs/03-demos/30-cloud/22-airtable.md
index c6a320c..4a55951 100644
--- a/docz/docs/03-demos/30-cloud/22-airtable.md
+++ b/docz/docs/03-demos/30-cloud/22-airtable.md
@@ -199,15 +199,15 @@ Local files can be read using the SheetJS `readFile` method[^7]:
 const wb = XLSX.readFile("SheetJSAirtableTest.xlsb");
 (async() => {
   await airtable_load_workbook(table, wb);
-});
+})();
 ```
 
 ## Complete Example
 
 :::note Tested Deployments
 
-This demo was last tested on 2023 September 03. At the time, free accounts
-included limited API access.
+This demo was last tested on 2024 May 04. At the time, free accounts included
+limited API access.
 
 :::
 
@@ -217,8 +217,8 @@ included limited API access.
 
 :::note pass
 
-In the past, Airtable offered API keys.  They are slated to deprecate API keys
-in January 2024. They recommend "Personal Access Tokens" for operations.
+In the past, Airtable offered API keys. They were officially deprecated on 2024
+February 1. They recommend "Personal Access Tokens" for operations.
 
 :::
 
@@ -226,7 +226,14 @@ API actions will require a PAT, which must be created through the developer hub:
 
 1) Click on account icon (topright area of the page) and select "Developer Hub".
 
-2) Click "Create Token".
+:::caution pass
+
+The email address associated with the account must be verified before attempting
+to create a token.
+
+:::
+
+2) Click the blue "Create Token" button.
 
 3) In the form, make the following selections:
 
@@ -234,7 +241,7 @@ API actions will require a PAT, which must be created through the developer hub:
 - Scopes: `data.records:read` and `data.records:write` (adding 2 scopes)
 - Access: "All current and future bases in all current and future workspaces"
 
-The form will look like the screenshot below:
+The form will look like the following screenshot:
 
 
 
@@ -246,21 +253,39 @@ For the purposes of this demo, a sample workspace should be created:
 
 5) Download https://docs.sheetjs.com/pres.xlsx
 
-6) Create a project in Airtable using "Quickly upload". Select "Microsoft Excel"
+6) Click "Back to Home" to return to the home page.
+
+7) Create a project in Airtable using "Quickly upload". Select "Microsoft Excel"
 and select the downloaded file from step 1.  Click "Upload", then "Import".
 
-7) A workspace will be created. The name will be found in the URL. For example:
+8) A workspace will be created. The name will be found in the URL. For example:
 
 ```
 https://airtable.com/appblahblah/tblblahblah/blahblah
 --------------------/^^^^^^^^^^^/ workspace name
 ```
 
-the first part after the `.com` will be the workspace name.
+The first part after the `.com` will be the workspace name. Copy the name.
+
+### New Project
+
+9) Create a new project:
+
+```bash
+mkdir -p sheetjs-airtable
+cd sheetjs-airtable
+npm init -y
+```
+
+10) Install dependencies:
+
+{`\
+npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz airtable`}
+
 
 ### Exporting Data
 
-8) Save the following to `SheetJSAirtableRead.js`:
+11) Save the following to `SheetJSAirtableRead.js`:
 
 ```js title="SheetJSAirtableRead.js"
 const Airtable = require("airtable"), XLSX = require("xlsx");
@@ -282,15 +307,9 @@ const base = "app...";
 })();
 ```
 
-9) Replace the values in the highlighted lines with the PAT and workspace name.
+12) Replace the values in the highlighted lines with the PAT and workspace name.
 
-10) Install dependencies:
-
-{`\
-npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz airtable`}
-
-
-11) Run the script:
+13) Run the script:
 
 ```bash
 node SheetJSAirtableRead.js
@@ -300,19 +319,14 @@ The script should write `SheetJSAirtable.xlsb`. The file can be opened in Excel.
 
 ### Importing Data
 
-12) Create a file `SheetJSAirpend.xlsx` with some new records in sheet `Sheet1`:
+14) Download [`SheetJSAirpend.xlsx`](pathname:///airtable/SheetJSAirpend.xlsx)
+to the project folder:
 
-
-
-`npx xlsx-cli SheetJSAirpend.xlsx` should print the following data:
-
-```csv
-Sheet1
-Name,Index
-Someone Else,47
+```bash
+curl -LO https://docs.sheetjs.com/airtable/SheetJSAirpend.xlsx
 ```
 
-13) Save the following to `SheetJSAirtableWrite.js`:
+15) Save the following to `SheetJSAirtableWrite.js`:
 
 ```js title="SheetJSAirtableWrite.js"
 const Airtable = require("airtable"), XLSX = require("xlsx");
@@ -332,15 +346,9 @@ const base = "app...";
 })();
 ```
 
-14) Replace the values in the highlighted lines with the PAT and workspace name.
+16) Replace the values in the highlighted lines with the PAT and workspace name.
 
-15) Install dependencies:
-
-{`\
-npm i --save https://cdn.sheetjs.com/xlsx-${current}/xlsx-${current}.tgz airtable`}
-
-
-16) Run the script:
+17) Run the script:
 
 ```bash
 node SheetJSAirtableWrite.js
diff --git a/docz/static/airtable/SheetJSAirpend.xlsx b/docz/static/airtable/SheetJSAirpend.xlsx
new file mode 100644
index 0000000..8fa557b
Binary files /dev/null and b/docz/static/airtable/SheetJSAirpend.xlsx differ
diff --git a/docz/static/airtable/airpend.png b/docz/static/airtable/airpend.png
deleted file mode 100644
index 19978a1..0000000
Binary files a/docz/static/airtable/airpend.png and /dev/null differ
diff --git a/docz/static/airtable/post.png b/docz/static/airtable/post.png
index 89ca5fb..bfc3147 100644
Binary files a/docz/static/airtable/post.png and b/docz/static/airtable/post.png differ