A web app to aggregate Hockey ice time schedules from the Greater Seattle Area into one place!
- Aggregated schedules from multiple rinks (KCI, LIC/OVA, Sno-King)
- Weekly calendar grid with loading skeletons for fast perceived performance
- Rink filters and state persisted via lightweight stores (Zustand)
- Emotion with SSR support
- Feedback form emailed via AWS SES
- Issue reporter that opens a GitHub issue and emails a summary
- Plausible analytics (privacy-friendly), with outbound link tracking
- Framework: Next.js 16 (App Router), React 19
- Styling: Emotion (
@emotion/react,@emotion/styled) with SSR - State: Zustand
- Email: AWS SES via
@aws-sdk/client-ses+nodemailer, templated with@react-email - HTTP: axios
- Analytics:
next-plausible - Testing: Vitest, Testing Library, jsdom, @emotion/jest
- TypeScript: 5.x
The app uses the following environment variables:
AWS_ACCESS_KEY– IAM access key for SESAWS_SECRET_KEY– IAM secret key for SESAWS_REGION– AWS region for SES (e.g. us-west-2)EMAIL_FROM_ADDRESS– Verified SES senderEMAIL_TO_ADDRESS– Destination for feedback/issue summary emailsGITHUB_ISSUE_TOKEN– Fine-scoped token to create issues inbooshja/seattle-ice-time
Optional (Plausible is configured via code with domain seattleicetime.com using next-plausible proxy), but you can set typical PL_NEXT_PROXY_* vars if needed. See next-plausible docs for advanced setups.
- Install dependencies
bun install- Create a
.env.localwith required variables
AWS_ACCESS_KEY=...
AWS_SECRET_KEY=...
AWS_REGION=...
EMAIL_FROM_ADDRESS=...
EMAIL_TO_ADDRESS=...
GITHUB_ISSUE_TOKEN=...- Run the development server
bun run devbun run dev– Start Next.js dev serverbun run build– Build production bundlebun run start– Start production serverbun run lint– Run eslintbun run test– Run Vitest testsbun run test:watch– Vitest in watch modebun run test:ci– Vitest with coverage
Vitest is configured via vitest.config.ts with:
- jsdom environment
- Coverage collected for
src/**(excluding tests, email templates, fonts, styled files, constants/strings, lib, types, and Next special files)
Run tests:
bun run testView coverage in coverage/ (HTML report at coverage/lcov-report/index.html).
Plausible is enabled via next-plausible:
- Open an issue or PR in this repo
- Run tests and lint before submitting
- Keep code readable and typed; prefer small, focused PRs