wanderer
Self-hosted trail database that makes your GPS data searchable
Alternative to: alltrails, komoot, strava
wanderer is a self-hosted trail catalogue for hikers, cyclists, and outdoor enthusiasts. Upload recorded GPX/TCX tracks or plan new routes, enrich them with metadata and photos, and organize everything into a searchable, filterable catalogue that can be shared with other people.
wanderer Docker Compose example
Self-host wanderer on your own server, homelab, or VPS starting from this Docker Compose example.
It runs wanderer in Docker containers using the official getmeili/meilisearch:latest, flomp/wanderer-db:latest, flomp/wanderer-web:latest images, with persistent volumes and automatic restarts preconfigured.
Review the environment variables and adjust them to your setup, save the file as compose.yml (or docker-compose.yml), and start the stack with docker compose up -d.
services:
search:
image: getmeili/meilisearch:latest
restart: unless-stopped
environment:
# Internal Meilisearch endpoint used by the other services.
MEILI_URL: "http://search:7700"
# Master key protecting the Meilisearch instance (Meilisearch is internal-only).
MEILI_MASTER_KEY: "changeme-meili-master-key-please-rotate"
# Disable Meilisearch usage analytics.
MEILI_NO_ANALYTICS: "true"
volumes:
- meili_data:/meili_data
healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:7700/health"]
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
db:
image: flomp/wanderer-db:latest
restart: unless-stopped
depends_on:
search:
condition: service_healthy
environment:
# Internal Meilisearch endpoint used to index trails.
MEILI_URL: "http://search:7700"
# Master key protecting the Meilisearch instance.
MEILI_MASTER_KEY: "changeme-meili-master-key-please-rotate"
# 32-character key PocketBase uses to encrypt stored settings at rest.
POCKETBASE_ENCRYPTION_KEY: "fde406459dc1f6ca6f348e1f44a9a2af"
# Public origin (scheme + host) where wanderer is served.
ORIGIN: "http://localhost:3000"
volumes:
- pb_data:/pb_data
- pb_plugins:/data/plugins
healthcheck:
test: ["CMD", "/curl", "--fail", "http://localhost:8090/health"]
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
web:
image: flomp/wanderer-web:latest
restart: unless-stopped
depends_on:
search:
condition: service_healthy
db:
condition: service_healthy
environment:
# Internal Meilisearch endpoint used for search queries.
MEILI_URL: "http://search:7700"
# Master key protecting the Meilisearch instance.
MEILI_MASTER_KEY: "changeme-meili-master-key-please-rotate"
# Public origin (scheme + host) where wanderer is served.
ORIGIN: "http://localhost:3000"
# Maximum request body size ("Infinity" disables the limit for large GPX/photo uploads).
BODY_SIZE_LIMIT: "Infinity"
# Browser-facing URL of the PocketBase backend (the "db" service, port 8090).
PUBLIC_POCKETBASE_URL: "http://localhost:8090"
# Set to "true" to disable public sign-up.
PUBLIC_DISABLE_SIGNUP: "false"
# In-container path for uploaded files.
UPLOAD_FOLDER: "/app/uploads"
# Basic-auth user protecting the internal upload endpoint (optional).
UPLOAD_USER: ""
# Basic-auth password protecting the internal upload endpoint (optional).
UPLOAD_PASSWORD: ""
# Overpass API endpoint used for point-of-interest lookups.
OVERPASS_API_URL: "https://overpass-api.de"
# Valhalla routing API endpoint used for route generation.
VALHALLA_URL: "https://valhalla1.openstreetmap.de"
# Nominatim geocoding API endpoint used for place search.
NOMINATIM_URL: "https://nominatim.openstreetmap.org"
# Maximum number of polylines drawn on a single map view.
PUBLIC_MAP_MAX_POLYLINES: "100"
volumes:
- uploads:/app/uploads
healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:3000/"]
interval: 15s
retries: 10
start_period: 20s
timeout: 10s
volumes:
meili_data:
pb_data:
pb_plugins:
uploads:
Values set to changeme are required — replace them with your own
values before starting wanderer.
Prefer a managed setup? WinterFlow installs, configures, and updates wanderer for you using this same Docker Compose configuration.