Location: Root page - visitors enter here
Location: Plays automatically after age gate passes
Location: /Courtyard/courtyarddoors.html
Location: /Dungeons/dungeon###/
{
"id": "product-handle-1",
"title": "Product Title",
"price": "49.99",
"imageUrl": "https://...",
"door_id": "door005"
}
Optional competitive pricing display on product pages. Only appears when price comparison data is added to a product.
When viewing a product page, if price comparison data exists, a "📊 Price Comparison" section appears below the product description showing:
In products-clean.json, add this field to any product:
{
"id": "leather-harness",
"title": "Master Harness",
"price": "49.99",
"priceComparison": {
"competitors": [
{
"name": "Mr. S Leather",
"price": "69.99",
"currency": "USD",
"url": "https://www.mr-s-leather.com/product-page",
"notes": "Standard sizes only",
"verified": "2026-01"
},
{
"name": "Northbound Leather",
"price": "64.95",
"currency": "CAD",
"url": "https://www.northbound.ca/product",
"notes": "Standard sizes, machine-stitched",
"verified": "2026-01"
}
],
"advantages": [
"Custom-sized to your measurements",
"Hand-stitched with bonded nylon thread",
"Made in Canada with top-grain leather"
]
}
}
priceComparison (object, optional)
competitors (array, required if priceComparison exists)
Each competitor object:
name (string, required): Company nameprice (string, required): Their price (numbers only)currency (string, optional): "USD" or "CAD" (defaults to USD)url (string, optional): Link to their product pagenotes (string, optional): Size info, quality notes, etc.verified (string, optional): Date you checked (format: "2026-01")advantages (array, optional)
DO:
DON'T:
✓ Good candidates:
✗ Skip comparison for:
| Action | Keys | Where |
|---|---|---|
| Submit age | Enter | Age gate |
| Reveal admin controls | Ctrl+Shift+D | Courtyard |
| High Contrast Doors | Click button (after Ctrl+Shift+D) | Courtyard (admin only) |
index.html - Age gate + intro videoCourtyard/courtyarddoors.html - Door selection screenCourtyard/courtyard.css - Door stylingCourtyard/courtyard.js - Door logic + admin modeDungeons/dungeon###/dungeon.html - Dungeon pageCompleted Pages/products-clean.json - Product data and dungeon assignmentDungeons/dungeon###/dungeon.css - StylingDungeons/dungeon###/Background/background###.jpg - BackdropCompleted Pages/products-clean.json - Product databaseCompleted Pages/catalog.html - Product catalog pageCompleted Pages/product-page.html - Individual product viewCompleted Pages/cart.html - Shopping cart pageCompleted Pages/checkout.html - Embedded Stripe checkoutCompleted Pages/checkout-success.html - Success pageCompleted Pages/checkout-cancel.html - Cancel pageCompleted Pages/wholesale-admin.html - Wholesale toggle (admin)Completed Pages/customers-admin.html - Customer discount listassets/video/intro001.mp4 - Intro videoassets/js/ - JavaScript filesassets/css/ - Stylesheetsassets/images/ - Site imagesassets/js/cart.js - Cart logicassets/css/cart.css - Cart stylingsquareup-server/server.js - Square backend (embedded checkout)squareup-server/.env - Square secrets (local only)squareup-server/data/customers.json - Customer databasesquareup-server/data/orders.json - Orders/refunds/disputes log (webhook)squareup-server/exports/daily-YYYY-MM-DD.csv - Auto CSV per dayCompleted Pages/orders-admin.html - Orders dashboard + CSV exportCompleted Pages/admin-editor.htmlid,categoriesCompleted Pages/customers-admin.htmlADMIN_TOKENsquareup-server/.env.example to .envSQUARE_ACCESS_TOKEN, SQUARE_LOCATION_ID, optional SQUARE_ENVIRONMENT, ADMIN_TOKEN, PORT (4242)squareup-server run npm installsquareup-server run npm start (or node server.js).envCompleted Pages/checkout.htmlsquareup-server, run stripe login (one-time)http://localhost:4242/webhook during local testingCompleted Pages/orders-admin.htmlhttp://localhost:4242 and enter ADMIN_TOKENsquareup-server/exports/daily-YYYY-MM-DD.csv; raw log is squareup-server/data/orders.jsonCompleted Pages/wholesale-admin.htmlADMIN_TOKENwholesale to trueassets/video/intro001.mp4 existsdoor_id in products-clean.jsonassets/js/generate-shields.js is linked in the dungeon pageDungeons not dungeons)priceComparison object exists in product JSONcompetitors array has at least one entryLast Updated: March 09, 2026