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 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)
  • 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, 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.9 MiB
Languages
Dart 99.2%
Shell 0.4%
Ruby 0.3%