A full-stack web application for managing swim meet data including meets, sessions, athletes, teams, and results.
Built with Flask, React (TypeScript), PostgreSQL, and Docker.
Important
This project is entirely hypothetical and is not intended for production use. It was built as a class project to demonstrate full-stack development, database design, and DevOps skills within the competitive swimming domain.
- Docker Desktop installed and running.
- Clone the repository:
git clone https://github.com/SpeedoMan25/Halcyon.git cd Halcyon - Configure environment:
cp .env.example .env
Customize
.envwith your own secrets for production use. - Start the stack:
docker-compose up --build
- Access the app:
- Frontend: http://localhost:5173
- Backend API: http://localhost:5000
Halcyon/
├── backend/ # Flask API
│ ├── app/
│ │ ├── models/ # Data models (raw SQL)
│ │ ├── routes/ # API endpoints
│ │ ├── schemas/ # Request/response validation
│ │ ├── services/ # Business logic
│ │ └── utils/ # Helpers & security
│ ├── database/
│ │ └── init.sql # Schema & seed data
│ ├── docs/ # API & DB documentation
│ └── tests/ # pytest suite
├── frontend/ # React (Vite) + TypeScript
│ ├── src/
│ │ ├── api/ # Backend API client
│ │ ├── components/ # Reusable UI components
│ │ └── pages/ # Application pages
│ └── public/ # Static assets
├── assets/ # Branding & logos
├── scripts/ # Local dev helper scripts
├── docker-compose.yml # Full-stack orchestration
└── .github/workflows/ # CI/CD pipelines
- Professional UI — Premium dark-themed design with smooth transitions and glassmorphism.
- Meet Management — Comprehensive management of swim meets, sessions, and events.
- Entity Tracking — Full CRUD for Teams, Swimmers, Coaches, Officials, and Pools.
- Results & Timing — Advanced results tracking with support for multiple timing events.
- Authentication — Secure JWT-based registration and login system.
- Import System — Bulk data import from structured files.
- Global Search — Search across all entities from a single search bar.
- API Documentation — Auto-generated Swagger UI and Redoc via APIFlask.
Once the stack is running, interactive API docs are available at:
- Swagger UI: http://localhost:5000/docs
- Redoc: http://localhost:5000/redoc
| Module | Description |
|---|---|
| Auth | User registration, login, and profile management |
| Teams | Swimming organizations and clubs |
| Swimmers | Athlete profiles and registration details |
| Coaches | Coaching staff and team assignments |
| Officials | Meet official roles and contact information |
| Pools | Pool facilities and lane configurations |
| Events | Swim event definitions (distance, stroke, gender) |
| Results | Race times, disqualifications, and timing data |
| Standards | Time standards and qualifying criteria |
See backend/docs/API.md for full details.
The backend includes a comprehensive pytest suite:
# Start the test database
docker-compose up -d db-test
# Run tests from the backend container
docker-compose exec backend pytestSee backend/docs/DATABASE.md for the database architecture.
GitHub Actions workflows run on every push and PR to main:
| Workflow | What it does |
|---|---|
| Docker Build | Builds backend & frontend Docker images |
| Backend Tests | Runs the pytest suite against a PostgreSQL service |
| Backend Quality | Ruff linting/formatting + Mypy type checking |
| Frontend CI | ESLint + TypeScript type check + Vite build |
PowerShell helper scripts are provided for running outside of Docker:
# One-time setup (creates venv, installs dependencies)
.\scripts\setup_local.ps1
# Start backend & frontend in separate windows
.\scripts\start_local.ps1Note: You'll still need a PostgreSQL instance running locally or via Docker.
The database is automatically initialized with init.sql on first run. To reset:
docker-compose down -v
docker-compose up --buildContributions are welcome! Please:
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Commit your changes (
git commit -m 'Add my feature') - Push to the branch (
git push origin feature/my-feature) - Open a Pull Request
This project is licensed under the MIT License — see the LICENSE file for details.