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 (calculated as the highest zoom level at which a single tile covers the selected area)
    • Lets user pick the max zoom, shows real tile/storage estimate.
    • Always includes world tiles for zoom 14 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)

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, SummerFall 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

Description
No description provided
Readme AGPL-3.0 7.8 MiB
Languages
Dart 99.2%
Shell 0.4%
Ruby 0.3%