a4e9327b1819845eba69af61d02b1c1a19e4579f
LocationSearchSheet now shows only stadium cities (with sport badges) when selecting start/end locations, preventing users from picking cities with no stadiums. TripWizardViewModel filters available sports to the union of sports at the selected cities, and clears invalid selections when locations change. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
SportsTime
An iOS app for planning multi-stop sports road trips across North America. Plan your ultimate stadium-hopping adventure with intelligent route optimization, real-time game schedules, and detailed trip itineraries.
Features
- Multi-Sport Trip Planning - Plan trips across 7 professional leagues
- Three Planning Modes
- By Date Range - Find the best games within your travel window
- By Must-See Games - Build a trip around specific matchups you want to attend
- By Cities - Select departure/arrival cities and discover games along the route
- Intelligent Route Optimization - TSP solver optimizes multi-stop routes for minimum travel time
- Driving Constraints - Respects max daily driving hours and number of drivers
- Offline-First - Works without internet using locally cached schedule data
- PDF Export - Generate detailed trip itineraries with maps, stadium info, and nearby attractions
- Stadium Tracking - Track which stadiums you've visited across all leagues
Supported Leagues
| League | Sport | Season |
|---|---|---|
| MLB | Baseball | March - October |
| NBA | Basketball | October - June |
| NHL | Hockey | October - June |
| NFL | Football | September - February |
| MLS | Soccer | February - December |
| WNBA | Basketball | May - October |
| NWSL | Soccer | March - November |
Requirements
- iOS 26.0+
- Xcode 26.0+
- Swift 6.0+
Installation
-
Clone the repository:
git clone https://github.com/yourusername/SportsTime.git cd SportsTime -
Open the project in Xcode:
open SportsTime.xcodeproj -
Build and run on simulator or device.
Project Structure
SportsTime/
├── SportsTime/ # Main app target
│ ├── Core/ # Data layer
│ │ ├── Models/
│ │ │ ├── Domain/ # Pure Swift structs (Trip, Game, Stadium, Team)
│ │ │ ├── CloudKit/ # CKRecord wrappers
│ │ │ └── Local/ # SwiftData models
│ │ └── Services/ # CloudKit, Location services
│ ├── Planning/ # Domain layer - trip planning logic
│ │ └── Engine/ # TripPlanningEngine, RouteOptimizer, etc.
│ ├── Features/ # Presentation layer - SwiftUI views
│ │ ├── Home/
│ │ ├── Trip/
│ │ ├── Schedule/
│ │ ├── Progress/
│ │ └── Settings/
│ ├── Export/ # PDF generation
│ └── Resources/ # Bundled JSON data
├── SportsTimeTests/ # Unit tests
├── SportsTimeUITests/ # UI test suites + screen objects
├── Scripts/ # Python data pipeline
│ └── sportstime_parser/ # Schedule scraping & CloudKit upload
├── data/ # Local data files
└── docs/ # Documentation
Architecture
Clean MVVM with feature-based modules and offline-first data architecture.
Three-Layer Architecture
- Presentation Layer (
Features/) - SwiftUI Views +@ObservableViewModels - Domain Layer (
Planning/) - Trip planning algorithms - Data Layer (
Core/) - Models and services
Data Flow
AppDataProvider.shared (Single Source of Truth)
│
├── Bundled JSON (bootstrap on first launch)
├── SwiftData (local persistence)
└── CloudKit (background sync)
All schedule data flows through AppDataProvider.shared - never access CloudKit or SwiftData directly for canonical data.
Development
Build
xcodebuild -project SportsTime.xcodeproj \
-scheme SportsTime \
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
build
Run Tests
# All tests
xcodebuild -project SportsTime.xcodeproj \
-scheme SportsTime \
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
test
# Specific test suite
xcodebuild -project SportsTime.xcodeproj \
-scheme SportsTime \
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
-only-testing:SportsTimeTests/EdgeCaseTests \
test
# UI test target only
xcodebuild test-without-building \
-project SportsTime.xcodeproj \
-scheme SportsTime \
-destination 'platform=iOS Simulator,name=iPhone 17,OS=26.2' \
-parallel-testing-enabled NO \
-only-testing:SportsTimeUITests
Data Pipeline
The Python pipeline scrapes schedules from multiple sources and uploads to CloudKit:
cd Scripts
pip install -r requirements.txt
python -m sportstime_parser scrape --sport all --season 2026
python -m sportstime_parser upload --sport all
Test Suite
124 tests across 11 phases covering:
- Trip planning engine (all 3 scenarios)
- Route optimization (TSP solver)
- Travel estimation
- Game filtering and matching
- Edge cases and boundary conditions
- Concurrency behavior
Documentation
CLAUDE.md- Development guidelines and architecture detailsAGENTS.md- Agent-specific execution notes for this repoARCHITECTURE.md- Detailed system architectureXCUITest-Authoring.md- How existing UI tests are structured and how to add new onesXCUITestSuiteTemplate.swift- Starter suite template for new UI test filesuiTestPrompt.md- Reusable prompt template for requesting UI test workdocs/TEST_PLAN.md- Test suite documentationdocs/MARKET_RESEARCH.md- Competitive analysis
License
MIT License - see LICENSE file for details.
Description
Languages
Cython
91.7%
Swift
8%
HTML
0.2%