A modern, full-stack sports team management platform
RosterEdge is a community-driven, open-source project designed to revolutionize sports team management. We believe in the power of collaboration to build exceptional tools. Whether you're a developer, a designer, or someone with a great idea, we invite you to be part of our journey.
Features β’ Tech Stack β’ Getting Started β’ Architecture β’ Contributing
- Overview
- Features
- Tech Stack
- Architecture
- Getting Started
- Project Structure
- Development
- Testing
- Internationalization
- Contributing
- License
RosterEdge is a comprehensive sports team management platform that enables clubs, coaches, and administrators to efficiently manage teams, track matches, organize staff, and generate detailed reports. Built with modern web technologies and following industry best practices, RosterEdge provides a scalable, maintainable, and user-friendly solution for sports organizations of all sizes.
- Team Organization: Create and manage multiple teams with categories, genders, and seasons
- Staff Management: Assign coaches, trainers, and support staff with role-based access
- Roster Control: Build and maintain team rosters with detailed player information
- Match Scheduling: Plan and organize matches with venues, dates, and opponent details
- Matchday Management: Track matchdays and tournament schedules
- Event Tracking: Record and monitor match events in real-time
- Team Assignments: Assign teams and staff to specific matches
- Dashboard Analytics: Visualize team performance, streaks, and key metrics
- Report Generation: Create detailed reports with PDF export capabilities
- Performance Tracking: Monitor wins, losses, and team statistics over time
- Multi-language Support: Full internationalization with English and Spanish
- Notification System: Real-time notifications for important events
- User Management: Role-based access control and user administration
- Geographic Data: Manage countries, cities, stadiums, and venues
- Currency Support: Multi-currency support for financial tracking
- Responsive Design: Mobile-first approach with adaptive layouts
- Dark Mode: Built-in theme support for better user experience
- Accessibility: WCAG-compliant interface with full keyboard navigation
- Offline Support: Progressive Web App capabilities
- Real-time Updates: Live data synchronization with React Query
- React 19.1.1 - Latest React with concurrent features
- TypeScript 5.8.3 - Type-safe development
- Vite 7.1.6 - Lightning-fast build tool and dev server
- TanStack Query 5.89.0 - Powerful async state management
- Zustand 5.0.8 - Lightweight global state management
- React Router DOM 7.9.1 - Client-side routing
- Material-UI 7.3.2 - Comprehensive component library
- Radix UI - Unstyled, accessible components
- Tailwind CSS 4.1.13 - Utility-first CSS framework
- Emotion - CSS-in-JS styling solution
- Lucide React - Beautiful icon set
- i18next & react-i18next - Internationalization framework
- React PDF Renderer - PDF generation
- Recharts - Data visualization
- Sonner - Toast notifications
- JWT Decode - Token management
- React Cookie - Cookie handling
- Vitest 4.0.8 - Unit testing framework
- Testing Library - React component testing
- ESLint 9.35.0 - Code linting
- Prettier 3.6.2 - Code formatting
- Husky 9.1.7 - Git hooks
- lint-staged - Pre-commit linting
- Spring Boot 3.5.4 - Enterprise-grade Java framework
- Java 21 - Latest LTS version with modern features
- Spring Data JDBC - Simplified data access
- PostgreSQL 42.7.4 - Robust relational database
- Caffeine Cache - High-performance caching
- Lombok - Boilerplate code reduction
- Spring Validation - Request validation
- Spring Dotenv - Environment configuration
- Maven - Dependency management and build
- Spring Boot Test - Testing framework
- Docker Compose - Containerized development environment
- Git - Version control
- GitHub Actions - CI/CD pipelines (future)
RosterEdge follows the Scope Rule architectural pattern and Screaming Architecture principles, ensuring the codebase is maintainable, scalable, and immediately understandable.
"Code used by 2+ features MUST go in global/shared directories. Code used by 1 feature MUST stay local."
This strict rule ensures:
- Clear component ownership and responsibility
- Reduced coupling between features
- Easy refactoring and maintenance
- Intuitive code discovery
The directory structure immediately communicates what the application does:
src/
βββ modules/ # Feature modules (business functionality)
β βββ dashboard/ # Analytics and overview
β βββ matches/ # Match management
β βββ teams/ # Team organization
β βββ staff/ # Staff management
β βββ reports/ # Report generation
β βββ notifications/ # Notification system
β βββ ...
βββ shared/ # Cross-feature components (used by 2+ features)
β βββ components/ # Reusable UI components
β βββ hooks/ # Shared custom hooks
β βββ types/ # Shared TypeScript types
β βββ utils/ # Shared utilities
βββ infrastructure/ # Cross-cutting concerns
βββ config/ # App configuration
- Containers: Handle business logic, state, and data fetching
- Presentational: Pure UI components receiving props
- Main containers match their feature names exactly
The backend follows a layered architecture with clear separation of concerns:
src/main/java/
βββ co/edu/uniquindio/rosteredge/
βββ controller/ # REST API endpoints
βββ service/ # Business logic
βββ repository/ # Data access layer
βββ model/ # Domain entities
βββ dto/ # Data transfer objects
βββ exception/ # Custom exceptions
βββ config/ # Spring configuration
- SOLID Principles: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion
- Repository Pattern: Data access abstraction
- DTO Pattern: Clean data transfer between layers
- Dependency Injection: Loose coupling via Spring IoC
- Custom Hooks: React logic encapsulation
- Composition over Inheritance: Flexible component design
- Node.js 18.0.0 or higher
- npm 9.0.0 or higher (or pnpm/yarn)
- Java 21 or higher
- Maven 3.8.0 or higher
- PostgreSQL 14.0 or higher
git clone https://github.com/diegnghtmr/roster-edge.git
cd roster-edgecd backend
# Configure environment variables
cp .env.example .env
# Edit .env with your database credentials
# Install dependencies and run
./mvnw clean install
./mvnw spring-boot:runThe backend API will be available at http://localhost:8080
cd frontend
# Install dependencies
npm install
# Start development server
npm run devThe frontend will be available at http://localhost:5173
# Database Configuration
DB_HOST=localhost
DB_PORT=5432
DB_NAME=rosteredge
DB_USERNAME=your_username
DB_PASSWORD=your_password
# Application Configuration
SERVER_PORT=8080
JWT_SECRET=your_jwt_secret
JWT_EXPIRATION=86400000VITE_API_URL=http://localhost:8080/api
VITE_APP_NAME=RosterEdge# Start all services with Docker Compose
docker-compose up -d
# Stop services
docker-compose downfrontend/
βββ public/ # Static assets
βββ src/
β βββ api/ # API client configuration
β βββ components/ # Global UI components
β β βββ ui/ # Base UI components (shadcn/ui)
β β βββ reports/ # Report-specific components
β βββ constants/ # Application constants
β βββ hooks/ # Global custom hooks
β βββ i18n/ # Internationalization
β β βββ locales/
β β β βββ en/ # English translations
β β β βββ es/ # Spanish translations
β β βββ index.ts
β βββ infrastructure/ # Cross-cutting concerns
β β βββ config/ # App configuration
β βββ interface/ # TypeScript interfaces
β βββ lib/ # Third-party library configs
β βββ modules/ # Feature modules
β β βββ cities/
β β βββ contact/
β β βββ countries/
β β βββ currencies/
β β βββ dashboard/
β β βββ events/
β β βββ matchdays/
β β βββ matches/
β β βββ notifications/
β β βββ reports/
β β βββ seasons/
β β βββ stadiums/
β β βββ staff/
β β βββ staff-roles/
β β βββ support/
β β βββ team-categories/
β β βββ team-genders/
β β βββ teams/
β β βββ users/
β β βββ venues/
β βββ page/ # Page components
β β βββ login/
β β βββ ErrorPage.tsx
β βββ router/ # Routing configuration
β βββ shared/ # Shared utilities (2+ features)
β β βββ components/ # Shared components
β β βββ hooks/ # Shared hooks
β β βββ types/ # Shared types
β β βββ utils/ # Shared utilities
β βββ storage/ # Local storage utilities
β βββ test/ # Test utilities and setup
β βββ utils/ # General utilities
β βββ App.tsx # Main App component
β βββ App.css # Global styles
β βββ main.tsx # Application entry point
βββ .husky/ # Git hooks
βββ eslint.config.js # ESLint configuration
βββ prettier.config.js # Prettier configuration
βββ tsconfig.json # TypeScript configuration
βββ vite.config.ts # Vite configuration
βββ package.json # Dependencies and scripts
backend/
βββ src/
β βββ main/
β β βββ java/
β β β βββ co/edu/uniquindio/rosteredge/
β β β βββ config/ # Configuration classes
β β β βββ controller/ # REST controllers
β β β βββ dto/ # Data transfer objects
β β β βββ exception/ # Exception handlers
β β β βββ model/ # Domain entities
β β β βββ repository/ # Data repositories
β β β βββ service/ # Business logic
β β β βββ RosterEdgeApplication.java
β β βββ resources/
β β βββ application.properties
β β βββ schema.sql
β βββ test/ # Unit and integration tests
βββ .mvn/ # Maven wrapper
βββ mvnw # Maven wrapper script (Unix)
βββ mvnw.cmd # Maven wrapper script (Windows)
βββ pom.xml # Maven configuration
βββ compose.yml # Docker Compose config
# Development
npm run dev # Start dev server with hot reload
npm run preview # Preview production build
# Build
npm run build # Build for production
npm run type-check # TypeScript type checking
# Code Quality
npm run lint # Run ESLint
npm run lint:fix # Fix ESLint errors
npm run format # Format code with Prettier
npm run format:check # Check code formatting
# Testing
npm run test # Run tests in watch mode
npm run test:ui # Run tests with UI
npm run test:coverage # Generate coverage report
# Git Hooks
npm run lint-staged # Run lint-staged (pre-commit)# Development
./mvnw spring-boot:run # Run application
./mvnw spring-boot:run -Dspring-boot.run.profiles=dev # Run with dev profile
# Build
./mvnw clean install # Build and install
./mvnw clean package # Build JAR
# Testing
./mvnw test # Run tests
./mvnw test -Dtest=ClassName # Run specific test
# Code Quality
./mvnw checkstyle:check # Check code style
./mvnw spotbugs:check # Static analysis- Use functional components with hooks
- Prefer const over let
- Use named exports for components
- Follow Container/Presentational pattern
- Keep components small and focused
- Use TypeScript interfaces for props
- Apply SOLID principles
- Follow Spring Boot conventions
- Use Lombok to reduce boilerplate
- Implement proper exception handling
- Write meaningful tests
- Use constructor injection for dependencies
- Keep services thin, repositories focused
# Create feature branch
git checkout -b feature/your-feature-name
# Make changes and commit
git add .
git commit -m "feat: add new feature"
# Push and create PR
git push origin feature/your-feature-nameFollow Conventional Commits:
feat: add new feature
fix: resolve bug
docs: update documentation
style: format code
refactor: restructure code
test: add tests
chore: update dependencies
Husky automatically runs on commit:
- lint-staged: Lints and formats staged files
- type-check: Validates TypeScript types
- Prevents commits with errors
# Run all tests
npm run test
# Run with UI
npm run test:ui
# Generate coverage
npm run test:coverage- Vitest: Fast unit testing
- Testing Library: React component testing
- jsdom: DOM environment simulation
import { render, screen } from '@testing-library/react';
import { describe, it, expect } from 'vitest';
import { Dashboard } from './Dashboard';
describe('Dashboard', () => {
it('renders dashboard title', () => {
render(<Dashboard />);
expect(screen.getByText(/dashboard/i)).toBeInTheDocument();
});
});# Run all tests
./mvnw test
# Run specific test
./mvnw test -Dtest=TeamServiceTestRosterEdge supports multiple languages using i18next:
- English (en) - Default
- Spanish (es)
- Add translation keys to locale files:
// frontend/src/i18n/locales/en/common.json
{
"actions": {
"create": "Create",
"edit": "Edit"
}
}- Use in components:
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation();
return <button>{t('actions.create')}</button>;
}- Create directory:
frontend/src/i18n/locales/[lang-code]/ - Add translation files
- Register in
frontend/src/i18n/index.ts
We welcome contributions from the community! Here's how you can help:
- π Report bugs
- π‘ Suggest new features
- π Improve documentation
- π§ Submit pull requests
- β Star the project
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes following our guidelines
- Test your changes thoroughly
- Commit with conventional commit messages
- Push to your fork
- Open a Pull Request
- Follow the Scope Rule for component placement
- Write tests for new features
- Update documentation as needed
- Ensure code quality with linters
- Follow architectural patterns
- Consider accessibility and i18n
All pull requests require:
- β Passing CI/CD checks
- β Code review approval
- β Up-to-date with main branch
- β No merge conflicts
This project is licensed under the MIT License - see the LICENSE file for details.
MIT License
Copyright (c) 2025 Diego Alejandro Flores Quintero
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
- Built with β€οΈ by the RosterEdge community
- Powered by React, Spring Boot, and amazing open-source libraries
- Inspired by modern architectural patterns and best practices
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: Contact Form
Made with β€οΈ by the RosterEdge Community