diff --git a/docz/docs/03-demos/04-static/05-vitejs.md b/docz/docs/03-demos/04-static/05-vitejs.md
index 4c91731..f159339 100644
--- a/docz/docs/03-demos/04-static/05-vitejs.md
+++ b/docz/docs/03-demos/04-static/05-vitejs.md
@@ -1,14 +1,32 @@
 ---
 title: ViteJS
+sidebar_class_name: red
+sidebar_label: ViteJS
+description: Make static websites from spreadsheets using ViteJS. Seamlessly integrate data into your website using SheetJS. Empower non-technical people to write content from Excel.
 pagination_prev: demos/net/index
 pagination_next: demos/mobile/index
 sidebar_custom_props:
   type: bundler
 ---
 
+# ViteJS Spreadsheet Plugins
+
 import current from '/version.js';
 import CodeBlock from '@theme/CodeBlock';
 
+[ViteJS](https://vitejs.dev/) is a modern build tool for generating static sites.
+It has a robust JavaScript-powered plugin system[^1]
+
+[SheetJS](https://sheetjs.com) is a JavaScript library for reading and writing
+data from spreadsheets.
+
+This demo uses ViteJS and SheetJS to pull data from a spreadsheet and display
+the content in an HTML table. We'll explore how to load SheetJS in a ViteJS
+plugin and compare a few different data loading strategies.
+
+The ["Complete Demo"](#complete-demo) section includes a complete website powered
+by an XLSX spreadsheet.
+
 :::note
 
 This demo covers static asset imports. For processing files in the browser, the
@@ -16,25 +34,21 @@ This demo covers static asset imports. For processing files in the browser, the
 
 :::
 
-## Loaders
+## Plugins
 
-ViteJS supports static asset imports, but the default raw loader interprets data
+ViteJS supports static asset imports[^2], but the default raw loader interprets data
 as UTF-8 strings.  This corrupts binary formats like XLSX and XLS, but a custom
 loader can override the default behavior.
 
-:::note Recommendation
-
-For simple tables of data, ["Pure Data Loader"](#pure-data-loader) is strongly
+For simple tables of data, ["Pure Data Plugin"](#pure-data-plugin) is strongly
 recommended.  The heavy work is performed at build time and the generated site
 only includes the raw data.
 
-For more complex parsing or display logic, ["Base64 Loader"](#base64-loader) is
+For more complex parsing or display logic, ["Base64 Plugin"](#base64-plugin) is
 preferable. Since the raw parsing logic is performed in the page, the library
 will be included in the final bundle.
 
-:::
-
-### Pure Data Loader
+### Pure Data Plugin
 
 For a pure static site, a plugin can load data into an array of row objects. The
 SheetJS work is performed in the plugin. The library is not loaded in the page!
@@ -54,6 +68,8 @@ flowchart LR
   aoo --> |main.js\nfrontend code| html
 ```
 
+This ViteJS plugin will read spreadsheets using the SheetJS `read` method[^3]
+and generate arrays of row objects with `sheet_to_json`[^4]:
 
 ```js title="vite.config.js"
 import { readFileSync } from 'fs';
@@ -77,19 +93,20 @@ export default defineConfig({
 });
 ```
 
-This loader uses the query `sheetjs`:
+In frontend code, the loader will look for all modules with a `?sheetjs`
+query string. The default export is an array of row objects:
 
 ```js title="main.js"
 import data from './data.xlsx?sheetjs';
 
 document.querySelector('#app').innerHTML = `
-${data.map(row => JSON.stringify(row)).join("\n")}
+  ${data.map(row => JSON.stringify(row)).join("\n")}