{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.dev/modules/4mwW0pOKAlpVzUnkNLGP/sVBuAiWqdxsJ8vDcea8J/iTDBHBBXX.js"],
  "sourcesContent": ["import { addPropertyControls, ControlType } from \"framer\"; /**\n                                                           * @framerRecordIdKey id\n                                                           * @framerSlug ZWk2Juz0q\n                                                           * @framerData\n                                                           */\nconst data = [{\n  H5VmJiEm2: {\n    pathVariables: {\n      ZWk2Juz0q: \"current\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  HOEyyf7hT: \"\",\n  HwjP6cBpP: \"Hosting\",\n  id: \"LMTYwdyvR\",\n  IMNCNZ86w: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.dev/images/IIHGQUAfjOYAdtgnIFOcrAVBrUE.jpg?scale-down-to=4096\").href,\n    srcSet: `${new URL(\"https://framerusercontent.dev/images/IIHGQUAfjOYAdtgnIFOcrAVBrUE.jpg?scale-down-to=512\").href} 512w, ${new URL(\"https://framerusercontent.dev/images/IIHGQUAfjOYAdtgnIFOcrAVBrUE.jpg?scale-down-to=1024\").href} 1024w, ${new URL(\"https://framerusercontent.dev/images/IIHGQUAfjOYAdtgnIFOcrAVBrUE.jpg?scale-down-to=2048\").href} 2048w, ${new URL(\"https://framerusercontent.dev/images/IIHGQUAfjOYAdtgnIFOcrAVBrUE.jpg?scale-down-to=4096\").href} 4096w, ${new URL(\"https://framerusercontent.dev/images/IIHGQUAfjOYAdtgnIFOcrAVBrUE.jpg\").href} 4408w`\n  },\n  kI6LRKxC3: \"\",\n  SbEdiCh1Y: \"**In principle we have a simple job ...**\\n\\n1. Based on the request find the deployment\\n2. Get all contents from storage\\n3. Send it to the user\\n\\n**... which is actually quite complicated:**\\n\\n1. TLS/SSL certificates?\\n2. Custom domains or `.framer.website`?\\n3. Caching?\\n\\n**_...and then there are bad guys, too!_**\\n\",\n  ZWk2Juz0q: \"hosting\"\n}, {\n  H5VmJiEm2: {\n    pathVariables: {\n      ZWk2Juz0q: \"caddy\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  HOEyyf7hT: \"\",\n  HwjP6cBpP: \"Current\",\n  id: \"ZIoOqHhKp\",\n  IMNCNZ86w: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.dev/images/MDvT6FcolAdWTWTzZBKNqCfMN0U.jpg?scale-down-to=4096\").href,\n    srcSet: `${new URL(\"https://framerusercontent.dev/images/MDvT6FcolAdWTWTzZBKNqCfMN0U.jpg?scale-down-to=512\").href} 341w, ${new URL(\"https://framerusercontent.dev/images/MDvT6FcolAdWTWTzZBKNqCfMN0U.jpg?scale-down-to=1024\").href} 682w, ${new URL(\"https://framerusercontent.dev/images/MDvT6FcolAdWTWTzZBKNqCfMN0U.jpg?scale-down-to=2048\").href} 1365w, ${new URL(\"https://framerusercontent.dev/images/MDvT6FcolAdWTWTzZBKNqCfMN0U.jpg?scale-down-to=4096\").href} 2730w, ${new URL(\"https://framerusercontent.dev/images/MDvT6FcolAdWTWTzZBKNqCfMN0U.jpg\").href} 3433w`\n  },\n  kI6LRKxC3: {\n    pathVariables: {\n      ZWk2Juz0q: \"hosting\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  SbEdiCh1Y: \"_FramerDomainsServer_ is a relatively simple HTTP server.\\n\\nIf we need something, we build it:\\n- TLS on demand (using `github.com/caddyserver/certmagic`)\\n- Login rate-limiting (using `golang.org/x/time/rate`)\\n- blocking of sites with too much traffic (...eh, just abort the connection)\\n\\nFYI: Building takes time. And keeping it working takes even more time.\\n\\n```\\n-------------------------------------------------------------------------------\\nLanguage                     files          blank        comment           code\\n-------------------------------------------------------------------------------\\nGo                              56           1036           2088           6041\\nHTML                             2             57              1            405\\nMarkdown                         1            107              0            270\\nJSON                             2              0              0             26\\nYAML                             1              0              0             26\\nBASH                             2              5              0             17\\nMakefile                         1              3              0             16\\n-------------------------------------------------------------------------------\\nTOTAL                           65           1208           2089           6801\\n```\\n\\n\",\n  ZWk2Juz0q: \"current\"\n}, {\n  H5VmJiEm2: \"/s-t/caddymagic\",\n  HOEyyf7hT: \"\",\n  HwjP6cBpP: \"Caddy\",\n  id: \"ZoOcn9Bv2\",\n  IMNCNZ86w: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.dev/images/MfjYBKY9jon1XfkksYG07KBtcmk.svg\").href\n  },\n  kI6LRKxC3: {\n    pathVariables: {\n      ZWk2Juz0q: \"current\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  SbEdiCh1Y: \"TODO: elevator pitch caddy\",\n  ZWk2Juz0q: \"caddy\"\n}, {\n  H5VmJiEm2: {\n    pathVariables: {\n      ZWk2Juz0q: \"blocking-domains\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  HOEyyf7hT: \"\",\n  HwjP6cBpP: \"Caddymagic\",\n  id: \"X_mpr4dyy\",\n  IMNCNZ86w: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.dev/images/TlgdwlldJTSauRtq06BTJuMwPQ.jpg?scale-down-to=4096\").href,\n    srcSet: `${new URL(\"https://framerusercontent.dev/images/TlgdwlldJTSauRtq06BTJuMwPQ.jpg?scale-down-to=512\").href} 512w, ${new URL(\"https://framerusercontent.dev/images/TlgdwlldJTSauRtq06BTJuMwPQ.jpg?scale-down-to=1024\").href} 1024w, ${new URL(\"https://framerusercontent.dev/images/TlgdwlldJTSauRtq06BTJuMwPQ.jpg?scale-down-to=2048\").href} 2048w, ${new URL(\"https://framerusercontent.dev/images/TlgdwlldJTSauRtq06BTJuMwPQ.jpg?scale-down-to=4096\").href} 4096w, ${new URL(\"https://framerusercontent.dev/images/TlgdwlldJTSauRtq06BTJuMwPQ.jpg\").href} 4873w`\n  },\n  kI6LRKxC3: {\n    pathVariables: {\n      ZWk2Juz0q: \"caddy\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  SbEdiCh1Y: \"TODO: Quick run over what we have\\n\\n* Modules with code (reusing existing parts)\\n* Caddyfile with extra directives to describe what we want\\n* HTTP/3 for custom domains\\n\",\n  ZWk2Juz0q: \"caddymagic\"\n}, {\n  CMS6k1BXa: \"https://blocked.test.ankon.dev\",\n  H5VmJiEm2: {\n    pathVariables: {\n      ZWk2Juz0q: \"demo\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  HOEyyf7hT: \"* 3 columns? split over pages? (then we can also show the login again)\\n* syntax highlighting, at least for the basics!\",\n  HwjP6cBpP: \"... and the bad guys?\",\n  id: \"iSg8N2I_p\",\n  IMNCNZ86w: {\n    alt: \"\",\n    src: new URL(\"https://framerusercontent.dev/images/Fhgc7Uai4uBYkogzW1zLZkKhs.jpg?scale-down-to=4096\").href,\n    srcSet: `${new URL(\"https://framerusercontent.dev/images/Fhgc7Uai4uBYkogzW1zLZkKhs.jpg?scale-down-to=512\").href} 512w, ${new URL(\"https://framerusercontent.dev/images/Fhgc7Uai4uBYkogzW1zLZkKhs.jpg?scale-down-to=1024\").href} 1024w, ${new URL(\"https://framerusercontent.dev/images/Fhgc7Uai4uBYkogzW1zLZkKhs.jpg?scale-down-to=2048\").href} 2048w, ${new URL(\"https://framerusercontent.dev/images/Fhgc7Uai4uBYkogzW1zLZkKhs.jpg?scale-down-to=4096\").href} 4096w, ${new URL(\"https://framerusercontent.dev/images/Fhgc7Uai4uBYkogzW1zLZkKhs.jpg\").href} 5184w`\n  },\n  kI6LRKxC3: {\n    pathVariables: {\n      ZWk2Juz0q: \"caddymagic\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  SbEdiCh1Y: 'With caddy in place we can move code to configuration\\n\\n* Filter out known cases early on:\\n   ```caddyfile\\n   @well_known_404 {\\n   \tpath /.well-known/assetlinks.json\\n   \tpath /swagger-ui/*\\n   }\\n   handle @well_known_404 {\\n   \trespond 404 {\\n   \t\tclose\\n   \t}\\n   }\\n   ```\\n* Rate-limit login attempts\\n   ```caddyfile\\n   @login {\\n   \tmethod POST\\n   \tpath /_framer/login/\\n   }\\n   \\n   handle @login {\\n   \trate_limit {\\n   \t\tdistributed\\n   \t\tzone logins {\\n   \t\t\tkey {remote_host}\\n   \t\t\tevents 20\\n   \t\t\twindow 60s\\n   \t\t}\\n   \t}\\n   \\n   \troute {\\n   \t\tframer_serve login\\n   \t}\\n   }\\n   ```\\n* Block things outright\\n   ```caddyfile\\n   @blocked_domains {\\n   \tframer_blocked_host \"GetParametersByPath\"\\n   }\\n   handle @blocked_domains {\\n   \trespond 429 {\\n   \t\tclose\\n   \t}\\n   }\\n   ```\\n',\n  ZWk2Juz0q: \"blocking-domains\"\n}, {\n  HOEyyf7hT: \"\",\n  HwjP6cBpP: \"Demo\",\n  id: \"Wu7o9nveb\",\n  kI6LRKxC3: {\n    pathVariables: {\n      ZWk2Juz0q: \"blocking-domains\"\n    },\n    webPageId: \"i_6u7ubtZ\"\n  },\n  SbEdiCh1Y: \"# DEMO\\n\\n<small>Open the dev tools. Show it's live. Tada.</small>\",\n  ZWk2Juz0q: \"demo\"\n}];\ndata.forEach(item => Object.freeze(item));\naddPropertyControls(data, {\n  HwjP6cBpP: {\n    defaultValue: \"\",\n    title: \"Title\",\n    type: ControlType.String\n  },\n  ZWk2Juz0q: {\n    title: \"Slug\",\n    type: ControlType.String\n  },\n  IMNCNZ86w: {\n    title: \"Image\",\n    type: ControlType.ResponsiveImage\n  },\n  SbEdiCh1Y: {\n    defaultValue: \"\",\n    displayTextArea: true,\n    title: \"Content\",\n    type: ControlType.String\n  },\n  H5VmJiEm2: {\n    title: \"Next\",\n    type: ControlType.Link\n  },\n  kI6LRKxC3: {\n    title: \"Previous\",\n    type: ControlType.Link\n  },\n  CMS6k1BXa: {\n    title: \"Demo\",\n    type: ControlType.Link\n  },\n  HOEyyf7hT: {\n    defaultValue: \"\",\n    displayTextArea: true,\n    title: \"Notes\",\n    type: ControlType.String\n  }\n});\ndata[\"displayName\"] = \"S&T\";\nexport default data;\nexport const __FramerMetadata__ = {\n  \"exports\": {\n    \"default\": {\n      \"type\": \"data\",\n      \"name\": \"data\",\n      \"annotations\": {\n        \"framerSlug\": \"ZWk2Juz0q\",\n        \"framerData\": \"\",\n        \"framerContractVersion\": \"1\",\n        \"framerRecordIdKey\": \"id\"\n      }\n    },\n    \"__FramerMetadata__\": {\n      \"type\": \"variable\"\n    }\n  }\n};"],
  "mappings": "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",
  "names": ["data", "item", "addPropertyControls", "ControlType", "iTDBHBBXX_default", "__FramerMetadata__"]
}
