{
  "schema_version": 1,
  "generated_at": "2026-10-22T00:00:00.000Z",
  "canonical_url": "https://openlogs.fyi/tools/flagsmith",
  "slug": "flagsmith",
  "name": "Flagsmith",
  "tagline": "Feature flag and remote config service.",
  "replaces": {
    "summary": "Paid feature flag services, such as LaunchDarkly.",
    "products": [
      {
        "slug": "launchdarkly",
        "name": "LaunchDarkly",
        "vendor": "LaunchDarkly",
        "url": "https://openlogs.fyi/alternatives/launchdarkly"
      }
    ]
  },
  "stack": [
    {
      "kind": "language",
      "name": "Python"
    },
    {
      "kind": "database",
      "name": "PostgreSQL"
    },
    {
      "kind": "database",
      "name": "ClickHouse"
    }
  ],
  "deployment_methods": [
    "docker_compose"
  ],
  "requirements": {
    "min_ram_mb": null,
    "min_cpu_cores": null,
    "source_url": null
  },
  "license": {
    "spdx": "BSD-3-Clause",
    "class": "osi",
    "source_url": "https://github.com/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/LICENSE.md"
  },
  "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/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/README.md",
    "checked_at": "2026-10-22"
  },
  "difficulty": {
    "value": "hard",
    "reason": "10 services (5 database or broker: postgres, kafka, clickhouse-server), 2 volume mounts, no env values to set, no elevated host access. Heuristic score 6 of 11: hard."
  },
  "repository": {
    "owner": "Flagsmith",
    "name": "flagsmith",
    "url": "https://github.com/Flagsmith/flagsmith"
  },
  "compose_check": {
    "status": "config_ok",
    "validated_at": "2026-10-22",
    "summary": "config_ok on 2026-10-22"
  },
  "recipe": {
    "version": 1,
    "source_path": "docker-compose.yml",
    "source_repo": "Flagsmith/flagsmith",
    "source_commit_sha": "d031dbe740f99e723ecbd7d97b219cc72111606c",
    "source_kind": "app_repo",
    "source_url": "https://github.com/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/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/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 2,
      "kind": "compose",
      "language": "yaml",
      "label": "Save the compose file as docker-compose.yml",
      "body": "# See https://docs.flagsmith.com/deployment/docker for more information on running Flagsmith in Docker\n# This Docker Compose file will run the entire Flagsmith Platform\n\nx-flagsmith-env: &flagsmith-env\n  # All environments variables are available here:\n  # API: https://docs.flagsmith.com/deployment/locally-api#environment-variables\n  # UI: https://docs.flagsmith.com/deployment/locally-frontend#environment-variables\n\n  DATABASE_URL: postgresql://postgres:password@postgres:5432/flagsmith\n  USE_POSTGRES_FOR_ANALYTICS: 'true' # Store API and Flag Analytics data in Postgres\n  ENVIRONMENT: production # set to 'production' in production.\n  DJANGO_ALLOWED_HOSTS: '*' # Change this in production\n  FLAGSMITH_DOMAIN: localhost:8000 # Change this in production\n  DJANGO_SECRET_KEY: secret # Change this in production\n  WAREHOUSE_CREDENTIALS_SECRET: &warehouse-credentials-secret secret # Change this in production\n  # PREVENT_SIGNUP: 'true' # Uncomment to prevent any additional signups\n  # ALLOW_REGISTRATION_WITHOUT_INVITE: 'true' # Uncomment and set to false to only allow signups via invitations\n\n  # Enable Task Processor\n  TASK_RUN_METHOD: TASK_PROCESSOR # other options are: SYNCHRONOUSLY, SEPARATE_THREAD (default)\n  PROMETHEUS_ENABLED: 'true'\n\n  # Uncomment if you want to enable Google OAuth. Note this does not turn Google OAuth on. You still need to use\n  # Flagsmith on Flagsmith to enable it - https://docs.flagsmith.com/deployment/#oauth_google\n  # DJANGO_SECURE_CROSS_ORIGIN_OPENER_POLICY: 'same-origin-allow-popups'\n\n  # For more info on configuring E-Mails - https://docs.flagsmith.com/deployment/locally-api#environment-variables\n  # Example SMTP:\n  # EMAIL_BACKEND: django.core.mail.backends.smtp.EmailBackend\n  # EMAIL_HOST: mail.example.com\n  # SENDER_EMAIL: flagsmith@example.com\n  # EMAIL_HOST_USER: flagsmith@example.com\n  # EMAIL_HOST_PASSWORD: smtp_account_password\n  # EMAIL_PORT: 587 # optional\n  # EMAIL_USE_TLS: 'true' # optional\n\n  # To run without experimentation, use docker-compose.flags-only.yml instead.\n  EXPERIMENTATION_ENABLED: 'true'\n\nvolumes:\n  pgdata:\n  clickhouse-data:\n\nservices:\n  postgres:\n    image: postgres:15.5-alpine\n    environment:\n      POSTGRES_PASSWORD: password\n      POSTGRES_DB: flagsmith\n    container_name: flagsmith_postgres\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n    healthcheck:\n      test: ['CMD-SHELL', 'pg_isready -d flagsmith -U postgres']\n      interval: 2s\n      timeout: 2s\n      retries: 20\n      start_period: 20s\n\n  migrate-db:\n    image: docker.flagsmith.com/flagsmith/flagsmith:latest\n    command:\n      - migrate\n    environment:\n      <<: *flagsmith-env\n    healthcheck:\n      disable: true\n    depends_on:\n      postgres:\n        condition: service_healthy\n\n  flagsmith:\n    image: docker.flagsmith.com/flagsmith/flagsmith:latest\n    command:\n      - serve\n    environment:\n      <<: *flagsmith-env\n    ports:\n      - 8000:8000\n    depends_on:\n      migrate-db:\n        condition: service_completed_successfully\n\n  # The flagsmith_processor service is only needed if TASK_RUN_METHOD set to TASK_PROCESSOR\n  # in the application environment\n  flagsmith-task-processor:\n    image: docker.flagsmith.com/flagsmith/flagsmith:latest\n    environment:\n      <<: *flagsmith-env\n    ports:\n      - 8001:8000\n    depends_on:\n      migrate-db:\n        condition: service_completed_successfully\n    command: run-task-processor\n\n  # Experimentation services.\n  kafka:\n    image: apache/kafka:3.9.1\n    environment:\n      KAFKA_NODE_ID: 1\n      KAFKA_PROCESS_ROLES: broker,controller\n      KAFKA_LISTENERS: PLAINTEXT://:9092,CONTROLLER://:9093\n      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092\n      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER\n      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT\n      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafka:9093\n      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1\n      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1\n      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1\n      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0\n    healthcheck:\n      test: ['CMD-SHELL', '/opt/kafka/bin/kafka-broker-api-versions.sh --bootstrap-server localhost:9092']\n      interval: 5s\n      timeout: 10s\n      retries: 20\n\n  kafka-init:\n    image: apache/kafka:3.9.1\n    entrypoint: ['/bin/sh', '-c']\n    command:\n      - |\n        for topic in flagsmith_warehouse_events external_warehouse_events external_warehouse_events_retry; do\n          /opt/kafka/bin/kafka-topics.sh --bootstrap-server kafka:9092 --create --if-not-exists --topic $$topic\n        done\n    depends_on:\n      kafka:\n        condition: service_healthy\n\n  # Connect it from Environment Settings > Warehouse > ClickHouse: host `clickhouse`, port 8123,\n  # TLS off, database `flagsmith_exp`, username `flagsmith`, password `password`.\n  clickhouse:\n    image: clickhouse/clickhouse-server:25.12\n    environment:\n      CLICKHOUSE_USER: flagsmith\n      CLICKHOUSE_PASSWORD: password\n    ulimits:\n      nofile:\n        soft: 262144\n        hard: 262144\n    volumes:\n      - clickhouse-data:/var/lib/clickhouse\n    healthcheck:\n      test: ['CMD', 'wget', '--spider', '-q', 'http://localhost:8123/ping']\n      interval: 5s\n      timeout: 3s\n      retries: 20\n\n  # Creates the events table from experimentation/clickhouse/events.sql.\n  clickhouse-init:\n    image: clickhouse/clickhouse-server:25.12\n    entrypoint: ['/bin/sh', '-c']\n    command:\n      - |\n        set -e\n        wget -qO /tmp/events.sql https://raw.githubusercontent.com/Flagsmith/flagsmith/main/experimentation/clickhouse/events.sql\n        clickhouse-client --host clickhouse --user flagsmith --password password --multiquery < /tmp/events.sql\n    depends_on:\n      clickhouse:\n        condition: service_healthy\n\n  ingestion-server:\n    image: flagsmith/events-ingestion-api:latest\n    environment:\n      KAFKA_BOOTSTRAP_SERVERS: kafka:9092\n      KAFKA_AUTH: none\n      KAFKA_TOPIC: flagsmith_warehouse_events\n      KAFKA_EXTERNAL_TOPIC: external_warehouse_events\n      DATABASE_URL: postgres://postgres:password@postgres:5432/flagsmith\n    ports:\n      - 8080:8080\n    depends_on:\n      migrate-db:\n        condition: service_completed_successfully\n      kafka-init:\n        condition: service_completed_successfully\n\n  warehouse-delivery:\n    image: flagsmith/warehouse-delivery:latest\n    environment:\n      KAFKA_BOOTSTRAP_SERVERS: kafka:9092\n      KAFKA_AUTH: none\n      DATABASE_URL: postgresql://postgres:password@postgres:5432/flagsmith\n      WAREHOUSE_CREDENTIALS_SECRET: *warehouse-credentials-secret\n    depends_on:\n      migrate-db:\n        condition: service_completed_successfully\n      kafka-init:\n        condition: service_completed_successfully\n      clickhouse-init:\n        condition: service_completed_successfully\n",
      "source_url": "https://github.com/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/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/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/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/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/docker-compose.yml",
      "validation_status": "unvalidated"
    },
    {
      "order": 5,
      "kind": "verify",
      "language": "text",
      "label": "Open the app",
      "body": "Open http://localhost:8000. The compose file publishes host port 8000 for the flagsmith service.",
      "source_url": "https://github.com/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/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: migrate-db: docker.flagsmith.com/flagsmith/flagsmith:latest, flagsmith: docker.flagsmith.com/flagsmith/flagsmith:latest, flagsmith-task-processor: docker.flagsmith.com/flagsmith/flagsmith:latest, ingestion-server: flagsmith/events-ingestion-api:latest, warehouse-delivery: flagsmith/warehouse-delivery:latest. A later pull can get a different version.",
      "source_url": "https://github.com/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file has placeholder values",
      "body": "Placeholder values: POSTGRES_PASSWORD is \"password\" (postgres), DJANGO_SECRET_KEY is \"secret\" (migrate-db), WAREHOUSE_CREDENTIALS_SECRET is \"secret\" (migrate-db), DJANGO_SECRET_KEY is \"secret\" (flagsmith), WAREHOUSE_CREDENTIALS_SECRET is \"secret\" (flagsmith), DJANGO_SECRET_KEY is \"secret\" (flagsmith-task-processor), WAREHOUSE_CREDENTIALS_SECRET is \"secret\" (flagsmith-task-processor), CLICKHOUSE_PASSWORD is \"password\" (clickhouse) and 1 more.",
      "source_url": "https://github.com/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/docker-compose.yml",
      "checked_at": "2026-10-22"
    },
    {
      "kind": "gotcha",
      "title": "The compose file publishes host ports",
      "body": "Host ports: 8000 (flagsmith), 8001 (flagsmith-task-processor), 8080 (ingestion-server). A port without a host address listens on all host network interfaces.",
      "source_url": "https://github.com/Flagsmith/flagsmith/blob/d031dbe740f99e723ecbd7d97b219cc72111606c/docker-compose.yml",
      "checked_at": "2026-10-22"
    }
  ],
  "signals": {
    "captured_at": "2026-10-22",
    "stars": 6610,
    "forks": 591,
    "open_issues": 734,
    "last_push": "2026-10-22",
    "days_since_push": 0,
    "latest_release": "v2.287.0",
    "latest_release_date": "2026-10-20",
    "days_since_release": 1
  },
  "links": {
    "html": "https://openlogs.fyi/tools/flagsmith",
    "markdown": "https://openlogs.fyi/tools/flagsmith.md",
    "json": "https://openlogs.fyi/tools/flagsmith.json"
  },
  "updated_at": "2026-10-22"
}
