A cross-platform Flutter application for discovering, reporting, and rating parkour spots. Built with Firebase backend services and modern Flutter architecture.
π Live App: https://Parkour.Spot
- π User Authentication - Sign up, login, and profile management
- π Spot Discovery - Browse and search parkour spots
- πΊοΈ Interactive Maps - View spots on maps with location data
- π± Add New Spots - Report new parkour locations with photos
- β Rating System - Rate and review spots
- π± Progressive Web App - Works on Web, Mobile, and Desktop via Progressive Web App
- βοΈ Cloud Backend - Firebase-powered with real-time data sync
- Flutter SDK: 3.9.0 or higher
- Dart SDK: 3.9.0 or higher
- Firebase CLI: Latest version
- Node.js: 18.0.0 or higher
git clone <your-repo-url>
cd Parkour.Spotchmod +x setup.sh
./setup.shThe setup script will:
- Check Flutter and Firebase CLI installation
- Install Flutter dependencies
- Initialize Firebase project
- Configure FlutterFire
- Initialize emulator seed data (for local development)
There are two development flows depending on whether you have access to the production Firebase project:
This is the recommended approach for most developers. No Firebase production access required.
# Terminal 1: Start Firebase emulators
./scripts/start_emulators.sh
# Terminal 2: Run the app with emulators
./scripts/run_local_with_emulators.shπ± Emulator Seed Data: When you start emulators for the first time, seed data from scripts/seed-data/ is automatically copied to .firebase/emulator-data/. This gives you a working dataset with test users, spots, and other sample data to develop with. Your changes are automatically saved when you stop the emulators.
Only for developers with access to the production Firebase project.
- Environment Configuration
cp env.example .env
# Edit .env with your Firebase configurationRequired environment variables:
# Firebase Configuration
FIREBASE_API_KEY=your_api_key_here
FIREBASE_APP_ID_WEB=your_web_app_id_here
FIREBASE_MESSAGING_SENDER_ID=your_sender_id_here
FIREBASE_PROJECT_ID=your_project_id_here
FIREBASE_AUTH_DOMAIN=parkour.spot
FIREBASE_STORAGE_BUCKET=your_project_id.firebasestorage.app
FIREBASE_MEASUREMENT_ID=your_measurement_id_here- Run the App
./scripts/run_production.shThe autocomplete and geocoding features use a server-side Google Maps API key via Firebase Functions secrets. Make sure to set the secret in your Firebase project:
firebase functions:secrets:set GOOGLE_MAPS_API_KEYThis key should have at least the following APIs enabled:
- Places API
- Geocoding API
The Flutter client calls callable functions placesAutocomplete, placeDetails, geocodeCoordinates, and reverseGeocodeAddress, which proxy Google APIs securely using the backend key.
# Build for production
./scripts/build_production.sh# Deploy hosting
firebase deploy --only hosting
# Deploy functions
firebase deploy --only functions
# Deploy indexes
firebase deploy --only firestore:indexes# Development build
./scripts/build_development.shThe project includes seed data for Firebase emulators to help new developers get started quickly.
Available Scripts:
# Reset emulator data to seed data
./scripts/clear_emulator_data.sh
# Update seed data from current emulator data
./scripts/update_seed_data.sh
# Export emulator data manually (if needed)
./scripts/export_emulator_data.shHow It Works:
- Seed Data: Located in
scripts/seed-data/, this is committed to the repository and provides initial test data - Emulator Data: Located in
.firebase/emulator-data/(gitignored), this is your local development data - Auto-Initialization: When you run
./scripts/start_emulators.shfor the first time, seed data is automatically copied to emulator data - Auto-Export: When you stop emulators (Ctrl+C), your data is automatically exported to
.firebase/emulator-data/ - Reset: Use
./scripts/clear_emulator_data.shto reset your emulator data back to seed data - Update Seed: Use
./scripts/update_seed_data.shto update the seed data that new developers will receive
[Flutter App (Mobile/Web)]
βοΈ
[REST API (Cloud Functions)]
βοΈ
[Database (Firestore)]
βοΈ
[Cloud Storage (Firebase Storage)]
βοΈ
[Authentication (Firebase Auth)]
lib/
βββ main.dart # App entry point
βββ models/ # Data models
β βββ spot.dart # Parkour spot model
β βββ user.dart # User model
β βββ rating.dart # Rating model
βββ services/ # Business logic
β βββ auth_service.dart # Authentication
β βββ spot_service.dart # Spot management
β βββ share_service_*.dart # Platform-specific sharing
βββ screens/ # UI screens
β βββ auth/ # Login/signup
β βββ spots/ # Spot-related screens
β βββ profile/ # User profile
βββ widgets/ # Reusable components
βββ router/ # Navigation and routing
{
"name": "String",
"description": "String",
"location": "GeoPoint",
"imageUrls": "List<String>?",
"rating": "Double?",
"ratingCount": "Int?",
"tags": "List<String>?",
"createdBy": "String",
"createdAt": "Timestamp",
"updatedAt": "Timestamp"
}{
"id": "String",
"email": "String",
"displayName": "String?",
"photoURL": "String?",
"createdAt": "Timestamp",
"lastLoginAt": "Timestamp",
"favoriteSpots": "List<String>?"
}{
"id": "String",
"spotId": "String",
"userId": "String",
"rating": "Double",
"createdAt": "Timestamp?",
"updatedAt": "Timestamp?"
}- firebase_core: Firebase initialization
- firebase_auth: User authentication
- cloud_firestore: Database operations
- firebase_storage: Image storage
- cloud_functions: Backend functions
- provider: State management
- geolocator: Location services
- image_picker: Photo selection
- Ensure
.envfile exists with correct values - Run
flutterfire configureif Firebase options are missing - Check Firebase project permissions
flutter config --enable-web
flutter clean
flutter build web# Clean build
flutter clean
flutter pub get
# Check Flutter doctor
flutter doctor
# Update Flutter
flutter upgrade| Platform | Status | Notes |
|---|---|---|
| Web | β Ready | Firebase Hosting + PWA |
| Mobile Web | β Ready | Works on iOS Safari, Android Chrome |
| PWA | β Ready | Installable on mobile devices |
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly on all platforms
- Submit a pull request
- Follow Flutter Style Guide
- Use meaningful variable and function names
- Add comments for complex logic
- Keep functions small and focused
- Write unit tests for services
- Test UI components with widget tests
- Ensure all new features have tests
This project is licensed under the MIT License.
Built with β€οΈ using Flutter and Firebase