A modern, offline-first Progressive Web App (PWA) for managing padel tournaments with a team-vs-team format. Built with Laravel, Inertia.js, and Vue 3.
2026 with ❤️ from REZIM70
- Create and manage tournaments with customizable settings
- Team vs Team format with multiple pairs per team
- Deterministic cross-team round-robin scheduling
- Pairs from the same team never play each other
- Tablet-friendly score input with large touch targets
- Real-time scoreboard with auto-refresh
- TV Mode for large displays (fullscreen, optimized typography)
- Comprehensive statistics dashboard
- Match highlights (highest scoring, closest match, biggest win)
- MVP Pair - Highest contribution to team
- Top Performer - Best win rate
- Ironman - Most matches played
- Clutch Pair - Most close victories
- Winning team celebration with confetti animation
- Full pair rankings with sortable columns
- Filter by team
- Track W-L record, points, and point differential
- Generate shareable result cards
- Download as PNG image
- Native share API support
- Install as app on any device
- Works offline with IndexedDB storage
- Background sync when connection restored
- Service Worker with smart caching strategies
| Layer | Technology |
|---|---|
| Backend | Laravel 12 |
| Frontend | Vue 3 + Inertia.js |
| Database | MySQL / SQLite |
| Styling | CSS with dark theme |
| PWA | Service Worker + IndexedDB |
| Build | Vite |
- PHP 8.2+
- Composer
- Node.js 18+
- MySQL (or SQLite for local dev)
# Clone repository
git clone <repository-url>
cd teamrezim
# Install dependencies
composer install
npm install
# Environment setup
cp .env.example .env
php artisan key:generate
# Database setup
php artisan migrate
# Build assets
npm run build
# Start server
php artisan serve# Run with hot reload
npm run dev
# In another terminal
php artisan serve- Click "New Tournament" from the home page
- Enter name, description (Court name, Date/Time)
- Configure pairs per team, rounds, and points per set
- Add teams and pairs
- Generate schedule
- Start tournament!
- Click on any match from the tournament page
- Use the score input interface
- Scores auto-save as you enter them
- Complete match when finished
- Statistics - Tournament stats and match highlights
- Leaderboard - Pair rankings with sorting
- Complete - Winner celebration and awards
| Page | Route | Description |
|---|---|---|
| Tournaments | /tournaments |
List all tournaments |
| Tournament | /tournaments/{id} |
Tournament detail & management |
| Statistics | /tournaments/{id}/statistics |
Tournament statistics |
| Leaderboard | /tournaments/{id}/leaderboard |
Pair rankings |
| Complete | /tournaments/{id}/complete-view |
Winner & awards |
| Matches | /tournaments/{id}/matches |
All matches by round |
| Score Input | /tournaments/{id}/matches/{id}/score |
Enter scores |
| Scoreboard | /tournaments/{id}/scoreboard |
Live scores |
| TV Mode | /tournaments/{id}/tv |
Large display view |
app/
├── Http/Controllers/ # Route controllers
├── Models/ # Eloquent models
├── Services/ # Business logic
│ ├── SchedulingService.php
│ ├── ScoringService.php
│ ├── StatisticsService.php
│ └── AwardsService.php
resources/js/
├── Pages/ # Vue page components
├── Components/ # Reusable components
├── Layouts/ # App layout
└── pwa/ # PWA utilities
public/
├── sw.js # Service Worker
├── manifest.json # PWA manifest
└── offline.html # Offline fallback
This project is open-sourced software.