{
  "manifest_version": "1.0.0",
  "template": {
    "id": "a4b3e7ba-6343-471c-8ae5-6a8fcaa47e83",
    "slug": "fluxer-chat",
    "name": "Fluxer | Open-Source Discord Alternative (Text Chat)",
    "description": "Self-hosted Discord-style chat: servers, channels, DMs, uploads, search",
    "url": "https://railway.com/deploy/fluxer-chat",
    "upstream": {
      "repo_url": "https://github.com/nomideusz/fluxer-railway"
    }
  },
  "services": [
    {
      "name": "worker",
      "source": {
        "image": "ghcr.io/fluxerapp/fluxer-api:2026.1004.160619"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Valkey",
      "source": {
        "image": "valkey/valkey:9.1-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "svc",
      "source": {
        "repo": "https://github.com/nomideusz/fluxer-railway"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Fluxer",
      "source": {
        "repo": "https://github.com/nomideusz/fluxer-railway"
      },
      "needs_volume": false,
      "http": true
    },
    {
      "name": "NATS",
      "source": {
        "image": "nats:2.14-alpine"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "admin",
      "source": {
        "image": "ghcr.io/fluxerapp/fluxer-admin:2026.1003.122521"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Meilisearch",
      "source": {
        "image": "getmeili/meilisearch:v1.53"
      },
      "needs_volume": true,
      "volume_mount_path": "/meili_data",
      "http": false
    },
    {
      "name": "media-proxy",
      "source": {
        "image": "ghcr.io/fluxerapp/fluxer-media-proxy:2026.1003.110721"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "gateway",
      "source": {
        "image": "ghcr.io/fluxerapp/fluxer-gateway:2026.1004.10845"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "Postgres",
      "source": {
        "image": "ghcr.io/railwayapp-templates/postgres-ssl:16"
      },
      "needs_volume": true,
      "volume_mount_path": "/var/lib/postgresql/data",
      "http": false
    },
    {
      "name": "SeaweedFS",
      "source": {
        "repo": "https://github.com/nomideusz/fluxer-railway"
      },
      "needs_volume": true,
      "volume_mount_path": "/data",
      "http": false
    },
    {
      "name": "api",
      "source": {
        "image": "ghcr.io/fluxerapp/fluxer-api:2026.1004.160619"
      },
      "needs_volume": false,
      "http": false
    },
    {
      "name": "app-proxy",
      "source": {
        "image": "ghcr.io/fluxerapp/fluxer-app-proxy-self-hosted:2026.1004.174950"
      },
      "needs_volume": false,
      "http": false
    }
  ],
  "required_inputs": [
    {
      "key": "FLUXER_ENV",
      "service": "worker",
      "description": "Runtime environment",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "FLUXER_KV_URL",
      "service": "worker",
      "description": "Valkey URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_BOOT_JS",
      "service": "worker",
      "description": "Boot shim",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SVC_DEPENDENCY",
      "service": "worker",
      "description": "Orders this service after svc on deploy. Don't edit",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_NATS_URL",
      "service": "worker",
      "description": "NATS URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_REGION",
      "service": "worker",
      "description": "S3 region",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "FLUXER_SEARCH_URL",
      "service": "worker",
      "description": "Meilisearch URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_VAPID_SEED",
      "service": "worker",
      "description": "Seed for the derived VAPID keypair",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "worker",
      "description": "Public hostname (set on the api service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PUBLIC_PORT",
      "service": "worker",
      "description": "Public port",
      "secret": false,
      "strategy": "default",
      "default": "443"
    },
    {
      "key": "FLUXER_S3_ENDPOINT",
      "service": "worker",
      "description": "S3 endpoint (SeaweedFS)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_SELF_HOSTED",
      "service": "worker",
      "description": "Self-hosted mode",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_VAPID_EMAIL",
      "service": "worker",
      "description": "Web push contact",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_APP_ENDPOINT",
      "service": "worker",
      "description": "Web app URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SVC_NATS_URL",
      "service": "worker",
      "description": "NATS URL for internal services",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_EMAIL_ENABLED",
      "service": "worker",
      "description": "Email. Off = addresses auto-verified, no password reset mail",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_PASSKEY_RP_ID",
      "service": "worker",
      "description": "Passkey relying party",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_HOST",
      "service": "worker",
      "description": "Postgres host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_POSTGRES_PORT",
      "service": "worker",
      "description": "Postgres port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FLUXER_PUBLIC_SCHEME",
      "service": "worker",
      "description": "Public scheme",
      "secret": false,
      "strategy": "default",
      "default": "https"
    },
    {
      "key": "FLUXER_S3_BUCKET_CDN",
      "service": "worker",
      "description": "Processed assets bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "FLUXER_SEARCH_ENGINE",
      "service": "worker",
      "description": "Search engine",
      "secret": false,
      "strategy": "default",
      "default": "meilisearch"
    },
    {
      "key": "FLUXER_ADMIN_ENDPOINT",
      "service": "worker",
      "description": "Admin dashboard URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_ENDPOINT",
      "service": "worker",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SEARCH_API_KEY",
      "service": "worker",
      "description": "Meilisearch master key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_WORKER_MODE",
      "service": "worker",
      "description": "Run every job lane",
      "secret": false,
      "strategy": "default",
      "default": "all_lanes"
    },
    {
      "key": "FLUXER_LIVEKIT_ENABLED",
      "service": "worker",
      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_SVC_SHARD_COUNT",
      "service": "worker",
      "description": "Internal service shard count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "FLUXER_DATABASE_BACKEND",
      "service": "worker",
      "description": "Database backend",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "FLUXER_EMAIL_FROM_EMAIL",
      "service": "worker",
      "description": "From address once SMTP is configured",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_ACCESS_KEY_ID",
      "service": "worker",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SUDO_MODE_SECRET",
      "service": "worker",
      "description": "Sudo-mode JWT key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_DATABASE",
      "service": "worker",
      "description": "Postgres database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_PASSWORD",
      "service": "worker",
      "description": "Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_USERNAME",
      "service": "worker",
      "description": "Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_BUCKET_REPORTS",
      "service": "worker",
      "description": "Abuse reports bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-reports"
    },
    {
      "key": "FLUXER_S3_BUCKET_UPLOADS",
      "service": "worker",
      "description": "Raw uploads bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-uploads"
    },
    {
      "key": "FLUXER_MARKETING_ENDPOINT",
      "service": "worker",
      "description": "Marketing URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_NATS_JETSTREAM_URL",
      "service": "worker",
      "description": "NATS JetStream URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_BUCKET_HARVESTS",
      "service": "worker",
      "description": "Data export bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-harvests"
    },
    {
      "key": "FLUXER_S3_PUBLIC_ENDPOINT",
      "service": "worker",
      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_FORCE_PATH_STYLE",
      "service": "worker",
      "description": "Path-style S3 addressing",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_GATEWAY_PUSH_ENABLED",
      "service": "worker",
      "description": "Browser push notifications (push service not deployed)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_S3_SECRET_ACCESS_KEY",
      "service": "worker",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_ADMIN_SECRET_KEY_BASE",
      "service": "worker",
      "description": "Admin session key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_API_ENDPOINT",
      "service": "worker",
      "description": "Internal API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
      "service": "worker",
      "description": "API<->Gateway RPC token",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_SECRET_KEY",
      "service": "worker",
      "description": "Media proxy URL signing key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_TRUST_CLIENT_IP_HEADER",
      "service": "worker",
      "description": "Trust X-Forwarded-For set by the edge",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_POSTGRES_MAX_CONNECTIONS",
      "service": "worker",
      "description": "Postgres pool size",
      "secret": false,
      "strategy": "default",
      "default": "15"
    },
    {
      "key": "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
      "service": "worker",
      "description": "Admin OAuth client secret",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT",
      "service": "worker",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_CONNECTION_INITIATION_SECRET",
      "service": "worker",
      "description": "Connection initiation token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT",
      "service": "worker",
      "description": "Internal media proxy URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_API_WORKER_ENABLE_CRON_SCHEDULER",
      "service": "worker",
      "description": "Run cron jobs",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT",
      "service": "worker",
      "description": "Upload relay URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS",
      "service": "worker",
      "description": "Passkey origins",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64",
      "service": "worker",
      "description": "Upload relay token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED",
      "service": "worker",
      "description": "Presigned data-export downloads",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "VALKEY_PASSWORD",
      "service": "Valkey",
      "description": "Auto-generated Valkey password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "PORT",
      "service": "svc",
      "description": "Health port of the first internal service (healthcheck)",
      "secret": false,
      "strategy": "default",
      "default": "8090"
    },
    {
      "key": "FLUXER_ENV",
      "service": "svc",
      "description": "Runtime environment",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "FLUXER_KV_URL",
      "service": "svc",
      "description": "Valkey URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_NATS_URL",
      "service": "svc",
      "description": "NATS URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_REGION",
      "service": "svc",
      "description": "S3 region",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "FLUXER_SEARCH_URL",
      "service": "svc",
      "description": "Meilisearch URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "svc",
      "description": "Public hostname (set on the api service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PUBLIC_PORT",
      "service": "svc",
      "description": "Public port",
      "secret": false,
      "strategy": "default",
      "default": "443"
    },
    {
      "key": "FLUXER_S3_ENDPOINT",
      "service": "svc",
      "description": "S3 endpoint (SeaweedFS)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_SELF_HOSTED",
      "service": "svc",
      "description": "Self-hosted mode",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_VAPID_EMAIL",
      "service": "svc",
      "description": "Web push contact",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_APP_ENDPOINT",
      "service": "svc",
      "description": "Web app URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SVC_NATS_URL",
      "service": "svc",
      "description": "NATS URL for internal services",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_EMAIL_ENABLED",
      "service": "svc",
      "description": "Email. Off = addresses auto-verified, no password reset mail",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_PASSKEY_RP_ID",
      "service": "svc",
      "description": "Passkey relying party",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_HOST",
      "service": "svc",
      "description": "Postgres host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_POSTGRES_PORT",
      "service": "svc",
      "description": "Postgres port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FLUXER_PUBLIC_SCHEME",
      "service": "svc",
      "description": "Public scheme",
      "secret": false,
      "strategy": "default",
      "default": "https"
    },
    {
      "key": "FLUXER_S3_BUCKET_CDN",
      "service": "svc",
      "description": "Processed assets bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "FLUXER_SEARCH_ENGINE",
      "service": "svc",
      "description": "Search engine",
      "secret": false,
      "strategy": "default",
      "default": "meilisearch"
    },
    {
      "key": "FLUXER_ADMIN_ENDPOINT",
      "service": "svc",
      "description": "Admin dashboard URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_ENDPOINT",
      "service": "svc",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SEARCH_API_KEY",
      "service": "svc",
      "description": "Meilisearch master key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_LIVEKIT_ENABLED",
      "service": "svc",
      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_SVC_SHARD_COUNT",
      "service": "svc",
      "description": "Internal service shard count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "FLUXER_DATABASE_BACKEND",
      "service": "svc",
      "description": "Database backend",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "FLUXER_EMAIL_FROM_EMAIL",
      "service": "svc",
      "description": "From address once SMTP is configured",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_ACCESS_KEY_ID",
      "service": "svc",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SUDO_MODE_SECRET",
      "service": "svc",
      "description": "Sudo-mode JWT key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_DATABASE",
      "service": "svc",
      "description": "Postgres database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_PASSWORD",
      "service": "svc",
      "description": "Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_USERNAME",
      "service": "svc",
      "description": "Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_BUCKET_REPORTS",
      "service": "svc",
      "description": "Abuse reports bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-reports"
    },
    {
      "key": "FLUXER_S3_BUCKET_UPLOADS",
      "service": "svc",
      "description": "Raw uploads bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-uploads"
    },
    {
      "key": "FLUXER_MARKETING_ENDPOINT",
      "service": "svc",
      "description": "Marketing URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_NATS_JETSTREAM_URL",
      "service": "svc",
      "description": "NATS JetStream URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_BUCKET_HARVESTS",
      "service": "svc",
      "description": "Data export bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-harvests"
    },
    {
      "key": "FLUXER_S3_PUBLIC_ENDPOINT",
      "service": "svc",
      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_FORCE_PATH_STYLE",
      "service": "svc",
      "description": "Path-style S3 addressing",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_GATEWAY_PUSH_ENABLED",
      "service": "svc",
      "description": "Browser push notifications (push service not deployed)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_S3_SECRET_ACCESS_KEY",
      "service": "svc",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_ADMIN_SECRET_KEY_BASE",
      "service": "svc",
      "description": "Admin session key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_API_ENDPOINT",
      "service": "svc",
      "description": "Internal API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
      "service": "svc",
      "description": "API<->Gateway RPC token",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_SECRET_KEY",
      "service": "svc",
      "description": "Media proxy URL signing key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_TRUST_CLIENT_IP_HEADER",
      "service": "svc",
      "description": "Trust X-Forwarded-For set by the edge",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
      "service": "svc",
      "description": "Admin OAuth client secret",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT",
      "service": "svc",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_CONNECTION_INITIATION_SECRET",
      "service": "svc",
      "description": "Connection initiation token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT",
      "service": "svc",
      "description": "Internal media proxy URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT",
      "service": "svc",
      "description": "Upload relay URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS",
      "service": "svc",
      "description": "Passkey origins",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64",
      "service": "svc",
      "description": "Upload relay token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED",
      "service": "svc",
      "description": "Presigned data-export downloads",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PORT",
      "service": "Fluxer",
      "description": "Edge listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "API_UPSTREAM",
      "service": "Fluxer",
      "description": "api upstream",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "APP_UPSTREAM",
      "service": "Fluxer",
      "description": "app-proxy upstream",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "ADMIN_UPSTREAM",
      "service": "Fluxer",
      "description": "admin upstream",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_BOOT_JS",
      "service": "Fluxer",
      "description": "Boot shim: derives FLUXER_VAPID_* from FLUXER_VAPID_SEED, then starts Fluxer. Don't edit",
      "secret": false,
      "strategy": "default",
      "default": "const c=process.getBuiltinModule('crypto'),u=process.getBuiltinModule('url'),e=process.env;if(!e.FLUXER_VAPID_PRIVATE_KEY){const k=c.createHash('sha256').update('fluxer-vapid:'+e.FLUXER_VAPID_SEED).digest(),d=c.createECDH('prime256v1');d.setPrivateKey(k);e.FLUXER_VAPID_PRIVATE_KEY=k.toString('base64url');e.FLUXER_VAPID_PUBLIC_KEY=d.getPublicKey().toString('base64url')}import(u.pathToFileURL(process.argv[1]).href)"
    },
    {
      "key": "MEDIA_UPSTREAM",
      "service": "Fluxer",
      "description": "media-proxy upstream",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "GATEWAY_UPSTREAM",
      "service": "Fluxer",
      "description": "gateway upstream",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_VAPID_SEED",
      "service": "Fluxer",
      "description": "Seed the web-push VAPID keypair is derived from at boot",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "Fluxer",
      "description": "Public hostname every service reads. Change this when you add a custom domain",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_domain"
    },
    {
      "key": "FLUXER_SUDO_MODE_SECRET",
      "service": "Fluxer",
      "description": "Sudo-mode JWT key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_ADMIN_SECRET_KEY_BASE",
      "service": "Fluxer",
      "description": "Admin session key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
      "service": "Fluxer",
      "description": "API<->Gateway RPC token",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_SECRET_KEY",
      "service": "Fluxer",
      "description": "Media proxy URL signing key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
      "service": "Fluxer",
      "description": "Admin OAuth client secret",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_CONNECTION_INITIATION_SECRET",
      "service": "Fluxer",
      "description": "Connection initiation token key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64",
      "service": "Fluxer",
      "description": "Upload relay token key (base64, >=32 bytes)",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "PORT",
      "service": "admin",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_ENV",
      "service": "admin",
      "description": "Runtime environment",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "FLUXER_KV_URL",
      "service": "admin",
      "description": "Valkey URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_NATS_URL",
      "service": "admin",
      "description": "NATS URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_REGION",
      "service": "admin",
      "description": "S3 region",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "FLUXER_ADMIN_PORT",
      "service": "admin",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_SEARCH_URL",
      "service": "admin",
      "description": "Meilisearch URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "admin",
      "description": "Public hostname (set on the api service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PUBLIC_PORT",
      "service": "admin",
      "description": "Public port",
      "secret": false,
      "strategy": "default",
      "default": "443"
    },
    {
      "key": "FLUXER_S3_ENDPOINT",
      "service": "admin",
      "description": "S3 endpoint (SeaweedFS)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_SELF_HOSTED",
      "service": "admin",
      "description": "Self-hosted mode",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_VAPID_EMAIL",
      "service": "admin",
      "description": "Web push contact",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_ENDPOINT",
      "service": "admin",
      "description": "Internal API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_APP_ENDPOINT",
      "service": "admin",
      "description": "Web app URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SVC_NATS_URL",
      "service": "admin",
      "description": "NATS URL for internal services",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_EMAIL_ENABLED",
      "service": "admin",
      "description": "Email. Off = addresses auto-verified, no password reset mail",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_PASSKEY_RP_ID",
      "service": "admin",
      "description": "Passkey relying party",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_HOST",
      "service": "admin",
      "description": "Postgres host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_POSTGRES_PORT",
      "service": "admin",
      "description": "Postgres port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FLUXER_PUBLIC_SCHEME",
      "service": "admin",
      "description": "Public scheme",
      "secret": false,
      "strategy": "default",
      "default": "https"
    },
    {
      "key": "FLUXER_S3_BUCKET_CDN",
      "service": "admin",
      "description": "Processed assets bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "FLUXER_SEARCH_ENGINE",
      "service": "admin",
      "description": "Search engine",
      "secret": false,
      "strategy": "default",
      "default": "meilisearch"
    },
    {
      "key": "FLUXER_ADMIN_ENDPOINT",
      "service": "admin",
      "description": "Admin dashboard URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_ENDPOINT",
      "service": "admin",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SEARCH_API_KEY",
      "service": "admin",
      "description": "Meilisearch master key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_ADMIN_BASE_PATH",
      "service": "admin",
      "description": "Admin path",
      "secret": false,
      "strategy": "default",
      "default": "/admin"
    },
    {
      "key": "FLUXER_LIVEKIT_ENABLED",
      "service": "admin",
      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_SVC_SHARD_COUNT",
      "service": "admin",
      "description": "Internal service shard count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "FLUXER_DATABASE_BACKEND",
      "service": "admin",
      "description": "Database backend",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "FLUXER_EMAIL_FROM_EMAIL",
      "service": "admin",
      "description": "From address once SMTP is configured",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_ACCESS_KEY_ID",
      "service": "admin",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SUDO_MODE_SECRET",
      "service": "admin",
      "description": "Sudo-mode JWT key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_DATABASE",
      "service": "admin",
      "description": "Postgres database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_PASSWORD",
      "service": "admin",
      "description": "Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_USERNAME",
      "service": "admin",
      "description": "Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_BUCKET_REPORTS",
      "service": "admin",
      "description": "Abuse reports bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-reports"
    },
    {
      "key": "FLUXER_S3_BUCKET_UPLOADS",
      "service": "admin",
      "description": "Raw uploads bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-uploads"
    },
    {
      "key": "FLUXER_MARKETING_ENDPOINT",
      "service": "admin",
      "description": "Marketing URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_NATS_JETSTREAM_URL",
      "service": "admin",
      "description": "NATS JetStream URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_BUCKET_HARVESTS",
      "service": "admin",
      "description": "Data export bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-harvests"
    },
    {
      "key": "FLUXER_S3_PUBLIC_ENDPOINT",
      "service": "admin",
      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_FORCE_PATH_STYLE",
      "service": "admin",
      "description": "Path-style S3 addressing",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_STATIC_CDN_ENDPOINT",
      "service": "admin",
      "description": "Static CDN URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_GATEWAY_PUSH_ENABLED",
      "service": "admin",
      "description": "Browser push notifications (push service not deployed)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_S3_SECRET_ACCESS_KEY",
      "service": "admin",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_ADMIN_SECRET_KEY_BASE",
      "service": "admin",
      "description": "Admin session key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_API_ENDPOINT",
      "service": "admin",
      "description": "Internal API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
      "service": "admin",
      "description": "API<->Gateway RPC token",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_SECRET_KEY",
      "service": "admin",
      "description": "Media proxy URL signing key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_TRUST_CLIENT_IP_HEADER",
      "service": "admin",
      "description": "Trust X-Forwarded-For set by the edge",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
      "service": "admin",
      "description": "Admin OAuth client secret",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT",
      "service": "admin",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_CONNECTION_INITIATION_SECRET",
      "service": "admin",
      "description": "Connection initiation token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT",
      "service": "admin",
      "description": "Internal media proxy URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT",
      "service": "admin",
      "description": "Upload relay URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS",
      "service": "admin",
      "description": "Passkey origins",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64",
      "service": "admin",
      "description": "Upload relay token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED",
      "service": "admin",
      "description": "Presigned data-export downloads",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "MEILI_ENV",
      "service": "Meilisearch",
      "description": "Meilisearch mode",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "MEILI_HTTP_ADDR",
      "service": "Meilisearch",
      "description": "Listen on IPv6 + IPv4 for private networking",
      "secret": false,
      "strategy": "default",
      "default": "[::]:7700"
    },
    {
      "key": "MEILI_MASTER_KEY",
      "service": "Meilisearch",
      "description": "Auto-generated Meilisearch master key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "MEILI_NO_ANALYTICS",
      "service": "Meilisearch",
      "description": "Disable telemetry",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "MEILI_MAX_INDEXING_MEMORY",
      "service": "Meilisearch",
      "description": "Indexing memory cap",
      "secret": false,
      "strategy": "default",
      "default": "256mb"
    },
    {
      "key": "MEILI_MAX_INDEXING_THREADS",
      "service": "Meilisearch",
      "description": "Indexing threads",
      "secret": false,
      "strategy": "default",
      "default": "2"
    },
    {
      "key": "PORT",
      "service": "media-proxy",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_ENV",
      "service": "media-proxy",
      "description": "Runtime environment",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "FLUXER_KV_URL",
      "service": "media-proxy",
      "description": "Valkey URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_NATS_URL",
      "service": "media-proxy",
      "description": "NATS URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_REGION",
      "service": "media-proxy",
      "description": "S3 region",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "FLUXER_SEARCH_URL",
      "service": "media-proxy",
      "description": "Meilisearch URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "media-proxy",
      "description": "Public hostname (set on the api service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PUBLIC_PORT",
      "service": "media-proxy",
      "description": "Public port",
      "secret": false,
      "strategy": "default",
      "default": "443"
    },
    {
      "key": "FLUXER_S3_ENDPOINT",
      "service": "media-proxy",
      "description": "S3 endpoint (SeaweedFS)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_SELF_HOSTED",
      "service": "media-proxy",
      "description": "Self-hosted mode",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_VAPID_EMAIL",
      "service": "media-proxy",
      "description": "Web push contact",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_APP_ENDPOINT",
      "service": "media-proxy",
      "description": "Web app URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SVC_NATS_URL",
      "service": "media-proxy",
      "description": "NATS URL for internal services",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_EMAIL_ENABLED",
      "service": "media-proxy",
      "description": "Email. Off = addresses auto-verified, no password reset mail",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_PASSKEY_RP_ID",
      "service": "media-proxy",
      "description": "Passkey relying party",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_HOST",
      "service": "media-proxy",
      "description": "Postgres host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_POSTGRES_PORT",
      "service": "media-proxy",
      "description": "Postgres port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FLUXER_PUBLIC_SCHEME",
      "service": "media-proxy",
      "description": "Public scheme",
      "secret": false,
      "strategy": "default",
      "default": "https"
    },
    {
      "key": "FLUXER_S3_BUCKET_CDN",
      "service": "media-proxy",
      "description": "Processed assets bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "FLUXER_SEARCH_ENGINE",
      "service": "media-proxy",
      "description": "Search engine",
      "secret": false,
      "strategy": "default",
      "default": "meilisearch"
    },
    {
      "key": "FLUXER_ADMIN_ENDPOINT",
      "service": "media-proxy",
      "description": "Admin dashboard URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_ENDPOINT",
      "service": "media-proxy",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_READ_SIGNED",
      "service": "media-proxy",
      "description": "Sign S3 reads",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_SEARCH_API_KEY",
      "service": "media-proxy",
      "description": "Meilisearch master key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_LIVEKIT_ENABLED",
      "service": "media-proxy",
      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_SVC_SHARD_COUNT",
      "service": "media-proxy",
      "description": "Internal service shard count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "FLUXER_DATABASE_BACKEND",
      "service": "media-proxy",
      "description": "Database backend",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "FLUXER_EMAIL_FROM_EMAIL",
      "service": "media-proxy",
      "description": "From address once SMTP is configured",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_MODE",
      "service": "media-proxy",
      "description": "Serve media + upload relay",
      "secret": false,
      "strategy": "default",
      "default": "upload"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_PORT",
      "service": "media-proxy",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_S3_ACCESS_KEY_ID",
      "service": "media-proxy",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SUDO_MODE_SECRET",
      "service": "media-proxy",
      "description": "Sudo-mode JWT key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_DATABASE",
      "service": "media-proxy",
      "description": "Postgres database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_PASSWORD",
      "service": "media-proxy",
      "description": "Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_USERNAME",
      "service": "media-proxy",
      "description": "Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_BUCKET_REPORTS",
      "service": "media-proxy",
      "description": "Abuse reports bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-reports"
    },
    {
      "key": "FLUXER_S3_BUCKET_UPLOADS",
      "service": "media-proxy",
      "description": "Raw uploads bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-uploads"
    },
    {
      "key": "FLUXER_MARKETING_ENDPOINT",
      "service": "media-proxy",
      "description": "Marketing URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_NATS_JETSTREAM_URL",
      "service": "media-proxy",
      "description": "NATS JetStream URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_BUCKET_HARVESTS",
      "service": "media-proxy",
      "description": "Data export bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-harvests"
    },
    {
      "key": "FLUXER_S3_PUBLIC_ENDPOINT",
      "service": "media-proxy",
      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_FORCE_PATH_STYLE",
      "service": "media-proxy",
      "description": "Path-style S3 addressing",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_GATEWAY_PUSH_ENABLED",
      "service": "media-proxy",
      "description": "Browser push notifications (push service not deployed)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_S3_SECRET_ACCESS_KEY",
      "service": "media-proxy",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_ADMIN_SECRET_KEY_BASE",
      "service": "media-proxy",
      "description": "Admin session key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_API_ENDPOINT",
      "service": "media-proxy",
      "description": "Internal API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
      "service": "media-proxy",
      "description": "API<->Gateway RPC token",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_SECRET_KEY",
      "service": "media-proxy",
      "description": "Media proxy URL signing key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_TRUST_CLIENT_IP_HEADER",
      "service": "media-proxy",
      "description": "Trust X-Forwarded-For set by the edge",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
      "service": "media-proxy",
      "description": "Admin OAuth client secret",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT",
      "service": "media-proxy",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_STORAGE_BACKEND",
      "service": "media-proxy",
      "description": "Storage backend",
      "secret": false,
      "strategy": "default",
      "default": "s3"
    },
    {
      "key": "FLUXER_CONNECTION_INITIATION_SECRET",
      "service": "media-proxy",
      "description": "Connection initiation token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT",
      "service": "media-proxy",
      "description": "Internal media proxy URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_CORS_ALLOWED_ORIGINS",
      "service": "media-proxy",
      "description": "CORS origins",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT",
      "service": "media-proxy",
      "description": "Upload relay URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS",
      "service": "media-proxy",
      "description": "Passkey origins",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64",
      "service": "media-proxy",
      "description": "Upload relay token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED",
      "service": "media-proxy",
      "description": "Presigned data-export downloads",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PORT",
      "service": "gateway",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_ENV",
      "service": "gateway",
      "description": "Runtime environment",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "FLUXER_KV_URL",
      "service": "gateway",
      "description": "Valkey URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_NATS_URL",
      "service": "gateway",
      "description": "NATS URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_REGION",
      "service": "gateway",
      "description": "S3 region",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "FLUXER_SEARCH_URL",
      "service": "gateway",
      "description": "Meilisearch URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "gateway",
      "description": "Public hostname (set on the api service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PUBLIC_PORT",
      "service": "gateway",
      "description": "Public port",
      "secret": false,
      "strategy": "default",
      "default": "443"
    },
    {
      "key": "FLUXER_S3_ENDPOINT",
      "service": "gateway",
      "description": "S3 endpoint (SeaweedFS)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_SELF_HOSTED",
      "service": "gateway",
      "description": "Self-hosted mode",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_VAPID_EMAIL",
      "service": "gateway",
      "description": "Web push contact",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_APP_ENDPOINT",
      "service": "gateway",
      "description": "Web app URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_GATEWAY_PORT",
      "service": "gateway",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_SVC_NATS_URL",
      "service": "gateway",
      "description": "NATS URL for internal services",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_EMAIL_ENABLED",
      "service": "gateway",
      "description": "Email. Off = addresses auto-verified, no password reset mail",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_ERLANG_COOKIE",
      "service": "gateway",
      "description": "BEAM distribution cookie",
      "secret": false,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "FLUXER_PASSKEY_RP_ID",
      "service": "gateway",
      "description": "Passkey relying party",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_HOST",
      "service": "gateway",
      "description": "Postgres host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_POSTGRES_PORT",
      "service": "gateway",
      "description": "Postgres port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FLUXER_PUBLIC_SCHEME",
      "service": "gateway",
      "description": "Public scheme",
      "secret": false,
      "strategy": "default",
      "default": "https"
    },
    {
      "key": "FLUXER_S3_BUCKET_CDN",
      "service": "gateway",
      "description": "Processed assets bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "FLUXER_SEARCH_ENGINE",
      "service": "gateway",
      "description": "Search engine",
      "secret": false,
      "strategy": "default",
      "default": "meilisearch"
    },
    {
      "key": "FLUXER_ADMIN_ENDPOINT",
      "service": "gateway",
      "description": "Admin dashboard URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_ENDPOINT",
      "service": "gateway",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SEARCH_API_KEY",
      "service": "gateway",
      "description": "Meilisearch master key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_LIVEKIT_ENABLED",
      "service": "gateway",
      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_SVC_SHARD_COUNT",
      "service": "gateway",
      "description": "Internal service shard count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "FLUXER_DATABASE_BACKEND",
      "service": "gateway",
      "description": "Database backend",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "FLUXER_EMAIL_FROM_EMAIL",
      "service": "gateway",
      "description": "From address once SMTP is configured",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_ACCESS_KEY_ID",
      "service": "gateway",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SUDO_MODE_SECRET",
      "service": "gateway",
      "description": "Sudo-mode JWT key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_DATABASE",
      "service": "gateway",
      "description": "Postgres database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_PASSWORD",
      "service": "gateway",
      "description": "Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_USERNAME",
      "service": "gateway",
      "description": "Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_BUCKET_REPORTS",
      "service": "gateway",
      "description": "Abuse reports bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-reports"
    },
    {
      "key": "FLUXER_S3_BUCKET_UPLOADS",
      "service": "gateway",
      "description": "Raw uploads bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-uploads"
    },
    {
      "key": "FLUXER_MARKETING_ENDPOINT",
      "service": "gateway",
      "description": "Marketing URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_NATS_JETSTREAM_URL",
      "service": "gateway",
      "description": "NATS JetStream URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_BUCKET_HARVESTS",
      "service": "gateway",
      "description": "Data export bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-harvests"
    },
    {
      "key": "FLUXER_S3_PUBLIC_ENDPOINT",
      "service": "gateway",
      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_FORCE_PATH_STYLE",
      "service": "gateway",
      "description": "Path-style S3 addressing",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_GATEWAY_PUSH_ENABLED",
      "service": "gateway",
      "description": "Browser push notifications (push service not deployed)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_S3_SECRET_ACCESS_KEY",
      "service": "gateway",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_ADMIN_SECRET_KEY_BASE",
      "service": "gateway",
      "description": "Admin session key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_API_ENDPOINT",
      "service": "gateway",
      "description": "Internal API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
      "service": "gateway",
      "description": "API<->Gateway RPC token",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_SECRET_KEY",
      "service": "gateway",
      "description": "Media proxy URL signing key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_TRUST_CLIENT_IP_HEADER",
      "service": "gateway",
      "description": "Trust X-Forwarded-For set by the edge",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
      "service": "gateway",
      "description": "Admin OAuth client secret",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_GATEWAY_STATIC_CDN_ENDPOINT",
      "service": "gateway",
      "description": "Static CDN URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT",
      "service": "gateway",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_CONNECTION_INITIATION_SECRET",
      "service": "gateway",
      "description": "Connection initiation token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_GATEWAY_MEDIA_PROXY_ENDPOINT",
      "service": "gateway",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT",
      "service": "gateway",
      "description": "Internal media proxy URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT",
      "service": "gateway",
      "description": "Upload relay URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS",
      "service": "gateway",
      "description": "Passkey origins",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64",
      "service": "gateway",
      "description": "Upload relay token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED",
      "service": "gateway",
      "description": "Presigned data-export downloads",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "PGDATA",
      "service": "Postgres",
      "description": "Data subdirectory - keeps Postgres happy on Railway volumes",
      "secret": false,
      "strategy": "default",
      "default": "/var/lib/postgresql/data/pgdata"
    },
    {
      "key": "POSTGRES_DB",
      "service": "Postgres",
      "description": "Database name",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "POSTGRES_USER",
      "service": "Postgres",
      "description": "Database user",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "POSTGRES_PASSWORD",
      "service": "Postgres",
      "description": "Auto-generated database password",
      "secret": true,
      "strategy": "generate",
      "generate": "strong_password"
    },
    {
      "key": "RAILWAY_DEPLOYMENT_DRAINING_SECONDS",
      "service": "Postgres",
      "description": "Time for Postgres to shut down cleanly on redeploy",
      "secret": false,
      "strategy": "default",
      "default": "60"
    },
    {
      "key": "GOMEMLIMIT",
      "service": "SeaweedFS",
      "description": "Go heap soft limit",
      "secret": false,
      "strategy": "default",
      "default": "512MiB"
    },
    {
      "key": "S3_ACCESS_KEY",
      "service": "SeaweedFS",
      "description": "S3 access key",
      "secret": true,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "S3_SECRET_KEY",
      "service": "SeaweedFS",
      "description": "Auto-generated S3 secret key",
      "secret": true,
      "strategy": "generate",
      "generate": "random_base64_32"
    },
    {
      "key": "WEED_MASTER_VOLUME_GROWTH_COPY_1",
      "service": "SeaweedFS",
      "description": "Grow one volume at a time (upstream default)",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "PORT",
      "service": "api",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_ENV",
      "service": "api",
      "description": "Runtime environment",
      "secret": false,
      "strategy": "default",
      "default": "production"
    },
    {
      "key": "FLUXER_KV_URL",
      "service": "api",
      "description": "Valkey URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_BOOT_JS",
      "service": "api",
      "description": "Boot shim",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "SVC_DEPENDENCY",
      "service": "api",
      "description": "Orders this service after svc on deploy. Don't edit",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_PORT",
      "service": "api",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_NATS_URL",
      "service": "api",
      "description": "NATS URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_REGION",
      "service": "api",
      "description": "S3 region",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "FLUXER_SEARCH_URL",
      "service": "api",
      "description": "Meilisearch URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_VAPID_SEED",
      "service": "api",
      "description": "Seed for the derived VAPID keypair",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "api",
      "description": "Public hostname (set on the api service)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PUBLIC_PORT",
      "service": "api",
      "description": "Public port",
      "secret": false,
      "strategy": "default",
      "default": "443"
    },
    {
      "key": "FLUXER_S3_ENDPOINT",
      "service": "api",
      "description": "S3 endpoint (SeaweedFS)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_SELF_HOSTED",
      "service": "api",
      "description": "Self-hosted mode",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_VAPID_EMAIL",
      "service": "api",
      "description": "Web push contact",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_APP_ENDPOINT",
      "service": "api",
      "description": "Web app URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SVC_NATS_URL",
      "service": "api",
      "description": "NATS URL for internal services",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_EMAIL_ENABLED",
      "service": "api",
      "description": "Email. Off = addresses auto-verified, no password reset mail",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_PASSKEY_RP_ID",
      "service": "api",
      "description": "Passkey relying party",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_HOST",
      "service": "api",
      "description": "Postgres host",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_POSTGRES_PORT",
      "service": "api",
      "description": "Postgres port",
      "secret": false,
      "strategy": "default",
      "default": "5432"
    },
    {
      "key": "FLUXER_PUBLIC_SCHEME",
      "service": "api",
      "description": "Public scheme",
      "secret": false,
      "strategy": "default",
      "default": "https"
    },
    {
      "key": "FLUXER_S3_BUCKET_CDN",
      "service": "api",
      "description": "Processed assets bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer"
    },
    {
      "key": "FLUXER_SEARCH_ENGINE",
      "service": "api",
      "description": "Search engine",
      "secret": false,
      "strategy": "default",
      "default": "meilisearch"
    },
    {
      "key": "FLUXER_ADMIN_ENDPOINT",
      "service": "api",
      "description": "Admin dashboard URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_ENDPOINT",
      "service": "api",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SEARCH_API_KEY",
      "service": "api",
      "description": "Meilisearch master key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_LIVEKIT_ENABLED",
      "service": "api",
      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_SVC_SHARD_COUNT",
      "service": "api",
      "description": "Internal service shard count",
      "secret": false,
      "strategy": "default",
      "default": "1"
    },
    {
      "key": "FLUXER_DATABASE_BACKEND",
      "service": "api",
      "description": "Database backend",
      "secret": false,
      "strategy": "default",
      "default": "postgres"
    },
    {
      "key": "FLUXER_EMAIL_FROM_EMAIL",
      "service": "api",
      "description": "From address once SMTP is configured",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_ACCESS_KEY_ID",
      "service": "api",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_SUDO_MODE_SECRET",
      "service": "api",
      "description": "Sudo-mode JWT key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_DATABASE",
      "service": "api",
      "description": "Postgres database",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_PASSWORD",
      "service": "api",
      "description": "Postgres password",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_POSTGRES_USERNAME",
      "service": "api",
      "description": "Postgres user",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_BUCKET_REPORTS",
      "service": "api",
      "description": "Abuse reports bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-reports"
    },
    {
      "key": "FLUXER_S3_BUCKET_UPLOADS",
      "service": "api",
      "description": "Raw uploads bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-uploads"
    },
    {
      "key": "FLUXER_MARKETING_ENDPOINT",
      "service": "api",
      "description": "Marketing URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_NATS_JETSTREAM_URL",
      "service": "api",
      "description": "NATS JetStream URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_BUCKET_HARVESTS",
      "service": "api",
      "description": "Data export bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-harvests"
    },
    {
      "key": "FLUXER_S3_PUBLIC_ENDPOINT",
      "service": "api",
      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_FORCE_PATH_STYLE",
      "service": "api",
      "description": "Path-style S3 addressing",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_GATEWAY_PUSH_ENABLED",
      "service": "api",
      "description": "Browser push notifications (push service not deployed)",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_S3_SECRET_ACCESS_KEY",
      "service": "api",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_ADMIN_SECRET_KEY_BASE",
      "service": "api",
      "description": "Admin session key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_API_ENDPOINT",
      "service": "api",
      "description": "Internal API URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_GATEWAY_RPC_AUTH_TOKEN",
      "service": "api",
      "description": "API<->Gateway RPC token",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_SECRET_KEY",
      "service": "api",
      "description": "Media proxy URL signing key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_TRUST_CLIENT_IP_HEADER",
      "service": "api",
      "description": "Trust X-Forwarded-For set by the edge",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "FLUXER_POSTGRES_MAX_CONNECTIONS",
      "service": "api",
      "description": "Postgres pool size",
      "secret": false,
      "strategy": "default",
      "default": "20"
    },
    {
      "key": "FLUXER_ADMIN_OAUTH_CLIENT_SECRET",
      "service": "api",
      "description": "Admin OAuth client secret",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT",
      "service": "api",
      "description": "Public media URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_CONNECTION_INITIATION_SECRET",
      "service": "api",
      "description": "Connection initiation token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT",
      "service": "api",
      "description": "Internal media proxy URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT",
      "service": "api",
      "description": "Upload relay URL",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS",
      "service": "api",
      "description": "Passkey origins",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64",
      "service": "api",
      "description": "Upload relay token key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED",
      "service": "api",
      "description": "Presigned data-export downloads",
      "secret": false,
      "strategy": "default",
      "default": "false"
    },
    {
      "key": "FLUXER_API_PRESIGNED_ATTACHMENT_UPLOADS_ENABLED",
      "service": "api",
      "description": "Presigned attachment uploads",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PORT",
      "service": "app-proxy",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "FLUXER_S3_REGION",
      "service": "app-proxy",
      "description": "S3 region",
      "secret": false,
      "strategy": "default",
      "default": "us-east-1"
    },
    {
      "key": "FLUXER_BASE_DOMAIN",
      "service": "app-proxy",
      "description": "Public hostname",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_PUBLIC_PORT",
      "service": "app-proxy",
      "description": "Public port",
      "secret": false,
      "strategy": "default",
      "default": "443"
    },
    {
      "key": "FLUXER_S3_ENDPOINT",
      "service": "app-proxy",
      "description": "S3 endpoint (SeaweedFS)",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_PUBLIC_SCHEME",
      "service": "app-proxy",
      "description": "Public scheme",
      "secret": false,
      "strategy": "default",
      "default": "https"
    },
    {
      "key": "FLUXER_APP_PROXY_PORT",
      "service": "app-proxy",
      "description": "Listen port",
      "secret": false,
      "strategy": "default",
      "default": "8080"
    },
    {
      "key": "DISCOVERY_UPSTREAM_URL",
      "service": "app-proxy",
      "description": "Discovery via the edge's internal listener",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "railway_private_domain"
    },
    {
      "key": "FLUXER_S3_ACCESS_KEY_ID",
      "service": "app-proxy",
      "description": "S3 access key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_S3_BUCKET_UPLOADS",
      "service": "app-proxy",
      "description": "Raw uploads bucket",
      "secret": false,
      "strategy": "default",
      "default": "fluxer-uploads"
    },
    {
      "key": "FLUXER_S3_SECRET_ACCESS_KEY",
      "service": "app-proxy",
      "description": "S3 secret key",
      "secret": true,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    },
    {
      "key": "FLUXER_TRUST_CLIENT_IP_HEADER",
      "service": "app-proxy",
      "description": "Trust X-Forwarded-For set by the edge",
      "secret": false,
      "strategy": "default",
      "default": "true"
    },
    {
      "key": "PUBLIC_BOOTSTRAP_API_ENDPOINT",
      "service": "app-proxy",
      "description": "API path in the page bootstrap",
      "secret": false,
      "strategy": "default",
      "default": "/api"
    },
    {
      "key": "PUBLIC_BOOTSTRAP_API_PUBLIC_ENDPOINT",
      "service": "app-proxy",
      "description": "Absolute API URL in the page bootstrap",
      "secret": false,
      "strategy": "railway_provided",
      "railway_source": "reference_variable"
    }
  ],
  "deploy": {
    "mcp": {
      "server": "railway",
      "tool": "deploy_template",
      "args": {
        "template_code": "fluxer-chat"
      }
    },
    "cli": "railway deploy --template fluxer-chat",
    "api": {
      "method": "POST",
      "path": "/graphql/v2",
      "body": {
        "query": "mutation templateDeploy($input: TemplateDeployV2Input!) { templateDeployV2(input: $input) { projectId workflowId } }",
        "variables": {
          "input": {
            "templateId": "a4b3e7ba-6343-471c-8ae5-6a8fcaa47e83",
            "serializedConfig": {
              "services": {
                "1a9efa50-1935-5d74-a61d-90bafed4ba2c": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "worker",
                  "build": {},
                  "deploy": {
                    "startCommand": "/bin/sh -c 'exec node -e \"$FLUXER_BOOT_JS\" dist/WorkerEntrypoint.js'",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/fluxerapp/fluxer-api:2026.1004.160619"
                  },
                  "variables": {
                    "FLUXER_ENV": {
                      "isOptional": false,
                      "description": "Runtime environment",
                      "defaultValue": "production"
                    },
                    "FLUXER_KV_URL": {
                      "isOptional": false,
                      "description": "Valkey URL",
                      "defaultValue": "redis://:${{Valkey.VALKEY_PASSWORD}}@${{Valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FLUXER_BOOT_JS": {
                      "isOptional": false,
                      "description": "Boot shim",
                      "defaultValue": "${{Fluxer.FLUXER_BOOT_JS}}"
                    },
                    "SVC_DEPENDENCY": {
                      "isOptional": false,
                      "description": "Orders this service after svc on deploy. Don't edit",
                      "defaultValue": "${{svc.PORT}}"
                    },
                    "FLUXER_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region",
                      "defaultValue": "us-east-1"
                    },
                    "FLUXER_SEARCH_URL": {
                      "isOptional": false,
                      "description": "Meilisearch URL",
                      "defaultValue": "http://${{Meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "FLUXER_VAPID_SEED": {
                      "isOptional": false,
                      "description": "Seed for the derived VAPID keypair",
                      "defaultValue": "${{Fluxer.FLUXER_VAPID_SEED}}"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname (set on the api service)",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_PUBLIC_PORT": {
                      "isOptional": false,
                      "description": "Public port",
                      "defaultValue": "443"
                    },
                    "FLUXER_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint (SeaweedFS)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Self-hosted mode",
                      "defaultValue": "true"
                    },
                    "FLUXER_VAPID_EMAIL": {
                      "isOptional": false,
                      "description": "Web push contact",
                      "defaultValue": "admin@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_APP_ENDPOINT": {
                      "isOptional": false,
                      "description": "Web app URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_SVC_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL for internal services",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_EMAIL_ENABLED": {
                      "isOptional": false,
                      "description": "Email. Off = addresses auto-verified, no password reset mail",
                      "defaultValue": "false"
                    },
                    "FLUXER_PASSKEY_RP_ID": {
                      "isOptional": false,
                      "description": "Passkey relying party",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Postgres host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_PORT": {
                      "isOptional": false,
                      "description": "Postgres port",
                      "defaultValue": "5432"
                    },
                    "FLUXER_PUBLIC_SCHEME": {
                      "isOptional": false,
                      "description": "Public scheme",
                      "defaultValue": "https"
                    },
                    "FLUXER_S3_BUCKET_CDN": {
                      "isOptional": false,
                      "description": "Processed assets bucket",
                      "defaultValue": "fluxer"
                    },
                    "FLUXER_SEARCH_ENGINE": {
                      "isOptional": false,
                      "description": "Search engine",
                      "defaultValue": "meilisearch"
                    },
                    "FLUXER_ADMIN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Admin dashboard URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/admin"
                    },
                    "FLUXER_MEDIA_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_SEARCH_API_KEY": {
                      "isOptional": false,
                      "description": "Meilisearch master key",
                      "defaultValue": "${{Meilisearch.MEILI_MASTER_KEY}}"
                    },
                    "FLUXER_API_WORKER_MODE": {
                      "isOptional": false,
                      "description": "Run every job lane",
                      "defaultValue": "all_lanes"
                    },
                    "FLUXER_LIVEKIT_ENABLED": {
                      "isOptional": false,
                      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
                      "defaultValue": "false"
                    },
                    "FLUXER_SVC_SHARD_COUNT": {
                      "isOptional": false,
                      "description": "Internal service shard count",
                      "defaultValue": "1"
                    },
                    "FLUXER_DATABASE_BACKEND": {
                      "isOptional": false,
                      "description": "Database backend",
                      "defaultValue": "postgres"
                    },
                    "FLUXER_EMAIL_FROM_EMAIL": {
                      "isOptional": false,
                      "description": "From address once SMTP is configured",
                      "defaultValue": "noreply@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{SeaweedFS.S3_ACCESS_KEY}}"
                    },
                    "FLUXER_SUDO_MODE_SECRET": {
                      "isOptional": false,
                      "description": "Sudo-mode JWT key",
                      "defaultValue": "${{Fluxer.FLUXER_SUDO_MODE_SECRET}}"
                    },
                    "FLUXER_POSTGRES_DATABASE": {
                      "isOptional": false,
                      "description": "Postgres database",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "FLUXER_POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "FLUXER_POSTGRES_USERNAME": {
                      "isOptional": false,
                      "description": "Postgres user",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "FLUXER_S3_BUCKET_REPORTS": {
                      "isOptional": false,
                      "description": "Abuse reports bucket",
                      "defaultValue": "fluxer-reports"
                    },
                    "FLUXER_S3_BUCKET_UPLOADS": {
                      "isOptional": false,
                      "description": "Raw uploads bucket",
                      "defaultValue": "fluxer-uploads"
                    },
                    "FLUXER_MARKETING_ENDPOINT": {
                      "isOptional": false,
                      "description": "Marketing URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_NATS_JETSTREAM_URL": {
                      "isOptional": false,
                      "description": "NATS JetStream URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_BUCKET_HARVESTS": {
                      "isOptional": false,
                      "description": "Data export bucket",
                      "defaultValue": "fluxer-harvests"
                    },
                    "FLUXER_S3_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 addressing",
                      "defaultValue": "true"
                    },
                    "FLUXER_GATEWAY_PUSH_ENABLED": {
                      "isOptional": false,
                      "description": "Browser push notifications (push service not deployed)",
                      "defaultValue": "false"
                    },
                    "FLUXER_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{SeaweedFS.S3_SECRET_KEY}}"
                    },
                    "FLUXER_ADMIN_SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Admin session key",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_SECRET_KEY_BASE}}"
                    },
                    "FLUXER_INTERNAL_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal API URL",
                      "defaultValue": "http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_GATEWAY_RPC_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "API<->Gateway RPC token",
                      "defaultValue": "${{Fluxer.FLUXER_GATEWAY_RPC_AUTH_TOKEN}}"
                    },
                    "FLUXER_MEDIA_PROXY_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Media proxy URL signing key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_SECRET_KEY}}"
                    },
                    "FLUXER_TRUST_CLIENT_IP_HEADER": {
                      "isOptional": false,
                      "description": "Trust X-Forwarded-For set by the edge",
                      "defaultValue": "true"
                    },
                    "FLUXER_POSTGRES_MAX_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Postgres pool size",
                      "defaultValue": "15"
                    },
                    "FLUXER_ADMIN_OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Admin OAuth client secret",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_OAUTH_CLIENT_SECRET}}"
                    },
                    "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_CONNECTION_INITIATION_SECRET": {
                      "isOptional": false,
                      "description": "Connection initiation token key",
                      "defaultValue": "${{Fluxer.FLUXER_CONNECTION_INITIATION_SECRET}}"
                    },
                    "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal media proxy URL",
                      "defaultValue": "http://${{media-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_API_WORKER_ENABLE_CRON_SCHEDULER": {
                      "isOptional": false,
                      "description": "Run cron jobs",
                      "defaultValue": "true"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Upload relay URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "Passkey origins",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64": {
                      "isOptional": false,
                      "description": "Upload relay token key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64}}"
                    },
                    "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED": {
                      "isOptional": false,
                      "description": "Presigned data-export downloads",
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "3b12c87b-3343-59a8-a5ec-92856cbe1d9e": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/valkey.svg",
                  "name": "Valkey",
                  "build": {},
                  "deploy": {
                    "startCommand": "/bin/sh -c \"chown -R valkey:valkey /data && exec docker-entrypoint.sh valkey-server --requirepass $VALKEY_PASSWORD --appendonly yes --dir /data --maxmemory 192mb --maxmemory-policy noeviction\"",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "valkey/valkey:9.1-alpine"
                  },
                  "variables": {
                    "VALKEY_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated Valkey password",
                      "defaultValue": "{{VALKEY_PASSWORD}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "87148561-abf4-5c89-836d-20ac491d5411": {
                      "mountPath": "/data"
                    }
                  }
                },
                "500146e4-da5b-52f9-8066-8c8ea7d7f040": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "svc",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/nomideusz/fluxer-railway",
                    "rootDirectory": "/svc"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Health port of the first internal service (healthcheck)",
                      "defaultValue": "8090"
                    },
                    "FLUXER_ENV": {
                      "isOptional": false,
                      "description": "Runtime environment",
                      "defaultValue": "production"
                    },
                    "FLUXER_KV_URL": {
                      "isOptional": false,
                      "description": "Valkey URL",
                      "defaultValue": "redis://:${{Valkey.VALKEY_PASSWORD}}@${{Valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FLUXER_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region",
                      "defaultValue": "us-east-1"
                    },
                    "FLUXER_SEARCH_URL": {
                      "isOptional": false,
                      "description": "Meilisearch URL",
                      "defaultValue": "http://${{Meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname (set on the api service)",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_PUBLIC_PORT": {
                      "isOptional": false,
                      "description": "Public port",
                      "defaultValue": "443"
                    },
                    "FLUXER_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint (SeaweedFS)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Self-hosted mode",
                      "defaultValue": "true"
                    },
                    "FLUXER_VAPID_EMAIL": {
                      "isOptional": false,
                      "description": "Web push contact",
                      "defaultValue": "admin@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_APP_ENDPOINT": {
                      "isOptional": false,
                      "description": "Web app URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_SVC_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL for internal services",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_EMAIL_ENABLED": {
                      "isOptional": false,
                      "description": "Email. Off = addresses auto-verified, no password reset mail",
                      "defaultValue": "false"
                    },
                    "FLUXER_PASSKEY_RP_ID": {
                      "isOptional": false,
                      "description": "Passkey relying party",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Postgres host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_PORT": {
                      "isOptional": false,
                      "description": "Postgres port",
                      "defaultValue": "5432"
                    },
                    "FLUXER_PUBLIC_SCHEME": {
                      "isOptional": false,
                      "description": "Public scheme",
                      "defaultValue": "https"
                    },
                    "FLUXER_S3_BUCKET_CDN": {
                      "isOptional": false,
                      "description": "Processed assets bucket",
                      "defaultValue": "fluxer"
                    },
                    "FLUXER_SEARCH_ENGINE": {
                      "isOptional": false,
                      "description": "Search engine",
                      "defaultValue": "meilisearch"
                    },
                    "FLUXER_ADMIN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Admin dashboard URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/admin"
                    },
                    "FLUXER_MEDIA_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_SEARCH_API_KEY": {
                      "isOptional": false,
                      "description": "Meilisearch master key",
                      "defaultValue": "${{Meilisearch.MEILI_MASTER_KEY}}"
                    },
                    "FLUXER_LIVEKIT_ENABLED": {
                      "isOptional": false,
                      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
                      "defaultValue": "false"
                    },
                    "FLUXER_SVC_SHARD_COUNT": {
                      "isOptional": false,
                      "description": "Internal service shard count",
                      "defaultValue": "1"
                    },
                    "FLUXER_DATABASE_BACKEND": {
                      "isOptional": false,
                      "description": "Database backend",
                      "defaultValue": "postgres"
                    },
                    "FLUXER_EMAIL_FROM_EMAIL": {
                      "isOptional": false,
                      "description": "From address once SMTP is configured",
                      "defaultValue": "noreply@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{SeaweedFS.S3_ACCESS_KEY}}"
                    },
                    "FLUXER_SUDO_MODE_SECRET": {
                      "isOptional": false,
                      "description": "Sudo-mode JWT key",
                      "defaultValue": "${{Fluxer.FLUXER_SUDO_MODE_SECRET}}"
                    },
                    "FLUXER_POSTGRES_DATABASE": {
                      "isOptional": false,
                      "description": "Postgres database",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "FLUXER_POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "FLUXER_POSTGRES_USERNAME": {
                      "isOptional": false,
                      "description": "Postgres user",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "FLUXER_S3_BUCKET_REPORTS": {
                      "isOptional": false,
                      "description": "Abuse reports bucket",
                      "defaultValue": "fluxer-reports"
                    },
                    "FLUXER_S3_BUCKET_UPLOADS": {
                      "isOptional": false,
                      "description": "Raw uploads bucket",
                      "defaultValue": "fluxer-uploads"
                    },
                    "FLUXER_MARKETING_ENDPOINT": {
                      "isOptional": false,
                      "description": "Marketing URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_NATS_JETSTREAM_URL": {
                      "isOptional": false,
                      "description": "NATS JetStream URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_BUCKET_HARVESTS": {
                      "isOptional": false,
                      "description": "Data export bucket",
                      "defaultValue": "fluxer-harvests"
                    },
                    "FLUXER_S3_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 addressing",
                      "defaultValue": "true"
                    },
                    "FLUXER_GATEWAY_PUSH_ENABLED": {
                      "isOptional": false,
                      "description": "Browser push notifications (push service not deployed)",
                      "defaultValue": "false"
                    },
                    "FLUXER_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{SeaweedFS.S3_SECRET_KEY}}"
                    },
                    "FLUXER_ADMIN_SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Admin session key",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_SECRET_KEY_BASE}}"
                    },
                    "FLUXER_INTERNAL_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal API URL",
                      "defaultValue": "http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_GATEWAY_RPC_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "API<->Gateway RPC token",
                      "defaultValue": "${{Fluxer.FLUXER_GATEWAY_RPC_AUTH_TOKEN}}"
                    },
                    "FLUXER_MEDIA_PROXY_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Media proxy URL signing key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_SECRET_KEY}}"
                    },
                    "FLUXER_TRUST_CLIENT_IP_HEADER": {
                      "isOptional": false,
                      "description": "Trust X-Forwarded-For set by the edge",
                      "defaultValue": "true"
                    },
                    "FLUXER_ADMIN_OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Admin OAuth client secret",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_OAUTH_CLIENT_SECRET}}"
                    },
                    "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_CONNECTION_INITIATION_SECRET": {
                      "isOptional": false,
                      "description": "Connection initiation token key",
                      "defaultValue": "${{Fluxer.FLUXER_CONNECTION_INITIATION_SECRET}}"
                    },
                    "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal media proxy URL",
                      "defaultValue": "http://${{media-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Upload relay URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "Passkey origins",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64": {
                      "isOptional": false,
                      "description": "Upload relay token key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64}}"
                    },
                    "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED": {
                      "isOptional": false,
                      "description": "Presigned data-export downloads",
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "7322c947-0399-5860-965d-363a9bf076f3": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "Fluxer",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/nomideusz/fluxer-railway",
                    "rootDirectory": "/edge"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Edge listen port",
                      "defaultValue": "8080"
                    },
                    "API_UPSTREAM": {
                      "isOptional": false,
                      "description": "api upstream",
                      "defaultValue": "${{api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "APP_UPSTREAM": {
                      "isOptional": false,
                      "description": "app-proxy upstream",
                      "defaultValue": "${{app-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "ADMIN_UPSTREAM": {
                      "isOptional": false,
                      "description": "admin upstream",
                      "defaultValue": "${{admin.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_BOOT_JS": {
                      "isOptional": false,
                      "description": "Boot shim: derives FLUXER_VAPID_* from FLUXER_VAPID_SEED, then starts Fluxer. Don't edit",
                      "defaultValue": "const c=process.getBuiltinModule('crypto'),u=process.getBuiltinModule('url'),e=process.env;if(!e.FLUXER_VAPID_PRIVATE_KEY){const k=c.createHash('sha256').update('fluxer-vapid:'+e.FLUXER_VAPID_SEED).digest(),d=c.createECDH('prime256v1');d.setPrivateKey(k);e.FLUXER_VAPID_PRIVATE_KEY=k.toString('base64url');e.FLUXER_VAPID_PUBLIC_KEY=d.getPublicKey().toString('base64url')}import(u.pathToFileURL(process.argv[1]).href)"
                    },
                    "MEDIA_UPSTREAM": {
                      "isOptional": false,
                      "description": "media-proxy upstream",
                      "defaultValue": "${{media-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "GATEWAY_UPSTREAM": {
                      "isOptional": false,
                      "description": "gateway upstream",
                      "defaultValue": "${{gateway.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_VAPID_SEED": {
                      "isOptional": false,
                      "description": "Seed the web-push VAPID keypair is derived from at boot",
                      "defaultValue": "{{FLUXER_VAPID_SEED}}"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname every service reads. Change this when you add a custom domain",
                      "defaultValue": "${{RAILWAY_PUBLIC_DOMAIN}}"
                    },
                    "FLUXER_SUDO_MODE_SECRET": {
                      "isOptional": false,
                      "description": "Sudo-mode JWT key",
                      "defaultValue": "{{FLUXER_SUDO_MODE_SECRET}}"
                    },
                    "FLUXER_ADMIN_SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Admin session key",
                      "defaultValue": "{{FLUXER_ADMIN_SECRET_KEY_BASE}}"
                    },
                    "FLUXER_GATEWAY_RPC_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "API<->Gateway RPC token",
                      "defaultValue": "{{FLUXER_GATEWAY_RPC_AUTH_TOKEN}}"
                    },
                    "FLUXER_MEDIA_PROXY_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Media proxy URL signing key",
                      "defaultValue": "{{FLUXER_MEDIA_PROXY_SECRET_KEY}}"
                    },
                    "FLUXER_ADMIN_OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Admin OAuth client secret",
                      "defaultValue": "{{FLUXER_ADMIN_OAUTH_CLIENT_SECRET}}"
                    },
                    "FLUXER_CONNECTION_INITIATION_SECRET": {
                      "isOptional": false,
                      "description": "Connection initiation token key",
                      "defaultValue": "{{FLUXER_CONNECTION_INITIATION_SECRET}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64": {
                      "isOptional": false,
                      "description": "Upload relay token key (base64, >=32 bytes)",
                      "defaultValue": "{{FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64}}"
                    }
                  },
                  "networking": {
                    "serviceDomains": {
                      "<hasDomain>": {}
                    }
                  }
                },
                "7fe7267a-40e9-5b16-9451-45b83073bbc4": {
                  "icon": "https://cdn.simpleicons.org/natsdotio",
                  "name": "NATS",
                  "build": {},
                  "deploy": {
                    "startCommand": "nats-server -js -sd /data -m 8222",
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "nats:2.14-alpine"
                  },
                  "variables": {},
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "daefba23-a7ac-5905-b01e-b631f84e0825": {
                      "mountPath": "/data"
                    }
                  }
                },
                "8395fec8-47af-517e-af5e-fd126c5c8c1c": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "admin",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/fluxerapp/fluxer-admin:2026.1003.122521"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_ENV": {
                      "isOptional": false,
                      "description": "Runtime environment",
                      "defaultValue": "production"
                    },
                    "FLUXER_KV_URL": {
                      "isOptional": false,
                      "description": "Valkey URL",
                      "defaultValue": "redis://:${{Valkey.VALKEY_PASSWORD}}@${{Valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FLUXER_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region",
                      "defaultValue": "us-east-1"
                    },
                    "FLUXER_ADMIN_PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_SEARCH_URL": {
                      "isOptional": false,
                      "description": "Meilisearch URL",
                      "defaultValue": "http://${{Meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname (set on the api service)",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_PUBLIC_PORT": {
                      "isOptional": false,
                      "description": "Public port",
                      "defaultValue": "443"
                    },
                    "FLUXER_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint (SeaweedFS)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Self-hosted mode",
                      "defaultValue": "true"
                    },
                    "FLUXER_VAPID_EMAIL": {
                      "isOptional": false,
                      "description": "Web push contact",
                      "defaultValue": "admin@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal API URL",
                      "defaultValue": "http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_APP_ENDPOINT": {
                      "isOptional": false,
                      "description": "Web app URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_SVC_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL for internal services",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_EMAIL_ENABLED": {
                      "isOptional": false,
                      "description": "Email. Off = addresses auto-verified, no password reset mail",
                      "defaultValue": "false"
                    },
                    "FLUXER_PASSKEY_RP_ID": {
                      "isOptional": false,
                      "description": "Passkey relying party",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Postgres host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_PORT": {
                      "isOptional": false,
                      "description": "Postgres port",
                      "defaultValue": "5432"
                    },
                    "FLUXER_PUBLIC_SCHEME": {
                      "isOptional": false,
                      "description": "Public scheme",
                      "defaultValue": "https"
                    },
                    "FLUXER_S3_BUCKET_CDN": {
                      "isOptional": false,
                      "description": "Processed assets bucket",
                      "defaultValue": "fluxer"
                    },
                    "FLUXER_SEARCH_ENGINE": {
                      "isOptional": false,
                      "description": "Search engine",
                      "defaultValue": "meilisearch"
                    },
                    "FLUXER_ADMIN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Admin dashboard URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/admin"
                    },
                    "FLUXER_MEDIA_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_SEARCH_API_KEY": {
                      "isOptional": false,
                      "description": "Meilisearch master key",
                      "defaultValue": "${{Meilisearch.MEILI_MASTER_KEY}}"
                    },
                    "FLUXER_ADMIN_BASE_PATH": {
                      "isOptional": false,
                      "description": "Admin path",
                      "defaultValue": "/admin"
                    },
                    "FLUXER_LIVEKIT_ENABLED": {
                      "isOptional": false,
                      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
                      "defaultValue": "false"
                    },
                    "FLUXER_SVC_SHARD_COUNT": {
                      "isOptional": false,
                      "description": "Internal service shard count",
                      "defaultValue": "1"
                    },
                    "FLUXER_DATABASE_BACKEND": {
                      "isOptional": false,
                      "description": "Database backend",
                      "defaultValue": "postgres"
                    },
                    "FLUXER_EMAIL_FROM_EMAIL": {
                      "isOptional": false,
                      "description": "From address once SMTP is configured",
                      "defaultValue": "noreply@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{SeaweedFS.S3_ACCESS_KEY}}"
                    },
                    "FLUXER_SUDO_MODE_SECRET": {
                      "isOptional": false,
                      "description": "Sudo-mode JWT key",
                      "defaultValue": "${{Fluxer.FLUXER_SUDO_MODE_SECRET}}"
                    },
                    "FLUXER_POSTGRES_DATABASE": {
                      "isOptional": false,
                      "description": "Postgres database",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "FLUXER_POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "FLUXER_POSTGRES_USERNAME": {
                      "isOptional": false,
                      "description": "Postgres user",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "FLUXER_S3_BUCKET_REPORTS": {
                      "isOptional": false,
                      "description": "Abuse reports bucket",
                      "defaultValue": "fluxer-reports"
                    },
                    "FLUXER_S3_BUCKET_UPLOADS": {
                      "isOptional": false,
                      "description": "Raw uploads bucket",
                      "defaultValue": "fluxer-uploads"
                    },
                    "FLUXER_MARKETING_ENDPOINT": {
                      "isOptional": false,
                      "description": "Marketing URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_NATS_JETSTREAM_URL": {
                      "isOptional": false,
                      "description": "NATS JetStream URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_BUCKET_HARVESTS": {
                      "isOptional": false,
                      "description": "Data export bucket",
                      "defaultValue": "fluxer-harvests"
                    },
                    "FLUXER_S3_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 addressing",
                      "defaultValue": "true"
                    },
                    "FLUXER_STATIC_CDN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Static CDN URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_GATEWAY_PUSH_ENABLED": {
                      "isOptional": false,
                      "description": "Browser push notifications (push service not deployed)",
                      "defaultValue": "false"
                    },
                    "FLUXER_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{SeaweedFS.S3_SECRET_KEY}}"
                    },
                    "FLUXER_ADMIN_SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Admin session key",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_SECRET_KEY_BASE}}"
                    },
                    "FLUXER_INTERNAL_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal API URL",
                      "defaultValue": "http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_GATEWAY_RPC_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "API<->Gateway RPC token",
                      "defaultValue": "${{Fluxer.FLUXER_GATEWAY_RPC_AUTH_TOKEN}}"
                    },
                    "FLUXER_MEDIA_PROXY_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Media proxy URL signing key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_SECRET_KEY}}"
                    },
                    "FLUXER_TRUST_CLIENT_IP_HEADER": {
                      "isOptional": false,
                      "description": "Trust X-Forwarded-For set by the edge",
                      "defaultValue": "true"
                    },
                    "FLUXER_ADMIN_OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Admin OAuth client secret",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_OAUTH_CLIENT_SECRET}}"
                    },
                    "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_CONNECTION_INITIATION_SECRET": {
                      "isOptional": false,
                      "description": "Connection initiation token key",
                      "defaultValue": "${{Fluxer.FLUXER_CONNECTION_INITIATION_SECRET}}"
                    },
                    "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal media proxy URL",
                      "defaultValue": "http://${{media-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Upload relay URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "Passkey origins",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64": {
                      "isOptional": false,
                      "description": "Upload relay token key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64}}"
                    },
                    "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED": {
                      "isOptional": false,
                      "description": "Presigned data-export downloads",
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "84e430e9-b216-52fd-aaba-71dedeabf3c6": {
                  "icon": "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/meilisearch.svg",
                  "name": "Meilisearch",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "getmeili/meilisearch:v1.53"
                  },
                  "variables": {
                    "MEILI_ENV": {
                      "isOptional": false,
                      "description": "Meilisearch mode",
                      "defaultValue": "production"
                    },
                    "MEILI_HTTP_ADDR": {
                      "isOptional": false,
                      "description": "Listen on IPv6 + IPv4 for private networking",
                      "defaultValue": "[::]:7700"
                    },
                    "MEILI_MASTER_KEY": {
                      "isOptional": false,
                      "description": "Auto-generated Meilisearch master key",
                      "defaultValue": "{{MEILI_MASTER_KEY}}"
                    },
                    "MEILI_NO_ANALYTICS": {
                      "isOptional": false,
                      "description": "Disable telemetry",
                      "defaultValue": "true"
                    },
                    "MEILI_MAX_INDEXING_MEMORY": {
                      "isOptional": false,
                      "description": "Indexing memory cap",
                      "defaultValue": "256mb"
                    },
                    "MEILI_MAX_INDEXING_THREADS": {
                      "isOptional": false,
                      "description": "Indexing threads",
                      "defaultValue": "2"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "a45e1f41-269d-548b-ae20-d7464ad1b419": {
                      "mountPath": "/meili_data"
                    }
                  }
                },
                "8ee41afd-d8ce-5f8a-8ed6-69a33e217f21": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "media-proxy",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/fluxerapp/fluxer-media-proxy:2026.1003.110721"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_ENV": {
                      "isOptional": false,
                      "description": "Runtime environment",
                      "defaultValue": "production"
                    },
                    "FLUXER_KV_URL": {
                      "isOptional": false,
                      "description": "Valkey URL",
                      "defaultValue": "redis://:${{Valkey.VALKEY_PASSWORD}}@${{Valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FLUXER_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region",
                      "defaultValue": "us-east-1"
                    },
                    "FLUXER_SEARCH_URL": {
                      "isOptional": false,
                      "description": "Meilisearch URL",
                      "defaultValue": "http://${{Meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname (set on the api service)",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_PUBLIC_PORT": {
                      "isOptional": false,
                      "description": "Public port",
                      "defaultValue": "443"
                    },
                    "FLUXER_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint (SeaweedFS)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Self-hosted mode",
                      "defaultValue": "true"
                    },
                    "FLUXER_VAPID_EMAIL": {
                      "isOptional": false,
                      "description": "Web push contact",
                      "defaultValue": "admin@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_APP_ENDPOINT": {
                      "isOptional": false,
                      "description": "Web app URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_SVC_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL for internal services",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_EMAIL_ENABLED": {
                      "isOptional": false,
                      "description": "Email. Off = addresses auto-verified, no password reset mail",
                      "defaultValue": "false"
                    },
                    "FLUXER_PASSKEY_RP_ID": {
                      "isOptional": false,
                      "description": "Passkey relying party",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Postgres host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_PORT": {
                      "isOptional": false,
                      "description": "Postgres port",
                      "defaultValue": "5432"
                    },
                    "FLUXER_PUBLIC_SCHEME": {
                      "isOptional": false,
                      "description": "Public scheme",
                      "defaultValue": "https"
                    },
                    "FLUXER_S3_BUCKET_CDN": {
                      "isOptional": false,
                      "description": "Processed assets bucket",
                      "defaultValue": "fluxer"
                    },
                    "FLUXER_SEARCH_ENGINE": {
                      "isOptional": false,
                      "description": "Search engine",
                      "defaultValue": "meilisearch"
                    },
                    "FLUXER_ADMIN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Admin dashboard URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/admin"
                    },
                    "FLUXER_MEDIA_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_S3_READ_SIGNED": {
                      "isOptional": false,
                      "description": "Sign S3 reads",
                      "defaultValue": "true"
                    },
                    "FLUXER_SEARCH_API_KEY": {
                      "isOptional": false,
                      "description": "Meilisearch master key",
                      "defaultValue": "${{Meilisearch.MEILI_MASTER_KEY}}"
                    },
                    "FLUXER_LIVEKIT_ENABLED": {
                      "isOptional": false,
                      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
                      "defaultValue": "false"
                    },
                    "FLUXER_SVC_SHARD_COUNT": {
                      "isOptional": false,
                      "description": "Internal service shard count",
                      "defaultValue": "1"
                    },
                    "FLUXER_DATABASE_BACKEND": {
                      "isOptional": false,
                      "description": "Database backend",
                      "defaultValue": "postgres"
                    },
                    "FLUXER_EMAIL_FROM_EMAIL": {
                      "isOptional": false,
                      "description": "From address once SMTP is configured",
                      "defaultValue": "noreply@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_MODE": {
                      "isOptional": false,
                      "description": "Serve media + upload relay",
                      "defaultValue": "upload"
                    },
                    "FLUXER_MEDIA_PROXY_PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{SeaweedFS.S3_ACCESS_KEY}}"
                    },
                    "FLUXER_SUDO_MODE_SECRET": {
                      "isOptional": false,
                      "description": "Sudo-mode JWT key",
                      "defaultValue": "${{Fluxer.FLUXER_SUDO_MODE_SECRET}}"
                    },
                    "FLUXER_POSTGRES_DATABASE": {
                      "isOptional": false,
                      "description": "Postgres database",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "FLUXER_POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "FLUXER_POSTGRES_USERNAME": {
                      "isOptional": false,
                      "description": "Postgres user",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "FLUXER_S3_BUCKET_REPORTS": {
                      "isOptional": false,
                      "description": "Abuse reports bucket",
                      "defaultValue": "fluxer-reports"
                    },
                    "FLUXER_S3_BUCKET_UPLOADS": {
                      "isOptional": false,
                      "description": "Raw uploads bucket",
                      "defaultValue": "fluxer-uploads"
                    },
                    "FLUXER_MARKETING_ENDPOINT": {
                      "isOptional": false,
                      "description": "Marketing URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_NATS_JETSTREAM_URL": {
                      "isOptional": false,
                      "description": "NATS JetStream URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_BUCKET_HARVESTS": {
                      "isOptional": false,
                      "description": "Data export bucket",
                      "defaultValue": "fluxer-harvests"
                    },
                    "FLUXER_S3_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 addressing",
                      "defaultValue": "true"
                    },
                    "FLUXER_GATEWAY_PUSH_ENABLED": {
                      "isOptional": false,
                      "description": "Browser push notifications (push service not deployed)",
                      "defaultValue": "false"
                    },
                    "FLUXER_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{SeaweedFS.S3_SECRET_KEY}}"
                    },
                    "FLUXER_ADMIN_SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Admin session key",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_SECRET_KEY_BASE}}"
                    },
                    "FLUXER_INTERNAL_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal API URL",
                      "defaultValue": "http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_GATEWAY_RPC_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "API<->Gateway RPC token",
                      "defaultValue": "${{Fluxer.FLUXER_GATEWAY_RPC_AUTH_TOKEN}}"
                    },
                    "FLUXER_MEDIA_PROXY_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Media proxy URL signing key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_SECRET_KEY}}"
                    },
                    "FLUXER_TRUST_CLIENT_IP_HEADER": {
                      "isOptional": false,
                      "description": "Trust X-Forwarded-For set by the edge",
                      "defaultValue": "true"
                    },
                    "FLUXER_ADMIN_OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Admin OAuth client secret",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_OAUTH_CLIENT_SECRET}}"
                    },
                    "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_MEDIA_PROXY_STORAGE_BACKEND": {
                      "isOptional": false,
                      "description": "Storage backend",
                      "defaultValue": "s3"
                    },
                    "FLUXER_CONNECTION_INITIATION_SECRET": {
                      "isOptional": false,
                      "description": "Connection initiation token key",
                      "defaultValue": "${{Fluxer.FLUXER_CONNECTION_INITIATION_SECRET}}"
                    },
                    "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal media proxy URL",
                      "defaultValue": "http://${{media-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_MEDIA_PROXY_CORS_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "CORS origins",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Upload relay URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "Passkey origins",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64": {
                      "isOptional": false,
                      "description": "Upload relay token key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64}}"
                    },
                    "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED": {
                      "isOptional": false,
                      "description": "Presigned data-export downloads",
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "9768c4f6-efee-55db-b2e4-de5944d8e56e": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "gateway",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/fluxerapp/fluxer-gateway:2026.1004.10845"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_ENV": {
                      "isOptional": false,
                      "description": "Runtime environment",
                      "defaultValue": "production"
                    },
                    "FLUXER_KV_URL": {
                      "isOptional": false,
                      "description": "Valkey URL",
                      "defaultValue": "redis://:${{Valkey.VALKEY_PASSWORD}}@${{Valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FLUXER_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region",
                      "defaultValue": "us-east-1"
                    },
                    "FLUXER_SEARCH_URL": {
                      "isOptional": false,
                      "description": "Meilisearch URL",
                      "defaultValue": "http://${{Meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname (set on the api service)",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_PUBLIC_PORT": {
                      "isOptional": false,
                      "description": "Public port",
                      "defaultValue": "443"
                    },
                    "FLUXER_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint (SeaweedFS)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Self-hosted mode",
                      "defaultValue": "true"
                    },
                    "FLUXER_VAPID_EMAIL": {
                      "isOptional": false,
                      "description": "Web push contact",
                      "defaultValue": "admin@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_APP_ENDPOINT": {
                      "isOptional": false,
                      "description": "Web app URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_GATEWAY_PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_SVC_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL for internal services",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_EMAIL_ENABLED": {
                      "isOptional": false,
                      "description": "Email. Off = addresses auto-verified, no password reset mail",
                      "defaultValue": "false"
                    },
                    "FLUXER_ERLANG_COOKIE": {
                      "isOptional": false,
                      "description": "BEAM distribution cookie",
                      "defaultValue": "{{FLUXER_ERLANG_COOKIE}}"
                    },
                    "FLUXER_PASSKEY_RP_ID": {
                      "isOptional": false,
                      "description": "Passkey relying party",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Postgres host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_PORT": {
                      "isOptional": false,
                      "description": "Postgres port",
                      "defaultValue": "5432"
                    },
                    "FLUXER_PUBLIC_SCHEME": {
                      "isOptional": false,
                      "description": "Public scheme",
                      "defaultValue": "https"
                    },
                    "FLUXER_S3_BUCKET_CDN": {
                      "isOptional": false,
                      "description": "Processed assets bucket",
                      "defaultValue": "fluxer"
                    },
                    "FLUXER_SEARCH_ENGINE": {
                      "isOptional": false,
                      "description": "Search engine",
                      "defaultValue": "meilisearch"
                    },
                    "FLUXER_ADMIN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Admin dashboard URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/admin"
                    },
                    "FLUXER_MEDIA_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_SEARCH_API_KEY": {
                      "isOptional": false,
                      "description": "Meilisearch master key",
                      "defaultValue": "${{Meilisearch.MEILI_MASTER_KEY}}"
                    },
                    "FLUXER_LIVEKIT_ENABLED": {
                      "isOptional": false,
                      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
                      "defaultValue": "false"
                    },
                    "FLUXER_SVC_SHARD_COUNT": {
                      "isOptional": false,
                      "description": "Internal service shard count",
                      "defaultValue": "1"
                    },
                    "FLUXER_DATABASE_BACKEND": {
                      "isOptional": false,
                      "description": "Database backend",
                      "defaultValue": "postgres"
                    },
                    "FLUXER_EMAIL_FROM_EMAIL": {
                      "isOptional": false,
                      "description": "From address once SMTP is configured",
                      "defaultValue": "noreply@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{SeaweedFS.S3_ACCESS_KEY}}"
                    },
                    "FLUXER_SUDO_MODE_SECRET": {
                      "isOptional": false,
                      "description": "Sudo-mode JWT key",
                      "defaultValue": "${{Fluxer.FLUXER_SUDO_MODE_SECRET}}"
                    },
                    "FLUXER_POSTGRES_DATABASE": {
                      "isOptional": false,
                      "description": "Postgres database",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "FLUXER_POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "FLUXER_POSTGRES_USERNAME": {
                      "isOptional": false,
                      "description": "Postgres user",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "FLUXER_S3_BUCKET_REPORTS": {
                      "isOptional": false,
                      "description": "Abuse reports bucket",
                      "defaultValue": "fluxer-reports"
                    },
                    "FLUXER_S3_BUCKET_UPLOADS": {
                      "isOptional": false,
                      "description": "Raw uploads bucket",
                      "defaultValue": "fluxer-uploads"
                    },
                    "FLUXER_MARKETING_ENDPOINT": {
                      "isOptional": false,
                      "description": "Marketing URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_NATS_JETSTREAM_URL": {
                      "isOptional": false,
                      "description": "NATS JetStream URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_BUCKET_HARVESTS": {
                      "isOptional": false,
                      "description": "Data export bucket",
                      "defaultValue": "fluxer-harvests"
                    },
                    "FLUXER_S3_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 addressing",
                      "defaultValue": "true"
                    },
                    "FLUXER_GATEWAY_PUSH_ENABLED": {
                      "isOptional": false,
                      "description": "Browser push notifications (push service not deployed)",
                      "defaultValue": "false"
                    },
                    "FLUXER_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{SeaweedFS.S3_SECRET_KEY}}"
                    },
                    "FLUXER_ADMIN_SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Admin session key",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_SECRET_KEY_BASE}}"
                    },
                    "FLUXER_INTERNAL_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal API URL",
                      "defaultValue": "http://${{api.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_GATEWAY_RPC_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "API<->Gateway RPC token",
                      "defaultValue": "${{Fluxer.FLUXER_GATEWAY_RPC_AUTH_TOKEN}}"
                    },
                    "FLUXER_MEDIA_PROXY_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Media proxy URL signing key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_SECRET_KEY}}"
                    },
                    "FLUXER_TRUST_CLIENT_IP_HEADER": {
                      "isOptional": false,
                      "description": "Trust X-Forwarded-For set by the edge",
                      "defaultValue": "true"
                    },
                    "FLUXER_ADMIN_OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Admin OAuth client secret",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_OAUTH_CLIENT_SECRET}}"
                    },
                    "FLUXER_GATEWAY_STATIC_CDN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Static CDN URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_CONNECTION_INITIATION_SECRET": {
                      "isOptional": false,
                      "description": "Connection initiation token key",
                      "defaultValue": "${{Fluxer.FLUXER_CONNECTION_INITIATION_SECRET}}"
                    },
                    "FLUXER_GATEWAY_MEDIA_PROXY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal media proxy URL",
                      "defaultValue": "http://${{media-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Upload relay URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "Passkey origins",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64": {
                      "isOptional": false,
                      "description": "Upload relay token key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64}}"
                    },
                    "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED": {
                      "isOptional": false,
                      "description": "Presigned data-export downloads",
                      "defaultValue": "false"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "9892bf0a-8e35-57dc-b52c-1d7ce43e359d": {
                  "icon": "https://devicons.railway.app/i/postgresql.svg",
                  "name": "Postgres",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/railwayapp-templates/postgres-ssl:16"
                  },
                  "variables": {
                    "PGDATA": {
                      "isOptional": false,
                      "description": "Data subdirectory - keeps Postgres happy on Railway volumes",
                      "defaultValue": "/var/lib/postgresql/data/pgdata"
                    },
                    "POSTGRES_DB": {
                      "isOptional": false,
                      "description": "Database name",
                      "defaultValue": "fluxer"
                    },
                    "POSTGRES_USER": {
                      "isOptional": false,
                      "description": "Database user",
                      "defaultValue": "fluxer"
                    },
                    "POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Auto-generated database password",
                      "defaultValue": "{{POSTGRES_PASSWORD}}"
                    },
                    "RAILWAY_DEPLOYMENT_DRAINING_SECONDS": {
                      "isOptional": false,
                      "description": "Time for Postgres to shut down cleanly on redeploy",
                      "defaultValue": "60"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "8d20c7d1-47a6-5392-8fff-d24e9dc35ac6": {
                      "mountPath": "/var/lib/postgresql/data"
                    }
                  }
                },
                "b519800f-d321-5b66-97d0-29bc94388ebf": {
                  "icon": "https://raw.githubusercontent.com/seaweedfs/seaweedfs/master/note/seaweedfs.png",
                  "name": "SeaweedFS",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": null,
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "repo": "https://github.com/nomideusz/fluxer-railway",
                    "rootDirectory": "/seaweedfs"
                  },
                  "variables": {
                    "GOMEMLIMIT": {
                      "isOptional": false,
                      "description": "Go heap soft limit",
                      "defaultValue": "512MiB"
                    },
                    "S3_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "fluxer"
                    },
                    "S3_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Auto-generated S3 secret key",
                      "defaultValue": "{{S3_SECRET_KEY}}"
                    },
                    "WEED_MASTER_VOLUME_GROWTH_COPY_1": {
                      "isOptional": false,
                      "description": "Grow one volume at a time (upstream default)",
                      "defaultValue": "1"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  },
                  "volumeMounts": {
                    "27dd69d1-466b-512d-b9a3-7c7ddd06dd8e": {
                      "mountPath": "/data"
                    }
                  }
                },
                "c97dc882-4710-5056-bd05-d574435fe8fc": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "api",
                  "build": {},
                  "deploy": {
                    "startCommand": "/bin/sh -c 'exec node -e \"$FLUXER_BOOT_JS\" dist/AppEntrypoint.js'",
                    "healthcheckPath": "/_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/fluxerapp/fluxer-api:2026.1004.160619"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_ENV": {
                      "isOptional": false,
                      "description": "Runtime environment",
                      "defaultValue": "production"
                    },
                    "FLUXER_KV_URL": {
                      "isOptional": false,
                      "description": "Valkey URL",
                      "defaultValue": "redis://:${{Valkey.VALKEY_PASSWORD}}@${{Valkey.RAILWAY_PRIVATE_DOMAIN}}:6379/0"
                    },
                    "FLUXER_BOOT_JS": {
                      "isOptional": false,
                      "description": "Boot shim",
                      "defaultValue": "${{Fluxer.FLUXER_BOOT_JS}}"
                    },
                    "SVC_DEPENDENCY": {
                      "isOptional": false,
                      "description": "Orders this service after svc on deploy. Don't edit",
                      "defaultValue": "${{svc.PORT}}"
                    },
                    "FLUXER_API_PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region",
                      "defaultValue": "us-east-1"
                    },
                    "FLUXER_SEARCH_URL": {
                      "isOptional": false,
                      "description": "Meilisearch URL",
                      "defaultValue": "http://${{Meilisearch.RAILWAY_PRIVATE_DOMAIN}}:7700"
                    },
                    "FLUXER_VAPID_SEED": {
                      "isOptional": false,
                      "description": "Seed for the derived VAPID keypair",
                      "defaultValue": "${{Fluxer.FLUXER_VAPID_SEED}}"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname (set on the api service)",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_PUBLIC_PORT": {
                      "isOptional": false,
                      "description": "Public port",
                      "defaultValue": "443"
                    },
                    "FLUXER_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint (SeaweedFS)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_SELF_HOSTED": {
                      "isOptional": false,
                      "description": "Self-hosted mode",
                      "defaultValue": "true"
                    },
                    "FLUXER_VAPID_EMAIL": {
                      "isOptional": false,
                      "description": "Web push contact",
                      "defaultValue": "admin@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_APP_ENDPOINT": {
                      "isOptional": false,
                      "description": "Web app URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_SVC_NATS_URL": {
                      "isOptional": false,
                      "description": "NATS URL for internal services",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_EMAIL_ENABLED": {
                      "isOptional": false,
                      "description": "Email. Off = addresses auto-verified, no password reset mail",
                      "defaultValue": "false"
                    },
                    "FLUXER_PASSKEY_RP_ID": {
                      "isOptional": false,
                      "description": "Passkey relying party",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_HOST": {
                      "isOptional": false,
                      "description": "Postgres host",
                      "defaultValue": "${{Postgres.RAILWAY_PRIVATE_DOMAIN}}"
                    },
                    "FLUXER_POSTGRES_PORT": {
                      "isOptional": false,
                      "description": "Postgres port",
                      "defaultValue": "5432"
                    },
                    "FLUXER_PUBLIC_SCHEME": {
                      "isOptional": false,
                      "description": "Public scheme",
                      "defaultValue": "https"
                    },
                    "FLUXER_S3_BUCKET_CDN": {
                      "isOptional": false,
                      "description": "Processed assets bucket",
                      "defaultValue": "fluxer"
                    },
                    "FLUXER_SEARCH_ENGINE": {
                      "isOptional": false,
                      "description": "Search engine",
                      "defaultValue": "meilisearch"
                    },
                    "FLUXER_ADMIN_ENDPOINT": {
                      "isOptional": false,
                      "description": "Admin dashboard URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/admin"
                    },
                    "FLUXER_MEDIA_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_SEARCH_API_KEY": {
                      "isOptional": false,
                      "description": "Meilisearch master key",
                      "defaultValue": "${{Meilisearch.MEILI_MASTER_KEY}}"
                    },
                    "FLUXER_LIVEKIT_ENABLED": {
                      "isOptional": false,
                      "description": "Voice/video. Off: LiveKit needs UDP, which Railway does not offer",
                      "defaultValue": "false"
                    },
                    "FLUXER_SVC_SHARD_COUNT": {
                      "isOptional": false,
                      "description": "Internal service shard count",
                      "defaultValue": "1"
                    },
                    "FLUXER_DATABASE_BACKEND": {
                      "isOptional": false,
                      "description": "Database backend",
                      "defaultValue": "postgres"
                    },
                    "FLUXER_EMAIL_FROM_EMAIL": {
                      "isOptional": false,
                      "description": "From address once SMTP is configured",
                      "defaultValue": "noreply@${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{SeaweedFS.S3_ACCESS_KEY}}"
                    },
                    "FLUXER_SUDO_MODE_SECRET": {
                      "isOptional": false,
                      "description": "Sudo-mode JWT key",
                      "defaultValue": "${{Fluxer.FLUXER_SUDO_MODE_SECRET}}"
                    },
                    "FLUXER_POSTGRES_DATABASE": {
                      "isOptional": false,
                      "description": "Postgres database",
                      "defaultValue": "${{Postgres.POSTGRES_DB}}"
                    },
                    "FLUXER_POSTGRES_PASSWORD": {
                      "isOptional": false,
                      "description": "Postgres password",
                      "defaultValue": "${{Postgres.POSTGRES_PASSWORD}}"
                    },
                    "FLUXER_POSTGRES_USERNAME": {
                      "isOptional": false,
                      "description": "Postgres user",
                      "defaultValue": "${{Postgres.POSTGRES_USER}}"
                    },
                    "FLUXER_S3_BUCKET_REPORTS": {
                      "isOptional": false,
                      "description": "Abuse reports bucket",
                      "defaultValue": "fluxer-reports"
                    },
                    "FLUXER_S3_BUCKET_UPLOADS": {
                      "isOptional": false,
                      "description": "Raw uploads bucket",
                      "defaultValue": "fluxer-uploads"
                    },
                    "FLUXER_MARKETING_ENDPOINT": {
                      "isOptional": false,
                      "description": "Marketing URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_NATS_JETSTREAM_URL": {
                      "isOptional": false,
                      "description": "NATS JetStream URL",
                      "defaultValue": "nats://${{NATS.RAILWAY_PRIVATE_DOMAIN}}:4222"
                    },
                    "FLUXER_S3_BUCKET_HARVESTS": {
                      "isOptional": false,
                      "description": "Data export bucket",
                      "defaultValue": "fluxer-harvests"
                    },
                    "FLUXER_S3_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint used in presigned URLs (relayed via /media)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_S3_FORCE_PATH_STYLE": {
                      "isOptional": false,
                      "description": "Path-style S3 addressing",
                      "defaultValue": "true"
                    },
                    "FLUXER_GATEWAY_PUSH_ENABLED": {
                      "isOptional": false,
                      "description": "Browser push notifications (push service not deployed)",
                      "defaultValue": "false"
                    },
                    "FLUXER_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{SeaweedFS.S3_SECRET_KEY}}"
                    },
                    "FLUXER_ADMIN_SECRET_KEY_BASE": {
                      "isOptional": false,
                      "description": "Admin session key",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_SECRET_KEY_BASE}}"
                    },
                    "FLUXER_INTERNAL_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal API URL",
                      "defaultValue": "http://${{RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_GATEWAY_RPC_AUTH_TOKEN": {
                      "isOptional": false,
                      "description": "API<->Gateway RPC token",
                      "defaultValue": "${{Fluxer.FLUXER_GATEWAY_RPC_AUTH_TOKEN}}"
                    },
                    "FLUXER_MEDIA_PROXY_SECRET_KEY": {
                      "isOptional": false,
                      "description": "Media proxy URL signing key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_SECRET_KEY}}"
                    },
                    "FLUXER_TRUST_CLIENT_IP_HEADER": {
                      "isOptional": false,
                      "description": "Trust X-Forwarded-For set by the edge",
                      "defaultValue": "true"
                    },
                    "FLUXER_POSTGRES_MAX_CONNECTIONS": {
                      "isOptional": false,
                      "description": "Postgres pool size",
                      "defaultValue": "20"
                    },
                    "FLUXER_ADMIN_OAUTH_CLIENT_SECRET": {
                      "isOptional": false,
                      "description": "Admin OAuth client secret",
                      "defaultValue": "${{Fluxer.FLUXER_ADMIN_OAUTH_CLIENT_SECRET}}"
                    },
                    "FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "Public media URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_CONNECTION_INITIATION_SECRET": {
                      "isOptional": false,
                      "description": "Connection initiation token key",
                      "defaultValue": "${{Fluxer.FLUXER_CONNECTION_INITIATION_SECRET}}"
                    },
                    "FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Internal media proxy URL",
                      "defaultValue": "http://${{media-proxy.RAILWAY_PRIVATE_DOMAIN}}:8080"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT": {
                      "isOptional": false,
                      "description": "Upload relay URL",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/media"
                    },
                    "FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS": {
                      "isOptional": false,
                      "description": "Passkey origins",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64": {
                      "isOptional": false,
                      "description": "Upload relay token key",
                      "defaultValue": "${{Fluxer.FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64}}"
                    },
                    "FLUXER_API_PRESIGNED_HARVEST_DOWNLOADS_ENABLED": {
                      "isOptional": false,
                      "description": "Presigned data-export downloads",
                      "defaultValue": "false"
                    },
                    "FLUXER_API_PRESIGNED_ATTACHMENT_UPLOADS_ENABLED": {
                      "isOptional": false,
                      "description": "Presigned attachment uploads",
                      "defaultValue": "true"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                },
                "ff29b952-7df7-55c7-a296-cfd099786b05": {
                  "icon": "https://raw.githubusercontent.com/nomideusz/fluxer-railway/main/icon.svg",
                  "name": "app-proxy",
                  "build": {},
                  "deploy": {
                    "startCommand": null,
                    "healthcheckPath": "/_health",
                    "restartPolicyType": "ON_FAILURE",
                    "restartPolicyMaxRetries": 10
                  },
                  "source": {
                    "image": "ghcr.io/fluxerapp/fluxer-app-proxy-self-hosted:2026.1004.174950"
                  },
                  "variables": {
                    "PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "FLUXER_S3_REGION": {
                      "isOptional": false,
                      "description": "S3 region",
                      "defaultValue": "us-east-1"
                    },
                    "FLUXER_BASE_DOMAIN": {
                      "isOptional": false,
                      "description": "Public hostname",
                      "defaultValue": "${{Fluxer.FLUXER_BASE_DOMAIN}}"
                    },
                    "FLUXER_PUBLIC_PORT": {
                      "isOptional": false,
                      "description": "Public port",
                      "defaultValue": "443"
                    },
                    "FLUXER_S3_ENDPOINT": {
                      "isOptional": false,
                      "description": "S3 endpoint (SeaweedFS)",
                      "defaultValue": "http://${{SeaweedFS.RAILWAY_PRIVATE_DOMAIN}}:8333"
                    },
                    "FLUXER_PUBLIC_SCHEME": {
                      "isOptional": false,
                      "description": "Public scheme",
                      "defaultValue": "https"
                    },
                    "FLUXER_APP_PROXY_PORT": {
                      "isOptional": false,
                      "description": "Listen port",
                      "defaultValue": "8080"
                    },
                    "DISCOVERY_UPSTREAM_URL": {
                      "isOptional": false,
                      "description": "Discovery via the edge's internal listener",
                      "defaultValue": "http://${{Fluxer.RAILWAY_PRIVATE_DOMAIN}}:8088/.well-known/fluxer"
                    },
                    "FLUXER_S3_ACCESS_KEY_ID": {
                      "isOptional": false,
                      "description": "S3 access key",
                      "defaultValue": "${{SeaweedFS.S3_ACCESS_KEY}}"
                    },
                    "FLUXER_S3_BUCKET_UPLOADS": {
                      "isOptional": false,
                      "description": "Raw uploads bucket",
                      "defaultValue": "fluxer-uploads"
                    },
                    "FLUXER_S3_SECRET_ACCESS_KEY": {
                      "isOptional": false,
                      "description": "S3 secret key",
                      "defaultValue": "${{SeaweedFS.S3_SECRET_KEY}}"
                    },
                    "FLUXER_TRUST_CLIENT_IP_HEADER": {
                      "isOptional": false,
                      "description": "Trust X-Forwarded-For set by the edge",
                      "defaultValue": "true"
                    },
                    "PUBLIC_BOOTSTRAP_API_ENDPOINT": {
                      "isOptional": false,
                      "description": "API path in the page bootstrap",
                      "defaultValue": "/api"
                    },
                    "PUBLIC_BOOTSTRAP_API_PUBLIC_ENDPOINT": {
                      "isOptional": false,
                      "description": "Absolute API URL in the page bootstrap",
                      "defaultValue": "https://${{Fluxer.FLUXER_BASE_DOMAIN}}/api"
                    }
                  },
                  "networking": {
                    "serviceDomains": {}
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "post_deploy": {
    "healthcheck": {
      "service": "Fluxer",
      "method": "GET",
      "path": "/_health",
      "expect_status": 200
    }
  },
  "resources": {
    "expected_services": 13,
    "needs_volume": true
  },
  "generated_at": "2026-10-06T04:14:42.626Z",
  "generator_version": "0.1.0",
  "status": "degraded",
  "validated_at": "2026-10-05T01:33:09.492Z",
  "success_rate_30d": 0,
  "validation": {
    "last_run_id": "run_b3570e28365c487dbce1",
    "checks": [
      {
        "name": "workflow_completed",
        "passed": true
      },
      {
        "name": "all_services_deployed",
        "passed": false,
        "detail": "SUCCESS,SUCCESS,SUCCESS,SUCCESS,SUCCESS,SUCCESS,SUCCESS,DEPLOYING,SUCCESS,SUCCESS,SUCCESS,QUEUED,FAILED"
      }
    ]
  }
}
