HOT Tasking Manager is composed of two independently developed components: a React frontend that provides the mapping interface and project management UI, and a FastAPI + PostgreSQL/PostGIS backend that exposes a versioned REST API. You can work on either component in isolation — the frontend can be pointed at the HOT staging API, and the backend can be exercised directly through its Swagger UI — or you can run the full stack locally using Docker Compose.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/hotosm/tasking-manager/llms.txt
Use this file to discover all available pages before exploring further.
OSM OAuth2 Setup
Tasking Manager delegates all user authentication to OpenStreetMap’s OAuth 2.0 system. Before configuring any environment, you need OAuth2 credentials from openstreetmap.org.- Log in to openstreetmap.org. If you do not have an account, create one at openstreetmap.org/user/new.
- Open the dropdown on the top-right of the navigation bar and select My Settings.
- Navigate to OAuth 2 applications and click Register new application.
- Configure the application:
- Redirect URI:
http://127.0.0.1:3000/authorized - Permissions:
read_prefs(Read user preferences) andwrite_api(Modify the map)
- Redirect URI:
- Save the form and note down your Client ID and Client Secret.
Configure the Environment File
The repository includes a fully-documentedexample.env that serves as the starting point for any deployment. Copy it to tasking-manager.env in the repository root:
tasking-manager.env and set the following variables at minimum. The full list of available variables is described in the operations configuration reference.
| Variable | Description | Example |
|---|---|---|
TM_APP_BASE_URL | Public URL of the frontend (used in email links and OAuth callbacks) | http://127.0.0.1:3000 |
TM_CLIENT_ID | OAuth2 Client ID from openstreetmap.org | abc123 |
TM_CLIENT_SECRET | OAuth2 Client Secret from openstreetmap.org | s3cr3t |
TM_REDIRECT_URI | Must match the URI registered on OSM | http://127.0.0.1:3000/authorized |
TM_SCOPE | OAuth2 permission scopes | read_prefs write_api |
TM_SECRET | Freely-defined secret shared between frontend and backend | any-long-random-string |
POSTGRES_DB | Database name | tasking-manager |
POSTGRES_USER | Database user | tm |
POSTGRES_PASSWORD | Database password | tm |
POSTGRES_ENDPOINT | Database host (use Docker service name or IP for standalone) | tm-db |
POSTGRES_PORT | Database port | 5432 |
Running the Stack
- Docker
- Standalone
Docker Compose is the recommended way to run the full Tasking Manager stack for development. It brings up the PostGIS database, runs database migrations, starts the FastAPI backend, the React frontend, cron jobs, and the Traefik reverse proxy — all wired together automatically.The
Requirements
Install Docker Engine (Docker Compose v2 is bundled).Start All Services
Bring up the full stack
tm-migration service runs Alembic migrations against the database before tm-backend starts. Docker Compose healthchecks ensure correct startup ordering.Open the application
The Tasking Manager frontend is available at:The backend API docs are served at:
(Optional) Change the default port
The default frontend port is
3000, routed through Traefik. To use a different port, pass TM_DEV_PORT before the compose command:(Optional) Override Docker Compose configuration
To add custom service configuration (resource limits, volume mounts for live frontend reload, etc.) without modifying the tracked Docker Compose automatically merges
docker-compose.yml, create an override file from the included sample:docker-compose.override.yml when present.(Optional) Use an external database
If you want to connect to an existing PostgreSQL/PostGIS server (self-hosted or cloud-managed) instead of the containerised Then recreate the containers:
tm-db service, update these variables in tasking-manager.env:If your database runs on your local machine (not inside Docker), use your machine’s LAN IP address rather than
localhost — the tm-backend container cannot reach the host via localhost.API Access
When the backend is running, the full API is accessible athttp://localhost:5000 (standalone) or proxied through Traefik at http://127.0.0.1:3000/api/ (Docker). The Swagger UI at /api/docs documents every endpoint, shows request/response schemas, and supports authenticated test calls.
To authenticate in Swagger UI:
- Log in via the browser frontend to create your user session.
- Open your profile settings, enable Expert Mode, and copy the API Key.
- In the Swagger UI, click Authorize and enter
Token <your-api-key>.
curl requests use the same format (adjust the host and port for your setup — port 3000 via Docker, port 5000 standalone):
Key Environment Variables Reference
Below is a summary of the most important variables. For the complete reference, see the operations configuration guide.| Variable | Required | Default | Description |
|---|---|---|---|
TM_APP_BASE_URL | Yes | http://127.0.0.1:3000 | Public URL of the frontend |
TM_CLIENT_ID | Yes | — | OSM OAuth2 Client ID |
TM_CLIENT_SECRET | Yes | — | OSM OAuth2 Client Secret |
TM_REDIRECT_URI | Yes | http://127.0.0.1:3000/authorized | OAuth2 redirect URI (must match OSM registration) |
TM_SCOPE | Yes | read_prefs write_api | OAuth2 permission scopes |
TM_SECRET | Yes | — | Shared secret between frontend and backend |
POSTGRES_DB | Yes | tasking-manager | PostgreSQL database name |
POSTGRES_USER | Yes | tm | PostgreSQL user |
POSTGRES_PASSWORD | Yes | tm | PostgreSQL password |
POSTGRES_ENDPOINT | Yes | tm-db | PostgreSQL host |
POSTGRES_PORT | Yes | 5432 | PostgreSQL port |
TM_APP_API_URL | No | http://127.0.0.1:3000/api | Backend API URL consumed by the frontend |
TM_DEV_PORT | No | 3000 | Traefik-exposed port for the frontend (Docker only) |
TM_ENABLE_SANDBOX | No | false | Enable the sandbox/practice mapping mode |
TM_DEFAULT_LOCALE | No | en | Default UI language |