[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-aws-labs-cloudfront":3,"mdc-63yqzk-key":37,"related-repo-aws-labs-cloudfront":1689,"related-org-aws-labs-cloudfront":1790},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"cloudfront","configure Amazon CloudFront distributions","Design and configure Amazon CloudFront distributions. Use when setting up CDN for web applications, configuring cache behaviors, origins, Lambda@Edge, CloudFront Functions, signed URLs, WAF integration, or debugging cache issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"aws-labs","AWS Labs","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Faws-labs.png","awslabs",[13,17,20,23],{"name":14,"slug":15,"type":16},"Performance","performance","tag",{"name":18,"slug":19,"type":16},"Networking","networking",{"name":21,"slug":22,"type":16},"Deployment","deployment",{"name":24,"slug":25,"type":16},"AWS","aws",14,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups","2026-07-12T08:40:18.115518",null,15,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Official AWS Startups repository that hosts plugins, skills, tools and resources to support startup builders on AWS","https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fstartups\u002Ftree\u002FHEAD\u002Fsolution-architecture\u002Fplugins\u002Faws-dev-toolkit\u002Fskills\u002Fcloudfront","---\nname: cloudfront\ndescription: Design and configure Amazon CloudFront distributions. Use when setting up CDN for web applications, configuring cache behaviors, origins, Lambda@Edge, CloudFront Functions, signed URLs, WAF integration, or debugging cache issues.\nallowed-tools: Read, Grep, Glob, Bash(aws *), mcp__plugin_aws-dev-toolkit_awsknowledge__*\n---\n\nYou are an AWS CloudFront specialist. Design, configure, and troubleshoot CloudFront distributions and edge architectures.\n\n## Distribution Architecture\n\nA CloudFront distribution has:\n\n- **Origins**: Where CloudFront fetches content (S3, ALB, API Gateway, custom HTTP server)\n- **Cache Behaviors**: Rules that match URL patterns and define how CloudFront handles requests\n- **Default Cache Behavior**: Catches all requests that don't match other behaviors\n\n### Origin Types\n\n#### S3 Origins\n\n- Use **Origin Access Control (OAC)** — not the legacy Origin Access Identity (OAI)\n- OAC supports SSE-KMS, SSE-S3, and all S3 features. OAI does not.\n- Bucket policy must grant `s3:GetObject` to the CloudFront service principal\n- For S3 static website hosting endpoints, use a custom origin (not S3 origin type) since the website endpoint is HTTP-only\n\n#### ALB\u002FNLB Origins\n\n- ALB must be internet-facing (CloudFront cannot reach internal ALBs without Lambda@Edge tricks)\n- Add a custom header (e.g., `X-Origin-Verify: \u003Csecret>`) and validate it on the ALB to prevent direct access\n- Use HTTPS between CloudFront and ALB. Set origin protocol policy to `https-only`.\n\n#### API Gateway Origins\n\n- Use the regional API endpoint as origin domain (not the edge-optimized endpoint — that adds a second CloudFront hop)\n- Path pattern: `\u002Fapi\u002F*` -> API Gateway origin\n\n#### Custom Origins\n\n- Any HTTP\u002FHTTPS endpoint\n- Configure origin timeouts: connection timeout (default 10s) and read timeout (default 30s)\n- Set keep-alive timeout to match your origin server\n\n## Cache Behaviors\n\nCache behaviors are matched by path pattern in order of precedence (most specific first). The default (`*`) is always last.\n\n### Key Settings Per Behavior\n\n- **Viewer Protocol Policy**: Redirect HTTP to HTTPS (always use this for web apps)\n- **Allowed HTTP Methods**: GET\u002FHEAD for static, GET\u002FHEAD\u002FOPTIONS\u002FPUT\u002FPOST\u002FPATCH\u002FDELETE for APIs\n- **Cache Policy**: Controls what's included in the cache key (headers, query strings, cookies)\n- **Origin Request Policy**: Controls what's forwarded to the origin (separate from cache key)\n- **Response Headers Policy**: Add security headers (HSTS, CSP, X-Frame-Options)\n\n### Cache Policies (use managed policies when possible)\n\n| Policy                                 | Use Case                                                            |\n| -------------------------------------- | ------------------------------------------------------------------- |\n| CachingOptimized                       | Static assets (JS, CSS, images). Ignores query strings and headers. |\n| CachingOptimizedForUncompressedObjects | Same but without Gzip\u002FBrotli                                        |\n| CachingDisabled                        | Pass-through to origin. Use for APIs and dynamic content.           |\n\n**Custom cache policies** when you need to cache by specific query strings or headers. Include only what you must — every key dimension reduces cache hit ratio.\n\n### Origin Request Policies\n\n| Policy                    | Use Case                                              |\n| ------------------------- | ----------------------------------------------------- |\n| AllViewer                 | Forward all viewer headers to origin                  |\n| AllViewerExceptHostHeader | Forward all except Host (most common for ALB origins) |\n| CORS-S3Origin             | Forward CORS headers for S3                           |\n\n## Lambda@Edge vs CloudFront Functions\n\n| Feature             | CloudFront Functions            | Lambda@Edge                      |\n| ------------------- | ------------------------------- | -------------------------------- |\n| Runtime             | JavaScript only                 | Node.js, Python                  |\n| Execution time      | \u003C 1ms                           | Up to 5s (viewer) \u002F 30s (origin) |\n| Memory              | 2 MB                            | 128-10240 MB                     |\n| Network access      | No                              | Yes                              |\n| Request body access | No                              | Yes                              |\n| Trigger points      | Viewer request, viewer response | All 4 trigger points             |\n| Price               | ~1\u002F6 of Lambda@Edge             | Higher                           |\n| Deploy region       | All edge locations              | Regional edge caches             |\n\n**Use CloudFront Functions for:**\n\n- URL rewrites and redirects\n- Header manipulation (add\u002Fmodify\u002Fdelete)\n- Cache key normalization\n- Simple A\u002FB testing via cookie\n\n**Use Lambda@Edge for:**\n\n- Authentication and authorization (calling external APIs)\n- Dynamic origin selection\n- Modifying request\u002Fresponse bodies\n- Generating responses at the edge (SSR)\n\n### Trigger Points\n\n1. **Viewer Request**: After CloudFront receives request from viewer\n2. **Origin Request**: Before CloudFront forwards to origin (only on cache miss)\n3. **Origin Response**: After CloudFront receives response from origin\n4. **Viewer Response**: Before CloudFront returns response to viewer\n\n## Signed URLs and Signed Cookies\n\nUse when you need to restrict access to content:\n\n- **Signed URLs**: One URL = one resource. Best for individual file downloads.\n- **Signed Cookies**: One cookie = access to multiple resources. Best for HLS\u002FDASH streaming or restricting entire site sections.\n\nUse a **key group** (not the legacy CloudFront key pair which requires root account). Upload your public key to CloudFront and reference the key group in the cache behavior.\n\nSet expiration times as short as practical. For streaming, 1-2 hours. For downloads, minutes.\n\n## WAF Integration\n\n- Attach AWS WAF WebACL directly to the CloudFront distribution\n- WAF runs before cache lookup — it protects even cached content\n- Use managed rule groups: AWSManagedRulesCommonRuleSet, AWSManagedRulesKnownBadInputsRuleSet, AWSManagedRulesSQLiRuleSet\n- Add rate-limiting rules to prevent abuse\n- WAF on CloudFront is in us-east-1 (regardless of where your other resources are)\n\n## Common CLI Commands\n\n```bash\n# List distributions\naws cloudfront list-distributions --query 'DistributionList.Items[*].{ID:Id,Domain:DomainName,Status:Status,Aliases:Aliases.Items}'\n\n# Get distribution config\naws cloudfront get-distribution-config --id EXXXXX\n\n# Create invalidation\naws cloudfront create-invalidation --distribution-id EXXXXX --paths \"\u002F*\"\n\n# Create invalidation for specific paths\naws cloudfront create-invalidation --distribution-id EXXXXX --paths \"\u002Findex.html\" \"\u002Fstatic\u002F*\"\n\n# List invalidations\naws cloudfront list-invalidations --distribution-id EXXXXX\n\n# Get cache statistics\naws cloudfront get-distribution --id EXXXXX --query 'Distribution.{Status:Status,DomainName:DomainName,Origins:DistributionConfig.Origins.Items[*].DomainName}'\n\n# Test a CloudFront Function\naws cloudfront test-function --name my-function --if-match EXXXXX --stage DEVELOPMENT --event-object fileb:\u002F\u002Ftest-event.json\n\n# List CloudFront Functions\naws cloudfront list-functions\n\n# Describe a function\naws cloudfront describe-function --name my-function\n```\n\n## Output Format\n\n| Field                   | Details                                                                 |\n| ----------------------- | ----------------------------------------------------------------------- |\n| **Distribution type**   | Web distribution, streaming, or multi-origin                            |\n| **Origins**             | Origin domains, types (S3\u002FALB\u002FAPI GW\u002Fcustom), access control (OAC)      |\n| **Cache behaviors**     | Path patterns, cache policies, and origin request policies per behavior |\n| **SSL\u002FTLS**             | ACM certificate ARN, minimum protocol version, SNI config               |\n| **WAF**                 | WebACL ID, managed rule groups, custom rate-limiting rules              |\n| **Functions (Edge\u002FCF)** | CloudFront Functions or Lambda@Edge, trigger points, purpose            |\n| **Headers**             | Response headers policy (HSTS, CSP, X-Frame-Options)                    |\n| **Logging**             | Standard logging (S3 bucket) or real-time logging (Kinesis)             |\n\n## Related Skills\n\n- `s3` — S3 origins, bucket policies, and Origin Access Control\n- `api-gateway` — API Gateway origins, regional endpoints, and cache behavior config\n- `lambda` — Lambda@Edge functions and CloudFront Function alternatives\n- `networking` — ALB origins, VPC connectivity, and DNS with Route53\n- `security-review` — WAF rules, signed URLs, and public exposure review\n\n## Anti-Patterns\n\n- **Using OAI instead of OAC**: OAI is legacy and doesn't support SSE-KMS. Always use Origin Access Control.\n- **Caching dynamic content without a strategy**: Don't cache API responses unless you explicitly control TTLs and cache keys. Use CachingDisabled policy for APIs.\n- **Invalidating as a deployment strategy**: Invalidations take time and cost money after 1,000 paths\u002Fmonth. Instead, use versioned file names (e.g., `app.abc123.js`) for cache busting.\n- **Forwarding all headers\u002Fcookies\u002Fquery strings**: This destroys cache hit ratio. Forward only what the origin needs. Use separate cache and origin request policies.\n- **Not setting security response headers**: Always add HSTS, X-Content-Type-Options, X-Frame-Options via a response headers policy.\n- **Edge-optimized API Gateway behind CloudFront**: Double-hop through two CloudFront distributions. Use regional API Gateway endpoint instead.\n- **No WAF on public distributions**: CloudFront is the front door to your application. Protect it with WAF.\n- **Wildcard invalidation on every deploy**: `\u002F*` invalidates everything. Use path-specific invalidations or, better, versioned filenames.\n- **Not compressing content**: Enable automatic compression in the cache behavior. CloudFront supports Gzip and Brotli.\n- **Using self-signed certs with custom domains**: Use ACM certificates in us-east-1. They're free and auto-renew.\n",{"data":38,"body":40},{"name":4,"description":6,"allowed-tools":39},"Read, Grep, Glob, Bash(aws *), mcp__plugin_aws-dev-toolkit_awsknowledge__*",{"type":41,"children":42},"root",[43,51,58,63,99,106,113,152,158,192,198,219,225,243,248,261,267,320,326,393,403,409,468,474,643,651,674,682,705,711,755,761,766,789,801,806,812,840,846,1341,1347,1496,1502,1559,1565,1683],{"type":44,"tag":45,"props":46,"children":47},"element","p",{},[48],{"type":49,"value":50},"text","You are an AWS CloudFront specialist. Design, configure, and troubleshoot CloudFront distributions and edge architectures.",{"type":44,"tag":52,"props":53,"children":55},"h2",{"id":54},"distribution-architecture",[56],{"type":49,"value":57},"Distribution Architecture",{"type":44,"tag":45,"props":59,"children":60},{},[61],{"type":49,"value":62},"A CloudFront distribution has:",{"type":44,"tag":64,"props":65,"children":66},"ul",{},[67,79,89],{"type":44,"tag":68,"props":69,"children":70},"li",{},[71,77],{"type":44,"tag":72,"props":73,"children":74},"strong",{},[75],{"type":49,"value":76},"Origins",{"type":49,"value":78},": Where CloudFront fetches content (S3, ALB, API Gateway, custom HTTP server)",{"type":44,"tag":68,"props":80,"children":81},{},[82,87],{"type":44,"tag":72,"props":83,"children":84},{},[85],{"type":49,"value":86},"Cache Behaviors",{"type":49,"value":88},": Rules that match URL patterns and define how CloudFront handles requests",{"type":44,"tag":68,"props":90,"children":91},{},[92,97],{"type":44,"tag":72,"props":93,"children":94},{},[95],{"type":49,"value":96},"Default Cache Behavior",{"type":49,"value":98},": Catches all requests that don't match other behaviors",{"type":44,"tag":100,"props":101,"children":103},"h3",{"id":102},"origin-types",[104],{"type":49,"value":105},"Origin Types",{"type":44,"tag":107,"props":108,"children":110},"h4",{"id":109},"s3-origins",[111],{"type":49,"value":112},"S3 Origins",{"type":44,"tag":64,"props":114,"children":115},{},[116,128,133,147],{"type":44,"tag":68,"props":117,"children":118},{},[119,121,126],{"type":49,"value":120},"Use ",{"type":44,"tag":72,"props":122,"children":123},{},[124],{"type":49,"value":125},"Origin Access Control (OAC)",{"type":49,"value":127}," — not the legacy Origin Access Identity (OAI)",{"type":44,"tag":68,"props":129,"children":130},{},[131],{"type":49,"value":132},"OAC supports SSE-KMS, SSE-S3, and all S3 features. OAI does not.",{"type":44,"tag":68,"props":134,"children":135},{},[136,138,145],{"type":49,"value":137},"Bucket policy must grant ",{"type":44,"tag":139,"props":140,"children":142},"code",{"className":141},[],[143],{"type":49,"value":144},"s3:GetObject",{"type":49,"value":146}," to the CloudFront service principal",{"type":44,"tag":68,"props":148,"children":149},{},[150],{"type":49,"value":151},"For S3 static website hosting endpoints, use a custom origin (not S3 origin type) since the website endpoint is HTTP-only",{"type":44,"tag":107,"props":153,"children":155},{"id":154},"albnlb-origins",[156],{"type":49,"value":157},"ALB\u002FNLB Origins",{"type":44,"tag":64,"props":159,"children":160},{},[161,166,179],{"type":44,"tag":68,"props":162,"children":163},{},[164],{"type":49,"value":165},"ALB must be internet-facing (CloudFront cannot reach internal ALBs without Lambda@Edge tricks)",{"type":44,"tag":68,"props":167,"children":168},{},[169,171,177],{"type":49,"value":170},"Add a custom header (e.g., ",{"type":44,"tag":139,"props":172,"children":174},{"className":173},[],[175],{"type":49,"value":176},"X-Origin-Verify: \u003Csecret>",{"type":49,"value":178},") and validate it on the ALB to prevent direct access",{"type":44,"tag":68,"props":180,"children":181},{},[182,184,190],{"type":49,"value":183},"Use HTTPS between CloudFront and ALB. Set origin protocol policy to ",{"type":44,"tag":139,"props":185,"children":187},{"className":186},[],[188],{"type":49,"value":189},"https-only",{"type":49,"value":191},".",{"type":44,"tag":107,"props":193,"children":195},{"id":194},"api-gateway-origins",[196],{"type":49,"value":197},"API Gateway Origins",{"type":44,"tag":64,"props":199,"children":200},{},[201,206],{"type":44,"tag":68,"props":202,"children":203},{},[204],{"type":49,"value":205},"Use the regional API endpoint as origin domain (not the edge-optimized endpoint — that adds a second CloudFront hop)",{"type":44,"tag":68,"props":207,"children":208},{},[209,211,217],{"type":49,"value":210},"Path pattern: ",{"type":44,"tag":139,"props":212,"children":214},{"className":213},[],[215],{"type":49,"value":216},"\u002Fapi\u002F*",{"type":49,"value":218}," -> API Gateway origin",{"type":44,"tag":107,"props":220,"children":222},{"id":221},"custom-origins",[223],{"type":49,"value":224},"Custom Origins",{"type":44,"tag":64,"props":226,"children":227},{},[228,233,238],{"type":44,"tag":68,"props":229,"children":230},{},[231],{"type":49,"value":232},"Any HTTP\u002FHTTPS endpoint",{"type":44,"tag":68,"props":234,"children":235},{},[236],{"type":49,"value":237},"Configure origin timeouts: connection timeout (default 10s) and read timeout (default 30s)",{"type":44,"tag":68,"props":239,"children":240},{},[241],{"type":49,"value":242},"Set keep-alive timeout to match your origin server",{"type":44,"tag":52,"props":244,"children":246},{"id":245},"cache-behaviors",[247],{"type":49,"value":86},{"type":44,"tag":45,"props":249,"children":250},{},[251,253,259],{"type":49,"value":252},"Cache behaviors are matched by path pattern in order of precedence (most specific first). The default (",{"type":44,"tag":139,"props":254,"children":256},{"className":255},[],[257],{"type":49,"value":258},"*",{"type":49,"value":260},") is always last.",{"type":44,"tag":100,"props":262,"children":264},{"id":263},"key-settings-per-behavior",[265],{"type":49,"value":266},"Key Settings Per Behavior",{"type":44,"tag":64,"props":268,"children":269},{},[270,280,290,300,310],{"type":44,"tag":68,"props":271,"children":272},{},[273,278],{"type":44,"tag":72,"props":274,"children":275},{},[276],{"type":49,"value":277},"Viewer Protocol Policy",{"type":49,"value":279},": Redirect HTTP to HTTPS (always use this for web apps)",{"type":44,"tag":68,"props":281,"children":282},{},[283,288],{"type":44,"tag":72,"props":284,"children":285},{},[286],{"type":49,"value":287},"Allowed HTTP Methods",{"type":49,"value":289},": GET\u002FHEAD for static, GET\u002FHEAD\u002FOPTIONS\u002FPUT\u002FPOST\u002FPATCH\u002FDELETE for APIs",{"type":44,"tag":68,"props":291,"children":292},{},[293,298],{"type":44,"tag":72,"props":294,"children":295},{},[296],{"type":49,"value":297},"Cache Policy",{"type":49,"value":299},": Controls what's included in the cache key (headers, query strings, cookies)",{"type":44,"tag":68,"props":301,"children":302},{},[303,308],{"type":44,"tag":72,"props":304,"children":305},{},[306],{"type":49,"value":307},"Origin Request Policy",{"type":49,"value":309},": Controls what's forwarded to the origin (separate from cache key)",{"type":44,"tag":68,"props":311,"children":312},{},[313,318],{"type":44,"tag":72,"props":314,"children":315},{},[316],{"type":49,"value":317},"Response Headers Policy",{"type":49,"value":319},": Add security headers (HSTS, CSP, X-Frame-Options)",{"type":44,"tag":100,"props":321,"children":323},{"id":322},"cache-policies-use-managed-policies-when-possible",[324],{"type":49,"value":325},"Cache Policies (use managed policies when possible)",{"type":44,"tag":327,"props":328,"children":329},"table",{},[330,349],{"type":44,"tag":331,"props":332,"children":333},"thead",{},[334],{"type":44,"tag":335,"props":336,"children":337},"tr",{},[338,344],{"type":44,"tag":339,"props":340,"children":341},"th",{},[342],{"type":49,"value":343},"Policy",{"type":44,"tag":339,"props":345,"children":346},{},[347],{"type":49,"value":348},"Use Case",{"type":44,"tag":350,"props":351,"children":352},"tbody",{},[353,367,380],{"type":44,"tag":335,"props":354,"children":355},{},[356,362],{"type":44,"tag":357,"props":358,"children":359},"td",{},[360],{"type":49,"value":361},"CachingOptimized",{"type":44,"tag":357,"props":363,"children":364},{},[365],{"type":49,"value":366},"Static assets (JS, CSS, images). Ignores query strings and headers.",{"type":44,"tag":335,"props":368,"children":369},{},[370,375],{"type":44,"tag":357,"props":371,"children":372},{},[373],{"type":49,"value":374},"CachingOptimizedForUncompressedObjects",{"type":44,"tag":357,"props":376,"children":377},{},[378],{"type":49,"value":379},"Same but without Gzip\u002FBrotli",{"type":44,"tag":335,"props":381,"children":382},{},[383,388],{"type":44,"tag":357,"props":384,"children":385},{},[386],{"type":49,"value":387},"CachingDisabled",{"type":44,"tag":357,"props":389,"children":390},{},[391],{"type":49,"value":392},"Pass-through to origin. Use for APIs and dynamic content.",{"type":44,"tag":45,"props":394,"children":395},{},[396,401],{"type":44,"tag":72,"props":397,"children":398},{},[399],{"type":49,"value":400},"Custom cache policies",{"type":49,"value":402}," when you need to cache by specific query strings or headers. Include only what you must — every key dimension reduces cache hit ratio.",{"type":44,"tag":100,"props":404,"children":406},{"id":405},"origin-request-policies",[407],{"type":49,"value":408},"Origin Request Policies",{"type":44,"tag":327,"props":410,"children":411},{},[412,426],{"type":44,"tag":331,"props":413,"children":414},{},[415],{"type":44,"tag":335,"props":416,"children":417},{},[418,422],{"type":44,"tag":339,"props":419,"children":420},{},[421],{"type":49,"value":343},{"type":44,"tag":339,"props":423,"children":424},{},[425],{"type":49,"value":348},{"type":44,"tag":350,"props":427,"children":428},{},[429,442,455],{"type":44,"tag":335,"props":430,"children":431},{},[432,437],{"type":44,"tag":357,"props":433,"children":434},{},[435],{"type":49,"value":436},"AllViewer",{"type":44,"tag":357,"props":438,"children":439},{},[440],{"type":49,"value":441},"Forward all viewer headers to origin",{"type":44,"tag":335,"props":443,"children":444},{},[445,450],{"type":44,"tag":357,"props":446,"children":447},{},[448],{"type":49,"value":449},"AllViewerExceptHostHeader",{"type":44,"tag":357,"props":451,"children":452},{},[453],{"type":49,"value":454},"Forward all except Host (most common for ALB origins)",{"type":44,"tag":335,"props":456,"children":457},{},[458,463],{"type":44,"tag":357,"props":459,"children":460},{},[461],{"type":49,"value":462},"CORS-S3Origin",{"type":44,"tag":357,"props":464,"children":465},{},[466],{"type":49,"value":467},"Forward CORS headers for S3",{"type":44,"tag":52,"props":469,"children":471},{"id":470},"lambdaedge-vs-cloudfront-functions",[472],{"type":49,"value":473},"Lambda@Edge vs CloudFront Functions",{"type":44,"tag":327,"props":475,"children":476},{},[477,498],{"type":44,"tag":331,"props":478,"children":479},{},[480],{"type":44,"tag":335,"props":481,"children":482},{},[483,488,493],{"type":44,"tag":339,"props":484,"children":485},{},[486],{"type":49,"value":487},"Feature",{"type":44,"tag":339,"props":489,"children":490},{},[491],{"type":49,"value":492},"CloudFront Functions",{"type":44,"tag":339,"props":494,"children":495},{},[496],{"type":49,"value":497},"Lambda@Edge",{"type":44,"tag":350,"props":499,"children":500},{},[501,519,537,555,573,589,607,625],{"type":44,"tag":335,"props":502,"children":503},{},[504,509,514],{"type":44,"tag":357,"props":505,"children":506},{},[507],{"type":49,"value":508},"Runtime",{"type":44,"tag":357,"props":510,"children":511},{},[512],{"type":49,"value":513},"JavaScript only",{"type":44,"tag":357,"props":515,"children":516},{},[517],{"type":49,"value":518},"Node.js, Python",{"type":44,"tag":335,"props":520,"children":521},{},[522,527,532],{"type":44,"tag":357,"props":523,"children":524},{},[525],{"type":49,"value":526},"Execution time",{"type":44,"tag":357,"props":528,"children":529},{},[530],{"type":49,"value":531},"\u003C 1ms",{"type":44,"tag":357,"props":533,"children":534},{},[535],{"type":49,"value":536},"Up to 5s (viewer) \u002F 30s (origin)",{"type":44,"tag":335,"props":538,"children":539},{},[540,545,550],{"type":44,"tag":357,"props":541,"children":542},{},[543],{"type":49,"value":544},"Memory",{"type":44,"tag":357,"props":546,"children":547},{},[548],{"type":49,"value":549},"2 MB",{"type":44,"tag":357,"props":551,"children":552},{},[553],{"type":49,"value":554},"128-10240 MB",{"type":44,"tag":335,"props":556,"children":557},{},[558,563,568],{"type":44,"tag":357,"props":559,"children":560},{},[561],{"type":49,"value":562},"Network access",{"type":44,"tag":357,"props":564,"children":565},{},[566],{"type":49,"value":567},"No",{"type":44,"tag":357,"props":569,"children":570},{},[571],{"type":49,"value":572},"Yes",{"type":44,"tag":335,"props":574,"children":575},{},[576,581,585],{"type":44,"tag":357,"props":577,"children":578},{},[579],{"type":49,"value":580},"Request body access",{"type":44,"tag":357,"props":582,"children":583},{},[584],{"type":49,"value":567},{"type":44,"tag":357,"props":586,"children":587},{},[588],{"type":49,"value":572},{"type":44,"tag":335,"props":590,"children":591},{},[592,597,602],{"type":44,"tag":357,"props":593,"children":594},{},[595],{"type":49,"value":596},"Trigger points",{"type":44,"tag":357,"props":598,"children":599},{},[600],{"type":49,"value":601},"Viewer request, viewer response",{"type":44,"tag":357,"props":603,"children":604},{},[605],{"type":49,"value":606},"All 4 trigger points",{"type":44,"tag":335,"props":608,"children":609},{},[610,615,620],{"type":44,"tag":357,"props":611,"children":612},{},[613],{"type":49,"value":614},"Price",{"type":44,"tag":357,"props":616,"children":617},{},[618],{"type":49,"value":619},"~1\u002F6 of Lambda@Edge",{"type":44,"tag":357,"props":621,"children":622},{},[623],{"type":49,"value":624},"Higher",{"type":44,"tag":335,"props":626,"children":627},{},[628,633,638],{"type":44,"tag":357,"props":629,"children":630},{},[631],{"type":49,"value":632},"Deploy region",{"type":44,"tag":357,"props":634,"children":635},{},[636],{"type":49,"value":637},"All edge locations",{"type":44,"tag":357,"props":639,"children":640},{},[641],{"type":49,"value":642},"Regional edge caches",{"type":44,"tag":45,"props":644,"children":645},{},[646],{"type":44,"tag":72,"props":647,"children":648},{},[649],{"type":49,"value":650},"Use CloudFront Functions for:",{"type":44,"tag":64,"props":652,"children":653},{},[654,659,664,669],{"type":44,"tag":68,"props":655,"children":656},{},[657],{"type":49,"value":658},"URL rewrites and redirects",{"type":44,"tag":68,"props":660,"children":661},{},[662],{"type":49,"value":663},"Header manipulation (add\u002Fmodify\u002Fdelete)",{"type":44,"tag":68,"props":665,"children":666},{},[667],{"type":49,"value":668},"Cache key normalization",{"type":44,"tag":68,"props":670,"children":671},{},[672],{"type":49,"value":673},"Simple A\u002FB testing via cookie",{"type":44,"tag":45,"props":675,"children":676},{},[677],{"type":44,"tag":72,"props":678,"children":679},{},[680],{"type":49,"value":681},"Use Lambda@Edge for:",{"type":44,"tag":64,"props":683,"children":684},{},[685,690,695,700],{"type":44,"tag":68,"props":686,"children":687},{},[688],{"type":49,"value":689},"Authentication and authorization (calling external APIs)",{"type":44,"tag":68,"props":691,"children":692},{},[693],{"type":49,"value":694},"Dynamic origin selection",{"type":44,"tag":68,"props":696,"children":697},{},[698],{"type":49,"value":699},"Modifying request\u002Fresponse bodies",{"type":44,"tag":68,"props":701,"children":702},{},[703],{"type":49,"value":704},"Generating responses at the edge (SSR)",{"type":44,"tag":100,"props":706,"children":708},{"id":707},"trigger-points",[709],{"type":49,"value":710},"Trigger Points",{"type":44,"tag":712,"props":713,"children":714},"ol",{},[715,725,735,745],{"type":44,"tag":68,"props":716,"children":717},{},[718,723],{"type":44,"tag":72,"props":719,"children":720},{},[721],{"type":49,"value":722},"Viewer Request",{"type":49,"value":724},": After CloudFront receives request from viewer",{"type":44,"tag":68,"props":726,"children":727},{},[728,733],{"type":44,"tag":72,"props":729,"children":730},{},[731],{"type":49,"value":732},"Origin Request",{"type":49,"value":734},": Before CloudFront forwards to origin (only on cache miss)",{"type":44,"tag":68,"props":736,"children":737},{},[738,743],{"type":44,"tag":72,"props":739,"children":740},{},[741],{"type":49,"value":742},"Origin Response",{"type":49,"value":744},": After CloudFront receives response from origin",{"type":44,"tag":68,"props":746,"children":747},{},[748,753],{"type":44,"tag":72,"props":749,"children":750},{},[751],{"type":49,"value":752},"Viewer Response",{"type":49,"value":754},": Before CloudFront returns response to viewer",{"type":44,"tag":52,"props":756,"children":758},{"id":757},"signed-urls-and-signed-cookies",[759],{"type":49,"value":760},"Signed URLs and Signed Cookies",{"type":44,"tag":45,"props":762,"children":763},{},[764],{"type":49,"value":765},"Use when you need to restrict access to content:",{"type":44,"tag":64,"props":767,"children":768},{},[769,779],{"type":44,"tag":68,"props":770,"children":771},{},[772,777],{"type":44,"tag":72,"props":773,"children":774},{},[775],{"type":49,"value":776},"Signed URLs",{"type":49,"value":778},": One URL = one resource. Best for individual file downloads.",{"type":44,"tag":68,"props":780,"children":781},{},[782,787],{"type":44,"tag":72,"props":783,"children":784},{},[785],{"type":49,"value":786},"Signed Cookies",{"type":49,"value":788},": One cookie = access to multiple resources. Best for HLS\u002FDASH streaming or restricting entire site sections.",{"type":44,"tag":45,"props":790,"children":791},{},[792,794,799],{"type":49,"value":793},"Use a ",{"type":44,"tag":72,"props":795,"children":796},{},[797],{"type":49,"value":798},"key group",{"type":49,"value":800}," (not the legacy CloudFront key pair which requires root account). Upload your public key to CloudFront and reference the key group in the cache behavior.",{"type":44,"tag":45,"props":802,"children":803},{},[804],{"type":49,"value":805},"Set expiration times as short as practical. For streaming, 1-2 hours. For downloads, minutes.",{"type":44,"tag":52,"props":807,"children":809},{"id":808},"waf-integration",[810],{"type":49,"value":811},"WAF Integration",{"type":44,"tag":64,"props":813,"children":814},{},[815,820,825,830,835],{"type":44,"tag":68,"props":816,"children":817},{},[818],{"type":49,"value":819},"Attach AWS WAF WebACL directly to the CloudFront distribution",{"type":44,"tag":68,"props":821,"children":822},{},[823],{"type":49,"value":824},"WAF runs before cache lookup — it protects even cached content",{"type":44,"tag":68,"props":826,"children":827},{},[828],{"type":49,"value":829},"Use managed rule groups: AWSManagedRulesCommonRuleSet, AWSManagedRulesKnownBadInputsRuleSet, AWSManagedRulesSQLiRuleSet",{"type":44,"tag":68,"props":831,"children":832},{},[833],{"type":49,"value":834},"Add rate-limiting rules to prevent abuse",{"type":44,"tag":68,"props":836,"children":837},{},[838],{"type":49,"value":839},"WAF on CloudFront is in us-east-1 (regardless of where your other resources are)",{"type":44,"tag":52,"props":841,"children":843},{"id":842},"common-cli-commands",[844],{"type":49,"value":845},"Common CLI Commands",{"type":44,"tag":847,"props":848,"children":853},"pre",{"className":849,"code":850,"language":851,"meta":852,"style":852},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# List distributions\naws cloudfront list-distributions --query 'DistributionList.Items[*].{ID:Id,Domain:DomainName,Status:Status,Aliases:Aliases.Items}'\n\n# Get distribution config\naws cloudfront get-distribution-config --id EXXXXX\n\n# Create invalidation\naws cloudfront create-invalidation --distribution-id EXXXXX --paths \"\u002F*\"\n\n# Create invalidation for specific paths\naws cloudfront create-invalidation --distribution-id EXXXXX --paths \"\u002Findex.html\" \"\u002Fstatic\u002F*\"\n\n# List invalidations\naws cloudfront list-invalidations --distribution-id EXXXXX\n\n# Get cache statistics\naws cloudfront get-distribution --id EXXXXX --query 'Distribution.{Status:Status,DomainName:DomainName,Origins:DistributionConfig.Origins.Items[*].DomainName}'\n\n# Test a CloudFront Function\naws cloudfront test-function --name my-function --if-match EXXXXX --stage DEVELOPMENT --event-object fileb:\u002F\u002Ftest-event.json\n\n# List CloudFront Functions\naws cloudfront list-functions\n\n# Describe a function\naws cloudfront describe-function --name my-function\n","bash","",[854],{"type":44,"tag":139,"props":855,"children":856},{"__ignoreMap":852},[857,869,910,920,929,956,964,973,1020,1028,1037,1092,1100,1109,1133,1140,1149,1191,1199,1208,1264,1272,1281,1298,1306,1315],{"type":44,"tag":858,"props":859,"children":862},"span",{"class":860,"line":861},"line",1,[863],{"type":44,"tag":858,"props":864,"children":866},{"style":865},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[867],{"type":49,"value":868},"# List distributions\n",{"type":44,"tag":858,"props":870,"children":872},{"class":860,"line":871},2,[873,878,884,889,894,900,905],{"type":44,"tag":858,"props":874,"children":876},{"style":875},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[877],{"type":49,"value":25},{"type":44,"tag":858,"props":879,"children":881},{"style":880},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[882],{"type":49,"value":883}," cloudfront",{"type":44,"tag":858,"props":885,"children":886},{"style":880},[887],{"type":49,"value":888}," list-distributions",{"type":44,"tag":858,"props":890,"children":891},{"style":880},[892],{"type":49,"value":893}," --query",{"type":44,"tag":858,"props":895,"children":897},{"style":896},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[898],{"type":49,"value":899}," '",{"type":44,"tag":858,"props":901,"children":902},{"style":880},[903],{"type":49,"value":904},"DistributionList.Items[*].{ID:Id,Domain:DomainName,Status:Status,Aliases:Aliases.Items}",{"type":44,"tag":858,"props":906,"children":907},{"style":896},[908],{"type":49,"value":909},"'\n",{"type":44,"tag":858,"props":911,"children":913},{"class":860,"line":912},3,[914],{"type":44,"tag":858,"props":915,"children":917},{"emptyLinePlaceholder":916},true,[918],{"type":49,"value":919},"\n",{"type":44,"tag":858,"props":921,"children":923},{"class":860,"line":922},4,[924],{"type":44,"tag":858,"props":925,"children":926},{"style":865},[927],{"type":49,"value":928},"# Get distribution config\n",{"type":44,"tag":858,"props":930,"children":932},{"class":860,"line":931},5,[933,937,941,946,951],{"type":44,"tag":858,"props":934,"children":935},{"style":875},[936],{"type":49,"value":25},{"type":44,"tag":858,"props":938,"children":939},{"style":880},[940],{"type":49,"value":883},{"type":44,"tag":858,"props":942,"children":943},{"style":880},[944],{"type":49,"value":945}," get-distribution-config",{"type":44,"tag":858,"props":947,"children":948},{"style":880},[949],{"type":49,"value":950}," --id",{"type":44,"tag":858,"props":952,"children":953},{"style":880},[954],{"type":49,"value":955}," EXXXXX\n",{"type":44,"tag":858,"props":957,"children":959},{"class":860,"line":958},6,[960],{"type":44,"tag":858,"props":961,"children":962},{"emptyLinePlaceholder":916},[963],{"type":49,"value":919},{"type":44,"tag":858,"props":965,"children":967},{"class":860,"line":966},7,[968],{"type":44,"tag":858,"props":969,"children":970},{"style":865},[971],{"type":49,"value":972},"# Create invalidation\n",{"type":44,"tag":858,"props":974,"children":976},{"class":860,"line":975},8,[977,981,985,990,995,1000,1005,1010,1015],{"type":44,"tag":858,"props":978,"children":979},{"style":875},[980],{"type":49,"value":25},{"type":44,"tag":858,"props":982,"children":983},{"style":880},[984],{"type":49,"value":883},{"type":44,"tag":858,"props":986,"children":987},{"style":880},[988],{"type":49,"value":989}," create-invalidation",{"type":44,"tag":858,"props":991,"children":992},{"style":880},[993],{"type":49,"value":994}," --distribution-id",{"type":44,"tag":858,"props":996,"children":997},{"style":880},[998],{"type":49,"value":999}," EXXXXX",{"type":44,"tag":858,"props":1001,"children":1002},{"style":880},[1003],{"type":49,"value":1004}," --paths",{"type":44,"tag":858,"props":1006,"children":1007},{"style":896},[1008],{"type":49,"value":1009}," \"",{"type":44,"tag":858,"props":1011,"children":1012},{"style":880},[1013],{"type":49,"value":1014},"\u002F*",{"type":44,"tag":858,"props":1016,"children":1017},{"style":896},[1018],{"type":49,"value":1019},"\"\n",{"type":44,"tag":858,"props":1021,"children":1023},{"class":860,"line":1022},9,[1024],{"type":44,"tag":858,"props":1025,"children":1026},{"emptyLinePlaceholder":916},[1027],{"type":49,"value":919},{"type":44,"tag":858,"props":1029,"children":1031},{"class":860,"line":1030},10,[1032],{"type":44,"tag":858,"props":1033,"children":1034},{"style":865},[1035],{"type":49,"value":1036},"# Create invalidation for specific paths\n",{"type":44,"tag":858,"props":1038,"children":1040},{"class":860,"line":1039},11,[1041,1045,1049,1053,1057,1061,1065,1069,1074,1079,1083,1088],{"type":44,"tag":858,"props":1042,"children":1043},{"style":875},[1044],{"type":49,"value":25},{"type":44,"tag":858,"props":1046,"children":1047},{"style":880},[1048],{"type":49,"value":883},{"type":44,"tag":858,"props":1050,"children":1051},{"style":880},[1052],{"type":49,"value":989},{"type":44,"tag":858,"props":1054,"children":1055},{"style":880},[1056],{"type":49,"value":994},{"type":44,"tag":858,"props":1058,"children":1059},{"style":880},[1060],{"type":49,"value":999},{"type":44,"tag":858,"props":1062,"children":1063},{"style":880},[1064],{"type":49,"value":1004},{"type":44,"tag":858,"props":1066,"children":1067},{"style":896},[1068],{"type":49,"value":1009},{"type":44,"tag":858,"props":1070,"children":1071},{"style":880},[1072],{"type":49,"value":1073},"\u002Findex.html",{"type":44,"tag":858,"props":1075,"children":1076},{"style":896},[1077],{"type":49,"value":1078},"\"",{"type":44,"tag":858,"props":1080,"children":1081},{"style":896},[1082],{"type":49,"value":1009},{"type":44,"tag":858,"props":1084,"children":1085},{"style":880},[1086],{"type":49,"value":1087},"\u002Fstatic\u002F*",{"type":44,"tag":858,"props":1089,"children":1090},{"style":896},[1091],{"type":49,"value":1019},{"type":44,"tag":858,"props":1093,"children":1095},{"class":860,"line":1094},12,[1096],{"type":44,"tag":858,"props":1097,"children":1098},{"emptyLinePlaceholder":916},[1099],{"type":49,"value":919},{"type":44,"tag":858,"props":1101,"children":1103},{"class":860,"line":1102},13,[1104],{"type":44,"tag":858,"props":1105,"children":1106},{"style":865},[1107],{"type":49,"value":1108},"# List invalidations\n",{"type":44,"tag":858,"props":1110,"children":1111},{"class":860,"line":26},[1112,1116,1120,1125,1129],{"type":44,"tag":858,"props":1113,"children":1114},{"style":875},[1115],{"type":49,"value":25},{"type":44,"tag":858,"props":1117,"children":1118},{"style":880},[1119],{"type":49,"value":883},{"type":44,"tag":858,"props":1121,"children":1122},{"style":880},[1123],{"type":49,"value":1124}," list-invalidations",{"type":44,"tag":858,"props":1126,"children":1127},{"style":880},[1128],{"type":49,"value":994},{"type":44,"tag":858,"props":1130,"children":1131},{"style":880},[1132],{"type":49,"value":955},{"type":44,"tag":858,"props":1134,"children":1135},{"class":860,"line":30},[1136],{"type":44,"tag":858,"props":1137,"children":1138},{"emptyLinePlaceholder":916},[1139],{"type":49,"value":919},{"type":44,"tag":858,"props":1141,"children":1143},{"class":860,"line":1142},16,[1144],{"type":44,"tag":858,"props":1145,"children":1146},{"style":865},[1147],{"type":49,"value":1148},"# Get cache statistics\n",{"type":44,"tag":858,"props":1150,"children":1152},{"class":860,"line":1151},17,[1153,1157,1161,1166,1170,1174,1178,1182,1187],{"type":44,"tag":858,"props":1154,"children":1155},{"style":875},[1156],{"type":49,"value":25},{"type":44,"tag":858,"props":1158,"children":1159},{"style":880},[1160],{"type":49,"value":883},{"type":44,"tag":858,"props":1162,"children":1163},{"style":880},[1164],{"type":49,"value":1165}," get-distribution",{"type":44,"tag":858,"props":1167,"children":1168},{"style":880},[1169],{"type":49,"value":950},{"type":44,"tag":858,"props":1171,"children":1172},{"style":880},[1173],{"type":49,"value":999},{"type":44,"tag":858,"props":1175,"children":1176},{"style":880},[1177],{"type":49,"value":893},{"type":44,"tag":858,"props":1179,"children":1180},{"style":896},[1181],{"type":49,"value":899},{"type":44,"tag":858,"props":1183,"children":1184},{"style":880},[1185],{"type":49,"value":1186},"Distribution.{Status:Status,DomainName:DomainName,Origins:DistributionConfig.Origins.Items[*].DomainName}",{"type":44,"tag":858,"props":1188,"children":1189},{"style":896},[1190],{"type":49,"value":909},{"type":44,"tag":858,"props":1192,"children":1194},{"class":860,"line":1193},18,[1195],{"type":44,"tag":858,"props":1196,"children":1197},{"emptyLinePlaceholder":916},[1198],{"type":49,"value":919},{"type":44,"tag":858,"props":1200,"children":1202},{"class":860,"line":1201},19,[1203],{"type":44,"tag":858,"props":1204,"children":1205},{"style":865},[1206],{"type":49,"value":1207},"# Test a CloudFront Function\n",{"type":44,"tag":858,"props":1209,"children":1211},{"class":860,"line":1210},20,[1212,1216,1220,1225,1230,1235,1240,1244,1249,1254,1259],{"type":44,"tag":858,"props":1213,"children":1214},{"style":875},[1215],{"type":49,"value":25},{"type":44,"tag":858,"props":1217,"children":1218},{"style":880},[1219],{"type":49,"value":883},{"type":44,"tag":858,"props":1221,"children":1222},{"style":880},[1223],{"type":49,"value":1224}," test-function",{"type":44,"tag":858,"props":1226,"children":1227},{"style":880},[1228],{"type":49,"value":1229}," --name",{"type":44,"tag":858,"props":1231,"children":1232},{"style":880},[1233],{"type":49,"value":1234}," my-function",{"type":44,"tag":858,"props":1236,"children":1237},{"style":880},[1238],{"type":49,"value":1239}," --if-match",{"type":44,"tag":858,"props":1241,"children":1242},{"style":880},[1243],{"type":49,"value":999},{"type":44,"tag":858,"props":1245,"children":1246},{"style":880},[1247],{"type":49,"value":1248}," --stage",{"type":44,"tag":858,"props":1250,"children":1251},{"style":880},[1252],{"type":49,"value":1253}," DEVELOPMENT",{"type":44,"tag":858,"props":1255,"children":1256},{"style":880},[1257],{"type":49,"value":1258}," --event-object",{"type":44,"tag":858,"props":1260,"children":1261},{"style":880},[1262],{"type":49,"value":1263}," fileb:\u002F\u002Ftest-event.json\n",{"type":44,"tag":858,"props":1265,"children":1267},{"class":860,"line":1266},21,[1268],{"type":44,"tag":858,"props":1269,"children":1270},{"emptyLinePlaceholder":916},[1271],{"type":49,"value":919},{"type":44,"tag":858,"props":1273,"children":1275},{"class":860,"line":1274},22,[1276],{"type":44,"tag":858,"props":1277,"children":1278},{"style":865},[1279],{"type":49,"value":1280},"# List CloudFront Functions\n",{"type":44,"tag":858,"props":1282,"children":1284},{"class":860,"line":1283},23,[1285,1289,1293],{"type":44,"tag":858,"props":1286,"children":1287},{"style":875},[1288],{"type":49,"value":25},{"type":44,"tag":858,"props":1290,"children":1291},{"style":880},[1292],{"type":49,"value":883},{"type":44,"tag":858,"props":1294,"children":1295},{"style":880},[1296],{"type":49,"value":1297}," list-functions\n",{"type":44,"tag":858,"props":1299,"children":1301},{"class":860,"line":1300},24,[1302],{"type":44,"tag":858,"props":1303,"children":1304},{"emptyLinePlaceholder":916},[1305],{"type":49,"value":919},{"type":44,"tag":858,"props":1307,"children":1309},{"class":860,"line":1308},25,[1310],{"type":44,"tag":858,"props":1311,"children":1312},{"style":865},[1313],{"type":49,"value":1314},"# Describe a function\n",{"type":44,"tag":858,"props":1316,"children":1318},{"class":860,"line":1317},26,[1319,1323,1327,1332,1336],{"type":44,"tag":858,"props":1320,"children":1321},{"style":875},[1322],{"type":49,"value":25},{"type":44,"tag":858,"props":1324,"children":1325},{"style":880},[1326],{"type":49,"value":883},{"type":44,"tag":858,"props":1328,"children":1329},{"style":880},[1330],{"type":49,"value":1331}," describe-function",{"type":44,"tag":858,"props":1333,"children":1334},{"style":880},[1335],{"type":49,"value":1229},{"type":44,"tag":858,"props":1337,"children":1338},{"style":880},[1339],{"type":49,"value":1340}," my-function\n",{"type":44,"tag":52,"props":1342,"children":1344},{"id":1343},"output-format",[1345],{"type":49,"value":1346},"Output Format",{"type":44,"tag":327,"props":1348,"children":1349},{},[1350,1366],{"type":44,"tag":331,"props":1351,"children":1352},{},[1353],{"type":44,"tag":335,"props":1354,"children":1355},{},[1356,1361],{"type":44,"tag":339,"props":1357,"children":1358},{},[1359],{"type":49,"value":1360},"Field",{"type":44,"tag":339,"props":1362,"children":1363},{},[1364],{"type":49,"value":1365},"Details",{"type":44,"tag":350,"props":1367,"children":1368},{},[1369,1385,1400,1416,1432,1448,1464,1480],{"type":44,"tag":335,"props":1370,"children":1371},{},[1372,1380],{"type":44,"tag":357,"props":1373,"children":1374},{},[1375],{"type":44,"tag":72,"props":1376,"children":1377},{},[1378],{"type":49,"value":1379},"Distribution type",{"type":44,"tag":357,"props":1381,"children":1382},{},[1383],{"type":49,"value":1384},"Web distribution, streaming, or multi-origin",{"type":44,"tag":335,"props":1386,"children":1387},{},[1388,1395],{"type":44,"tag":357,"props":1389,"children":1390},{},[1391],{"type":44,"tag":72,"props":1392,"children":1393},{},[1394],{"type":49,"value":76},{"type":44,"tag":357,"props":1396,"children":1397},{},[1398],{"type":49,"value":1399},"Origin domains, types (S3\u002FALB\u002FAPI GW\u002Fcustom), access control (OAC)",{"type":44,"tag":335,"props":1401,"children":1402},{},[1403,1411],{"type":44,"tag":357,"props":1404,"children":1405},{},[1406],{"type":44,"tag":72,"props":1407,"children":1408},{},[1409],{"type":49,"value":1410},"Cache behaviors",{"type":44,"tag":357,"props":1412,"children":1413},{},[1414],{"type":49,"value":1415},"Path patterns, cache policies, and origin request policies per behavior",{"type":44,"tag":335,"props":1417,"children":1418},{},[1419,1427],{"type":44,"tag":357,"props":1420,"children":1421},{},[1422],{"type":44,"tag":72,"props":1423,"children":1424},{},[1425],{"type":49,"value":1426},"SSL\u002FTLS",{"type":44,"tag":357,"props":1428,"children":1429},{},[1430],{"type":49,"value":1431},"ACM certificate ARN, minimum protocol version, SNI config",{"type":44,"tag":335,"props":1433,"children":1434},{},[1435,1443],{"type":44,"tag":357,"props":1436,"children":1437},{},[1438],{"type":44,"tag":72,"props":1439,"children":1440},{},[1441],{"type":49,"value":1442},"WAF",{"type":44,"tag":357,"props":1444,"children":1445},{},[1446],{"type":49,"value":1447},"WebACL ID, managed rule groups, custom rate-limiting rules",{"type":44,"tag":335,"props":1449,"children":1450},{},[1451,1459],{"type":44,"tag":357,"props":1452,"children":1453},{},[1454],{"type":44,"tag":72,"props":1455,"children":1456},{},[1457],{"type":49,"value":1458},"Functions (Edge\u002FCF)",{"type":44,"tag":357,"props":1460,"children":1461},{},[1462],{"type":49,"value":1463},"CloudFront Functions or Lambda@Edge, trigger points, purpose",{"type":44,"tag":335,"props":1465,"children":1466},{},[1467,1475],{"type":44,"tag":357,"props":1468,"children":1469},{},[1470],{"type":44,"tag":72,"props":1471,"children":1472},{},[1473],{"type":49,"value":1474},"Headers",{"type":44,"tag":357,"props":1476,"children":1477},{},[1478],{"type":49,"value":1479},"Response headers policy (HSTS, CSP, X-Frame-Options)",{"type":44,"tag":335,"props":1481,"children":1482},{},[1483,1491],{"type":44,"tag":357,"props":1484,"children":1485},{},[1486],{"type":44,"tag":72,"props":1487,"children":1488},{},[1489],{"type":49,"value":1490},"Logging",{"type":44,"tag":357,"props":1492,"children":1493},{},[1494],{"type":49,"value":1495},"Standard logging (S3 bucket) or real-time logging (Kinesis)",{"type":44,"tag":52,"props":1497,"children":1499},{"id":1498},"related-skills",[1500],{"type":49,"value":1501},"Related Skills",{"type":44,"tag":64,"props":1503,"children":1504},{},[1505,1516,1527,1538,1548],{"type":44,"tag":68,"props":1506,"children":1507},{},[1508,1514],{"type":44,"tag":139,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":49,"value":1513},"s3",{"type":49,"value":1515}," — S3 origins, bucket policies, and Origin Access Control",{"type":44,"tag":68,"props":1517,"children":1518},{},[1519,1525],{"type":44,"tag":139,"props":1520,"children":1522},{"className":1521},[],[1523],{"type":49,"value":1524},"api-gateway",{"type":49,"value":1526}," — API Gateway origins, regional endpoints, and cache behavior config",{"type":44,"tag":68,"props":1528,"children":1529},{},[1530,1536],{"type":44,"tag":139,"props":1531,"children":1533},{"className":1532},[],[1534],{"type":49,"value":1535},"lambda",{"type":49,"value":1537}," — Lambda@Edge functions and CloudFront Function alternatives",{"type":44,"tag":68,"props":1539,"children":1540},{},[1541,1546],{"type":44,"tag":139,"props":1542,"children":1544},{"className":1543},[],[1545],{"type":49,"value":19},{"type":49,"value":1547}," — ALB origins, VPC connectivity, and DNS with Route53",{"type":44,"tag":68,"props":1549,"children":1550},{},[1551,1557],{"type":44,"tag":139,"props":1552,"children":1554},{"className":1553},[],[1555],{"type":49,"value":1556},"security-review",{"type":49,"value":1558}," — WAF rules, signed URLs, and public exposure review",{"type":44,"tag":52,"props":1560,"children":1562},{"id":1561},"anti-patterns",[1563],{"type":49,"value":1564},"Anti-Patterns",{"type":44,"tag":64,"props":1566,"children":1567},{},[1568,1578,1588,1606,1616,1626,1636,1646,1663,1673],{"type":44,"tag":68,"props":1569,"children":1570},{},[1571,1576],{"type":44,"tag":72,"props":1572,"children":1573},{},[1574],{"type":49,"value":1575},"Using OAI instead of OAC",{"type":49,"value":1577},": OAI is legacy and doesn't support SSE-KMS. Always use Origin Access Control.",{"type":44,"tag":68,"props":1579,"children":1580},{},[1581,1586],{"type":44,"tag":72,"props":1582,"children":1583},{},[1584],{"type":49,"value":1585},"Caching dynamic content without a strategy",{"type":49,"value":1587},": Don't cache API responses unless you explicitly control TTLs and cache keys. Use CachingDisabled policy for APIs.",{"type":44,"tag":68,"props":1589,"children":1590},{},[1591,1596,1598,1604],{"type":44,"tag":72,"props":1592,"children":1593},{},[1594],{"type":49,"value":1595},"Invalidating as a deployment strategy",{"type":49,"value":1597},": Invalidations take time and cost money after 1,000 paths\u002Fmonth. Instead, use versioned file names (e.g., ",{"type":44,"tag":139,"props":1599,"children":1601},{"className":1600},[],[1602],{"type":49,"value":1603},"app.abc123.js",{"type":49,"value":1605},") for cache busting.",{"type":44,"tag":68,"props":1607,"children":1608},{},[1609,1614],{"type":44,"tag":72,"props":1610,"children":1611},{},[1612],{"type":49,"value":1613},"Forwarding all headers\u002Fcookies\u002Fquery strings",{"type":49,"value":1615},": This destroys cache hit ratio. Forward only what the origin needs. Use separate cache and origin request policies.",{"type":44,"tag":68,"props":1617,"children":1618},{},[1619,1624],{"type":44,"tag":72,"props":1620,"children":1621},{},[1622],{"type":49,"value":1623},"Not setting security response headers",{"type":49,"value":1625},": Always add HSTS, X-Content-Type-Options, X-Frame-Options via a response headers policy.",{"type":44,"tag":68,"props":1627,"children":1628},{},[1629,1634],{"type":44,"tag":72,"props":1630,"children":1631},{},[1632],{"type":49,"value":1633},"Edge-optimized API Gateway behind CloudFront",{"type":49,"value":1635},": Double-hop through two CloudFront distributions. Use regional API Gateway endpoint instead.",{"type":44,"tag":68,"props":1637,"children":1638},{},[1639,1644],{"type":44,"tag":72,"props":1640,"children":1641},{},[1642],{"type":49,"value":1643},"No WAF on public distributions",{"type":49,"value":1645},": CloudFront is the front door to your application. Protect it with WAF.",{"type":44,"tag":68,"props":1647,"children":1648},{},[1649,1654,1656,1661],{"type":44,"tag":72,"props":1650,"children":1651},{},[1652],{"type":49,"value":1653},"Wildcard invalidation on every deploy",{"type":49,"value":1655},": ",{"type":44,"tag":139,"props":1657,"children":1659},{"className":1658},[],[1660],{"type":49,"value":1014},{"type":49,"value":1662}," invalidates everything. Use path-specific invalidations or, better, versioned filenames.",{"type":44,"tag":68,"props":1664,"children":1665},{},[1666,1671],{"type":44,"tag":72,"props":1667,"children":1668},{},[1669],{"type":49,"value":1670},"Not compressing content",{"type":49,"value":1672},": Enable automatic compression in the cache behavior. CloudFront supports Gzip and Brotli.",{"type":44,"tag":68,"props":1674,"children":1675},{},[1676,1681],{"type":44,"tag":72,"props":1677,"children":1678},{},[1679],{"type":49,"value":1680},"Using self-signed certs with custom domains",{"type":49,"value":1682},": Use ACM certificates in us-east-1. They're free and auto-renew.",{"type":44,"tag":1684,"props":1685,"children":1686},"style",{},[1687],{"type":49,"value":1688},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":1690,"total":1789},[1691,1705,1720,1732,1744,1759,1774],{"slug":1692,"name":1692,"fn":1693,"description":1694,"org":1695,"tags":1696,"stars":26,"repoUrl":27,"updatedAt":1704},"agentcore","design Amazon Bedrock AgentCore architectures","Deep-dive into Amazon Bedrock AgentCore platform design, service selection, deployment, and production operations. This skill should be used when the user asks to \"design an AgentCore architecture\", \"deploy agents on AgentCore\", \"configure AgentCore Runtime\", \"set up AgentCore Memory\", \"use AgentCore Gateway\", \"configure AgentCore Identity\", \"set up AgentCore Policy\", \"plan agent observability\", \"evaluate agent quality\", \"move agent PoC to production\", or mentions AgentCore, AgentCore Runtime, AgentCore Memory, AgentCore Gateway, AgentCore Identity, AgentCore Policy, AgentCore Evaluations, AgentCore Code Interpreter, AgentCore Browser, A2A protocol, or multi-agent orchestration on AWS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1697,1700,1703],{"name":1698,"slug":1699,"type":16},"Agents","agents",{"name":1701,"slug":1702,"type":16},"Architecture","architecture",{"name":24,"slug":25,"type":16},"2026-07-12T08:40:11.108951",{"slug":1706,"name":1706,"fn":1707,"description":1708,"org":1709,"tags":1710,"stars":26,"repoUrl":27,"updatedAt":1719},"aidlc-lite","develop AI applications on AWS","Lightweight AI development lifecycle for building on AWS. A simplified take on the AI-DLC philosophy — think together, then build fast. Acts as a design partner that understands intent, proposes alternatives with trade-offs, and ships working code without the ceremony of full requirements\u002Fdesign\u002Fspec documents. Use when a founder says \"build X on AWS\", \"add Y to my stack\", \"scaffold an API\", or \"write the CDK for Z\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1711,1712,1715,1716],{"name":1698,"slug":1699,"type":16},{"name":1713,"slug":1714,"type":16},"AI Infrastructure","ai-infrastructure",{"name":24,"slug":25,"type":16},{"name":1717,"slug":1718,"type":16},"Engineering","engineering","2026-07-12T08:40:40.204103",{"slug":1721,"name":1721,"fn":1722,"description":1723,"org":1724,"tags":1725,"stars":26,"repoUrl":27,"updatedAt":1731},"architect-for-startups","advise on AWS architecture for startups","AWS architecture advisor tailored specifically for startups. Alters AWS architecture recommendations based on startup stage (pre-revenue through Series B+), team size, runway, and credits. ALWAYS use when asked about building on AWS, choosing services, planning infrastructure, managing costs with credits, or preparing architecture for fundraising.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1726,1727,1728],{"name":1701,"slug":1702,"type":16},{"name":24,"slug":25,"type":16},{"name":1729,"slug":1730,"type":16},"Strategy","strategy","2026-07-12T08:41:33.557354",{"slug":1733,"name":1733,"fn":1734,"description":1735,"org":1736,"tags":1737,"stars":26,"repoUrl":27,"updatedAt":1743},"aws-architect","design and review AWS architectures","Design and review AWS architectures following Well-Architected Framework principles. Use when planning new infrastructure, reviewing existing architectures, evaluating trade-offs between AWS services, or when asked about AWS best practices.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1738,1739,1740],{"name":1701,"slug":1702,"type":16},{"name":24,"slug":25,"type":16},{"name":1741,"slug":1742,"type":16},"Infrastructure","infrastructure","2026-07-12T08:40:57.630086",{"slug":1745,"name":1745,"fn":1746,"description":1747,"org":1748,"tags":1749,"stars":26,"repoUrl":27,"updatedAt":1758},"aws-compare","compare AWS architecture options","Compare 2-3 AWS architecture options side-by-side across cost, complexity, performance, security, and operational burden. Use when evaluating trade-offs between approaches or when the user is deciding between options.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1750,1751,1752,1755],{"name":1701,"slug":1702,"type":16},{"name":24,"slug":25,"type":16},{"name":1753,"slug":1754,"type":16},"Cost Optimization","cost-optimization",{"name":1756,"slug":1757,"type":16},"Security","security","2026-07-12T08:40:23.960287",{"slug":1760,"name":1760,"fn":1761,"description":1762,"org":1763,"tags":1764,"stars":26,"repoUrl":27,"updatedAt":1773},"aws-debug","debug AWS infrastructure and deployment failures","Debug AWS infrastructure issues, deployment failures, and runtime errors. Use when troubleshooting CloudFormation stack failures, Lambda errors, ECS task failures, permission issues, networking problems, or any AWS service misbehavior.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1765,1766,1769,1770],{"name":24,"slug":25,"type":16},{"name":1767,"slug":1768,"type":16},"Debugging","debugging",{"name":21,"slug":22,"type":16},{"name":1771,"slug":1772,"type":16},"Observability","observability","2026-07-12T08:40:16.767171",{"slug":1775,"name":1775,"fn":1776,"description":1777,"org":1778,"tags":1779,"stars":26,"repoUrl":27,"updatedAt":1788},"aws-diagram","generate AWS architecture diagrams","Generate AWS architecture diagrams in Mermaid or ASCII from a description, existing IaC, or conversation context. Use when the user wants to visualize an architecture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1780,1781,1782,1785],{"name":1701,"slug":1702,"type":16},{"name":24,"slug":25,"type":16},{"name":1783,"slug":1784,"type":16},"Diagrams","diagrams",{"name":1786,"slug":1787,"type":16},"Visualization","visualization","2026-07-12T08:40:43.26341",42,{"items":1791,"total":1963},[1792,1807,1828,1838,1851,1864,1874,1884,1903,1918,1933,1948],{"slug":1793,"name":1793,"fn":1794,"description":1795,"org":1796,"tags":1797,"stars":1804,"repoUrl":1805,"updatedAt":1806},"agentcore-investigation","investigate Bedrock AgentCore runtime sessions","Investigate Bedrock AgentCore runtime sessions via CloudWatch Logs Insights — resolve session\u002Ftrace IDs, query OTEL spans, filter noise, build timelines. Use when debugging AgentCore agent sessions, tracing tool calls, or analyzing latency.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1798,1799,1800,1803],{"name":24,"slug":25,"type":16},{"name":1767,"slug":1768,"type":16},{"name":1801,"slug":1802,"type":16},"Logs","logs",{"name":1771,"slug":1772,"type":16},9427,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fmcp","2026-07-12T08:37:22.601527",{"slug":1808,"name":1809,"fn":1810,"description":1811,"org":1812,"tags":1813,"stars":1804,"repoUrl":1805,"updatedAt":1827},"amazon-aurora-dsql","amazon aurora dsql","build applications with Aurora DSQL","Build with Aurora DSQL — manage schemas, execute queries, handle migrations, diagnose query plans, load data, and develop applications with a serverless, distributed SQL database. Covers IAM auth, multi-tenant patterns, MySQL-to-DSQL and PostgreSQL-to-DSQL schema conversion, FK replacement code generation, OCC retry patterns, ORM migration (Django\u002FHibernate\u002FRails), DDL operations, query plan explainability, SQL compatibility validation, and bulk data loading. Triggers on phrases like: DSQL, Aurora DSQL, create DSQL table, DSQL schema, migrate to DSQL, distributed SQL database, serverless PostgreSQL-compatible database, DSQL query plan, DSQL EXPLAIN ANALYZE, why is my DSQL query slow, DSQL foreign key, DSQL OCC retry, DSQL multi-region, load into DSQL, load CSV into DSQL, bulk load DSQL, aurora-dsql-loader.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1814,1817,1818,1821,1824],{"name":1815,"slug":1816,"type":16},"Aurora","aurora",{"name":24,"slug":25,"type":16},{"name":1819,"slug":1820,"type":16},"Database","database",{"name":1822,"slug":1823,"type":16},"Serverless","serverless",{"name":1825,"slug":1826,"type":16},"SQL","sql","2026-07-12T08:36:45.053393",{"slug":1829,"name":1830,"fn":1810,"description":1811,"org":1831,"tags":1832,"stars":1804,"repoUrl":1805,"updatedAt":1837},"aurora-dsql","aurora dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1833,1834,1835,1836],{"name":24,"slug":25,"type":16},{"name":1819,"slug":1820,"type":16},{"name":1822,"slug":1823,"type":16},{"name":1825,"slug":1826,"type":16},"2026-07-12T08:36:42.694299",{"slug":1839,"name":1840,"fn":1810,"description":1811,"org":1841,"tags":1842,"stars":1804,"repoUrl":1805,"updatedAt":1850},"aws-dsql","aws dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1843,1844,1845,1848,1849],{"name":24,"slug":25,"type":16},{"name":1819,"slug":1820,"type":16},{"name":1846,"slug":1847,"type":16},"Migration","migration",{"name":1822,"slug":1823,"type":16},{"name":1825,"slug":1826,"type":16},"2026-07-12T08:36:38.584057",{"slug":1852,"name":1853,"fn":1810,"description":1811,"org":1854,"tags":1855,"stars":1804,"repoUrl":1805,"updatedAt":1863},"distributed-postgres","distributed postgres",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1856,1857,1858,1861,1862],{"name":24,"slug":25,"type":16},{"name":1819,"slug":1820,"type":16},{"name":1859,"slug":1860,"type":16},"PostgreSQL","postgresql",{"name":1822,"slug":1823,"type":16},{"name":1825,"slug":1826,"type":16},"2026-07-12T08:36:46.530743",{"slug":1865,"name":1866,"fn":1810,"description":1811,"org":1867,"tags":1868,"stars":1804,"repoUrl":1805,"updatedAt":1873},"distributed-sql","distributed sql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1869,1870,1871,1872],{"name":24,"slug":25,"type":16},{"name":1819,"slug":1820,"type":16},{"name":1822,"slug":1823,"type":16},{"name":1825,"slug":1826,"type":16},"2026-07-12T08:36:48.104182",{"slug":1875,"name":1875,"fn":1810,"description":1811,"org":1876,"tags":1877,"stars":1804,"repoUrl":1805,"updatedAt":1883},"dsql",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1878,1879,1880,1881,1882],{"name":24,"slug":25,"type":16},{"name":1819,"slug":1820,"type":16},{"name":1846,"slug":1847,"type":16},{"name":1822,"slug":1823,"type":16},{"name":1825,"slug":1826,"type":16},"2026-07-12T08:36:36.374512",{"slug":1885,"name":1885,"fn":1886,"description":1887,"org":1888,"tags":1889,"stars":1900,"repoUrl":1901,"updatedAt":1902},"cost-efficiency-analyzer","analyze cost efficiency and expenses","Analyzes cost structure, cost efficiency, and expense management from P&L data. Use when the user asks about costs, expenses, COGS, operating expenses, cost ratios, cost control, spending efficiency, margin compression from cost side, or wants to understand where money is going. Also use for \"are we spending too much\", \"cost breakdown\", \"expense analysis\", or \"how efficient are our operations\". NOT for revenue or top-line analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1890,1893,1896,1897],{"name":1891,"slug":1892,"type":16},"Accounting","accounting",{"name":1894,"slug":1895,"type":16},"Analytics","analytics",{"name":1753,"slug":1754,"type":16},{"name":1898,"slug":1899,"type":16},"Finance","finance",3176,"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Fagentcore-samples","2026-07-12T08:40:03.29555",{"slug":1904,"name":1904,"fn":1905,"description":1906,"org":1907,"tags":1908,"stars":1900,"repoUrl":1901,"updatedAt":1917},"executive-financial-briefing","generate executive financial briefings","Generates a concise executive-level financial briefing or summary suitable for a CEO, CFO, or board presentation. Use when the user asks for a summary, briefing, executive summary, board update, financial overview, financial health check, or \"how is the business doing\". Covers the full P&L picture in one page. Also use for \"give me the highlights\", \"what do I need to know\", or \"quick financial update\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1909,1910,1911,1914],{"name":24,"slug":25,"type":16},{"name":1898,"slug":1899,"type":16},{"name":1912,"slug":1913,"type":16},"Management","management",{"name":1915,"slug":1916,"type":16},"Reporting","reporting","2026-07-12T08:40:02.066471",{"slug":1919,"name":1919,"fn":1920,"description":1921,"org":1922,"tags":1923,"stars":1900,"repoUrl":1901,"updatedAt":1932},"multi-quarter-trend-analysis","analyze multi-quarter financial trends","Analyzes financial trends across multiple quarters by comparing P&L metrics over time. Use when the user wants to see trends, patterns, trajectories, or directional movement across 3 or more quarters. Also use for \"how are we trending\", \"show me the trend\", \"track performance over time\", \"quarter over quarter comparison across all quarters\", or any multi-period longitudinal analysis.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1924,1925,1926,1929],{"name":1894,"slug":1895,"type":16},{"name":1898,"slug":1899,"type":16},{"name":1927,"slug":1928,"type":16},"Financial Statements","financial-statements",{"name":1930,"slug":1931,"type":16},"Variance Analysis","variance-analysis","2026-07-12T08:40:00.79141",{"slug":1934,"name":1934,"fn":1935,"description":1936,"org":1937,"tags":1938,"stars":1900,"repoUrl":1901,"updatedAt":1947},"pdf","process and manipulate PDF documents","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1939,1942,1945],{"name":1940,"slug":1941,"type":16},"Automation","automation",{"name":1943,"slug":1944,"type":16},"Documents","documents",{"name":1946,"slug":1934,"type":16},"PDF","2026-07-12T08:41:44.135656",{"slug":1949,"name":1949,"fn":1950,"description":1951,"org":1952,"tags":1953,"stars":1900,"repoUrl":1901,"updatedAt":1962},"quarterly-kpi-calculator","calculate quarterly financial KPIs","Calculates quarterly financial KPIs from P&L data. P&L figures can be provided directly by the user or fetched from the financial data MCP server. Use when the user wants KPI calculations such as Gross Margin %, EBITDA Margin %, Operating Expense Ratio, or Revenue Growth % QoQ. Also use for quarterly performance review, P&L analysis, or interpreting financial ratios against benchmarks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[1954,1955,1958,1959],{"name":1891,"slug":1892,"type":16},{"name":1956,"slug":1957,"type":16},"Data Analysis","data-analysis",{"name":1898,"slug":1899,"type":16},{"name":1960,"slug":1961,"type":16},"KPI","kpi","2026-07-12T08:39:59.54971",150]