[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-netlify-netlify-image-cdn":3,"mdc-yjl5jx-key":33,"related-org-netlify-netlify-image-cdn":1114,"related-repo-netlify-netlify-image-cdn":1291},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":31,"mdContent":32},"netlify-image-cdn","optimize and transform images with Netlify","Guide for using Netlify Image CDN for image optimization and transformation. Use when serving optimized images, creating responsive image markup, setting up user-uploaded image pipelines, or configuring image transformations. Covers the \u002F.netlify\u002Fimages endpoint, query parameters, remote image allowlisting, clean URL rewrites, and composing uploads with Functions + Blobs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"netlify","Netlify","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fnetlify.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Performance","performance","tag",{"name":17,"slug":18,"type":15},"Media","media",{"name":20,"slug":21,"type":15},"Images","images",{"name":9,"slug":8,"type":15},24,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools","2026-07-14T05:40:32.897026",null,5,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":26},[],"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Fcontext-and-tools\u002Ftree\u002FHEAD\u002Fskills\u002Fnetlify-image-cdn","---\nname: netlify-image-cdn\ndescription: Guide for using Netlify Image CDN for image optimization and transformation. Use when serving optimized images, creating responsive image markup, setting up user-uploaded image pipelines, or configuring image transformations. Covers the \u002F.netlify\u002Fimages endpoint, query parameters, remote image allowlisting, clean URL rewrites, and composing uploads with Functions + Blobs.\n---\n\n# Netlify Image CDN\n\nEvery Netlify site has a built-in `\u002F.netlify\u002Fimages` endpoint for on-the-fly image transformation. No configuration required for local images.\n\n## Basic Usage\n\n```html\n\u003Cimg src=\"\u002F.netlify\u002Fimages?url=\u002Fphoto.jpg&w=800&h=600&fit=cover&q=80\" \u002F>\n```\n\n## Query Parameters\n\n| Param | Description | Values |\n|---|---|---|\n| `url` | Source image path (required) | Relative path or absolute URL |\n| `w` | Width in pixels | Any positive integer |\n| `h` | Height in pixels | Any positive integer |\n| `fit` | Resize behavior | `contain` (default), `cover`, `fill` |\n| `position` | Crop alignment (with `cover`) | `center` (default), `top`, `bottom`, `left`, `right` |\n| `fm` | Output format | `avif`, `webp`, `jpg`, `png`, `gif`, `blurhash` |\n| `q` | Quality (lossy formats) | 1-100 (default: 75) |\n\nWhen `fm` is omitted, Netlify auto-negotiates the best format based on browser support (preferring `webp`, then `avif`).\n\n### `fm=blurhash` returns a string, not an image\n\n`fm=blurhash` is special: the response body is a short BlurHash **text string**, not image bytes. Pointing an `\u003Cimg src>` (or CSS `background-image`) straight at a `\u002F.netlify\u002Fimages?...&fm=blurhash` URL does not work — the browser receives text and has nothing to render. Use it as a placeholder workflow instead: obtain the blurhash string ahead of time (server-side, in a data loader, via a `fetch`, or at build time), decode it with a BlurHash decoder library into a rendered placeholder (a canvas or a data-URI), and show that while the real image loads. The real, displayable image is a **separate** `\u002F.netlify\u002Fimages` request **without** `fm=blurhash`.\n\n## Remote Image Allowlisting\n\nExternal images must be explicitly allowed in `netlify.toml`:\n\n```toml\n[images]\nremote_images = [\"https:\u002F\u002Fexample\\\\.com\u002F.*\", \"https:\u002F\u002Fcdn\\\\.images\\\\.com\u002F.*\"]\n```\n\nValues are regex patterns.\n\nA remote source URL that does **not** match any `remote_images` pattern is rejected with a **404** — Netlify does not fetch or proxy it. This is a strict allowlist, not a fallback: there is no automatic proxying of arbitrary external hosts. Add the host (as an escaped regex) to `remote_images` *before* referencing it through `\u002F.netlify\u002Fimages`, or every transform request for that source will 404. (Local images on the same site never need allowlisting.)\n\nWhen referencing an allow-listed remote image, **percent-encode the source URL** before placing it in the `url` parameter:\n\n```html\n\u003C!-- source: https:\u002F\u002Fcdn.example.com\u002Fmarketing\u002Fbanner.jpg -->\n\u003Cimg src=\"\u002F.netlify\u002Fimages?url=https%3A%2F%2Fcdn.example.com%2Fmarketing%2Fbanner.jpg&w=800&fm=webp&q=80\" \u002F>\n```\n\nPercent-encode the source value (e.g. with `encodeURIComponent`) whenever it contains characters that would otherwise be read as Image CDN params — `?`, `&`, `=`, `#`, or whitespace. This applies to remote URLs and relative paths alike (a filename or user-generated key can contain them too, e.g. `url=\u002Fuploads\u002Fa%26b.jpg`). Basic paths without those characters don't need encoding.\n\n## Clean URL Rewrites\n\nCreate user-friendly image URLs with redirects:\n\n```toml\n# Basic optimization\n[[redirects]]\nfrom = \"\u002Fimg\u002F*\"\nto = \"\u002F.netlify\u002Fimages?url=\u002F:splat\"\nstatus = 200\n\n# Preset: thumbnail\n[[redirects]]\nfrom = \"\u002Fimg\u002Fthumb\u002F:key\"\nto = \"\u002F.netlify\u002Fimages?url=\u002Fuploads\u002F:key&w=150&h=150&fit=cover\"\nstatus = 200\n\n# Preset: hero\n[[redirects]]\nfrom = \"\u002Fimg\u002Fhero\u002F:key\"\nto = \"\u002F.netlify\u002Fimages?url=\u002Fuploads\u002F:key&w=1200&h=675&fit=cover\"\nstatus = 200\n```\n\n## Local Development\n\n`\u002F.netlify\u002Fimages` is a Netlify platform endpoint — it does **not** exist in a framework's own dev server. Running `vite`, `next dev`, `astro dev`, etc. directly will **404** on `\u002F.netlify\u002Fimages`, and `[images]` allowlisting and your image redirects won't apply either. Run `netlify dev` for local work: it emulates the Image CDN endpoint, remote-image allowlisting, and redirect rules, so image URLs resolve locally the same way they do in production. A 404 on `\u002F.netlify\u002Fimages` locally almost always means a framework dev server is being run directly instead of `netlify dev` — the URL itself is fine.\n\n## Caching\n\n- Transformed images are cached at the CDN edge automatically\n- Cache invalidates on new deploys\n- Set cache headers on source images to control caching:\n\n```toml\n[[headers]]\nfor = \"\u002Fuploads\u002F*\"\n[headers.values]\nCache-Control = \"public, max-age=31536000, immutable\"\n```\n\n## User-Uploaded Images\n\nCombine **Netlify Functions** (upload handler) + **Netlify Blobs** (storage) + **Image CDN** (serving\u002Ftransforming) to build a complete user-uploaded image pipeline. See [references\u002Fuser-uploads.md](references\u002Fuser-uploads.md) for the full pattern.\n",{"data":34,"body":35},{"name":4,"description":6},{"type":36,"children":37},"root",[38,46,61,68,128,134,418,444,457,534,540,553,579,584,632,651,703,752,758,763,916,922,1003,1009,1029,1068,1074,1108],{"type":39,"tag":40,"props":41,"children":42},"element","h1",{"id":4},[43],{"type":44,"value":45},"text","Netlify Image CDN",{"type":39,"tag":47,"props":48,"children":49},"p",{},[50,52,59],{"type":44,"value":51},"Every Netlify site has a built-in ",{"type":39,"tag":53,"props":54,"children":56},"code",{"className":55},[],[57],{"type":44,"value":58},"\u002F.netlify\u002Fimages",{"type":44,"value":60}," endpoint for on-the-fly image transformation. No configuration required for local images.",{"type":39,"tag":62,"props":63,"children":65},"h2",{"id":64},"basic-usage",[66],{"type":44,"value":67},"Basic Usage",{"type":39,"tag":69,"props":70,"children":75},"pre",{"className":71,"code":72,"language":73,"meta":74,"style":74},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003Cimg src=\"\u002F.netlify\u002Fimages?url=\u002Fphoto.jpg&w=800&h=600&fit=cover&q=80\" \u002F>\n","html","",[76],{"type":39,"tag":53,"props":77,"children":78},{"__ignoreMap":74},[79],{"type":39,"tag":80,"props":81,"children":84},"span",{"class":82,"line":83},"line",1,[85,91,97,103,108,113,119,123],{"type":39,"tag":80,"props":86,"children":88},{"style":87},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[89],{"type":44,"value":90},"\u003C",{"type":39,"tag":80,"props":92,"children":94},{"style":93},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[95],{"type":44,"value":96},"img",{"type":39,"tag":80,"props":98,"children":100},{"style":99},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[101],{"type":44,"value":102}," src",{"type":39,"tag":80,"props":104,"children":105},{"style":87},[106],{"type":44,"value":107},"=",{"type":39,"tag":80,"props":109,"children":110},{"style":87},[111],{"type":44,"value":112},"\"",{"type":39,"tag":80,"props":114,"children":116},{"style":115},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[117],{"type":44,"value":118},"\u002F.netlify\u002Fimages?url=\u002Fphoto.jpg&w=800&h=600&fit=cover&q=80",{"type":39,"tag":80,"props":120,"children":121},{"style":87},[122],{"type":44,"value":112},{"type":39,"tag":80,"props":124,"children":125},{"style":87},[126],{"type":44,"value":127}," \u002F>\n",{"type":39,"tag":62,"props":129,"children":131},{"id":130},"query-parameters",[132],{"type":44,"value":133},"Query Parameters",{"type":39,"tag":135,"props":136,"children":137},"table",{},[138,162],{"type":39,"tag":139,"props":140,"children":141},"thead",{},[142],{"type":39,"tag":143,"props":144,"children":145},"tr",{},[146,152,157],{"type":39,"tag":147,"props":148,"children":149},"th",{},[150],{"type":44,"value":151},"Param",{"type":39,"tag":147,"props":153,"children":154},{},[155],{"type":44,"value":156},"Description",{"type":39,"tag":147,"props":158,"children":159},{},[160],{"type":44,"value":161},"Values",{"type":39,"tag":163,"props":164,"children":165},"tbody",{},[166,189,211,232,274,335,396],{"type":39,"tag":143,"props":167,"children":168},{},[169,179,184],{"type":39,"tag":170,"props":171,"children":172},"td",{},[173],{"type":39,"tag":53,"props":174,"children":176},{"className":175},[],[177],{"type":44,"value":178},"url",{"type":39,"tag":170,"props":180,"children":181},{},[182],{"type":44,"value":183},"Source image path (required)",{"type":39,"tag":170,"props":185,"children":186},{},[187],{"type":44,"value":188},"Relative path or absolute URL",{"type":39,"tag":143,"props":190,"children":191},{},[192,201,206],{"type":39,"tag":170,"props":193,"children":194},{},[195],{"type":39,"tag":53,"props":196,"children":198},{"className":197},[],[199],{"type":44,"value":200},"w",{"type":39,"tag":170,"props":202,"children":203},{},[204],{"type":44,"value":205},"Width in pixels",{"type":39,"tag":170,"props":207,"children":208},{},[209],{"type":44,"value":210},"Any positive integer",{"type":39,"tag":143,"props":212,"children":213},{},[214,223,228],{"type":39,"tag":170,"props":215,"children":216},{},[217],{"type":39,"tag":53,"props":218,"children":220},{"className":219},[],[221],{"type":44,"value":222},"h",{"type":39,"tag":170,"props":224,"children":225},{},[226],{"type":44,"value":227},"Height in pixels",{"type":39,"tag":170,"props":229,"children":230},{},[231],{"type":44,"value":210},{"type":39,"tag":143,"props":233,"children":234},{},[235,244,249],{"type":39,"tag":170,"props":236,"children":237},{},[238],{"type":39,"tag":53,"props":239,"children":241},{"className":240},[],[242],{"type":44,"value":243},"fit",{"type":39,"tag":170,"props":245,"children":246},{},[247],{"type":44,"value":248},"Resize behavior",{"type":39,"tag":170,"props":250,"children":251},{},[252,258,260,266,268],{"type":39,"tag":53,"props":253,"children":255},{"className":254},[],[256],{"type":44,"value":257},"contain",{"type":44,"value":259}," (default), ",{"type":39,"tag":53,"props":261,"children":263},{"className":262},[],[264],{"type":44,"value":265},"cover",{"type":44,"value":267},", ",{"type":39,"tag":53,"props":269,"children":271},{"className":270},[],[272],{"type":44,"value":273},"fill",{"type":39,"tag":143,"props":275,"children":276},{},[277,286,298],{"type":39,"tag":170,"props":278,"children":279},{},[280],{"type":39,"tag":53,"props":281,"children":283},{"className":282},[],[284],{"type":44,"value":285},"position",{"type":39,"tag":170,"props":287,"children":288},{},[289,291,296],{"type":44,"value":290},"Crop alignment (with ",{"type":39,"tag":53,"props":292,"children":294},{"className":293},[],[295],{"type":44,"value":265},{"type":44,"value":297},")",{"type":39,"tag":170,"props":299,"children":300},{},[301,307,308,314,315,321,322,328,329],{"type":39,"tag":53,"props":302,"children":304},{"className":303},[],[305],{"type":44,"value":306},"center",{"type":44,"value":259},{"type":39,"tag":53,"props":309,"children":311},{"className":310},[],[312],{"type":44,"value":313},"top",{"type":44,"value":267},{"type":39,"tag":53,"props":316,"children":318},{"className":317},[],[319],{"type":44,"value":320},"bottom",{"type":44,"value":267},{"type":39,"tag":53,"props":323,"children":325},{"className":324},[],[326],{"type":44,"value":327},"left",{"type":44,"value":267},{"type":39,"tag":53,"props":330,"children":332},{"className":331},[],[333],{"type":44,"value":334},"right",{"type":39,"tag":143,"props":336,"children":337},{},[338,347,352],{"type":39,"tag":170,"props":339,"children":340},{},[341],{"type":39,"tag":53,"props":342,"children":344},{"className":343},[],[345],{"type":44,"value":346},"fm",{"type":39,"tag":170,"props":348,"children":349},{},[350],{"type":44,"value":351},"Output format",{"type":39,"tag":170,"props":353,"children":354},{},[355,361,362,368,369,375,376,382,383,389,390],{"type":39,"tag":53,"props":356,"children":358},{"className":357},[],[359],{"type":44,"value":360},"avif",{"type":44,"value":267},{"type":39,"tag":53,"props":363,"children":365},{"className":364},[],[366],{"type":44,"value":367},"webp",{"type":44,"value":267},{"type":39,"tag":53,"props":370,"children":372},{"className":371},[],[373],{"type":44,"value":374},"jpg",{"type":44,"value":267},{"type":39,"tag":53,"props":377,"children":379},{"className":378},[],[380],{"type":44,"value":381},"png",{"type":44,"value":267},{"type":39,"tag":53,"props":384,"children":386},{"className":385},[],[387],{"type":44,"value":388},"gif",{"type":44,"value":267},{"type":39,"tag":53,"props":391,"children":393},{"className":392},[],[394],{"type":44,"value":395},"blurhash",{"type":39,"tag":143,"props":397,"children":398},{},[399,408,413],{"type":39,"tag":170,"props":400,"children":401},{},[402],{"type":39,"tag":53,"props":403,"children":405},{"className":404},[],[406],{"type":44,"value":407},"q",{"type":39,"tag":170,"props":409,"children":410},{},[411],{"type":44,"value":412},"Quality (lossy formats)",{"type":39,"tag":170,"props":414,"children":415},{},[416],{"type":44,"value":417},"1-100 (default: 75)",{"type":39,"tag":47,"props":419,"children":420},{},[421,423,428,430,435,437,442],{"type":44,"value":422},"When ",{"type":39,"tag":53,"props":424,"children":426},{"className":425},[],[427],{"type":44,"value":346},{"type":44,"value":429}," is omitted, Netlify auto-negotiates the best format based on browser support (preferring ",{"type":39,"tag":53,"props":431,"children":433},{"className":432},[],[434],{"type":44,"value":367},{"type":44,"value":436},", then ",{"type":39,"tag":53,"props":438,"children":440},{"className":439},[],[441],{"type":44,"value":360},{"type":44,"value":443},").",{"type":39,"tag":445,"props":446,"children":448},"h3",{"id":447},"fmblurhash-returns-a-string-not-an-image",[449,455],{"type":39,"tag":53,"props":450,"children":452},{"className":451},[],[453],{"type":44,"value":454},"fm=blurhash",{"type":44,"value":456}," returns a string, not an image",{"type":39,"tag":47,"props":458,"children":459},{},[460,465,467,473,475,481,483,489,491,497,499,505,507,512,514,519,521,526,527,532],{"type":39,"tag":53,"props":461,"children":463},{"className":462},[],[464],{"type":44,"value":454},{"type":44,"value":466}," is special: the response body is a short BlurHash ",{"type":39,"tag":468,"props":469,"children":470},"strong",{},[471],{"type":44,"value":472},"text string",{"type":44,"value":474},", not image bytes. Pointing an ",{"type":39,"tag":53,"props":476,"children":478},{"className":477},[],[479],{"type":44,"value":480},"\u003Cimg src>",{"type":44,"value":482}," (or CSS ",{"type":39,"tag":53,"props":484,"children":486},{"className":485},[],[487],{"type":44,"value":488},"background-image",{"type":44,"value":490},") straight at a ",{"type":39,"tag":53,"props":492,"children":494},{"className":493},[],[495],{"type":44,"value":496},"\u002F.netlify\u002Fimages?...&fm=blurhash",{"type":44,"value":498}," URL does not work — the browser receives text and has nothing to render. Use it as a placeholder workflow instead: obtain the blurhash string ahead of time (server-side, in a data loader, via a ",{"type":39,"tag":53,"props":500,"children":502},{"className":501},[],[503],{"type":44,"value":504},"fetch",{"type":44,"value":506},", or at build time), decode it with a BlurHash decoder library into a rendered placeholder (a canvas or a data-URI), and show that while the real image loads. The real, displayable image is a ",{"type":39,"tag":468,"props":508,"children":509},{},[510],{"type":44,"value":511},"separate",{"type":44,"value":513}," ",{"type":39,"tag":53,"props":515,"children":517},{"className":516},[],[518],{"type":44,"value":58},{"type":44,"value":520}," request ",{"type":39,"tag":468,"props":522,"children":523},{},[524],{"type":44,"value":525},"without",{"type":44,"value":513},{"type":39,"tag":53,"props":528,"children":530},{"className":529},[],[531],{"type":44,"value":454},{"type":44,"value":533},".",{"type":39,"tag":62,"props":535,"children":537},{"id":536},"remote-image-allowlisting",[538],{"type":44,"value":539},"Remote Image Allowlisting",{"type":39,"tag":47,"props":541,"children":542},{},[543,545,551],{"type":44,"value":544},"External images must be explicitly allowed in ",{"type":39,"tag":53,"props":546,"children":548},{"className":547},[],[549],{"type":44,"value":550},"netlify.toml",{"type":44,"value":552},":",{"type":39,"tag":69,"props":554,"children":558},{"className":555,"code":556,"language":557,"meta":74,"style":74},"language-toml shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","[images]\nremote_images = [\"https:\u002F\u002Fexample\\\\.com\u002F.*\", \"https:\u002F\u002Fcdn\\\\.images\\\\.com\u002F.*\"]\n","toml",[559],{"type":39,"tag":53,"props":560,"children":561},{"__ignoreMap":74},[562,570],{"type":39,"tag":80,"props":563,"children":564},{"class":82,"line":83},[565],{"type":39,"tag":80,"props":566,"children":567},{},[568],{"type":44,"value":569},"[images]\n",{"type":39,"tag":80,"props":571,"children":573},{"class":82,"line":572},2,[574],{"type":39,"tag":80,"props":575,"children":576},{},[577],{"type":44,"value":578},"remote_images = [\"https:\u002F\u002Fexample\\\\.com\u002F.*\", \"https:\u002F\u002Fcdn\\\\.images\\\\.com\u002F.*\"]\n",{"type":39,"tag":47,"props":580,"children":581},{},[582],{"type":44,"value":583},"Values are regex patterns.",{"type":39,"tag":47,"props":585,"children":586},{},[587,589,594,596,602,604,609,611,616,617,623,625,630],{"type":44,"value":588},"A remote source URL that does ",{"type":39,"tag":468,"props":590,"children":591},{},[592],{"type":44,"value":593},"not",{"type":44,"value":595}," match any ",{"type":39,"tag":53,"props":597,"children":599},{"className":598},[],[600],{"type":44,"value":601},"remote_images",{"type":44,"value":603}," pattern is rejected with a ",{"type":39,"tag":468,"props":605,"children":606},{},[607],{"type":44,"value":608},"404",{"type":44,"value":610}," — Netlify does not fetch or proxy it. This is a strict allowlist, not a fallback: there is no automatic proxying of arbitrary external hosts. Add the host (as an escaped regex) to ",{"type":39,"tag":53,"props":612,"children":614},{"className":613},[],[615],{"type":44,"value":601},{"type":44,"value":513},{"type":39,"tag":618,"props":619,"children":620},"em",{},[621],{"type":44,"value":622},"before",{"type":44,"value":624}," referencing it through ",{"type":39,"tag":53,"props":626,"children":628},{"className":627},[],[629],{"type":44,"value":58},{"type":44,"value":631},", or every transform request for that source will 404. (Local images on the same site never need allowlisting.)",{"type":39,"tag":47,"props":633,"children":634},{},[635,637,642,644,649],{"type":44,"value":636},"When referencing an allow-listed remote image, ",{"type":39,"tag":468,"props":638,"children":639},{},[640],{"type":44,"value":641},"percent-encode the source URL",{"type":44,"value":643}," before placing it in the ",{"type":39,"tag":53,"props":645,"children":647},{"className":646},[],[648],{"type":44,"value":178},{"type":44,"value":650}," parameter:",{"type":39,"tag":69,"props":652,"children":654},{"className":71,"code":653,"language":73,"meta":74,"style":74},"\u003C!-- source: https:\u002F\u002Fcdn.example.com\u002Fmarketing\u002Fbanner.jpg -->\n\u003Cimg src=\"\u002F.netlify\u002Fimages?url=https%3A%2F%2Fcdn.example.com%2Fmarketing%2Fbanner.jpg&w=800&fm=webp&q=80\" \u002F>\n",[655],{"type":39,"tag":53,"props":656,"children":657},{"__ignoreMap":74},[658,667],{"type":39,"tag":80,"props":659,"children":660},{"class":82,"line":83},[661],{"type":39,"tag":80,"props":662,"children":664},{"style":663},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[665],{"type":44,"value":666},"\u003C!-- source: https:\u002F\u002Fcdn.example.com\u002Fmarketing\u002Fbanner.jpg -->\n",{"type":39,"tag":80,"props":668,"children":669},{"class":82,"line":572},[670,674,678,682,686,690,695,699],{"type":39,"tag":80,"props":671,"children":672},{"style":87},[673],{"type":44,"value":90},{"type":39,"tag":80,"props":675,"children":676},{"style":93},[677],{"type":44,"value":96},{"type":39,"tag":80,"props":679,"children":680},{"style":99},[681],{"type":44,"value":102},{"type":39,"tag":80,"props":683,"children":684},{"style":87},[685],{"type":44,"value":107},{"type":39,"tag":80,"props":687,"children":688},{"style":87},[689],{"type":44,"value":112},{"type":39,"tag":80,"props":691,"children":692},{"style":115},[693],{"type":44,"value":694},"\u002F.netlify\u002Fimages?url=https%3A%2F%2Fcdn.example.com%2Fmarketing%2Fbanner.jpg&w=800&fm=webp&q=80",{"type":39,"tag":80,"props":696,"children":697},{"style":87},[698],{"type":44,"value":112},{"type":39,"tag":80,"props":700,"children":701},{"style":87},[702],{"type":44,"value":127},{"type":39,"tag":47,"props":704,"children":705},{},[706,708,714,716,722,723,729,730,735,736,742,744,750],{"type":44,"value":707},"Percent-encode the source value (e.g. with ",{"type":39,"tag":53,"props":709,"children":711},{"className":710},[],[712],{"type":44,"value":713},"encodeURIComponent",{"type":44,"value":715},") whenever it contains characters that would otherwise be read as Image CDN params — ",{"type":39,"tag":53,"props":717,"children":719},{"className":718},[],[720],{"type":44,"value":721},"?",{"type":44,"value":267},{"type":39,"tag":53,"props":724,"children":726},{"className":725},[],[727],{"type":44,"value":728},"&",{"type":44,"value":267},{"type":39,"tag":53,"props":731,"children":733},{"className":732},[],[734],{"type":44,"value":107},{"type":44,"value":267},{"type":39,"tag":53,"props":737,"children":739},{"className":738},[],[740],{"type":44,"value":741},"#",{"type":44,"value":743},", or whitespace. This applies to remote URLs and relative paths alike (a filename or user-generated key can contain them too, e.g. ",{"type":39,"tag":53,"props":745,"children":747},{"className":746},[],[748],{"type":44,"value":749},"url=\u002Fuploads\u002Fa%26b.jpg",{"type":44,"value":751},"). Basic paths without those characters don't need encoding.",{"type":39,"tag":62,"props":753,"children":755},{"id":754},"clean-url-rewrites",[756],{"type":44,"value":757},"Clean URL Rewrites",{"type":39,"tag":47,"props":759,"children":760},{},[761],{"type":44,"value":762},"Create user-friendly image URLs with redirects:",{"type":39,"tag":69,"props":764,"children":766},{"className":555,"code":765,"language":557,"meta":74,"style":74},"# Basic optimization\n[[redirects]]\nfrom = \"\u002Fimg\u002F*\"\nto = \"\u002F.netlify\u002Fimages?url=\u002F:splat\"\nstatus = 200\n\n# Preset: thumbnail\n[[redirects]]\nfrom = \"\u002Fimg\u002Fthumb\u002F:key\"\nto = \"\u002F.netlify\u002Fimages?url=\u002Fuploads\u002F:key&w=150&h=150&fit=cover\"\nstatus = 200\n\n# Preset: hero\n[[redirects]]\nfrom = \"\u002Fimg\u002Fhero\u002F:key\"\nto = \"\u002F.netlify\u002Fimages?url=\u002Fuploads\u002F:key&w=1200&h=675&fit=cover\"\nstatus = 200\n",[767],{"type":39,"tag":53,"props":768,"children":769},{"__ignoreMap":74},[770,778,786,795,804,812,822,831,839,848,857,865,873,882,890,899,908],{"type":39,"tag":80,"props":771,"children":772},{"class":82,"line":83},[773],{"type":39,"tag":80,"props":774,"children":775},{},[776],{"type":44,"value":777},"# Basic optimization\n",{"type":39,"tag":80,"props":779,"children":780},{"class":82,"line":572},[781],{"type":39,"tag":80,"props":782,"children":783},{},[784],{"type":44,"value":785},"[[redirects]]\n",{"type":39,"tag":80,"props":787,"children":789},{"class":82,"line":788},3,[790],{"type":39,"tag":80,"props":791,"children":792},{},[793],{"type":44,"value":794},"from = \"\u002Fimg\u002F*\"\n",{"type":39,"tag":80,"props":796,"children":798},{"class":82,"line":797},4,[799],{"type":39,"tag":80,"props":800,"children":801},{},[802],{"type":44,"value":803},"to = \"\u002F.netlify\u002Fimages?url=\u002F:splat\"\n",{"type":39,"tag":80,"props":805,"children":806},{"class":82,"line":27},[807],{"type":39,"tag":80,"props":808,"children":809},{},[810],{"type":44,"value":811},"status = 200\n",{"type":39,"tag":80,"props":813,"children":815},{"class":82,"line":814},6,[816],{"type":39,"tag":80,"props":817,"children":819},{"emptyLinePlaceholder":818},true,[820],{"type":44,"value":821},"\n",{"type":39,"tag":80,"props":823,"children":825},{"class":82,"line":824},7,[826],{"type":39,"tag":80,"props":827,"children":828},{},[829],{"type":44,"value":830},"# Preset: thumbnail\n",{"type":39,"tag":80,"props":832,"children":834},{"class":82,"line":833},8,[835],{"type":39,"tag":80,"props":836,"children":837},{},[838],{"type":44,"value":785},{"type":39,"tag":80,"props":840,"children":842},{"class":82,"line":841},9,[843],{"type":39,"tag":80,"props":844,"children":845},{},[846],{"type":44,"value":847},"from = \"\u002Fimg\u002Fthumb\u002F:key\"\n",{"type":39,"tag":80,"props":849,"children":851},{"class":82,"line":850},10,[852],{"type":39,"tag":80,"props":853,"children":854},{},[855],{"type":44,"value":856},"to = \"\u002F.netlify\u002Fimages?url=\u002Fuploads\u002F:key&w=150&h=150&fit=cover\"\n",{"type":39,"tag":80,"props":858,"children":860},{"class":82,"line":859},11,[861],{"type":39,"tag":80,"props":862,"children":863},{},[864],{"type":44,"value":811},{"type":39,"tag":80,"props":866,"children":868},{"class":82,"line":867},12,[869],{"type":39,"tag":80,"props":870,"children":871},{"emptyLinePlaceholder":818},[872],{"type":44,"value":821},{"type":39,"tag":80,"props":874,"children":876},{"class":82,"line":875},13,[877],{"type":39,"tag":80,"props":878,"children":879},{},[880],{"type":44,"value":881},"# Preset: hero\n",{"type":39,"tag":80,"props":883,"children":885},{"class":82,"line":884},14,[886],{"type":39,"tag":80,"props":887,"children":888},{},[889],{"type":44,"value":785},{"type":39,"tag":80,"props":891,"children":893},{"class":82,"line":892},15,[894],{"type":39,"tag":80,"props":895,"children":896},{},[897],{"type":44,"value":898},"from = \"\u002Fimg\u002Fhero\u002F:key\"\n",{"type":39,"tag":80,"props":900,"children":902},{"class":82,"line":901},16,[903],{"type":39,"tag":80,"props":904,"children":905},{},[906],{"type":44,"value":907},"to = \"\u002F.netlify\u002Fimages?url=\u002Fuploads\u002F:key&w=1200&h=675&fit=cover\"\n",{"type":39,"tag":80,"props":909,"children":911},{"class":82,"line":910},17,[912],{"type":39,"tag":80,"props":913,"children":914},{},[915],{"type":44,"value":811},{"type":39,"tag":62,"props":917,"children":919},{"id":918},"local-development",[920],{"type":44,"value":921},"Local Development",{"type":39,"tag":47,"props":923,"children":924},{},[925,930,932,936,938,944,945,951,952,958,960,964,966,971,973,979,981,987,989,994,996,1001],{"type":39,"tag":53,"props":926,"children":928},{"className":927},[],[929],{"type":44,"value":58},{"type":44,"value":931}," is a Netlify platform endpoint — it does ",{"type":39,"tag":468,"props":933,"children":934},{},[935],{"type":44,"value":593},{"type":44,"value":937}," exist in a framework's own dev server. Running ",{"type":39,"tag":53,"props":939,"children":941},{"className":940},[],[942],{"type":44,"value":943},"vite",{"type":44,"value":267},{"type":39,"tag":53,"props":946,"children":948},{"className":947},[],[949],{"type":44,"value":950},"next dev",{"type":44,"value":267},{"type":39,"tag":53,"props":953,"children":955},{"className":954},[],[956],{"type":44,"value":957},"astro dev",{"type":44,"value":959},", etc. directly will ",{"type":39,"tag":468,"props":961,"children":962},{},[963],{"type":44,"value":608},{"type":44,"value":965}," on ",{"type":39,"tag":53,"props":967,"children":969},{"className":968},[],[970],{"type":44,"value":58},{"type":44,"value":972},", and ",{"type":39,"tag":53,"props":974,"children":976},{"className":975},[],[977],{"type":44,"value":978},"[images]",{"type":44,"value":980}," allowlisting and your image redirects won't apply either. Run ",{"type":39,"tag":53,"props":982,"children":984},{"className":983},[],[985],{"type":44,"value":986},"netlify dev",{"type":44,"value":988}," for local work: it emulates the Image CDN endpoint, remote-image allowlisting, and redirect rules, so image URLs resolve locally the same way they do in production. A 404 on ",{"type":39,"tag":53,"props":990,"children":992},{"className":991},[],[993],{"type":44,"value":58},{"type":44,"value":995}," locally almost always means a framework dev server is being run directly instead of ",{"type":39,"tag":53,"props":997,"children":999},{"className":998},[],[1000],{"type":44,"value":986},{"type":44,"value":1002}," — the URL itself is fine.",{"type":39,"tag":62,"props":1004,"children":1006},{"id":1005},"caching",[1007],{"type":44,"value":1008},"Caching",{"type":39,"tag":1010,"props":1011,"children":1012},"ul",{},[1013,1019,1024],{"type":39,"tag":1014,"props":1015,"children":1016},"li",{},[1017],{"type":44,"value":1018},"Transformed images are cached at the CDN edge automatically",{"type":39,"tag":1014,"props":1020,"children":1021},{},[1022],{"type":44,"value":1023},"Cache invalidates on new deploys",{"type":39,"tag":1014,"props":1025,"children":1026},{},[1027],{"type":44,"value":1028},"Set cache headers on source images to control caching:",{"type":39,"tag":69,"props":1030,"children":1032},{"className":555,"code":1031,"language":557,"meta":74,"style":74},"[[headers]]\nfor = \"\u002Fuploads\u002F*\"\n[headers.values]\nCache-Control = \"public, max-age=31536000, immutable\"\n",[1033],{"type":39,"tag":53,"props":1034,"children":1035},{"__ignoreMap":74},[1036,1044,1052,1060],{"type":39,"tag":80,"props":1037,"children":1038},{"class":82,"line":83},[1039],{"type":39,"tag":80,"props":1040,"children":1041},{},[1042],{"type":44,"value":1043},"[[headers]]\n",{"type":39,"tag":80,"props":1045,"children":1046},{"class":82,"line":572},[1047],{"type":39,"tag":80,"props":1048,"children":1049},{},[1050],{"type":44,"value":1051},"for = \"\u002Fuploads\u002F*\"\n",{"type":39,"tag":80,"props":1053,"children":1054},{"class":82,"line":788},[1055],{"type":39,"tag":80,"props":1056,"children":1057},{},[1058],{"type":44,"value":1059},"[headers.values]\n",{"type":39,"tag":80,"props":1061,"children":1062},{"class":82,"line":797},[1063],{"type":39,"tag":80,"props":1064,"children":1065},{},[1066],{"type":44,"value":1067},"Cache-Control = \"public, max-age=31536000, immutable\"\n",{"type":39,"tag":62,"props":1069,"children":1071},{"id":1070},"user-uploaded-images",[1072],{"type":44,"value":1073},"User-Uploaded Images",{"type":39,"tag":47,"props":1075,"children":1076},{},[1077,1079,1084,1086,1091,1093,1098,1100,1106],{"type":44,"value":1078},"Combine ",{"type":39,"tag":468,"props":1080,"children":1081},{},[1082],{"type":44,"value":1083},"Netlify Functions",{"type":44,"value":1085}," (upload handler) + ",{"type":39,"tag":468,"props":1087,"children":1088},{},[1089],{"type":44,"value":1090},"Netlify Blobs",{"type":44,"value":1092}," (storage) + ",{"type":39,"tag":468,"props":1094,"children":1095},{},[1096],{"type":44,"value":1097},"Image CDN",{"type":44,"value":1099}," (serving\u002Ftransforming) to build a complete user-uploaded image pipeline. See ",{"type":39,"tag":1101,"props":1102,"children":1104},"a",{"href":1103},"references\u002Fuser-uploads.md",[1105],{"type":44,"value":1103},{"type":44,"value":1107}," for the full pattern.",{"type":39,"tag":1109,"props":1110,"children":1111},"style",{},[1112],{"type":44,"value":1113},"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":1115,"total":910},[1116,1135,1147,1164,1179,1194,1211,1224,1234,1249,1262,1277],{"slug":1117,"name":1117,"fn":1118,"description":1119,"org":1120,"tags":1121,"stars":1132,"repoUrl":1133,"updatedAt":1134},"configure-axis","configure AXIS agent evaluation scenarios","Author AXIS (Agent Experience Index Score) scenarios and axis.config.json for a project. Use when the user asks to set up AXIS, add a scenario, write or edit axis.config.json, or evaluate an AI agent with AXIS.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1122,1125,1128,1131],{"name":1123,"slug":1124,"type":15},"Agents","agents",{"name":1126,"slug":1127,"type":15},"Configuration","configuration",{"name":1129,"slug":1130,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},32,"https:\u002F\u002Fgithub.com\u002Fnetlify\u002Faxis","2026-07-20T05:59:47.468757",{"slug":1136,"name":1136,"fn":1137,"description":1138,"org":1139,"tags":1140,"stars":1132,"repoUrl":1133,"updatedAt":1146},"using-axis","run and interpret AXIS reports","Run AXIS, read its reports, navigate its project layout, and interpret scores. Use when the user asks to run AXIS, invoke the CLI, compare runs, explain a score, find a regression, manage baselines, or understand where AXIS writes its files.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1141,1144,1145],{"name":1142,"slug":1143,"type":15},"CLI","cli",{"name":1129,"slug":1130,"type":15},{"name":9,"slug":8,"type":15},"2026-07-14T05:40:13.443461",{"slug":1148,"name":1148,"fn":1149,"description":1150,"org":1151,"tags":1152,"stars":23,"repoUrl":24,"updatedAt":1163},"netlify-access-control","manage Netlify site access control","Use when the task involves controlling who can reach a Netlify site, or telling Netlify Identity apart from Secure Access. Trigger whenever the user wants to lock a site or deploy to their company\u002Fteam, restrict access to employees only, build an internal or employees-only app, set up password protection, SSO, or SAML, asks \"who can access my site\", or is confused about Netlify Identity vs Secure Access vs team login vs OAuth providers. Routes the request to the right layer — app-level Identity, site-visitor Password Protection, the Auth0 extension, or Team\u002FOrg SAML SSO — and explains the two-layer (perimeter + in-app identity) pattern and its double-login tradeoff. For building the app-level auth itself, use the netlify-identity skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1153,1156,1157,1160],{"name":1154,"slug":1155,"type":15},"Access Control","access-control",{"name":9,"slug":8,"type":15},{"name":1158,"slug":1159,"type":15},"Permissions","permissions",{"name":1161,"slug":1162,"type":15},"Security","security","2026-07-14T05:40:29.082149",{"slug":1165,"name":1165,"fn":1166,"description":1167,"org":1168,"tags":1169,"stars":23,"repoUrl":24,"updatedAt":1178},"netlify-agent-runner","run AI agent tasks on Netlify","Run AI agent tasks remotely on Netlify using Claude, Codex, or Gemini. Use when the user wants to run an AI agent on their site, get a second opinion from another model, or delegate development tasks to run remotely against their repo.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1170,1171,1174,1177],{"name":1123,"slug":1124,"type":15},{"name":1172,"slug":1173,"type":15},"Automation","automation",{"name":1175,"slug":1176,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-07-17T05:30:19.462913",{"slug":1180,"name":1180,"fn":1181,"description":1182,"org":1183,"tags":1184,"stars":23,"repoUrl":24,"updatedAt":1193},"netlify-ai-gateway","route AI requests via Netlify AI Gateway","Reference for Netlify AI Gateway — the managed proxy that routes calls to OpenAI, Anthropic, and Google Gemini SDKs without provider API keys. Use this skill any time the user wants to add AI on a Netlify site (chat, completion, reasoning, image generation, image-to-image edit\u002Fstylize), choose or change a model, wire up the OpenAI \u002F Anthropic \u002F @google\u002Fgenai SDK, decide which provider to use for an image-gen feature (it's Gemini-only on the gateway), or debug \"model not found\" \u002F \"API key missing\" against the gateway. Required reading before pinning a model — the gateway exposes a curated subset, not every provider model.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1185,1188,1191,1192],{"name":1186,"slug":1187,"type":15},"AI Infrastructure","ai-infrastructure",{"name":1189,"slug":1190,"type":15},"API Development","api-development",{"name":1175,"slug":1176,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:13.14555",{"slug":1195,"name":1195,"fn":1196,"description":1197,"org":1198,"tags":1199,"stars":23,"repoUrl":24,"updatedAt":1210},"netlify-blobs","manage file storage with Netlify Blobs","Guide for using Netlify Blobs for file and asset storage — images, documents, uploads, exports, cached binary artifacts. Covers getStore(), CRUD operations, metadata, listing, deploy-scoped vs site-scoped stores, and local development. Do NOT use Blobs as a dynamic data store — use Netlify Database for that.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1200,1203,1206,1207],{"name":1201,"slug":1202,"type":15},"Backend","backend",{"name":1204,"slug":1205,"type":15},"File Storage","file-storage",{"name":9,"slug":8,"type":15},{"name":1208,"slug":1209,"type":15},"Storage","storage","2026-07-17T05:30:16.503306",{"slug":1212,"name":1212,"fn":1213,"description":1214,"org":1215,"tags":1216,"stars":23,"repoUrl":24,"updatedAt":1223},"netlify-caching","configure CDN caching on Netlify","Guide for controlling caching on Netlify's CDN. Use when configuring cache headers, setting up stale-while-revalidate, implementing on-demand cache purge, or understanding Netlify's CDN caching behavior. Covers Cache-Control, Netlify-CDN-Cache-Control, cache tags, durable cache, and framework-specific caching patterns.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1217,1218,1221,1222],{"name":1008,"slug":1005,"type":15},{"name":1219,"slug":1220,"type":15},"Deployment","deployment",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},"2026-07-14T05:40:20.066717",{"slug":1225,"name":1225,"fn":1226,"description":1227,"org":1228,"tags":1229,"stars":23,"repoUrl":24,"updatedAt":1233},"netlify-config","configure Netlify site settings","Reference for netlify.toml configuration and site environment variables. Use when configuring build settings, redirects, rewrites, headers, deploy contexts, the `[dev]` block that controls `netlify dev` (command, port, targetPort, framework), or any site-level configuration — and when managing environment variables or secrets with the Netlify CLI, including scoping values to specific deploy contexts. Covers the complete netlify.toml syntax including redirects with splats\u002Fconditions, headers, deploy contexts, functions config, edge functions config, and the `[dev]` block (including when `framework` must be `\"#custom\"` — required when both a custom `command` and `targetPort` are set).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1230,1231,1232],{"name":1126,"slug":1127,"type":15},{"name":1219,"slug":1220,"type":15},{"name":9,"slug":8,"type":15},"2026-07-17T05:30:21.284801",{"slug":1235,"name":1235,"fn":1236,"description":1237,"org":1238,"tags":1239,"stars":23,"repoUrl":24,"updatedAt":1248},"netlify-database","provision and manage Netlify Database","Guide for using Netlify Database — the GA managed Postgres product built into Netlify. Use when a project needs any kind of dynamic, structured, or relational data. Covers provisioning via @netlify\u002Fdatabase, Drizzle ORM (@beta) setup, migrations, preview branching, and safe production data handling. Blobs is only for file\u002Fasset storage — any dynamic data belongs in the database.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1240,1241,1244,1245],{"name":1201,"slug":1202,"type":15},{"name":1242,"slug":1243,"type":15},"Database","database",{"name":9,"slug":8,"type":15},{"name":1246,"slug":1247,"type":15},"PostgreSQL","postgresql","2026-07-20T05:58:58.934045",{"slug":1250,"name":1250,"fn":1251,"description":1252,"org":1253,"tags":1254,"stars":23,"repoUrl":24,"updatedAt":1261},"netlify-deploy","deploy and host projects on Netlify","Deploy, host, and publish web projects on Netlify with the Netlify CLI. Use when the user wants to deploy a site or repository to Netlify, link a local project to a Netlify site, ship a production or preview\u002Fdraft deploy, set up Git-based continuous deployment, run a manual or local deploy, configure CI deploys, or troubleshoot a failed or misconfigured deploy. Also use to view or tail a deployed site's runtime logs — function and edge-function output, deploy logs — via `netlify logs` when debugging what a live site is doing (recent errors, recent activity, streaming output).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1255,1256,1257,1258],{"name":1142,"slug":1143,"type":15},{"name":1219,"slug":1220,"type":15},{"name":9,"slug":8,"type":15},{"name":1259,"slug":1260,"type":15},"Web Development","web-development","2026-07-17T05:30:14.218977",{"slug":1263,"name":1263,"fn":1264,"description":1265,"org":1266,"tags":1267,"stars":23,"repoUrl":24,"updatedAt":1276},"netlify-edge-functions","write Netlify Edge Functions","Guide for writing Netlify Edge Functions. Use when building middleware, geolocation-based logic, request\u002Fresponse manipulation, authentication checks, A\u002FB testing, or any low-latency edge compute. Covers Deno runtime, context.next() middleware pattern, geolocation, and when to choose edge vs serverless.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1268,1271,1274,1275],{"name":1269,"slug":1270,"type":15},"Edge Functions","edge-functions",{"name":1272,"slug":1273,"type":15},"Middleware","middleware",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},"2026-07-14T05:40:34.147865",{"slug":1278,"name":1278,"fn":1279,"description":1280,"org":1281,"tags":1282,"stars":23,"repoUrl":24,"updatedAt":1290},"netlify-forms","handle HTML forms with Netlify","Guide for using Netlify Forms for HTML form handling. Use when adding contact forms, feedback forms, file upload forms, or any form that should be collected by Netlify. Covers the data-netlify attribute, spam filtering, AJAX submissions, file uploads, notifications, and the submissions API.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1283,1286,1288,1289],{"name":1284,"slug":1285,"type":15},"Forms","forms",{"name":1287,"slug":73,"type":15},"HTML",{"name":9,"slug":8,"type":15},{"name":1259,"slug":1260,"type":15},"2026-07-14T05:40:16.075367",{"items":1292,"total":892},[1293,1300,1307,1314,1321,1328,1334],{"slug":1148,"name":1148,"fn":1149,"description":1150,"org":1294,"tags":1295,"stars":23,"repoUrl":24,"updatedAt":1163},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1296,1297,1298,1299],{"name":1154,"slug":1155,"type":15},{"name":9,"slug":8,"type":15},{"name":1158,"slug":1159,"type":15},{"name":1161,"slug":1162,"type":15},{"slug":1165,"name":1165,"fn":1166,"description":1167,"org":1301,"tags":1302,"stars":23,"repoUrl":24,"updatedAt":1178},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1303,1304,1305,1306],{"name":1123,"slug":1124,"type":15},{"name":1172,"slug":1173,"type":15},{"name":1175,"slug":1176,"type":15},{"name":9,"slug":8,"type":15},{"slug":1180,"name":1180,"fn":1181,"description":1182,"org":1308,"tags":1309,"stars":23,"repoUrl":24,"updatedAt":1193},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1310,1311,1312,1313],{"name":1186,"slug":1187,"type":15},{"name":1189,"slug":1190,"type":15},{"name":1175,"slug":1176,"type":15},{"name":9,"slug":8,"type":15},{"slug":1195,"name":1195,"fn":1196,"description":1197,"org":1315,"tags":1316,"stars":23,"repoUrl":24,"updatedAt":1210},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1317,1318,1319,1320],{"name":1201,"slug":1202,"type":15},{"name":1204,"slug":1205,"type":15},{"name":9,"slug":8,"type":15},{"name":1208,"slug":1209,"type":15},{"slug":1212,"name":1212,"fn":1213,"description":1214,"org":1322,"tags":1323,"stars":23,"repoUrl":24,"updatedAt":1223},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1324,1325,1326,1327],{"name":1008,"slug":1005,"type":15},{"name":1219,"slug":1220,"type":15},{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},{"slug":1225,"name":1225,"fn":1226,"description":1227,"org":1329,"tags":1330,"stars":23,"repoUrl":24,"updatedAt":1233},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1331,1332,1333],{"name":1126,"slug":1127,"type":15},{"name":1219,"slug":1220,"type":15},{"name":9,"slug":8,"type":15},{"slug":1235,"name":1235,"fn":1236,"description":1237,"org":1335,"tags":1336,"stars":23,"repoUrl":24,"updatedAt":1248},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[1337,1338,1339,1340],{"name":1201,"slug":1202,"type":15},{"name":1242,"slug":1243,"type":15},{"name":9,"slug":8,"type":15},{"name":1246,"slug":1247,"type":15}]