A prototype marketing and lead-capture site for Act Two Catering, a real premium catering business ("Tom") serving South Jersey. It's a single-page React app (no build step — hand-written JS using the React/ReactDOM CDN globals) covering the business's services, sample menus, and a quote-request flow, deployed to GitHub Pages.
The business's actual customer-facing site today is still the Squarespace site at acttwocatering.com — this repo is the in-progress rebuild.
| Path | What it is |
|---|---|
index.html |
Static shell: loading overlay, <noscript> fallback content, and the script tags that load React/ReactDOM from CDN + app.js |
app.js |
The entire app — business info, service categories, sample-menu content, hash-based routing (#/, #/sample-menus, #/contact, etc.), and all page components. This is what actually ships. |
act-two-catering (3).jsx |
JSX source mirroring app.js. Hand-synced, no build step ties them together — edit both when changing the app. |
sw.js |
Service worker with a versioned cache key (act-two-catering-vN) and precache/route list |
manifest.json |
PWA manifest (icons, shortcuts to Sample Menus / Contact) |
data/sample-menus.json |
Curated sample-menu content, hand-picked from the business's real Notion recipe database. Documentation source of truth; the site itself uses an inline JS copy in app.js. |
netlify/functions/quote.js |
CORS-restricted Netlify Function that validates quote submissions and writes them to the canonical Notion Leads database. The UI confirms success only after this function returns a successful Notion write. |
netlify/functions/package.json |
Pins the serverless function directory to CommonJS. It has no dependencies and introduces no package install or build step. |
netlify.toml |
Netlify function directory + SPA redirect config (the site itself deploys via GitHub Pages, not Netlify hosting) |
.github/workflows/pages.yml |
Deploys the repo root to GitHub Pages on every push to main |
images/, icons/, assets/icons/ |
Site photography (real photos of the business's food) and brand/favicon assets |
act-2-photos/ |
Raw, unprocessed source photos for future hero-image swaps |
docs/, MATERIALS.md, catering-feature-analysis-2026-03-25.md |
Planning docs, UX audits, and a detailed materials/asset index from earlier work on the site |
This is a static site with no build step or package manager — there's no package.json.
- Locally: serve the repo root with any static file server (e.g.
npx serve .orpython -m http.server) and open it in a browser. Openingindex.htmldirectly viafile://will not work because the service worker and hash-routed app expect to run from an HTTP origin. - Deployed: every push to
maintriggers.github/workflows/pages.yml, which publishes the repo root to GitHub Pages.
The quote backend deploys separately to the existing acttwocatering.netlify.app site. Activation requires NOTION_API_KEY and NOTION_LEADS_DB_ID in Netlify, with the Leads database shared to that Notion integration. Run node --test tests/quote.test.cjs before deploying the function.
app.jsandact-two-catering (3).jsxare hand-synced. There's no build/bundle step converting one to the other — if you change the app, edit both files.- Bump the cache version in
sw.js(act-two-catering-vN) whenever the precache list or route map changes, or returning visitors will keep getting stale assets. - Anti-fabrication rule: customer-facing copy (services, phone, service area, dish names) must trace back to the real business — either the live Squarespace site or the real Notion recipe database — not invented content. See
MATERIALS.mdfor the full asset/content registry.