Flock Map App
A Flutter app for mapping and tagging ALPR-style cameras (and other surveillance nodes) for OpenStreetMap. Recently expanded with robust profile and upload management, and now with in-progress OFFLINE MAP AREA support.
User Experience
Map View
- View OSM map with online tiles and camera overlays.
- Main actions: "Tag Camera" to add a node; "Download" to save an offline map area (in progress).
Camera Tagging & Profiles
- Add cameras by dropping a pin, setting direction/angle, and selecting a camera profile.
- Manage camera profiles in Settings: create, edit, delete, and enable/disable for tagging.
Upload Destinations
- Select from Production OSM, OSM Sandbox, or Simulate (offline/test) in Settings.
- Upload queue visible in Settings, with clear/retry.
- Full OAuth flow for user authentication to OSM.
Offline Areas (IN PROGRESS)
- Download any map area for offline use! Uses OSM raster tile cache and Overpass-surveillance cameras.
- Each area download:
- Selects the current map region with a dynamic minimum zoom.
- Lets user pick the max zoom, shows real tile/storage estimate.
- Always includes world tiles for zoom 1–4 for seamless context.
- Downloads all camera points in area (not just top 250) for offline visibility.
- Status, progress, and detailed area management appear in Settings:
- Cancel, retry, and delete areas (in UI now)
- Storage/camera breakdown per area (coming soon)
- After area download: future updates will allow full offline map and camera viewing/queuing.
OAuth Setup
Before you can upload to OpenStreetMap (production or sandbox), you must register your own OAuth2 application on each OSM API you wish to support:
Copy your generated client IDs into a new file:
// lib/keys.dart
const String kOsmProdClientId = 'YOUR_PROD_CLIENT_ID_HERE';
const String kOsmSandboxClientId = 'YOUR_SANDBOX_CLIENT_ID_HERE';
For open source: use lib/keys.dart.example as a template and do not commit your real secrets.
If you discover a bug that causes bad behavior w/rt OSM API, register a new OAuth client to distinguish patched versions and, if needed, delete the old app to prevent misuse.
Upload Modes
In Settings, you can now choose your "Upload Destination":
- Production: Live OSM database (visible to all users).
- Sandbox: OSM's dedicated test database; safe for development/testing. More info.
- Simulate: Does not contact any server. Actions are fully offline for testing UI/flows.
Roadmap and Progress (Beta, Summer–Fall 2025)
COMPLETE
- Full queue management: view/cancel/retry/clear all uploads (incl. simulated/test modes)
- OAuth and upload destination management (choose prod, sandbox, offline/sim)
- Flexible profile system for cameras (full CRUD, enable/disable, per-camera tagging)
- Polished map experience: fixed FAB UX, dialogs, overlays
IN PROGRESS – OFFLINE MAP AREAS
- Dynamic min-zoom and tile/storage estimate in the Download dialog
- Settings: new section listing offline areas with progress, camera count, and management (delete/cancel)
- Tiles for world zooms 1-4 always included for context
- Backend downloads all camera points in area for full offline mapping (already working)
- Area downloads correctly resumed/cancelled (UI feedback working)
- NEXT:
- Persist area index/restores after restart
- Tile loading from disk (offline-viewable map)
- True offline/cached camera overlays
- Polished error/retry flow & final UX fit & finish
REMAINING/LATER
- Fancier camera tag/cone icons
- Satellite/North-up map options
- Settings polish, more informative error/credits flow
- Misc polish, final bugfixes
- Future: post-beta/offline wayfinding
Stuff for build env
Install from GUI:
Xcode, Android Studio. Xcode cmdline tools Android cmdline tools + NDK
Terminal
brew install openjdk@17 sudo ln -sfn /usr/local/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
brew install ruby
gem install cocoapods
sdkmanager --install "ndk;27.0.12077973"
export PATH="/Users/bob/.gem/ruby/3.4.0/bin:$PATH"
export PATH=$HOME/development/flutter/bin:$PATH
flutter clean flutter pub get flutter run