{
  "server": {
    "engine": "isaac",
    // [Listen] Binding address: `0.0.0.0` by default or `127.0.0.1` for ipv4 only, `::` for ipv6 only, `:::` for both
    "address": "0.0.0.0",
    // [Listen] Queue length limited to os values : tcp_max_syn_backlog, somaxconn
    "backlog": 511,
    "credentials": {
      "_comment": "Project ENV override: SSL Credentials: private key & certificate",
      "privateKey": "${GINA_HOMEDIR}/certificates/scopes/${scope}/${host}/private.key",
      "certificate": "${GINA_HOMEDIR}/certificates/scopes/${scope}/${host}/certificate.crt",
      "ca": "${GINA_HOMEDIR}/certificates/scopes/${scope}/${host}/ca_bundle.crt",
      "allowHTTP1": true
    },
    // refers to server.js, lib.routing & controller.js
    "supportedRequestMethods": {
      "body": {},
      "get": {},
      "post": {},
      "put": {},
      "delete": {},
      "files": []
      // https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods
      // ? connect, head, options, trace, patch, cookies, copy
    },
    "keepAliveTimeout": "5s",
    // slightly longer than keepAliveTimeout — must remain > keepAliveTimeout
    "headersTimeout": "5500ms",
    // HTTP/2 tuning — wired into core/server.isaac.js at server creation time.
    // maxConcurrentStreams      : max parallel streams per TCP connection (Node default: 100, Gina default: 256).
    // initialWindowSize        : flow-control window in bytes (Node default: 65535, Gina default: 655350 = 10×).
    // maxSessionRejectedStreams : RST flood defense — CVE-2019-9514, CVE-2023-44487 (default: 100).
    // maxSessionInvalidFrames  : CONTINUATION flood defense — CVE-2024-27316, CVE-2024-27983 (default: 1000).
    "http2Options": {
      "maxConcurrentStreams": 256,
      "initialWindowSize": 655350,
      "maxSessionRejectedStreams": 100,
      "maxSessionInvalidFrames": 1000
    },
    // Compare with core/content.encoding
    // This is the prefered order when it comes to respond with compressed content
    "preferedCompressionEncodingOrder": ["br", "deflate", "gzip", "zstdn", "dcb", "dcz", "compress"]
  },
  "upload": {
    "_comment": "for more details, check out https://github.com/mscdex/busboy",
    "encoding": "utf8",
    "tmpPath": "${tmpPath}",
    "maxFieldsSize": "2MB", // for all uploads by default - can be redefined under the group
    "maxFields": 1000, // number of assets when isMultipleAllowed - can be redifined under the group
    // timeout for tmp files removal - can be redifined under the group
    // will be ignored by server if set to 0 or false
    // but you will have to setup a cron to remove files from tmp dir
    // eg.: "5s" for 5 seconds, "10m" for 10 minutes, "1h" for 1 hour
    // eg.: "500ms" for sub-second precision
    // eg.: 0 or false to disable
    "autoTmpCleanupTimeout": false,
    // You need to set groups in order to enable uploads
    "groups": {
      "untagged": {
        "path": "${tmpPath}",
        "allowedExtensions": "*", // or [ "jpg", "jpeg", "png", "svg" ]
        "isMultipleAllowed": false
        // optional sample
        // ,
        // "filePrefix": "$designId_",
        // "subFolder": "/$ownerId_$companyId",
        // "maxFieldsSize": "512K"
      }
    }
  },
  "cache": {},
  "engine.io": {
    // Reserved Gina infrastructure range: 4100–4199
    // 4100 = socket server, 4101 = reserved, 4102 = engine.io, 4103–4199 = reserved
    "port": 4102
  },
  "livereload": {},
  "locale": {
    "preferedLanguages": [ "en-US" ],
    "region": "EN",
    "firstDayOfWeek": 1,
    "calendar": "gregorian",
    "temperature": "celsius",
    "number": {
      "grouping": null,
      "decimal": "."
    },
    "currency": {
      "code": "usd",
      "grouping": null,
      "decimal": "."
    },
    "measurementUnits": "metric",
    "dateFormat": {
      "short": "mm/dd/yyyy",
      "medium": "mmm d, yyyy",
      "long": "mmmm d, yyyy",
      "full": "dddd, mmmm d, yyyy"
    },
    "24HourTimeFormat": true,
    "timeFormat": {
      "default": {
        "short": "h:MM:ss",
        "medium": "h:MM:ss",
        "long": "h:MM:ss TT"
      },
      "24H": {
        "short": "HH:MM",
        "medium": "HH:MM:ss",
        "long": "HH:MM:ss TT"
      }
    }
  }
}