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 bun 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
- Radix UI components with custom styling
- Shadcn/ui component library
- Sanity Client for headless CMS integration
- Vercel Analytics for performance monitoring
- Sanity 5 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
- bun for package management with workspace support
- ESLint with custom configuration
- Prettier with Tailwind CSS plugin
- Commitlint for conventional commits
- Husky 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.12.0
- bun 1.3.5 package manager
- Git for version control
- @antfu/ni for talking to the package manager
-
Clone the repository
git clone <repository-url> cd web
-
Install @antfu/ni globally
npm i -g @antfu/ni
-
Install dependencies
ni
-
Set up environment variables
For the Studio (
apps/studio/.env):SANITY_API_DATASET=production 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
nr dev
nr dev # Start all apps in development mode
nr dev:email # Start React Email preview server
nr build # Build all apps for production
nr build:affected # Build only affected packages
nr lint # Lint all apps
nr lint:affected # Lint only affected packages
nr typecheck # Type check all apps
nr typegen:sanity # Generate Sanity types for web app
nr typegen:routes # Generate Next.js route typescd apps/web
nr dev # Next.js dev server
nr build # Production build
nr start # Start production server
nr typecheck # Type check with TypeScript
nr typegen:sanity # Generate Sanity types
nr typegen:routes # Generate Next.js route typescd apps/studio
nr dev # Sanity Studio development
nr build # Build Sanity Studio
nr deploy # Deploy studio to Sanity
nr extract-types # Extract schema types for typegen
nr typecheck # Type check with TypeScriptcd packages/email
nr dev:email # React Email preview server (port 3001)
nr build # Build email templates
nr 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.