Example website for Software Factory Intensive training. Live at https://bryanhirsch.github.io/acme-widgets-private/.
- Bun
>=1.2— runtime + package manager + script runner. Vite (the dev server / bundler) is installed for you when you runbun install, so you don't need to install it globally.
See the official install guide: https://bun.sh/docs/installation.
# macOS / Linux / WSL
curl -fsSL https://bun.sh/install | bash
# macOS via Homebrew
brew install oven-sh/bun/bun
# Windows (PowerShell)
powershell -c "irm bun.sh/install.ps1 | iex"Verify:
bun --version # should print 1.2.x or newerYou don't install Vite globally for this project — it ships as a dev dependency
(see package.json) and is run via the bun run scripts below. If you want to
read up on it: https://vitejs.dev/guide/.
git clone git@github.com:bryanhirsch/acme-widgets-private.git
cd acme-widgets-private
bun install # installs Vite and all other deps
bun run dev # http://localhost:5173Other useful scripts:
bun run typecheck # tsc --noEmit
bun run build # production build to dist/ (also writes 404.html)
bun run preview # serve the built output on http://localhost:4173
bun run test # Vitest, one shot
bun run test:watch # Vitest, watch mode
bun run test:e2e # Playwright (chromium); spins up `bun run preview`TypeScript + React 19 + Vite 6 + Tailwind v4 + React Router v7,
hosted on GitHub Pages, CI on GitHub Actions. See
docs/current/STACK.md for as-built versions
and conventions, and
docs/decision-records/0001.ADR.TECH_STACK.md
for the decision record.
docs/current/— what is true onmainright now.docs/decision-records/— frozen ADRs.docs/future/— proposed changes drafted as ADRs.src/— application source.pages/contains the three routes;components/contains shared chrome and the 15 widget presets;lib/widgets.tsis the CSV parser + cache.e2e/— Playwright specs.public/data/widgets.csv— last-resort fallback for the catalog if the Google Sheet can't be reached. Editing this file does not change the live site; see below.
Widget data (prices, stock counts, descriptions) lives in a Google Sheet, not in this repo. Producers and employees edit the sheet directly; changes appear on the live site within a few minutes — no PR, no deploy.
See docs/current/EDITING_THE_CATALOG.md
for the sheet location and editing rules. The architecture choice is
captured in
docs/decision-records/0002.ADR.DYNAMIC_WIDGET_CATALOG.md.