{
  "schema_version": 1,
  "generated_at": "2026-10-22T00:00:00.000Z",
  "canonical_url": "https://openlogs.fyi/tools/dawarich",
  "slug": "dawarich",
  "name": "Dawarich",
  "tagline": "Stores and maps your location history, as a self-hosted alternative to Google Timeline.",
  "replaces": {
    "summary": "Paid location history services, such as Google Timeline.",
    "products": [
      {
        "slug": "google-timeline",
        "name": "Google Timeline",
        "vendor": "Google",
        "url": "https://openlogs.fyi/alternatives/google-timeline"
      }
    ]
  },
  "stack": [
    {
      "kind": "language",
      "name": "Ruby"
    },
    {
      "kind": "database",
      "name": "Redis"
    }
  ],
  "deployment_methods": [
    "docker_compose"
  ],
  "requirements": {
    "min_ram_mb": null,
    "min_cpu_cores": null,
    "source_url": null
  },
  "license": {
    "spdx": "AGPL-3.0",
    "class": "osi",
    "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/LICENSE"
  },
  "business_model": {
    "value": "unknown",
    "notes": "The README at the pinned commit does not state a business model, so it stays unknown.",
    "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/README.md",
    "checked_at": "2026-10-22"
  },
  "difficulty": {
    "value": "medium",
    "reason": "4 services (1 database or broker: redis), 7 volume mounts, no env values to set, no elevated host access. Heuristic score 5 of 11: medium."
  },
  "repository": {
    "owner": "Freika",
    "name": "dawarich",
    "url": "https://github.com/Freika/dawarich"
  },
  "compose_check": {
    "status": "config_ok",
    "validated_at": "2026-10-22",
    "summary": "config_ok on 2026-10-22"
  },
  "recipe": {
    "version": 1,
    "source_path": "docker/docker-compose.yml",
    "source_repo": "Freika/dawarich",
    "source_commit_sha": "2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957",
    "source_kind": "app_repo",
    "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml"
  },
  "install_steps": [
    {
      "order": 1,
      "kind": "prerequisite",
      "language": "text",
      "label": "Docker with the Compose plugin",
      "body": "A host with Docker and the Docker Compose plugin. This entry runs from a compose file.",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 2,
      "kind": "compose",
      "language": "yaml",
      "label": "Save the compose file as docker-compose.yml",
      "body": "# full list of environment variables with descriptions can be found in the documentation:\n# https://dawarich.app/docs/self-hosting/environment-variables/\n\nnetworks:\n  dawarich:\n\nservices:\n  dawarich_redis:\n    image: redis:7.4-alpine\n    container_name: dawarich_redis\n    command: >\n      redis-server\n      --save 900 1\n      --save 300 10\n      --appendonly no\n    networks:\n      - dawarich\n    volumes:\n      - dawarich_shared:/data\n    restart: always\n    healthcheck:\n      test: [ \"CMD\", \"redis-cli\", \"--raw\", \"incr\", \"ping\" ]\n      interval: 10s\n      retries: 5\n      start_period: 30s\n      timeout: 10s\n\n  dawarich_db:\n    image: postgis/postgis:17-3.5-alpine\n    # image: imresamu/postgis:17-3.5-alpine # If you're on ARM architecture, use this image instead\n    shm_size: 1G\n    container_name: dawarich_db\n    volumes:\n      - dawarich_db_data:/var/lib/postgresql/data\n      - dawarich_shared:/var/shared\n    networks:\n      - dawarich\n    environment:\n      POSTGRES_USER: ${POSTGRES_USER:-postgres}\n      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-password}\n      POSTGRES_DB: ${POSTGRES_DB:-dawarich_development}\n    restart: always\n    healthcheck:\n      test: [ \"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER:-postgres} -d ${POSTGRES_DB:-dawarich_development}\" ]\n      interval: 10s\n      retries: 5\n      start_period: 30s\n      timeout: 10s\n    # command: postgres -c config_file=/etc/postgresql/postgresql.conf # Use custom config, uncomment if you want to use a custom config\n\n  dawarich_app:\n    image: freikin/dawarich:latest\n    container_name: dawarich_app\n    volumes:\n      - dawarich_public:/var/app/public\n      - dawarich_watched:/var/app/tmp/imports/watched\n      - dawarich_storage:/var/app/storage\n      - dawarich_db_data:/dawarich_db_data\n    networks:\n      - dawarich\n    ports:\n      - \"${DAWARICH_APP_PORT:-3000}:3000\"\n    stdin_open: true\n    tty: true\n    entrypoint: web-entrypoint.sh\n    command: ['bin/rails', 'server', '-p', '3000', '-b', '::']\n    restart: unless-stopped\n    environment:\n      RAILS_ENV: ${RAILS_ENV:-production}\n      ### To run under a non-root user, set PUID/PGID here (do NOT use `user:`).\n      # PUID: ${PUID:-1000}\n      # PGID: ${PGID:-1000}\n      REDIS_URL: ${REDIS_URL:-redis://dawarich_redis:6379}\n      DATABASE_HOST: ${DATABASE_HOST:-dawarich_db}\n      DATABASE_PORT: ${DATABASE_PORT:-5432}\n      DATABASE_USERNAME: ${DATABASE_USERNAME:-postgres}\n      DATABASE_PASSWORD: ${DATABASE_PASSWORD:-password}\n      DATABASE_NAME: ${DATABASE_NAME:-dawarich_development}\n      APPLICATION_HOSTS: ${APPLICATION_HOSTS:-localhost,::1,127.0.0.1}\n      TIME_ZONE: ${TIME_ZONE:-Europe/London}\n      APPLICATION_PROTOCOL: ${APPLICATION_PROTOCOL:-http}\n      PROMETHEUS_EXPORTER_ENABLED: ${PROMETHEUS_EXPORTER_ENABLED:-false}\n      SECRET_KEY_BASE: ${SECRET_KEY_BASE:-\"CHANGE_ME\"}\n      RAILS_LOG_TO_STDOUT: ${RAILS_LOG_TO_STDOUT:-true}\n      SELF_HOSTED: ${SELF_HOSTED:-true}\n      STORE_GEODATA: ${STORE_GEODATA:-true}\n      # One preloaded Puma worker is plenty for a household instance and\n      # halves idle memory. Raise for busier instances.\n      WEB_CONCURRENCY: ${WEB_CONCURRENCY:-1}\n      ### OTP encryption keys are required if you want to use 2FA\n      # OTP_ENCRYPTION_PRIMARY_KEY: ${OTP_ENCRYPTION_PRIMARY_KEY:-}\n      # OTP_ENCRYPTION_DETERMINISTIC_KEY: ${OTP_ENCRYPTION_DETERMINISTIC_KEY:-}\n      # OTP_ENCRYPTION_KEY_DERIVATION_SALT: ${OTP_ENCRYPTION_KEY_DERIVATION_SALT:-}\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: ${LOG_MAX_SIZE:-100m}\n        max-file: ${LOG_MAX_FILE:-5}\n    healthcheck:\n      test: [ \"CMD-SHELL\", \"wget -qO - http://127.0.0.1:3000/api/v1/health | grep -q '\\\"status\\\"\\\\s*:\\\\s*\\\"ok\\\"'\" ]\n      interval: 10s\n      retries: 30\n      start_period: 30s\n      timeout: 10s\n    depends_on:\n      dawarich_db:\n        condition: service_healthy\n        restart: true\n      dawarich_redis:\n        condition: service_healthy\n        restart: true\n    deploy:\n      resources:\n        limits:\n          cpus: ${APP_CPU_LIMIT:-0.50}\n          memory: ${APP_MEMORY_LIMIT:-4G}\n\n  dawarich_sidekiq:\n    image: freikin/dawarich:latest\n    container_name: dawarich_sidekiq\n    volumes:\n      - dawarich_public:/var/app/public\n      - dawarich_watched:/var/app/tmp/imports/watched\n      - dawarich_storage:/var/app/storage\n    networks:\n      - dawarich\n    stdin_open: true\n    tty: true\n    entrypoint: sidekiq-entrypoint.sh\n    command: ['sidekiq']\n    restart: unless-stopped\n    environment:\n      RAILS_ENV: ${RAILS_ENV:-production}\n      ### To run under a non-root user, set PUID/PGID here (do NOT use `user:`).\n      # PUID: ${PUID:-1000}\n      # PGID: ${PGID:-1000}\n      REDIS_URL: ${REDIS_URL:-redis://dawarich_redis:6379}\n      DATABASE_HOST: ${DATABASE_HOST:-dawarich_db}\n      DATABASE_PORT: ${DATABASE_PORT:-5432}\n      DATABASE_USERNAME: ${DATABASE_USERNAME:-postgres}\n      DATABASE_PASSWORD: ${DATABASE_PASSWORD:-password}\n      DATABASE_NAME: ${DATABASE_NAME:-dawarich_development}\n      APPLICATION_HOSTS: ${APPLICATION_HOSTS:-localhost,::1,127.0.0.1}\n      # 3 job threads keep idle memory and DB connections low; raise\n      # temporarily for large imports.\n      BACKGROUND_PROCESSING_CONCURRENCY: ${BACKGROUND_PROCESSING_CONCURRENCY:-3}\n      APPLICATION_PROTOCOL: ${APPLICATION_PROTOCOL:-http}\n      PROMETHEUS_EXPORTER_ENABLED: ${PROMETHEUS_EXPORTER_ENABLED:-false}\n      SECRET_KEY_BASE: ${SECRET_KEY_BASE:-\"CHANGE_ME\"}\n      RAILS_LOG_TO_STDOUT: ${RAILS_LOG_TO_STDOUT:-true}\n      SELF_HOSTED: ${SELF_HOSTED:-true}\n      STORE_GEODATA: ${STORE_GEODATA:-true}\n      ### OTP encryption keys are required if you want to use 2FA\n      # OTP_ENCRYPTION_PRIMARY_KEY: ${OTP_ENCRYPTION_PRIMARY_KEY:-}\n      # OTP_ENCRYPTION_DETERMINISTIC_KEY: ${OTP_ENCRYPTION_DETERMINISTIC_KEY:-}\n      # OTP_ENCRYPTION_KEY_DERIVATION_SALT: ${OTP_ENCRYPTION_KEY_DERIVATION_SALT:-}\n    logging:\n      driver: \"json-file\"\n      options:\n        max-size: ${LOG_MAX_SIZE:-100m}\n        max-file: ${LOG_MAX_FILE:-5}\n    healthcheck:\n      test: [ \"CMD-SHELL\", \"pgrep -f sidekiq\" ]\n      interval: 10s\n      retries: 30\n      start_period: 30s\n      timeout: 10s\n    depends_on:\n      dawarich_db:\n        condition: service_healthy\n        restart: true\n      dawarich_redis:\n        condition: service_healthy\n        restart: true\n      dawarich_app:\n        condition: service_healthy\n        restart: true\n\nvolumes:\n  dawarich_db_data:\n  dawarich_shared:\n  dawarich_public:\n  dawarich_watched:\n  dawarich_storage:\n",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "validation_status": "config_ok"
    },
    {
      "order": 3,
      "kind": "env",
      "language": "text",
      "label": "Set the values the compose file needs",
      "body": "Replace the placeholder values listed under Gotchas.",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 4,
      "kind": "shell",
      "language": "bash",
      "label": "Start it",
      "body": "docker compose up -d",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 5,
      "kind": "verify",
      "language": "text",
      "label": "Open the app",
      "body": "Open http://localhost:3000. The compose file publishes host port 3000 for the dawarich_app service.",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "validation_status": "unvalidated"
    }
  ],
  "notes": [
    {
      "kind": "gotcha",
      "title": "Some images use the latest tag or no tag",
      "body": "Images without a pinned version: dawarich_app: freikin/dawarich:latest, dawarich_sidekiq: freikin/dawarich:latest. A later pull can get a different version.",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file has placeholder values",
      "body": "Placeholder values: POSTGRES_PASSWORD is \"password\" (dawarich_db), DATABASE_PASSWORD is \"password\" (dawarich_app), SECRET_KEY_BASE is \"\"CHANGE_ME\"\" (dawarich_app), DATABASE_PASSWORD is \"password\" (dawarich_sidekiq), SECRET_KEY_BASE is \"\"CHANGE_ME\"\" (dawarich_sidekiq).",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file publishes host ports",
      "body": "Host ports: 3000 (dawarich_app). A port without a host address listens on all host network interfaces.",
      "source_url": "https://github.com/Freika/dawarich/blob/2dc26c40dff1f2e4b6c7e22d78ab5a271c0e8957/docker/docker-compose.yml",
      "checked_at": "2026-10-22"
    }
  ],
  "signals": {
    "captured_at": "2026-10-22",
    "stars": 10709,
    "forks": 405,
    "open_issues": 198,
    "last_push": "2026-10-21",
    "days_since_push": 0,
    "latest_release": "1.16.0",
    "latest_release_date": "2026-10-17",
    "days_since_release": 4
  },
  "links": {
    "html": "https://openlogs.fyi/tools/dawarich",
    "markdown": "https://openlogs.fyi/tools/dawarich.md",
    "json": "https://openlogs.fyi/tools/dawarich.json"
  },
  "updated_at": "2026-10-22"
}
