wanderer logo

wanderer

Self-hosted trail database that makes your GPS data searchable

Alternative to: alltrails, komoot, strava

wanderer screenshot

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.