A cross-platform Flutter app for managing geolocated landmarks with a beautiful, theme-aware UI
LandmarkGO lets you create, view, edit, and delete geolocated landmarks with ease. Browse your collection on an interactive OpenStreetMap, manage entries from a sleek records list, and enjoy a polished experience with full light/dark theme support.
| Feature | Description |
|---|---|
| 🗺️ Interactive Map | OpenStreetMap integration with large, theme-colored markers |
| 🌗 Theme Toggle | Seamless light/dark mode across the entire app |
| 📍 GPS Autofill | Automatically populate coordinates when adding landmarks |
| 📷 Image Support | Attach photos with automatic JPEG compression |
| ✏️ Quick Actions | Swipe gestures and bottom sheets for fast editing |
- Bottom Navigation — Switch between
Overview,Records, andNew Entrytabs - Theme Toggle — Global light/dark theme with reactive color updates
- Responsive Design — Clean, intuitive interface across devices
- Interactive OpenStreetMap with
flutter_osm_plugin - Large, theme-colored markers for visibility
- Tap markers to reveal a bottom sheet with image preview, coordinates, and quick actions
- Smooth panning and zooming
- Swipeable list cards with Edit/Delete actions
- Image previews with loading and error states
- Inline quick-edit dialog for title and coordinates
- Delete confirmation to prevent accidents
- Add Mode: Pick an image, auto-resize to JPEG, multipart upload
- GPS Autofill: Automatically populates latitude/longitude
- Edit Mode: Update title and coordinates (image locked by design)
- Form validation for required fields
- Full CRUD operations via REST API
- Robust JSON parsing (handles strings/numbers flexibly)
- Graceful null handling for missing images
| Requirement | Version |
|---|---|
| Flutter SDK | 3.9.2+ |
| Dart | 3.0+ |
| Android Studio / Xcode | Latest |
| Internet Connection | Required for maps & API |
-
Clone the repository
git clone https://github.com/your-username/LandmarkGO.git cd LandmarkGO -
Install dependencies
flutter pub get
-
Run the app
flutter run
📱 Android
Permissions are pre-configured in android/app/src/main/AndroidManifest.xml:
android.permission.INTERNETandroid.permission.ACCESS_COARSE_LOCATIONandroid.permission.ACCESS_FINE_LOCATION
🍎 iOS
Location usage descriptions are set in ios/Runner/Info.plist:
NSLocationWhenInUseUsageDescriptionNSLocationAlwaysAndWhenInUseUsageDescription
lib/
├── main.dart # App entry point & navigation
├── includes/
│ ├── app_bar.dart # Custom app bar with theme toggle
│ ├── globals.dart # Theme definitions & global state
│ └── nav_bar.dart # Bottom navigation component
├── models/
│ └── landmark.dart # Landmark data model
├── pages/
│ ├── overview.dart # Map overview page
│ ├── records.dart # Records list page
│ └── new_entry.dart # Add/Edit entry form
└── services/
└── api_service.dart # REST API client
| Add Entry | Edit Entry |
|---|---|
![]() |
![]() |
| Create landmarks with GPS autofill | Update title & coordinates |
| Map View | Marker Details |
|---|---|
![]() |
![]() |
| Interactive OpenStreetMap | Bottom sheet with quick actions |
| Dark Mode | Light Mode |
|---|---|
![]() |
![]() |
| Easy on the eyes | Clean and bright |
| Issue | Description |
|---|---|
| 🖼️ Image Lock in Edit | By design, editing only updates title/coordinates — image remains unchanged |
| 📍 Marker Collision | Landmarks with nearly identical coordinates may overlap |
| 📊 No Pagination | All records are fetched at once; large datasets may affect performance |
| 🌐 Online Only | Map tiles and API require an active internet connection |
| 🔄 Refresh Delay | Map markers may occasionally require manual refresh after deletion |
- Framework: Flutter 3.9.2+
- Language: Dart
- Maps: flutter_osm_plugin
- HTTP Client: http
- Image Handling: image_picker, image
- Location: geolocator
This project is proprietary. All rights reserved.
Made with ❤️ and Flutter





