{
  "manifest_version": "1.0.0",
  "template": {
    "id": "389e9618-42d2-4e0e-9462-bd9a6ba85bf7",
    "slug": "grovs-community",
    "name": "Grovs Community",
    "description": "Self-host deep links, mobile attribution, referrals and analytics.",
    "url": "https://railway.com/deploy/grovs-community",
    "upstream": {
      "image": "ghcr.io/grovs-io/dashboard:2.3.1"
    }
  },
  "status": "unvalidated",
  "validated_at": null,
  "success_rate_30d": null,
  "services": [
    {
      "name": "dashboard",
      "source": {
        "image": "ghcr.io/grovs-io/dashboard:2.3.1"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "redis",
      "source": {
        "image": "redis:7-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "worker-1",
      "source": {
        "image": "ghcr.io/grovs-io/backend:2.3.1"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "web",
      "source": {
        "image": "ghcr.io/grovs-io/backend:2.3.1"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "postgres",
      "source": {
        "image": "postgres:16-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "clickhouse",
      "source": {
        "image": "clickhouse/clickhouse-server:25.3"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/clickhouse",
      "http": false
    },
    {
      "name": "worker-2",
      "source": {
        "image": "ghcr.io/grovs-io/backend:2.3.1"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "PORT",
      "service": "dashboard",
      "description": "HTTP listening port. Keep at 3000 to match Railway networking.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "API_URL",
      "service": "dashboard",
      "description": "Public API URL on your custom domain.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "HOSTNAME",
      "service": "dashboard",
      "description": "Listen on IPv6 and IPv4 for Railway's private network.",
      "secret": false,
      "strategy": "default",
      "default": "::"
    },
    {
      "key": "OAUTH_CLIENT_UID",
      "service": "dashboard",
      "description": "Shared reference to web.OAUTH_CLIENT_UID; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "OAUTH_CLIENT_SECRET",
      "service": "dashboard",
      "description": "Shared reference to web.OAUTH_CLIENT_SECRET; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "redis",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "worker-1",
      "description": "Shared reference to web.PORT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GROVS_EE",
      "service": "worker-1",
      "description": "Shared reference to web.GROVS_EE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WEB_HOST",
      "service": "worker-1",
      "description": "Shared reference to web.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WEB_PORT",
      "service": "worker-1",
      "description": "Private API health-check port for worker startup.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "RAILS_ENV",
      "service": "worker-1",
      "description": "Shared reference to web.RAILS_ENV; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PORT",
      "service": "worker-1",
      "description": "Shared reference to web.SMTP_PORT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "worker-1",
      "description": "Shared reference to web.REDIS_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DOMAIN_LIVE",
      "service": "worker-1",
      "description": "Shared reference to web.DOMAIN_LIVE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DOMAIN_TEST",
      "service": "worker-1",
      "description": "Shared reference to web.DOMAIN_TEST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MAILER_FROM",
      "service": "worker-1",
      "description": "Shared reference to web.MAILER_FROM; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "worker-1",
      "description": "Shared reference to web.POSTGRES_DB; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "worker-1",
      "description": "Shared reference to web.S3_ENDPOINT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_HOST",
      "service": "worker-1",
      "description": "Shared reference to web.SERVER_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_DOMAIN",
      "service": "worker-1",
      "description": "Shared reference to web.SMTP_DOMAIN; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_ADDRESS",
      "service": "worker-1",
      "description": "Shared reference to web.SMTP_ADDRESS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ADMIN_API_KEY",
      "service": "worker-1",
      "description": "Shared reference to web.ADMIN_API_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_BUCKET",
      "service": "worker-1",
      "description": "Shared reference to web.AWS_S3_BUCKET; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_KEY_ID",
      "service": "worker-1",
      "description": "Shared reference to web.AWS_S3_KEY_ID; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_REGION",
      "service": "worker-1",
      "description": "Shared reference to web.AWS_S3_REGION; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "worker-1",
      "description": "Shared reference to web.POSTGRES_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_USER",
      "service": "worker-1",
      "description": "Shared reference to web.POSTGRES_USER; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_DB_POOL",
      "service": "worker-1",
      "description": "Shared reference to web.RAILS_DB_POOL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PASSWORD",
      "service": "worker-1",
      "description": "Shared reference to web.SMTP_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_USERNAME",
      "service": "worker-1",
      "description": "Shared reference to web.SMTP_USERNAME; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "worker-1",
      "description": "Shared reference to web.REDIS_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_HOST",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY_BASE",
      "service": "worker-1",
      "description": "Shared reference to web.SECRET_KEY_BASE; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WEB_CONCURRENCY",
      "service": "worker-1",
      "description": "Shared reference to web.WEB_CONCURRENCY; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_LOGO_URL",
      "service": "worker-1",
      "description": "Shared reference to web.DEFAULT_LOGO_URL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "OAUTH_CLIENT_UID",
      "service": "worker-1",
      "description": "Shared reference to web.OAUTH_CLIENT_UID; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PG_SHADOW_WRITES",
      "service": "worker-1",
      "description": "Shared reference to web.PG_SHADOW_WRITES; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_ACCESS_KEY",
      "service": "worker-1",
      "description": "Shared reference to web.AWS_S3_ACCESS_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GROVS_SELF_HOSTED",
      "service": "worker-1",
      "description": "Shared reference to web.GROVS_SELF_HOSTED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "worker-1",
      "description": "Shared reference to web.POSTGRES_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_MAX_THREADS",
      "service": "worker-1",
      "description": "Shared reference to web.RAILS_MAX_THREADS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_PRIMARY",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_PRIMARY; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_LINK_TITLE",
      "service": "worker-1",
      "description": "Shared reference to web.DEFAULT_LINK_TITLE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_DATABASE",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_DATABASE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIAGNOSTICS_API_KEY",
      "service": "worker-1",
      "description": "Shared reference to web.DIAGNOSTICS_API_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "OAUTH_CLIENT_SECRET",
      "service": "worker-1",
      "description": "Shared reference to web.OAUTH_CLIENT_SECRET; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_LOG_TO_STDOUT",
      "service": "worker-1",
      "description": "Shared reference to web.RAILS_LOG_TO_STDOUT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REACT_HOST_PROTOCOL",
      "service": "worker-1",
      "description": "Shared reference to web.REACT_HOST_PROTOCOL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_FORCE_PATH_STYLE",
      "service": "worker-1",
      "description": "Shared reference to web.S3_FORCE_PATH_STYLE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_AUTHENTICATION",
      "service": "worker-1",
      "description": "Shared reference to web.SMTP_AUTHENTICATION; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_HOST_PROTOCOL",
      "service": "worker-1",
      "description": "Shared reference to web.SERVER_HOST_PROTOCOL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BOOTSTRAP_ADMIN_EMAIL",
      "service": "worker-1",
      "description": "Shared reference to web.BOOTSTRAP_ADMIN_EMAIL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_LINK_SUBTITLE",
      "service": "worker-1",
      "description": "Shared reference to web.DEFAULT_LINK_SUBTITLE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_STORAGE_SERVICE",
      "service": "worker-1",
      "description": "Shared reference to web.ACTIVE_STORAGE_SERVICE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MAILER_DELIVERY_METHOD",
      "service": "worker-1",
      "description": "Shared reference to web.MAILER_DELIVERY_METHOD; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_READ_ENABLED",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SENT_QUOTAS_WEBHOOK_KEY",
      "service": "worker-1",
      "description": "Shared reference to web.SENT_QUOTAS_WEBHOOK_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BOOTSTRAP_ADMIN_PASSWORD",
      "service": "worker-1",
      "description": "Shared reference to web.BOOTSTRAP_ADMIN_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_WRITE_ENABLED",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_WRITE_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_MAX_CONNECTIONS",
      "service": "worker-1",
      "description": "Shared reference to web.POSTGRES_MAX_CONNECTIONS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_SERVE_STATIC_FILES",
      "service": "worker-1",
      "description": "Shared reference to web.RAILS_SERVE_STATIC_FILES; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REVENUE_READS_FROM_LEDGER",
      "service": "worker-1",
      "description": "Shared reference to web.REVENUE_READS_FROM_LEDGER; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_ENABLE_STARTTLS_AUTO",
      "service": "worker-1",
      "description": "Shared reference to web.SMTP_ENABLE_STARTTLS_AUTO; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_SOCIAL_PREVIEW_URL",
      "service": "worker-1",
      "description": "Shared reference to web.DEFAULT_SOCIAL_PREVIEW_URL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SIDEKIQ_EVENTS_CONCURRENCY",
      "service": "worker-1",
      "description": "Shared reference to web.SIDEKIQ_EVENTS_CONCURRENCY; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_ROLLUP_FAST_LANE",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_ROLLUP_FAST_LANE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DASHBOARD_CACHE_TTL_SECONDS",
      "service": "worker-1",
      "description": "Shared reference to web.DASHBOARD_CACHE_TTL_SECONDS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PUBLIC_GO_PROJECT_IDENTIFIER",
      "service": "worker-1",
      "description": "Shared reference to web.PUBLIC_GO_PROJECT_IDENTIFIER; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_ATTRIBUTION_READ_ENABLED",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_ATTRIBUTION_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY",
      "service": "worker-1",
      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED",
      "service": "worker-1",
      "description": "Shared reference to web.CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY",
      "service": "worker-1",
      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT",
      "service": "worker-1",
      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PORT",
      "service": "web",
      "description": "HTTP listening port. Keep at 3000 to match Railway networking.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "GROVS_EE",
      "service": "web",
      "description": "Keep false for the Community edition.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "RAILS_ENV",
      "service": "web",
      "description": "Run Rails in production mode.",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "SMTP_PORT",
      "service": "web",
      "description": "SMTP server port.",
      "secret": false,
      "strategy": "default",
      "default": "587"
    },
    {
      "key": "REDIS_HOST",
      "service": "web",
      "description": "Shared reference to redis.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "DOMAIN_LIVE",
      "service": "web",
      "description": "Production links base domain, for example links.example.com.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "DOMAIN_TEST",
      "service": "web",
      "description": "Test links base domain, for example test.links.example.com.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "MAILER_FROM",
      "service": "web",
      "description": "Sender address used for outgoing Grovs emails.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "web",
      "description": "Grovs PostgreSQL database name.",
      "secret": false,
      "strategy": "default",
      "default": "grovs_production"
    },
    {
      "key": "SERVER_HOST",
      "service": "web",
      "description": "App base domain, for example grovs.example.com; no https:// or path.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "SMTP_DOMAIN",
      "service": "web",
      "description": "Shared reference to web.SERVER_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_ADDRESS",
      "service": "web",
      "description": "SMTP server hostname; only used when email is enabled.",
      "secret": false,
      "strategy": "default",
      "default": "smtp.example.com"
    },
    {
      "key": "ADMIN_API_KEY",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "AWS_S3_BUCKET",
      "service": "web",
      "description": "Private bucket name shared by API and workers.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "AWS_S3_KEY_ID",
      "service": "web",
      "description": "Access key for your private S3-compatible bucket.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "AWS_S3_REGION",
      "service": "web",
      "description": "Bucket region, for example eu-north-1.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "web",
      "description": "Shared reference to postgres.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "POSTGRES_USER",
      "service": "web",
      "description": "Grovs PostgreSQL database user.",
      "secret": false,
      "strategy": "default",
      "default": "grovs"
    },
    {
      "key": "RAILS_DB_POOL",
      "service": "web",
      "description": "Database connections available per process.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "web",
      "description": "Shared reference to redis.REDIS_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_HOST",
      "service": "web",
      "description": "Shared reference to clickhouse.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "SECRET_KEY_BASE",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "WEB_CONCURRENCY",
      "service": "web",
      "description": "Number of Puma web processes.",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "DEFAULT_LOGO_URL",
      "service": "web",
      "description": "Default app icon on link landing pages.",
      "secret": false,
      "strategy": "default",
      "default": "https://appssemble-assets.s3.eu-north-1.amazonaws.com/linksquared/logo-square-new.svg"
    },
    {
      "key": "OAUTH_CLIENT_UID",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PG_SHADOW_WRITES",
      "service": "web",
      "description": "Mirror event writes to PostgreSQL; disabled for ClickHouse-primary storage.",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "AWS_S3_ACCESS_KEY",
      "service": "web",
      "description": "Secret access key for your private bucket.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "GROVS_SELF_HOSTED",
      "service": "web",
      "description": "Enable self-hosted configuration and bootstrap login.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "web",
      "description": "Shared reference to postgres.POSTGRES_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_MAX_THREADS",
      "service": "web",
      "description": "Maximum threads per web process.",
      "secret": false,
      "strategy": "default",
      "default": "5"
    },
    {
      "key": "CLICKHOUSE_PRIMARY",
      "service": "web",
      "description": "Use ClickHouse as the primary event store.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "DEFAULT_LINK_TITLE",
      "service": "web",
      "description": "Default link landing-page title.",
      "secret": false,
      "strategy": "default",
      "default": "grovs"
    },
    {
      "key": "CLICKHOUSE_DATABASE",
      "service": "web",
      "description": "Analytics database used by the application.",
      "secret": false,
      "strategy": "default",
      "default": "grovs_production"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "web",
      "description": "Shared reference to clickhouse.CLICKHOUSE_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIAGNOSTICS_API_KEY",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "OAUTH_CLIENT_SECRET",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "RAILS_LOG_TO_STDOUT",
      "service": "web",
      "description": "Send Rails logs to Railway's log viewer.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "REACT_HOST_PROTOCOL",
      "service": "web",
      "description": "Public dashboard URL protocol.",
      "secret": false,
      "strategy": "default",
      "default": "https://"
    },
    {
      "key": "SMTP_AUTHENTICATION",
      "service": "web",
      "description": "SMTP authentication mechanism.",
      "secret": false,
      "strategy": "default",
      "default": "plain"
    },
    {
      "key": "SERVER_HOST_PROTOCOL",
      "service": "web",
      "description": "Public backend URL protocol.",
      "secret": false,
      "strategy": "default",
      "default": "https://"
    },
    {
      "key": "BOOTSTRAP_ADMIN_EMAIL",
      "service": "web",
      "description": "Email address for the first administrator.",
      "secret": false,
      "strategy": "ask_user"
    },
    {
      "key": "DEFAULT_LINK_SUBTITLE",
      "service": "web",
      "description": "Default link landing-page description.",
      "secret": false,
      "strategy": "default",
      "default": "Dynamic links, attributions, and referrals across mobile and web platforms."
    },
    {
      "key": "ACTIVE_STORAGE_SERVICE",
      "service": "web",
      "description": "Use S3 storage shared by the API and workers.",
      "secret": false,
      "strategy": "default",
      "default": "amazon"
    },
    {
      "key": "CLICKHOUSE_READ_ENABLED",
      "service": "web",
      "description": "Read analytics events from ClickHouse.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "SENT_QUOTAS_WEBHOOK_KEY",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "BOOTSTRAP_ADMIN_PASSWORD",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "CLICKHOUSE_WRITE_ENABLED",
      "service": "web",
      "description": "Write analytics events to ClickHouse.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "POSTGRES_MAX_CONNECTIONS",
      "service": "web",
      "description": "Connection budget setting from the Compose defaults; Railway PostgreSQL tuning is separate.",
      "secret": false,
      "strategy": "default",
      "default": "200"
    },
    {
      "key": "RAILS_SERVE_STATIC_FILES",
      "service": "web",
      "description": "Serve the backend's bundled static assets.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "REVENUE_READS_FROM_LEDGER",
      "service": "web",
      "description": "Read purchase revenue from the event ledger.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "SMTP_ENABLE_STARTTLS_AUTO",
      "service": "web",
      "description": "Use STARTTLS when supported by the SMTP server.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "DEFAULT_SOCIAL_PREVIEW_URL",
      "service": "web",
      "description": "Default image for shared links.",
      "secret": false,
      "strategy": "default",
      "default": "https://appssemble-assets.s3.eu-north-1.amazonaws.com/linksquared/social-media-placeholder.jpg"
    },
    {
      "key": "SIDEKIQ_EVENTS_CONCURRENCY",
      "service": "web",
      "description": "Concurrent jobs in the event worker.",
      "secret": false,
      "strategy": "default",
      "default": "10"
    },
    {
      "key": "CLICKHOUSE_ROLLUP_FAST_LANE",
      "service": "web",
      "description": "Enable the fast path for analytics rollups.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "DASHBOARD_CACHE_TTL_SECONDS",
      "service": "web",
      "description": "Dashboard result cache lifetime in seconds.",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "PUBLIC_GO_PROJECT_IDENTIFIER",
      "service": "web",
      "description": "Identifier for the built-in public redirect project.",
      "secret": false,
      "strategy": "default",
      "default": "go-self-hosted"
    },
    {
      "key": "CLICKHOUSE_ATTRIBUTION_READ_ENABLED",
      "service": "web",
      "description": "Read attribution data from ClickHouse.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED",
      "service": "web",
      "description": "Read link dimensions from ClickHouse.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED",
      "service": "web",
      "description": "Read pre-aggregated ClickHouse analytics.",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT",
      "service": "web",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PGDATA",
      "service": "postgres",
      "description": "PostgreSQL data directory inside the persistent volume.",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "postgres",
      "description": "Grovs PostgreSQL database name.",
      "secret": false,
      "strategy": "default",
      "default": "grovs_production"
    },
    {
      "key": "POSTGRES_USER",
      "service": "postgres",
      "description": "Grovs PostgreSQL database user.",
      "secret": false,
      "strategy": "default",
      "default": "grovs"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "postgres",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "CLICKHOUSE_DB",
      "service": "clickhouse",
      "description": "Grovs ClickHouse database name.",
      "secret": false,
      "strategy": "default",
      "default": "grovs_production"
    },
    {
      "key": "CLICKHOUSE_USER",
      "service": "clickhouse",
      "description": "Grovs ClickHouse database user.",
      "secret": false,
      "strategy": "default",
      "default": "grovs"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "clickhouse",
      "description": "Generated uniquely for this deployment.",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "worker-2",
      "description": "Shared reference to web.PORT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GROVS_EE",
      "service": "worker-2",
      "description": "Shared reference to web.GROVS_EE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WEB_HOST",
      "service": "worker-2",
      "description": "Shared reference to web.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "WEB_PORT",
      "service": "worker-2",
      "description": "Private API health-check port for worker startup.",
      "secret": false,
      "strategy": "default",
      "default": "3000"
    },
    {
      "key": "RAILS_ENV",
      "service": "worker-2",
      "description": "Shared reference to web.RAILS_ENV; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PORT",
      "service": "worker-2",
      "description": "Shared reference to web.SMTP_PORT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_HOST",
      "service": "worker-2",
      "description": "Shared reference to web.REDIS_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DOMAIN_LIVE",
      "service": "worker-2",
      "description": "Shared reference to web.DOMAIN_LIVE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DOMAIN_TEST",
      "service": "worker-2",
      "description": "Shared reference to web.DOMAIN_TEST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MAILER_FROM",
      "service": "worker-2",
      "description": "Shared reference to web.MAILER_FROM; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_DB",
      "service": "worker-2",
      "description": "Shared reference to web.POSTGRES_DB; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_ENDPOINT",
      "service": "worker-2",
      "description": "Shared reference to web.S3_ENDPOINT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_HOST",
      "service": "worker-2",
      "description": "Shared reference to web.SERVER_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_DOMAIN",
      "service": "worker-2",
      "description": "Shared reference to web.SMTP_DOMAIN; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_ADDRESS",
      "service": "worker-2",
      "description": "Shared reference to web.SMTP_ADDRESS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ADMIN_API_KEY",
      "service": "worker-2",
      "description": "Shared reference to web.ADMIN_API_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_BUCKET",
      "service": "worker-2",
      "description": "Shared reference to web.AWS_S3_BUCKET; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_KEY_ID",
      "service": "worker-2",
      "description": "Shared reference to web.AWS_S3_KEY_ID; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_REGION",
      "service": "worker-2",
      "description": "Shared reference to web.AWS_S3_REGION; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_HOST",
      "service": "worker-2",
      "description": "Shared reference to web.POSTGRES_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_USER",
      "service": "worker-2",
      "description": "Shared reference to web.POSTGRES_USER; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_DB_POOL",
      "service": "worker-2",
      "description": "Shared reference to web.RAILS_DB_POOL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_PASSWORD",
      "service": "worker-2",
      "description": "Shared reference to web.SMTP_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_USERNAME",
      "service": "worker-2",
      "description": "Shared reference to web.SMTP_USERNAME; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REDIS_PASSWORD",
      "service": "worker-2",
      "description": "Shared reference to web.REDIS_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_HOST",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_HOST; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SECRET_KEY_BASE",
      "service": "worker-2",
      "description": "Shared reference to web.SECRET_KEY_BASE; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "WEB_CONCURRENCY",
      "service": "worker-2",
      "description": "Shared reference to web.WEB_CONCURRENCY; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_LOGO_URL",
      "service": "worker-2",
      "description": "Shared reference to web.DEFAULT_LOGO_URL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "OAUTH_CLIENT_UID",
      "service": "worker-2",
      "description": "Shared reference to web.OAUTH_CLIENT_UID; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PG_SHADOW_WRITES",
      "service": "worker-2",
      "description": "Shared reference to web.PG_SHADOW_WRITES; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "AWS_S3_ACCESS_KEY",
      "service": "worker-2",
      "description": "Shared reference to web.AWS_S3_ACCESS_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "GROVS_SELF_HOSTED",
      "service": "worker-2",
      "description": "Shared reference to web.GROVS_SELF_HOSTED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "worker-2",
      "description": "Shared reference to web.POSTGRES_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_MAX_THREADS",
      "service": "worker-2",
      "description": "Shared reference to web.RAILS_MAX_THREADS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_PRIMARY",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_PRIMARY; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_LINK_TITLE",
      "service": "worker-2",
      "description": "Shared reference to web.DEFAULT_LINK_TITLE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_DATABASE",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_DATABASE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_PASSWORD",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DIAGNOSTICS_API_KEY",
      "service": "worker-2",
      "description": "Shared reference to web.DIAGNOSTICS_API_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "OAUTH_CLIENT_SECRET",
      "service": "worker-2",
      "description": "Shared reference to web.OAUTH_CLIENT_SECRET; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_LOG_TO_STDOUT",
      "service": "worker-2",
      "description": "Shared reference to web.RAILS_LOG_TO_STDOUT; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REACT_HOST_PROTOCOL",
      "service": "worker-2",
      "description": "Shared reference to web.REACT_HOST_PROTOCOL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "S3_FORCE_PATH_STYLE",
      "service": "worker-2",
      "description": "Shared reference to web.S3_FORCE_PATH_STYLE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_AUTHENTICATION",
      "service": "worker-2",
      "description": "Shared reference to web.SMTP_AUTHENTICATION; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SERVER_HOST_PROTOCOL",
      "service": "worker-2",
      "description": "Shared reference to web.SERVER_HOST_PROTOCOL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BOOTSTRAP_ADMIN_EMAIL",
      "service": "worker-2",
      "description": "Shared reference to web.BOOTSTRAP_ADMIN_EMAIL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_LINK_SUBTITLE",
      "service": "worker-2",
      "description": "Shared reference to web.DEFAULT_LINK_SUBTITLE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_STORAGE_SERVICE",
      "service": "worker-2",
      "description": "Shared reference to web.ACTIVE_STORAGE_SERVICE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "MAILER_DELIVERY_METHOD",
      "service": "worker-2",
      "description": "Shared reference to web.MAILER_DELIVERY_METHOD; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_READ_ENABLED",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SENT_QUOTAS_WEBHOOK_KEY",
      "service": "worker-2",
      "description": "Shared reference to web.SENT_QUOTAS_WEBHOOK_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "BOOTSTRAP_ADMIN_PASSWORD",
      "service": "worker-2",
      "description": "Shared reference to web.BOOTSTRAP_ADMIN_PASSWORD; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_WRITE_ENABLED",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_WRITE_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "POSTGRES_MAX_CONNECTIONS",
      "service": "worker-2",
      "description": "Shared reference to web.POSTGRES_MAX_CONNECTIONS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "RAILS_SERVE_STATIC_FILES",
      "service": "worker-2",
      "description": "Shared reference to web.RAILS_SERVE_STATIC_FILES; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "REVENUE_READS_FROM_LEDGER",
      "service": "worker-2",
      "description": "Shared reference to web.REVENUE_READS_FROM_LEDGER; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SMTP_ENABLE_STARTTLS_AUTO",
      "service": "worker-2",
      "description": "Shared reference to web.SMTP_ENABLE_STARTTLS_AUTO; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DEFAULT_SOCIAL_PREVIEW_URL",
      "service": "worker-2",
      "description": "Shared reference to web.DEFAULT_SOCIAL_PREVIEW_URL; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SIDEKIQ_EVENTS_CONCURRENCY",
      "service": "worker-2",
      "description": "Shared reference to web.SIDEKIQ_EVENTS_CONCURRENCY; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_ROLLUP_FAST_LANE",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_ROLLUP_FAST_LANE; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "DASHBOARD_CACHE_TTL_SECONDS",
      "service": "worker-2",
      "description": "Shared reference to web.DASHBOARD_CACHE_TTL_SECONDS; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "PUBLIC_GO_PROJECT_IDENTIFIER",
      "service": "worker-2",
      "description": "Shared reference to web.PUBLIC_GO_PROJECT_IDENTIFIER; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_ATTRIBUTION_READ_ENABLED",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_ATTRIBUTION_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY",
      "service": "worker-2",
      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED",
      "service": "worker-2",
      "description": "Shared reference to web.CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED; keep in sync with its source.",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY",
      "service": "worker-2",
      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT",
      "service": "worker-2",
      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT; keep in sync with its source.",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "grovs-community"
      }
    },
    "cli": "railway deploy --template grovs-community",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "389e9618-42d2-4e0e-9462-bd9a6ba85bf7",
            "serializedConfig": {
              "services": {
                "2e956cba-2525-59bd-8abf-df50838569b6": {
                  "icon": "https://docs.grovs.io/logo.svg",
                  "name": "dashboard",
                  "deploy": {
                    "numReplicas": 1,
                    "healthcheckPath": "/login",
                    "sleepApplication": false,
                    "restartPolicyType": "ALWAYS",
                    "healthcheckTimeout": 600
                  },
                  "source": {
                    "image": "ghcr.io/grovs-io/dashboard:2.3.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "HTTP listening port. Keep at 3000 to match Railway networking.",
                      "defaultValue": "3000"
                    },
                    "API_URL": {
                      "isOptional": false,
                      "description": "Public API URL on your custom domain.",
                      "defaultValue": "https://api.${{web.SERVER_HOST}}"
                    },
                    "HOSTNAME": {
                      "isOptional": false,
                      "description": "Listen on IPv6 and IPv4 for Railway's private network.",
                      "defaultValue": "::"
                    },
                    "OAUTH_CLIENT_UID": {
                      "isOptional": false,
                      "description": "Shared reference to web.OAUTH_CLIENT_UID; keep in sync with its source.",
                      "defaultValue": "${{web.OAUTH_CLIENT_UID}}"
                    },
                    "OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Shared reference to web.OAUTH_CLIENT_SECRET; keep in sync with its source.",
                      "defaultValue": "${{web.OAUTH_CLIENT_SECRET}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3000": {}
                    }
                  }
                },
                "3de14aa7-03d1-561b-966c-bb02f6c6a95d": {
                  "icon": "https://devicons.railway.app/i/redis.svg",
                  "name": "redis",
                  "deploy": {
                    "numReplicas": 1,
                    "startCommand": "sh -ec 'exec redis-server --appendonly yes --maxmemory-policy noeviction --requirepass \"$REDIS_PASSWORD\"'",
                    "sleepApplication": false,
                    "requiredMountPath": "/data",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "redis:7-alpine"
                  },
                  "variables": {
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{REDIS_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "3de14aa7-03d1-561b-966c-bb02f6c6a95d": {
                      "mountPath": "/data"
                    }
                  }
                },
                "5b77f60b-d3d1-540c-bc1d-cac30c0fe17b": {
                  "icon": "https://docs.grovs.io/logo.svg",
                  "name": "worker-1",
                  "deploy": {
                    "numReplicas": 1,
                    "startCommand": "bash -ec '#!/usr/bin/env bash\n# Sourced into the commands embedded in Railway/Render configuration.\n# No files from this repository need to be present in the application image.\nset -eu\n: \"${SERVER_HOST:?Set your app domain}\"\n: \"${DOMAIN_LIVE:?Set your production links domain}\"\n: \"${DOMAIN_TEST:?Set your test links domain}\"\n: \"${AWS_S3_KEY_ID:?Set object storage credentials}\"\n: \"${AWS_S3_ACCESS_KEY:?Set object storage credentials}\"\n: \"${AWS_S3_REGION:?Set your bucket region}\"\n: \"${AWS_S3_BUCKET:?Set your bucket name}\"\nexport ACTIVE_STORAGE_SERVICE=amazon\nexport SERVER_HOST_PROTOCOL=https:// REACT_HOST_PROTOCOL=https://\nexport REACT_HOST=\"dashboard.$SERVER_HOST\"\nexport API_HOST=\"api.$SERVER_HOST\" SDK_HOST=\"sdk.$SERVER_HOST\"\nexport DASHBOARD_HOST=\"$REACT_HOST\" MCP_HOST=\"mcp.$SERVER_HOST\" GO_HOST=\"go.$SERVER_HOST\"\nexport PREVIEW_HOST=\"preview.$SERVER_HOST\"\nexport LINKS_PROD_HOST=\"links.$DOMAIN_LIVE\" LINKS_TEST_HOST=\"links.$DOMAIN_TEST\"\nexport PREVIEW_BASE_URL=\"https://preview.$SERVER_HOST\"\nexport MCP_CONSENT_URL=\"https://dashboard.$SERVER_HOST/mcp/authorize\"\nexport S3_ASSET_PREFIX=\"https://api.$SERVER_HOST\"\nencode_password() {\n  ruby -ruri -e '\"'\"'print URI.encode_www_form_component(ENV.fetch(ARGV.fetch(0))).gsub(\"+\", \"%20\")'\"'\"' \"$1\"\n}\nif [ -z \"${DATABASE_URL:-}\" ]; then\n  : \"${POSTGRES_HOST:?Set the private PostgreSQL host}\"\n  DATABASE_URL=\"postgres://grovs:$(encode_password POSTGRES_PASSWORD)@$POSTGRES_HOST:5432/grovs_production\"\n  export DATABASE_URL\nfi\nif [ -z \"${REDIS_URL:-}\" ]; then\n  : \"${REDIS_HOST:?Set the private Redis host}\"\n  REDIS_URL=\"redis://:$(encode_password REDIS_PASSWORD)@$REDIS_HOST:6379/0\"\n  export REDIS_URL\nfi\nif [ -z \"${CLICKHOUSE_URL:-}\" ]; then\n  : \"${CLICKHOUSE_HOST:?Set the private ClickHouse host}\"\n  : \"${CLICKHOUSE_PASSWORD:?Set the ClickHouse password}\"\n  ENCODED_PASSWORD=$(encode_password CLICKHOUSE_PASSWORD)\n  export CLICKHOUSE_URL=\"http://grovs:$ENCODED_PASSWORD@$CLICKHOUSE_HOST:8123\"\nfi\n\nwait_for_http() {\n  local attempt\n  for ((attempt=0; attempt<120; attempt++)); do\n    if curl --fail --silent --max-time 5 \"$1\" >/dev/null; then return 0; fi\n    sleep 5\n  done\n  echo \"Dependency did not become healthy within the startup window.\" >&2\n  return 1\n}\n\nwait_for_http \"http://$WEB_HOST:${WEB_PORT:-3000}/up\"\npids=()\ntrap '\"'\"'kill \"${pids[@]}\" 2>/dev/null || true'\"'\"' EXIT\ntrap '\"'\"'exit 143'\"'\"' TERM INT\nbundle exec sidekiq -C config/sidekiq_scheduler.yml &\npids+=($!)\nbundle exec sidekiq -C config/sidekiq_worker.yml &\npids+=($!)\nbundle exec sidekiq -C config/sidekiq_batch.yml &\npids+=($!)\nwait -n\n'",
                    "sleepApplication": false,
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/grovs-io/backend:2.3.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Shared reference to web.PORT; keep in sync with its source.",
                      "defaultValue": "${{web.PORT}}"
                    },
                    "GROVS_EE": {
                      "isOptional": false,
                      "description": "Shared reference to web.GROVS_EE; keep in sync with its source.",
                      "defaultValue": "${{web.GROVS_EE}}"
                    },
                    "WEB_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
                      "defaultValue": "${{web.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "WEB_PORT": {
                      "isOptional": false,
                      "description": "Private API health-check port for worker startup.",
                      "defaultValue": "3000"
                    },
                    "RAILS_ENV": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_ENV; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_ENV}}"
                    },
                    "SMTP_PORT": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_PORT; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_PORT}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.REDIS_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.REDIS_HOST}}"
                    },
                    "DOMAIN_LIVE": {
                      "isOptional": false,
                      "description": "Shared reference to web.DOMAIN_LIVE; keep in sync with its source.",
                      "defaultValue": "${{web.DOMAIN_LIVE}}"
                    },
                    "DOMAIN_TEST": {
                      "isOptional": false,
                      "description": "Shared reference to web.DOMAIN_TEST; keep in sync with its source.",
                      "defaultValue": "${{web.DOMAIN_TEST}}"
                    },
                    "MAILER_FROM": {
                      "isOptional": false,
                      "description": "Shared reference to web.MAILER_FROM; keep in sync with its source.",
                      "defaultValue": "${{web.MAILER_FROM}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_DB; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_DB}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "Shared reference to web.S3_ENDPOINT; keep in sync with its source.",
                      "defaultValue": "${{web.S3_ENDPOINT}}"
                    },
                    "SERVER_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.SERVER_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.SERVER_HOST}}"
                    },
                    "SMTP_DOMAIN": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_DOMAIN; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_DOMAIN}}"
                    },
                    "SMTP_ADDRESS": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_ADDRESS; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_ADDRESS}}"
                    },
                    "ADMIN_API_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.ADMIN_API_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.ADMIN_API_KEY}}"
                    },
                    "AWS_S3_BUCKET": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_BUCKET; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_BUCKET}}"
                    },
                    "AWS_S3_KEY_ID": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_KEY_ID; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_KEY_ID}}"
                    },
                    "AWS_S3_REGION": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_REGION; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_REGION}}"
                    },
                    "POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_HOST}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_USER; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_USER}}"
                    },
                    "RAILS_DB_POOL": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_DB_POOL; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_DB_POOL}}"
                    },
                    "SMTP_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_PASSWORD}}"
                    },
                    "SMTP_USERNAME": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_USERNAME; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_USERNAME}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.REDIS_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.REDIS_PASSWORD}}"
                    },
                    "CLICKHOUSE_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_HOST}}"
                    },
                    "SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Shared reference to web.SECRET_KEY_BASE; keep in sync with its source.",
                      "defaultValue": "${{web.SECRET_KEY_BASE}}"
                    },
                    "WEB_CONCURRENCY": {
                      "isOptional": false,
                      "description": "Shared reference to web.WEB_CONCURRENCY; keep in sync with its source.",
                      "defaultValue": "${{web.WEB_CONCURRENCY}}"
                    },
                    "DEFAULT_LOGO_URL": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_LOGO_URL; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_LOGO_URL}}"
                    },
                    "OAUTH_CLIENT_UID": {
                      "isOptional": false,
                      "description": "Shared reference to web.OAUTH_CLIENT_UID; keep in sync with its source.",
                      "defaultValue": "${{web.OAUTH_CLIENT_UID}}"
                    },
                    "PG_SHADOW_WRITES": {
                      "isOptional": false,
                      "description": "Shared reference to web.PG_SHADOW_WRITES; keep in sync with its source.",
                      "defaultValue": "${{web.PG_SHADOW_WRITES}}"
                    },
                    "AWS_S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_ACCESS_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_ACCESS_KEY}}"
                    },
                    "GROVS_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Shared reference to web.GROVS_SELF_HOSTED; keep in sync with its source.",
                      "defaultValue": "${{web.GROVS_SELF_HOSTED}}"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_PASSWORD}}"
                    },
                    "RAILS_MAX_THREADS": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_MAX_THREADS; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_MAX_THREADS}}"
                    },
                    "CLICKHOUSE_PRIMARY": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_PRIMARY; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_PRIMARY}}"
                    },
                    "DEFAULT_LINK_TITLE": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_LINK_TITLE; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_LINK_TITLE}}"
                    },
                    "CLICKHOUSE_DATABASE": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_DATABASE; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_DATABASE}}"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_PASSWORD}}"
                    },
                    "DIAGNOSTICS_API_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.DIAGNOSTICS_API_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.DIAGNOSTICS_API_KEY}}"
                    },
                    "OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Shared reference to web.OAUTH_CLIENT_SECRET; keep in sync with its source.",
                      "defaultValue": "${{web.OAUTH_CLIENT_SECRET}}"
                    },
                    "RAILS_LOG_TO_STDOUT": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_LOG_TO_STDOUT; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_LOG_TO_STDOUT}}"
                    },
                    "REACT_HOST_PROTOCOL": {
                      "isOptional": false,
                      "description": "Shared reference to web.REACT_HOST_PROTOCOL; keep in sync with its source.",
                      "defaultValue": "${{web.REACT_HOST_PROTOCOL}}"
                    },
                    "S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Shared reference to web.S3_FORCE_PATH_STYLE; keep in sync with its source.",
                      "defaultValue": "${{web.S3_FORCE_PATH_STYLE}}"
                    },
                    "SMTP_AUTHENTICATION": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_AUTHENTICATION; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_AUTHENTICATION}}"
                    },
                    "SERVER_HOST_PROTOCOL": {
                      "isOptional": false,
                      "description": "Shared reference to web.SERVER_HOST_PROTOCOL; keep in sync with its source.",
                      "defaultValue": "${{web.SERVER_HOST_PROTOCOL}}"
                    },
                    "BOOTSTRAP_ADMIN_EMAIL": {
                      "isOptional": false,
                      "description": "Shared reference to web.BOOTSTRAP_ADMIN_EMAIL; keep in sync with its source.",
                      "defaultValue": "${{web.BOOTSTRAP_ADMIN_EMAIL}}"
                    },
                    "DEFAULT_LINK_SUBTITLE": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_LINK_SUBTITLE; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_LINK_SUBTITLE}}"
                    },
                    "ACTIVE_STORAGE_SERVICE": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_STORAGE_SERVICE; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_STORAGE_SERVICE}}"
                    },
                    "MAILER_DELIVERY_METHOD": {
                      "isOptional": false,
                      "description": "Shared reference to web.MAILER_DELIVERY_METHOD; keep in sync with its source.",
                      "defaultValue": "${{web.MAILER_DELIVERY_METHOD}}"
                    },
                    "CLICKHOUSE_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_READ_ENABLED}}"
                    },
                    "SENT_QUOTAS_WEBHOOK_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.SENT_QUOTAS_WEBHOOK_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.SENT_QUOTAS_WEBHOOK_KEY}}"
                    },
                    "BOOTSTRAP_ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.BOOTSTRAP_ADMIN_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.BOOTSTRAP_ADMIN_PASSWORD}}"
                    },
                    "CLICKHOUSE_WRITE_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_WRITE_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_WRITE_ENABLED}}"
                    },
                    "POSTGRES_MAX_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_MAX_CONNECTIONS; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_MAX_CONNECTIONS}}"
                    },
                    "RAILS_SERVE_STATIC_FILES": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_SERVE_STATIC_FILES; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_SERVE_STATIC_FILES}}"
                    },
                    "REVENUE_READS_FROM_LEDGER": {
                      "isOptional": false,
                      "description": "Shared reference to web.REVENUE_READS_FROM_LEDGER; keep in sync with its source.",
                      "defaultValue": "${{web.REVENUE_READS_FROM_LEDGER}}"
                    },
                    "SMTP_ENABLE_STARTTLS_AUTO": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_ENABLE_STARTTLS_AUTO; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_ENABLE_STARTTLS_AUTO}}"
                    },
                    "DEFAULT_SOCIAL_PREVIEW_URL": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_SOCIAL_PREVIEW_URL; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_SOCIAL_PREVIEW_URL}}"
                    },
                    "SIDEKIQ_EVENTS_CONCURRENCY": {
                      "isOptional": false,
                      "description": "Shared reference to web.SIDEKIQ_EVENTS_CONCURRENCY; keep in sync with its source.",
                      "defaultValue": "${{web.SIDEKIQ_EVENTS_CONCURRENCY}}"
                    },
                    "CLICKHOUSE_ROLLUP_FAST_LANE": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_ROLLUP_FAST_LANE; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_ROLLUP_FAST_LANE}}"
                    },
                    "DASHBOARD_CACHE_TTL_SECONDS": {
                      "isOptional": false,
                      "description": "Shared reference to web.DASHBOARD_CACHE_TTL_SECONDS; keep in sync with its source.",
                      "defaultValue": "${{web.DASHBOARD_CACHE_TTL_SECONDS}}"
                    },
                    "PUBLIC_GO_PROJECT_IDENTIFIER": {
                      "isOptional": false,
                      "description": "Shared reference to web.PUBLIC_GO_PROJECT_IDENTIFIER; keep in sync with its source.",
                      "defaultValue": "${{web.PUBLIC_GO_PROJECT_IDENTIFIER}}"
                    },
                    "CLICKHOUSE_ATTRIBUTION_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_ATTRIBUTION_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_ATTRIBUTION_READ_ENABLED}}"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY}}"
                    },
                    "CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED}}"
                    },
                    "CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED}}"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY}}"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT}}"
                    }
                  }
                },
                "5e75d272-527a-5d61-9831-db220e7a793f": {
                  "icon": "https://docs.grovs.io/logo.svg",
                  "name": "web",
                  "deploy": {
                    "numReplicas": 1,
                    "startCommand": "bash -ec '#!/usr/bin/env bash\n# Sourced into the commands embedded in Railway/Render configuration.\n# No files from this repository need to be present in the application image.\nset -eu\n: \"${SERVER_HOST:?Set your app domain}\"\n: \"${DOMAIN_LIVE:?Set your production links domain}\"\n: \"${DOMAIN_TEST:?Set your test links domain}\"\n: \"${AWS_S3_KEY_ID:?Set object storage credentials}\"\n: \"${AWS_S3_ACCESS_KEY:?Set object storage credentials}\"\n: \"${AWS_S3_REGION:?Set your bucket region}\"\n: \"${AWS_S3_BUCKET:?Set your bucket name}\"\nexport ACTIVE_STORAGE_SERVICE=amazon\nexport SERVER_HOST_PROTOCOL=https:// REACT_HOST_PROTOCOL=https://\nexport REACT_HOST=\"dashboard.$SERVER_HOST\"\nexport API_HOST=\"api.$SERVER_HOST\" SDK_HOST=\"sdk.$SERVER_HOST\"\nexport DASHBOARD_HOST=\"$REACT_HOST\" MCP_HOST=\"mcp.$SERVER_HOST\" GO_HOST=\"go.$SERVER_HOST\"\nexport PREVIEW_HOST=\"preview.$SERVER_HOST\"\nexport LINKS_PROD_HOST=\"links.$DOMAIN_LIVE\" LINKS_TEST_HOST=\"links.$DOMAIN_TEST\"\nexport PREVIEW_BASE_URL=\"https://preview.$SERVER_HOST\"\nexport MCP_CONSENT_URL=\"https://dashboard.$SERVER_HOST/mcp/authorize\"\nexport S3_ASSET_PREFIX=\"https://api.$SERVER_HOST\"\nencode_password() {\n  ruby -ruri -e '\"'\"'print URI.encode_www_form_component(ENV.fetch(ARGV.fetch(0))).gsub(\"+\", \"%20\")'\"'\"' \"$1\"\n}\nif [ -z \"${DATABASE_URL:-}\" ]; then\n  : \"${POSTGRES_HOST:?Set the private PostgreSQL host}\"\n  DATABASE_URL=\"postgres://grovs:$(encode_password POSTGRES_PASSWORD)@$POSTGRES_HOST:5432/grovs_production\"\n  export DATABASE_URL\nfi\nif [ -z \"${REDIS_URL:-}\" ]; then\n  : \"${REDIS_HOST:?Set the private Redis host}\"\n  REDIS_URL=\"redis://:$(encode_password REDIS_PASSWORD)@$REDIS_HOST:6379/0\"\n  export REDIS_URL\nfi\nif [ -z \"${CLICKHOUSE_URL:-}\" ]; then\n  : \"${CLICKHOUSE_HOST:?Set the private ClickHouse host}\"\n  : \"${CLICKHOUSE_PASSWORD:?Set the ClickHouse password}\"\n  ENCODED_PASSWORD=$(encode_password CLICKHOUSE_PASSWORD)\n  export CLICKHOUSE_URL=\"http://grovs:$ENCODED_PASSWORD@$CLICKHOUSE_HOST:8123\"\nfi\n\nwait_for_http() {\n  local attempt\n  for ((attempt=0; attempt<120; attempt++)); do\n    if curl --fail --silent --max-time 5 \"$1\" >/dev/null; then return 0; fi\n    sleep 5\n  done\n  echo \"Dependency did not become healthy within the startup window.\" >&2\n  return 1\n}\n\nexec bundle exec puma -b \"tcp://[::]:${PORT:-3000}\"'",
                    "healthcheckPath": "/up",
                    "preDeployCommand": [
                      "bash -ec '#!/usr/bin/env bash\n# Sourced into the commands embedded in Railway/Render configuration.\n# No files from this repository need to be present in the application image.\nset -eu\n: \"${SERVER_HOST:?Set your app domain}\"\n: \"${DOMAIN_LIVE:?Set your production links domain}\"\n: \"${DOMAIN_TEST:?Set your test links domain}\"\n: \"${AWS_S3_KEY_ID:?Set object storage credentials}\"\n: \"${AWS_S3_ACCESS_KEY:?Set object storage credentials}\"\n: \"${AWS_S3_REGION:?Set your bucket region}\"\n: \"${AWS_S3_BUCKET:?Set your bucket name}\"\nexport ACTIVE_STORAGE_SERVICE=amazon\nexport SERVER_HOST_PROTOCOL=https:// REACT_HOST_PROTOCOL=https://\nexport REACT_HOST=\"dashboard.$SERVER_HOST\"\nexport API_HOST=\"api.$SERVER_HOST\" SDK_HOST=\"sdk.$SERVER_HOST\"\nexport DASHBOARD_HOST=\"$REACT_HOST\" MCP_HOST=\"mcp.$SERVER_HOST\" GO_HOST=\"go.$SERVER_HOST\"\nexport PREVIEW_HOST=\"preview.$SERVER_HOST\"\nexport LINKS_PROD_HOST=\"links.$DOMAIN_LIVE\" LINKS_TEST_HOST=\"links.$DOMAIN_TEST\"\nexport PREVIEW_BASE_URL=\"https://preview.$SERVER_HOST\"\nexport MCP_CONSENT_URL=\"https://dashboard.$SERVER_HOST/mcp/authorize\"\nexport S3_ASSET_PREFIX=\"https://api.$SERVER_HOST\"\nencode_password() {\n  ruby -ruri -e '\"'\"'print URI.encode_www_form_component(ENV.fetch(ARGV.fetch(0))).gsub(\"+\", \"%20\")'\"'\"' \"$1\"\n}\nif [ -z \"${DATABASE_URL:-}\" ]; then\n  : \"${POSTGRES_HOST:?Set the private PostgreSQL host}\"\n  DATABASE_URL=\"postgres://grovs:$(encode_password POSTGRES_PASSWORD)@$POSTGRES_HOST:5432/grovs_production\"\n  export DATABASE_URL\nfi\nif [ -z \"${REDIS_URL:-}\" ]; then\n  : \"${REDIS_HOST:?Set the private Redis host}\"\n  REDIS_URL=\"redis://:$(encode_password REDIS_PASSWORD)@$REDIS_HOST:6379/0\"\n  export REDIS_URL\nfi\nif [ -z \"${CLICKHOUSE_URL:-}\" ]; then\n  : \"${CLICKHOUSE_HOST:?Set the private ClickHouse host}\"\n  : \"${CLICKHOUSE_PASSWORD:?Set the ClickHouse password}\"\n  ENCODED_PASSWORD=$(encode_password CLICKHOUSE_PASSWORD)\n  export CLICKHOUSE_URL=\"http://grovs:$ENCODED_PASSWORD@$CLICKHOUSE_HOST:8123\"\nfi\n\nwait_for_http() {\n  local attempt\n  for ((attempt=0; attempt<120; attempt++)); do\n    if curl --fail --silent --max-time 5 \"$1\" >/dev/null; then return 0; fi\n    sleep 5\n  done\n  echo \"Dependency did not become healthy within the startup window.\" >&2\n  return 1\n}\n\nwait_for_http \"http://$CLICKHOUSE_HOST:8123/ping\"\nbin/rails db:prepare && bin/rails db:seed && bin/rails clickhouse:setup'"
                    ],
                    "sleepApplication": false,
                    "restartPolicyType": "ALWAYS",
                    "healthcheckTimeout": 600
                  },
                  "source": {
                    "image": "ghcr.io/grovs-io/backend:2.3.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "HTTP listening port. Keep at 3000 to match Railway networking.",
                      "defaultValue": "3000"
                    },
                    "GROVS_EE": {
                      "isOptional": false,
                      "description": "Keep false for the Community edition.",
                      "defaultValue": "false"
                    },
                    "RAILS_ENV": {
                      "isOptional": false,
                      "description": "Run Rails in production mode.",
                      "defaultValue": "production"
                    },
                    "SMTP_PORT": {
                      "isOptional": false,
                      "description": "SMTP server port.",
                      "defaultValue": "587"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to redis.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
                      "defaultValue": "${{redis.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "DOMAIN_LIVE": {
                      "isOptional": false,
                      "description": "Production links base domain, for example links.example.com.",
                      "defaultValue": "{{DOMAIN_LIVE}}"
                    },
                    "DOMAIN_TEST": {
                      "isOptional": false,
                      "description": "Test links base domain, for example test.links.example.com.",
                      "defaultValue": "{{DOMAIN_TEST}}"
                    },
                    "MAILER_FROM": {
                      "isOptional": false,
                      "description": "Sender address used for outgoing Grovs emails.",
                      "defaultValue": "Grovs <noreply@${{web.SERVER_HOST}}>"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Grovs PostgreSQL database name.",
                      "defaultValue": "grovs_production"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": true,
                      "description": "Optional override for S3-compatible storage.",
                      "defaultValue": ""
                    },
                    "SERVER_HOST": {
                      "isOptional": false,
                      "description": "App base domain, for example grovs.example.com; no https:// or path.",
                      "defaultValue": "{{SERVER_HOST}}"
                    },
                    "SMTP_DOMAIN": {
                      "isOptional": false,
                      "description": "Shared reference to web.SERVER_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.SERVER_HOST}}"
                    },
                    "SMTP_ADDRESS": {
                      "isOptional": false,
                      "description": "SMTP server hostname; only used when email is enabled.",
                      "defaultValue": "smtp.example.com"
                    },
                    "ADMIN_API_KEY": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{ADMIN_API_KEY}}"
                    },
                    "AWS_S3_BUCKET": {
                      "isOptional": false,
                      "description": "Private bucket name shared by API and workers.",
                      "defaultValue": "{{AWS_S3_BUCKET}}"
                    },
                    "AWS_S3_KEY_ID": {
                      "isOptional": false,
                      "description": "Access key for your private S3-compatible bucket.",
                      "defaultValue": "{{AWS_S3_KEY_ID}}"
                    },
                    "AWS_S3_REGION": {
                      "isOptional": false,
                      "description": "Bucket region, for example eu-north-1.",
                      "defaultValue": "{{AWS_S3_REGION}}"
                    },
                    "POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to postgres.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
                      "defaultValue": "${{postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Grovs PostgreSQL database user.",
                      "defaultValue": "grovs"
                    },
                    "RAILS_DB_POOL": {
                      "isOptional": false,
                      "description": "Database connections available per process.",
                      "defaultValue": "10"
                    },
                    "SMTP_PASSWORD": {
                      "isOptional": true,
                      "description": "SMTP authentication password, if required.",
                      "defaultValue": ""
                    },
                    "SMTP_USERNAME": {
                      "isOptional": true,
                      "description": "SMTP authentication username, if required.",
                      "defaultValue": ""
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to redis.REDIS_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{redis.REDIS_PASSWORD}}"
                    },
                    "CLICKHOUSE_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to clickhouse.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
                      "defaultValue": "${{clickhouse.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{SECRET_KEY_BASE}}"
                    },
                    "WEB_CONCURRENCY": {
                      "isOptional": false,
                      "description": "Number of Puma web processes.",
                      "defaultValue": "2"
                    },
                    "DEFAULT_LOGO_URL": {
                      "isOptional": false,
                      "description": "Default app icon on link landing pages.",
                      "defaultValue": "https://appssemble-assets.s3.eu-north-1.amazonaws.com/linksquared/logo-square-new.svg"
                    },
                    "OAUTH_CLIENT_UID": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{OAUTH_CLIENT_UID}}"
                    },
                    "PG_SHADOW_WRITES": {
                      "isOptional": false,
                      "description": "Mirror event writes to PostgreSQL; disabled for ClickHouse-primary storage.",
                      "defaultValue": "false"
                    },
                    "AWS_S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Secret access key for your private bucket.",
                      "defaultValue": "{{AWS_S3_ACCESS_KEY}}"
                    },
                    "GROVS_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Enable self-hosted configuration and bootstrap login.",
                      "defaultValue": "true"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to postgres.POSTGRES_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{postgres.POSTGRES_PASSWORD}}"
                    },
                    "RAILS_MAX_THREADS": {
                      "isOptional": false,
                      "description": "Maximum threads per web process.",
                      "defaultValue": "5"
                    },
                    "CLICKHOUSE_PRIMARY": {
                      "isOptional": false,
                      "description": "Use ClickHouse as the primary event store.",
                      "defaultValue": "true"
                    },
                    "DEFAULT_LINK_TITLE": {
                      "isOptional": false,
                      "description": "Default link landing-page title.",
                      "defaultValue": "grovs"
                    },
                    "CLICKHOUSE_DATABASE": {
                      "isOptional": false,
                      "description": "Analytics database used by the application.",
                      "defaultValue": "grovs_production"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to clickhouse.CLICKHOUSE_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{clickhouse.CLICKHOUSE_PASSWORD}}"
                    },
                    "DIAGNOSTICS_API_KEY": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{DIAGNOSTICS_API_KEY}}"
                    },
                    "OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{OAUTH_CLIENT_SECRET}}"
                    },
                    "RAILS_LOG_TO_STDOUT": {
                      "isOptional": false,
                      "description": "Send Rails logs to Railway's log viewer.",
                      "defaultValue": "true"
                    },
                    "REACT_HOST_PROTOCOL": {
                      "isOptional": false,
                      "description": "Public dashboard URL protocol.",
                      "defaultValue": "https://"
                    },
                    "S3_FORCE_PATH_STYLE": {
                      "isOptional": true,
                      "description": "Optional override for S3-compatible storage.",
                      "defaultValue": ""
                    },
                    "SMTP_AUTHENTICATION": {
                      "isOptional": false,
                      "description": "SMTP authentication mechanism.",
                      "defaultValue": "plain"
                    },
                    "SERVER_HOST_PROTOCOL": {
                      "isOptional": false,
                      "description": "Public backend URL protocol.",
                      "defaultValue": "https://"
                    },
                    "BOOTSTRAP_ADMIN_EMAIL": {
                      "isOptional": false,
                      "description": "Email address for the first administrator.",
                      "defaultValue": "{{BOOTSTRAP_ADMIN_EMAIL}}"
                    },
                    "DEFAULT_LINK_SUBTITLE": {
                      "isOptional": false,
                      "description": "Default link landing-page description.",
                      "defaultValue": "Dynamic links, attributions, and referrals across mobile and web platforms."
                    },
                    "ACTIVE_STORAGE_SERVICE": {
                      "isOptional": false,
                      "description": "Use S3 storage shared by the API and workers.",
                      "defaultValue": "amazon"
                    },
                    "MAILER_DELIVERY_METHOD": {
                      "isOptional": true,
                      "description": "Leave empty to disable email; configure SMTP to enable it.",
                      "defaultValue": ""
                    },
                    "CLICKHOUSE_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Read analytics events from ClickHouse.",
                      "defaultValue": "true"
                    },
                    "SENT_QUOTAS_WEBHOOK_KEY": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{SENT_QUOTAS_WEBHOOK_KEY}}"
                    },
                    "BOOTSTRAP_ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{BOOTSTRAP_ADMIN_PASSWORD}}"
                    },
                    "CLICKHOUSE_WRITE_ENABLED": {
                      "isOptional": false,
                      "description": "Write analytics events to ClickHouse.",
                      "defaultValue": "true"
                    },
                    "POSTGRES_MAX_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Connection budget setting from the Compose defaults; Railway PostgreSQL tuning is separate.",
                      "defaultValue": "200"
                    },
                    "RAILS_SERVE_STATIC_FILES": {
                      "isOptional": false,
                      "description": "Serve the backend's bundled static assets.",
                      "defaultValue": "true"
                    },
                    "REVENUE_READS_FROM_LEDGER": {
                      "isOptional": false,
                      "description": "Read purchase revenue from the event ledger.",
                      "defaultValue": "true"
                    },
                    "SMTP_ENABLE_STARTTLS_AUTO": {
                      "isOptional": false,
                      "description": "Use STARTTLS when supported by the SMTP server.",
                      "defaultValue": "true"
                    },
                    "DEFAULT_SOCIAL_PREVIEW_URL": {
                      "isOptional": false,
                      "description": "Default image for shared links.",
                      "defaultValue": "https://appssemble-assets.s3.eu-north-1.amazonaws.com/linksquared/social-media-placeholder.jpg"
                    },
                    "SIDEKIQ_EVENTS_CONCURRENCY": {
                      "isOptional": false,
                      "description": "Concurrent jobs in the event worker.",
                      "defaultValue": "10"
                    },
                    "CLICKHOUSE_ROLLUP_FAST_LANE": {
                      "isOptional": false,
                      "description": "Enable the fast path for analytics rollups.",
                      "defaultValue": "true"
                    },
                    "DASHBOARD_CACHE_TTL_SECONDS": {
                      "isOptional": false,
                      "description": "Dashboard result cache lifetime in seconds.",
                      "defaultValue": "60"
                    },
                    "PUBLIC_GO_PROJECT_IDENTIFIER": {
                      "isOptional": false,
                      "description": "Identifier for the built-in public redirect project.",
                      "defaultValue": "go-self-hosted"
                    },
                    "CLICKHOUSE_ATTRIBUTION_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Read attribution data from ClickHouse.",
                      "defaultValue": "true"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY}}"
                    },
                    "CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Read link dimensions from ClickHouse.",
                      "defaultValue": "true"
                    },
                    "CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Read pre-aggregated ClickHouse analytics.",
                      "defaultValue": "true"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY}}"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>:3000": {}
                    }
                  }
                },
                "647f4a47-10a4-506e-bee4-9d371d653bd4": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "postgres",
                  "deploy": {
                    "numReplicas": 1,
                    "sleepApplication": false,
                    "requiredMountPath": "/var/lib/postgresql/data",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "postgres:16-alpine"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "PostgreSQL data directory inside the persistent volume.",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Grovs PostgreSQL database name.",
                      "defaultValue": "grovs_production"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Grovs PostgreSQL database user.",
                      "defaultValue": "grovs"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "647f4a47-10a4-506e-bee4-9d371d653bd4": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "6c890386-8c6d-5e2b-aff3-243c614c73ce": {
                  "icon": "https://devicons.railway.app/i/clickhouse.svg",
                  "name": "clickhouse",
                  "deploy": {
                    "numReplicas": 1,
                    "sleepApplication": false,
                    "requiredMountPath": "/var/lib/clickhouse",
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "clickhouse/clickhouse-server:25.3"
                  },
                  "variables": {
                    "CLICKHOUSE_DB": {
                      "isOptional": false,
                      "description": "Grovs ClickHouse database name.",
                      "defaultValue": "grovs_production"
                    },
                    "CLICKHOUSE_USER": {
                      "isOptional": false,
                      "description": "Grovs ClickHouse database user.",
                      "defaultValue": "grovs"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "Generated uniquely for this deployment.",
                      "defaultValue": "{{CLICKHOUSE_PASSWORD}}"
                    }
                  },
                  "volumeMounts": {
                    "6c890386-8c6d-5e2b-aff3-243c614c73ce": {
                      "mountPath": "/var/lib/clickhouse"
                    }
                  }
                },
                "d0d6de96-d168-5f4a-8a9a-572cd3bca54a": {
                  "icon": "https://docs.grovs.io/logo.svg",
                  "name": "worker-2",
                  "deploy": {
                    "numReplicas": 1,
                    "startCommand": "bash -ec '#!/usr/bin/env bash\n# Sourced into the commands embedded in Railway/Render configuration.\n# No files from this repository need to be present in the application image.\nset -eu\n: \"${SERVER_HOST:?Set your app domain}\"\n: \"${DOMAIN_LIVE:?Set your production links domain}\"\n: \"${DOMAIN_TEST:?Set your test links domain}\"\n: \"${AWS_S3_KEY_ID:?Set object storage credentials}\"\n: \"${AWS_S3_ACCESS_KEY:?Set object storage credentials}\"\n: \"${AWS_S3_REGION:?Set your bucket region}\"\n: \"${AWS_S3_BUCKET:?Set your bucket name}\"\nexport ACTIVE_STORAGE_SERVICE=amazon\nexport SERVER_HOST_PROTOCOL=https:// REACT_HOST_PROTOCOL=https://\nexport REACT_HOST=\"dashboard.$SERVER_HOST\"\nexport API_HOST=\"api.$SERVER_HOST\" SDK_HOST=\"sdk.$SERVER_HOST\"\nexport DASHBOARD_HOST=\"$REACT_HOST\" MCP_HOST=\"mcp.$SERVER_HOST\" GO_HOST=\"go.$SERVER_HOST\"\nexport PREVIEW_HOST=\"preview.$SERVER_HOST\"\nexport LINKS_PROD_HOST=\"links.$DOMAIN_LIVE\" LINKS_TEST_HOST=\"links.$DOMAIN_TEST\"\nexport PREVIEW_BASE_URL=\"https://preview.$SERVER_HOST\"\nexport MCP_CONSENT_URL=\"https://dashboard.$SERVER_HOST/mcp/authorize\"\nexport S3_ASSET_PREFIX=\"https://api.$SERVER_HOST\"\nencode_password() {\n  ruby -ruri -e '\"'\"'print URI.encode_www_form_component(ENV.fetch(ARGV.fetch(0))).gsub(\"+\", \"%20\")'\"'\"' \"$1\"\n}\nif [ -z \"${DATABASE_URL:-}\" ]; then\n  : \"${POSTGRES_HOST:?Set the private PostgreSQL host}\"\n  DATABASE_URL=\"postgres://grovs:$(encode_password POSTGRES_PASSWORD)@$POSTGRES_HOST:5432/grovs_production\"\n  export DATABASE_URL\nfi\nif [ -z \"${REDIS_URL:-}\" ]; then\n  : \"${REDIS_HOST:?Set the private Redis host}\"\n  REDIS_URL=\"redis://:$(encode_password REDIS_PASSWORD)@$REDIS_HOST:6379/0\"\n  export REDIS_URL\nfi\nif [ -z \"${CLICKHOUSE_URL:-}\" ]; then\n  : \"${CLICKHOUSE_HOST:?Set the private ClickHouse host}\"\n  : \"${CLICKHOUSE_PASSWORD:?Set the ClickHouse password}\"\n  ENCODED_PASSWORD=$(encode_password CLICKHOUSE_PASSWORD)\n  export CLICKHOUSE_URL=\"http://grovs:$ENCODED_PASSWORD@$CLICKHOUSE_HOST:8123\"\nfi\n\nwait_for_http() {\n  local attempt\n  for ((attempt=0; attempt<120; attempt++)); do\n    if curl --fail --silent --max-time 5 \"$1\" >/dev/null; then return 0; fi\n    sleep 5\n  done\n  echo \"Dependency did not become healthy within the startup window.\" >&2\n  return 1\n}\n\nwait_for_http \"http://$WEB_HOST:${WEB_PORT:-3000}/up\"\npids=()\ntrap '\"'\"'kill \"${pids[@]}\" 2>/dev/null || true'\"'\"' EXIT\ntrap '\"'\"'exit 143'\"'\"' TERM INT\nbundle exec sidekiq -C config/sidekiq_maintenance.yml &\npids+=($!)\nbundle exec sidekiq -C config/sidekiq_device_updates.yml &\npids+=($!)\nwait -n\n'",
                    "sleepApplication": false,
                    "restartPolicyType": "ALWAYS"
                  },
                  "source": {
                    "image": "ghcr.io/grovs-io/backend:2.3.1"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Shared reference to web.PORT; keep in sync with its source.",
                      "defaultValue": "${{web.PORT}}"
                    },
                    "GROVS_EE": {
                      "isOptional": false,
                      "description": "Shared reference to web.GROVS_EE; keep in sync with its source.",
                      "defaultValue": "${{web.GROVS_EE}}"
                    },
                    "WEB_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILWAY_PRIVATE_DOMAIN; keep in sync with its source.",
                      "defaultValue": "${{web.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "WEB_PORT": {
                      "isOptional": false,
                      "description": "Private API health-check port for worker startup.",
                      "defaultValue": "3000"
                    },
                    "RAILS_ENV": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_ENV; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_ENV}}"
                    },
                    "SMTP_PORT": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_PORT; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_PORT}}"
                    },
                    "REDIS_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.REDIS_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.REDIS_HOST}}"
                    },
                    "DOMAIN_LIVE": {
                      "isOptional": false,
                      "description": "Shared reference to web.DOMAIN_LIVE; keep in sync with its source.",
                      "defaultValue": "${{web.DOMAIN_LIVE}}"
                    },
                    "DOMAIN_TEST": {
                      "isOptional": false,
                      "description": "Shared reference to web.DOMAIN_TEST; keep in sync with its source.",
                      "defaultValue": "${{web.DOMAIN_TEST}}"
                    },
                    "MAILER_FROM": {
                      "isOptional": false,
                      "description": "Shared reference to web.MAILER_FROM; keep in sync with its source.",
                      "defaultValue": "${{web.MAILER_FROM}}"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_DB; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_DB}}"
                    },
                    "S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "Shared reference to web.S3_ENDPOINT; keep in sync with its source.",
                      "defaultValue": "${{web.S3_ENDPOINT}}"
                    },
                    "SERVER_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.SERVER_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.SERVER_HOST}}"
                    },
                    "SMTP_DOMAIN": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_DOMAIN; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_DOMAIN}}"
                    },
                    "SMTP_ADDRESS": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_ADDRESS; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_ADDRESS}}"
                    },
                    "ADMIN_API_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.ADMIN_API_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.ADMIN_API_KEY}}"
                    },
                    "AWS_S3_BUCKET": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_BUCKET; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_BUCKET}}"
                    },
                    "AWS_S3_KEY_ID": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_KEY_ID; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_KEY_ID}}"
                    },
                    "AWS_S3_REGION": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_REGION; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_REGION}}"
                    },
                    "POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_HOST}}"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_USER; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_USER}}"
                    },
                    "RAILS_DB_POOL": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_DB_POOL; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_DB_POOL}}"
                    },
                    "SMTP_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_PASSWORD}}"
                    },
                    "SMTP_USERNAME": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_USERNAME; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_USERNAME}}"
                    },
                    "REDIS_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.REDIS_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.REDIS_PASSWORD}}"
                    },
                    "CLICKHOUSE_HOST": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_HOST; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_HOST}}"
                    },
                    "SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Shared reference to web.SECRET_KEY_BASE; keep in sync with its source.",
                      "defaultValue": "${{web.SECRET_KEY_BASE}}"
                    },
                    "WEB_CONCURRENCY": {
                      "isOptional": false,
                      "description": "Shared reference to web.WEB_CONCURRENCY; keep in sync with its source.",
                      "defaultValue": "${{web.WEB_CONCURRENCY}}"
                    },
                    "DEFAULT_LOGO_URL": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_LOGO_URL; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_LOGO_URL}}"
                    },
                    "OAUTH_CLIENT_UID": {
                      "isOptional": false,
                      "description": "Shared reference to web.OAUTH_CLIENT_UID; keep in sync with its source.",
                      "defaultValue": "${{web.OAUTH_CLIENT_UID}}"
                    },
                    "PG_SHADOW_WRITES": {
                      "isOptional": false,
                      "description": "Shared reference to web.PG_SHADOW_WRITES; keep in sync with its source.",
                      "defaultValue": "${{web.PG_SHADOW_WRITES}}"
                    },
                    "AWS_S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.AWS_S3_ACCESS_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.AWS_S3_ACCESS_KEY}}"
                    },
                    "GROVS_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Shared reference to web.GROVS_SELF_HOSTED; keep in sync with its source.",
                      "defaultValue": "${{web.GROVS_SELF_HOSTED}}"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_PASSWORD}}"
                    },
                    "RAILS_MAX_THREADS": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_MAX_THREADS; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_MAX_THREADS}}"
                    },
                    "CLICKHOUSE_PRIMARY": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_PRIMARY; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_PRIMARY}}"
                    },
                    "DEFAULT_LINK_TITLE": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_LINK_TITLE; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_LINK_TITLE}}"
                    },
                    "CLICKHOUSE_DATABASE": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_DATABASE; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_DATABASE}}"
                    },
                    "CLICKHOUSE_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_PASSWORD}}"
                    },
                    "DIAGNOSTICS_API_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.DIAGNOSTICS_API_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.DIAGNOSTICS_API_KEY}}"
                    },
                    "OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Shared reference to web.OAUTH_CLIENT_SECRET; keep in sync with its source.",
                      "defaultValue": "${{web.OAUTH_CLIENT_SECRET}}"
                    },
                    "RAILS_LOG_TO_STDOUT": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_LOG_TO_STDOUT; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_LOG_TO_STDOUT}}"
                    },
                    "REACT_HOST_PROTOCOL": {
                      "isOptional": false,
                      "description": "Shared reference to web.REACT_HOST_PROTOCOL; keep in sync with its source.",
                      "defaultValue": "${{web.REACT_HOST_PROTOCOL}}"
                    },
                    "S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Shared reference to web.S3_FORCE_PATH_STYLE; keep in sync with its source.",
                      "defaultValue": "${{web.S3_FORCE_PATH_STYLE}}"
                    },
                    "SMTP_AUTHENTICATION": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_AUTHENTICATION; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_AUTHENTICATION}}"
                    },
                    "SERVER_HOST_PROTOCOL": {
                      "isOptional": false,
                      "description": "Shared reference to web.SERVER_HOST_PROTOCOL; keep in sync with its source.",
                      "defaultValue": "${{web.SERVER_HOST_PROTOCOL}}"
                    },
                    "BOOTSTRAP_ADMIN_EMAIL": {
                      "isOptional": false,
                      "description": "Shared reference to web.BOOTSTRAP_ADMIN_EMAIL; keep in sync with its source.",
                      "defaultValue": "${{web.BOOTSTRAP_ADMIN_EMAIL}}"
                    },
                    "DEFAULT_LINK_SUBTITLE": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_LINK_SUBTITLE; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_LINK_SUBTITLE}}"
                    },
                    "ACTIVE_STORAGE_SERVICE": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_STORAGE_SERVICE; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_STORAGE_SERVICE}}"
                    },
                    "MAILER_DELIVERY_METHOD": {
                      "isOptional": false,
                      "description": "Shared reference to web.MAILER_DELIVERY_METHOD; keep in sync with its source.",
                      "defaultValue": "${{web.MAILER_DELIVERY_METHOD}}"
                    },
                    "CLICKHOUSE_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_READ_ENABLED}}"
                    },
                    "SENT_QUOTAS_WEBHOOK_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.SENT_QUOTAS_WEBHOOK_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.SENT_QUOTAS_WEBHOOK_KEY}}"
                    },
                    "BOOTSTRAP_ADMIN_PASSWORD": {
                      "isOptional": false,
                      "description": "Shared reference to web.BOOTSTRAP_ADMIN_PASSWORD; keep in sync with its source.",
                      "defaultValue": "${{web.BOOTSTRAP_ADMIN_PASSWORD}}"
                    },
                    "CLICKHOUSE_WRITE_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_WRITE_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_WRITE_ENABLED}}"
                    },
                    "POSTGRES_MAX_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Shared reference to web.POSTGRES_MAX_CONNECTIONS; keep in sync with its source.",
                      "defaultValue": "${{web.POSTGRES_MAX_CONNECTIONS}}"
                    },
                    "RAILS_SERVE_STATIC_FILES": {
                      "isOptional": false,
                      "description": "Shared reference to web.RAILS_SERVE_STATIC_FILES; keep in sync with its source.",
                      "defaultValue": "${{web.RAILS_SERVE_STATIC_FILES}}"
                    },
                    "REVENUE_READS_FROM_LEDGER": {
                      "isOptional": false,
                      "description": "Shared reference to web.REVENUE_READS_FROM_LEDGER; keep in sync with its source.",
                      "defaultValue": "${{web.REVENUE_READS_FROM_LEDGER}}"
                    },
                    "SMTP_ENABLE_STARTTLS_AUTO": {
                      "isOptional": false,
                      "description": "Shared reference to web.SMTP_ENABLE_STARTTLS_AUTO; keep in sync with its source.",
                      "defaultValue": "${{web.SMTP_ENABLE_STARTTLS_AUTO}}"
                    },
                    "DEFAULT_SOCIAL_PREVIEW_URL": {
                      "isOptional": false,
                      "description": "Shared reference to web.DEFAULT_SOCIAL_PREVIEW_URL; keep in sync with its source.",
                      "defaultValue": "${{web.DEFAULT_SOCIAL_PREVIEW_URL}}"
                    },
                    "SIDEKIQ_EVENTS_CONCURRENCY": {
                      "isOptional": false,
                      "description": "Shared reference to web.SIDEKIQ_EVENTS_CONCURRENCY; keep in sync with its source.",
                      "defaultValue": "${{web.SIDEKIQ_EVENTS_CONCURRENCY}}"
                    },
                    "CLICKHOUSE_ROLLUP_FAST_LANE": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_ROLLUP_FAST_LANE; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_ROLLUP_FAST_LANE}}"
                    },
                    "DASHBOARD_CACHE_TTL_SECONDS": {
                      "isOptional": false,
                      "description": "Shared reference to web.DASHBOARD_CACHE_TTL_SECONDS; keep in sync with its source.",
                      "defaultValue": "${{web.DASHBOARD_CACHE_TTL_SECONDS}}"
                    },
                    "PUBLIC_GO_PROJECT_IDENTIFIER": {
                      "isOptional": false,
                      "description": "Shared reference to web.PUBLIC_GO_PROJECT_IDENTIFIER; keep in sync with its source.",
                      "defaultValue": "${{web.PUBLIC_GO_PROJECT_IDENTIFIER}}"
                    },
                    "CLICKHOUSE_ATTRIBUTION_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_ATTRIBUTION_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_ATTRIBUTION_READ_ENABLED}}"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY}}"
                    },
                    "CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_LINK_DIMENSIONS_READ_ENABLED}}"
                    },
                    "CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED": {
                      "isOptional": false,
                      "description": "Shared reference to web.CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED; keep in sync with its source.",
                      "defaultValue": "${{web.CLICKHOUSE_ANALYTICS_ROLLUPS_READ_ENABLED}}"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY}}"
                    },
                    "ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT": {
                      "isOptional": false,
                      "description": "Shared reference to web.ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT; keep in sync with its source.",
                      "defaultValue": "${{web.ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT}}"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "dashboard",
      "method": "GET",
      "path": "/login",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 7,
    "needs_volume": true
  },
  "generated_at": "2026-09-15T10:14:39.124Z",
  "generator_version": "0.1.0"
}
