UTM Billiards Club: Site Documentation

Last updated: April 2026 | Made by Marco Anthony Ayuste (Class of 2027)

1. Site Overview

The UTMBC website is a React single-page application built with Vite, TypeScript, and Tailwind CSS. It provides club information, schedules, live rankings, rules, an AI FAQ chatbot, and a browser-based 8-ball game.

Pages

RoutePagePurpose
/Home3D hero, current schedule, upcoming tournaments
/leagueLeagueLeague info, how to join, Elo system, schedule
/practicePracticePractice session details, current + past schedule
/tournamentsTournamentsTournament info, schedule, 2v2 bracket generator
/rankingsRankingsLive standings from Google Sheet with search/filter
/rulesRulesBCA 8-ball rules + club decorum (tabbed)
/aboutAboutMission, values, learning goals
/peoplePeopleExecutive team carousels with click-to-expand cards
/contactContactContact info, email, message form
/joinJoinEmbedded Google Form for registration
/gameGameBrowser-based 8-ball pool game

2. Tech Stack

LayerTechnology
FrameworkReact 19 + TypeScript (strict mode)
Build ToolVite
StylingTailwind CSS + custom CSS
RoutingReact Router v7
3DThree.js (pool table hero scene)
DeployNetlify (static SPA)
DataGoogle Sheets CSV (rankings), JSON (FAQ, events)

3. How to Run Locally

Install dependencies

npm install

Start dev server

npm run dev

Open http://localhost:5173 in your browser.

Build for production

npm run build

4. How to Deploy to Netlify

  1. Push the repo to GitHub.
  2. Log in to Netlify and import the repo.
  3. Set Build command: npm run build
  4. Set Publish directory: dist
  5. Deploy.

5. How to Update Schedules & Tournaments

All schedule and tournament data lives in one file: public/data/events.json.

The JSON has two top-level sections: current (active season) and past (archived season).

Add a new tournament

{
  "date": "2026-04-15",
  "start": "1:00 PM",
  "end": "6:00 PM",
  "location": "Blind Duck Pub (Student Centre)",
  "format": "1-on-1 8-ball",
  "notes": "Prize: $50 gift card"
}

Use ISO date format (YYYY-MM-DD) for the date field.

6. How Rankings Work

Rankings are pulled live from a published Google Sheet (tab: Ranked Pool Standings). The sheet must be shared as "Anyone with the link -> Viewer".

7. How the Chatbot Works

The chatbot is a client-side FAQ bot that runs entirely in the browser (no server required).

8. How to Update the People Page

Edit src/pages/People.tsx. Each team member is an object in the newTeam or foundingTeam array:

{ name: 'Name', role: 'Role', desc: 'Bio.', img: '/img/photo.png' }

Place headshot images in public/img/. Cards are clickable and open an expanded modal.

9. How to Update FAQ Data

Edit public/data/faq.json. Dynamic answer templates: {{leagueDays}}, {{practiceSessions}}, {{tournaments}}, {{location}}, {{schedule}}.

10. Common Issues & Fixes

IssueFix
Rankings blankCheck Google Sheet is shared as "Anyone with the link -> Viewer"
Schedule not updatingEdit public/data/events.json, redeploy
Chatbot not respondingCheck public/data/faq.json exists and is valid JSON
Build failsRun npm install then npm run build
CSP blocking requestsCheck index.html Content-Security-Policy meta tag

11. Contact