A modern, full-stack website for TSG Irlich 1882, a German sports club (Turn- und Sportgemeinde) located in Neuwied/Irlich. This project features a Next.js frontend with Sanity CMS for content management, built as a monorepo using modern web technologies.
- ποΈ Project Architecture
- π Tech Stack
- π Project Structure
- π― Features
- π οΈ Development Setup
- π Available Scripts
- πββοΈ Sports Groups & Departments
- π Content Management
- π¨ Design System
- π Deployment
- π€ Contributing
- π License
- π Contact
This is a monorepo built with Turbo and pnpm containing:
apps/web- Next.js 16 frontend application with App Routerapps/studio- Sanity Studio CMS for content managementpackages/email- React Email templates for transactional emailspackages/shared- Shared utilities, types, and components
- Next.js 16 with App Router and Turbopack
- React 19 with TypeScript
- Tailwind CSS 4 for styling
- Base UI primitives with custom styling
- Shadcn/ui component patterns (CVA variants)
- Sanity Client for headless CMS integration
- Vercel Analytics for performance monitoring
- Sanity 6 headless CMS
- Sanity Studio with custom configuration
- German localization support
- Custom plugins for enhanced functionality
- Media management with Sanity plugins
- React Email for transactional email templates
- Resend integration for email delivery
- Turbo for build orchestration and caching
- pnpm for package management with workspace support
- oxlint with
@mheob/oxlint-config(plus oxlint-tsgolint for type-aware rules) - oxfmt with
@mheob/oxfmt-configfor formatting - Vitest for unit tests, Playwright for end-to-end and accessibility tests
- Commitlint with czg for conventional commits
- Lefthook for git hooks
- TypeScript for type safety
tsg-web/
βββ apps/
β βββ studio/ # Sanity Studio CMS
β β βββ components/ # Studio UI components
β β βββ plugins/ # Custom Sanity plugins
β β βββ schemas/ # Content schemas
β β βββ shared/ # Studio UI components
β β βββ structure/ # Studio UI structure
β β βββ utils/ # Sanity utilities
β βββ web/ # Next.js frontend application
β β βββ public/ # Static assets
β β βββ src/
β β βββ actions/ # Server actions
β β βββ app/ # App Router pages
β β βββ components/ # React components
β β βββ constants/ # Constants
β β βββ hook/ # React hooks
β β βββ icons/ # Icons
β β βββ images/ # Images
β β βββ lib/ # Utilities and configurations
β β βββ types/ # TypeScript type definitions
β β βββ utils/ # Utilities
βββ packages/
β βββ email/ # React Email templates
β βββ shared/ # Shared utilities and types
βββ turbo.json # Turbo configuration
- Multi-language support (German)
- Responsive design for all devices
- SEO optimized with dynamic sitemap, robots.txt, and metadata
- PWA support with web app manifest and icons
- RSS feed for news articles
- Performance optimized with image optimization
- About us description of the club
- Contact forms with validation
- News and blog system
- Sports groups and departments showcase
- Member testimonials
- Training schedules
- Accessibility page with accessibility statement
- Content management for all website sections
- Media library with image optimization
- User management and permissions
- Content versioning and publishing workflow
- Custom content types for sports groups
- SEO metadata management
- Node.js ^24.20.0
- pnpm 11.24.0 package manager
- Git for version control
-
Clone the repository
git clone <repository-url> cd web
-
Install dependencies
pnpm install
-
Set up environment variables
For the Studio (
apps/studio/.env):SANITY_API_DATASET=development SANITY_API_PROJECT_ID=your_project_id SANITY_API_READ_TOKEN=your_read_token SANITY_API_VERSION=2025-02-19 SANITY_API_WRITE_TOKEN=your_write_token
For the Web app (
apps/web/.env.local):NEXT_PUBLIC_SANITY_API_VERSION=2025-02-19 NEXT_PUBLIC_SANITY_DATASET=production NEXT_PUBLIC_SANITY_PROJECT_ID=your_project_id NEXT_PUBLIC_SANITY_STUDIO_URL=http://localhost:3333 SANITY_API_READ_TOKEN=your_read_token SANITY_REVALIDATE_SECRET=your_revalidate_secret RESEND_API_KEY=your_resend_api_key LINEAR_API_KEY=your_linear_api_key LINEAR_TEAM_ID=your_linear_team_id VERCEL_OIDC_TOKEN=your_vercel_token VERCEL_PROJECT_PRODUCTION_URL=your_vercel_project_production_url
-
Start development servers
pnpm run dev
pnpm run dev # Start all apps in development mode
pnpm run dev:email # Start React Email preview server
pnpm run build # Build all apps for production
pnpm run build:affected # Build only affected packages
pnpm run lint # Lint all apps
pnpm run lint:affected # Lint only affected packages
pnpm run lint:fix # Lint and autofix
pnpm run format # Format with oxfmt (format:check to only verify)
pnpm run test # Run every unit test suite
pnpm run test:affected # Only the affected packages
pnpm run test:coverage # Run with coverage (lcov per workspace)
pnpm run test:e2e # Playwright end-to-end suite (apps/web)
pnpm run typecheck # Type check all apps
pnpm run extract-types # Extract the Sanity schema from the studio
pnpm run typegen:sanity # Generate Sanity types for web app
pnpm run typegen:routes # Generate Next.js route types
pnpm run cve # Audit the dependencies with cve-litecd apps/web
pnpm run dev # Next.js dev server
pnpm run build # Production build
pnpm run start # Start production server
pnpm run typecheck # Type check with TypeScript
pnpm run typegen:sanity # Generate Sanity types
pnpm run typegen:routes # Generate Next.js route typescd apps/studio
pnpm run dev # Sanity Studio development
pnpm run build # Build Sanity Studio
pnpm run deploy # Deploy studio to Sanity
pnpm run extract-types # Extract schema types for typegen
pnpm run typecheck # Type check with TypeScriptcd packages/email
pnpm run dev:email # React Email preview server (port 3001)
pnpm run build # Build email templates
pnpm run export # Export email templatesThe website supports various sports groups including:
- Gymnastics (Children & Adults)
- Soccer (Multiple age groups)
- Dance (Various styles)
- Taekwondo (Martial arts)
- Other Sports (Flexible categories)
- Courses (Specialized training)
The Sanity Studio provides content management for:
- Pages (Home, About, Contact, etc.)
- News Articles with categories
- Sports Groups with detailed information
- People (Members, coaches, staff)
- Testimonials from members
- Venues and training locations
- Training Schedules and times
- Tailwind CSS for utility-first styling
- Custom design tokens for consistent theming
- Responsive breakpoints for all devices
- Accessibility compliant components
- German typography optimized
The project is configured for deployment on:
- Vercel (recommended for Next.js)
- Sanity (for the CMS)
- Any Node.js hosting platform
Please read our Contributing Guidelines for details on our code of conduct and the process for submitting pull requests.
This project is private and proprietary to TSG Irlich 1882.
For questions about this project, please contact the development team or visit our contact page.