diff --git a/docz/docs/03-demos/03-desktop/06-reactnative.md b/docz/docs/03-demos/03-desktop/06-reactnative.md
index 4a97731..47313c0 100644
--- a/docz/docs/03-demos/03-desktop/06-reactnative.md
+++ b/docz/docs/03-demos/03-desktop/06-reactnative.md
@@ -214,10 +214,9 @@ been tested against both application types.
 
 :::caution
 
-NodeJS `v16` is required.  There are OS-specific tools for downgrading:
-
-- [`nvm-windows`](https://github.com/coreybutler/nvm-windows/releases) Windows
-- [`n`](https://github.com/tj/n/) Linux, MacOS, WSL, etc.
+At the time of testing, NodeJS `v16` was required. A tool like
+[`nvm-windows`](https://github.com/coreybutler/nvm-windows/releases) should be
+used to switch the NodeJS version.
 
 :::
 
@@ -436,10 +435,8 @@ This demo was tested against `v0.64.30` on 2023 January 04 in MacOS 12.4
 
 :::caution
 
-NodeJS `v16` is required.  There are OS-specific tools for downgrading:
-
-- [`nvm-windows`](https://github.com/coreybutler/nvm-windows/releases) Windows
-- [`n`](https://github.com/tj/n/) Linux, MacOS, WSL, etc.
+At the time of testing, NodeJS `v16` was required. A tool like
+[`n`](https://github.com/tj/n/) should be used to switch the NodeJS version.
 
 :::
 
diff --git a/docz/docs/03-demos/04-grid.md b/docz/docs/03-demos/05-grid.md
similarity index 100%
rename from docz/docs/03-demos/04-grid.md
rename to docz/docs/03-demos/05-grid.md
diff --git a/docz/docs/03-demos/05-database.md b/docz/docs/03-demos/06-database.md
similarity index 100%
rename from docz/docs/03-demos/05-database.md
rename to docz/docs/03-demos/06-database.md
diff --git a/docz/docs/03-demos/11-static/09-nuxtjs.md b/docz/docs/03-demos/11-static/09-nuxtjs.md
index 0c5684f..b65e57e 100644
--- a/docz/docs/03-demos/11-static/09-nuxtjs.md
+++ b/docz/docs/03-demos/11-static/09-nuxtjs.md
@@ -4,17 +4,9 @@ pagination_prev: demos/extensions/index
 pagination_next: demos/gsheet
 ---
 
-### NuxtJS
-
 `@nuxt/content` is a file-based CMS for Nuxt, enabling static-site generation
 and on-demand server rendering powered by spreadsheets.
 
-:::note
-
-This demo was tested on 2022 November 18 against Nuxt Content `v1.15.1`.
-
-:::
-
 :::warning
 
 Nuxt Content `v2` (NuxtJS `v3`) employs a different architecture from `v1`.
@@ -25,7 +17,15 @@ until the issues are resolved.
 
 :::
 
-## Configuration
+## Nuxt Content v1
+
+:::note
+
+This demo was tested on 2022 November 18 against Nuxt Content `v1.15.1`.
+
+:::
+
+### Configuration
 
 Through an override in `nuxt.config.js`, Nuxt Content will use custom parsers.
 Differences from a stock `create-nuxt-app` config are shown below:
@@ -59,7 +59,7 @@ export default {
 }
 ```
 
-## Template Use
+### Template Use
 
 When a spreadsheet is placed in the `content` folder, Nuxt will find it.  The
 data can be referenced in a view with `asyncData`.  The name should not include
@@ -92,7 +92,7 @@ neatly with nested `v-for`:
   
 ```
 
-## Nuxt Content Demo
+### Nuxt Content Demo
 
 :::note
 
@@ -248,3 +248,235 @@ npx http-server dist
 Accessing the page http://localhost:8080 will show the page contents. Verifying
 the static nature is trivial: make another change in Excel and save.  The page
 will not change.
+
+## Nuxt Content v2
+
+:::note
+
+This demo was tested on 2023 January 19 against Nuxt Content `v2.3.0`.
+
+:::
+
+### Overview
+
+Nuxt Content `v2` supports custom transformers for controlling data.  Although
+the library hard-codes UTF-8 interpretations, the `_id` field currently uses
+the pattern `content:` followed by the filename (if files are placed in the
+`content` folder directly).  This enables a transformer to re-read the file:
+
+```ts
+import { defineTransformer } from "@nuxt/content/transformers/utils";
+import { read, utils } from "xlsx";
+import { readFileSync } from "node:fs";
+import { resolve } from 'node:path';
+
+export default defineTransformer({
+  name: 'sheetformer',
+  extensions: ['.xlsx'],
+  parse (_id: string, rawContent: string) {
+    const wb = read(readFileSync(resolve("./content/" + _id.slice(8))));
+    const body = wb.SheetNames.map(name => ({ name, data: utils.sheet_to_json(wb.Sheets[name])}));
+    return { _id, body };
+  }
+});
+```
+
+Pages can pull data using `useAsyncData`:
+
+```html
+
+```
+
+Pages should use `ContentRenderer` to reference the data:
+
+```html
+
+  
+  
+    
+    
{{ item.name }}
+    
+    
| Name | Index | 
|---|
+      
+        
+        | {{ row.Name }}+ | {{ row.Index }}+ | 
+    
+  
+    
{{ item.name }}
+    
| Name | Index | 
|---|
+      
+        | {{ row.Name }}+ | {{ row.Index }}+ | 
+    
+