The University of Sydney Wind Orchestra's Website - A modern web application for managing orchestra members, attendance, and public information.
__________ ____ ____ ___ __ ___ __________
/ / / / / / / / / / /
/ _____/ / / / / / / / / /
/ / / / / / / / / /
/_____ / / / / / / / / /
/ / / / / / / / /
/_________/ /_________/ /_____/_____/ /_________/
SUWO (Sydney University Wind Orchestra) is a multi-award-winning concert band based at the University of Sydney. Founded in 2003, SUWO brings together students and alumni to perform a diverse repertoire of wind band music, ranging from classical works to contemporary pieces. The orchestra is known for its vibrant community, occasional performances throughout the year, and a welcoming atmosphere for new membersβno auditions required. SUWO has received numerous accolades, including "BEST SMALL CLUB" at Sydney University (2006β2010) and "Champion Open B Grade Concert Band" in NSW (2011). Members enjoy opportunities for musical growth, social events, and contributing to the university's cultural life.
- Framework: Next.js
- Styling: Tailwind CSS with custom design system
- UI Components: Custom design system built on Radix UI and Heroicons
- State Management: TanStack Query (React Query)
- Forms: TanStack Form with Zod validation
- Database: Neon PostgreSQL with Prisma ORM
- Authentication:
josefor JWT session management with Argon2 password hashing - Email: Resend for transactional emails
- CMS: Notion for content management
- Package Manager: pnpm
- Type Safety: TypeScript with strict configuration
- Code Quality: ESLint, Prettier
- Documentation: Storybook for component documentation
- Deployment: Vercel
- Monitoring: Vercel Analytics
- π Marketing Pages: Orchestra information, calendar, history, and joining details
- π Dynamic History: Content managed through Notion CMS
- π Authentication: Secure login/logout with session management
- π€ Profile Management: Update personal information and instrument
- π§ Mailing List: Opt-in/out of weekly communications
- π Password Management: Secure password updates
- π Roll Call: Digital attendance tracking with QR codes
- π Attendance Management: View and manage weekly attendance
- π₯ Member Directory: Access to all orchestra member profiles
- πΊ Equipment Inventory: Track and view available equipment
suwo/
βββ prisma/
β βββ migrations/ # Database migration files
β βββ models/ # Prisma schema files
β βββ schema.prisma # Prisma config schema
βββ src/
β βββ app/ # Next.js App Router pages
β β βββ (app)/ # Authenticated app pages
β β β βββ attendance/ # Roll call and attendance management
β β β βββ equipment/ # Equipment inventory
β β β βββ mailing-list/ # Mailing list admin
β β β βββ members/ # Member directory
β β β βββ settings/ # Account settings
β β βββ (auth)/ # Authentication (login, register, etc.)
β β βββ (marketing)/ # Public marketing pages
β β βββ api/ # API routes
β βββ design_system/ # Reusable UI components
β βββ features/ # Feature-specific modules
β β βββ attendance/
β β βββ auth/
β β βββ marketing/
β β βββ navigation/
β β βββ profile/
β β βββ usyd_api_wrapper/ # USYD calendar helpers
β βββ icons/ # SUWO-specific SVG icons
β βββ generated/ # Prisma output βΒ ignore this
β βββ lib/
β β βββ forms/ # Tanstack Form forms
β β βββ mutations/ # Tanstack Query mutations
β β βββ queries/ # Tanstack Query queries
β β βββ validators/ # Zod schema validators
β βββ styles/ # Global styles and design tokens
β βββ utils/ # Utility functions and helpers
β βββ config.ts # Application configuration
β βββ routes.ts # Application route definitions
βββ .env.local # Environment variables (local)
βββ .gitignore # Git ignore rules
βββ eslint.config.mjs # ESLint configuration
βββ next.config.ts # Next.js configuration
βββ package.json # Project dependencies and scripts
βββ prettier.config.mjs # Prettier configuration
βββ tsconfig.json # TypeScript configuration
-
Clone the repository
gh repo clone nico-bachner/suwo cd suwo -
Install dependencies
pnpm install
-
Set up environment variables
vercel env pull
-
Start development server
pnpm dev
dev- Start development serverbuild- Build for productionstart- Start production serverlint- Run ESLintformat- Format code with Prisma and Prettiersb:dev- Start Storybook for component developmentsb:build- Build Storybook for production
- Use TypeScript for all new code
- Follow the existing file naming conventions (snake_case for files, PascalCase for components)
- Add JSDoc comments for complex functions
- Ensure all components are properly typed
- Prefer absolute imports (
@/prefix)
- Create components in the appropriate feature folder or design system
- Include Storybook stories for reusable components
- Follow the established design patterns and color system
- Ensure components are accessible and responsive
- Create Prisma migration:
pnpm prisma migrate dev --name [MIGRATION_NAME](use snake case for migration names) - Fix potentially broken TypeScript types
- Create a feature branch from
main - Make your changes with descriptive commit messages
- Ensure all tests pass and code is properly formatted
- Create a pull request with a clear description
- API Routes: Add to
/src/app/api/following the existing patterns - Pages: Use the appropriate route group (
(marketing)for public,(app)for authenticated) - Components: Place in the relevant feature folder or design system
- Utilities: Add to
/src/utils/if framework-independent
- Our dev database is a replica of the production database. Use that to your advantage to test against real data.
- Verify responsive design on multiple screen sizes
- Check accessibility with screen readers
This project is private and proprietary to the University of Sydney Wind Orchestra.