<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Brian Bauernschmitt</title>
    <description>The latest articles on DEV Community by Brian Bauernschmitt (@brokeinprod).</description>
    <link>https://dev.to/brokeinprod</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3984319%2F518c1b0d-9c23-4745-8360-33c4b545dc0d.png</url>
      <title>DEV Community: Brian Bauernschmitt</title>
      <link>https://dev.to/brokeinprod</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/brokeinprod"/>
    <language>en</language>
    <item>
      <title>Invalid src prop… hostname is not configured: It's One File, Not Two</title>
      <dc:creator>Brian Bauernschmitt</dc:creator>
      <pubDate>Fri, 21 Aug 2026 01:52:23 +0000</pubDate>
      <link>https://dev.to/brokeinprod/invalid-src-prop-hostname-is-not-configured-its-one-file-not-two-1phf</link>
      <guid>https://dev.to/brokeinprod/invalid-src-prop-hostname-is-not-configured-its-one-file-not-two-1phf</guid>
      <description>&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Invalid&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;src&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;prop…&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;configured:&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;It's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;One&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;File,&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Two"&lt;/span&gt;
&lt;span class="na"&gt;published&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;The&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;next/image&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;hostname&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;is&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;configured&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;error&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;means&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;remote&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;isn't&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;remotePatterns&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;—&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;not&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;CSP.&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;Here's&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;the&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;real&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;one-file&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;fix&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;and&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;why."&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nextjs, webdev, debugging, react&lt;/span&gt;
&lt;span class="na"&gt;canonical_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://brokeinprod.dev/debugging/next-image-hostname-not-configured&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The upload worked! The database had the real URL. The page still crashed —&lt;br&gt;
because the part of Next.js that renders images had never heard of the host&lt;br&gt;
the part that stores them had just used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start here:&lt;/strong&gt; Add the image host to &lt;code&gt;images.remotePatterns&lt;/code&gt; in &lt;code&gt;next.config.ts&lt;/code&gt; (protocol, hostname, port, pathname), then restart the dev server — the config is read once, at startup. You do &lt;strong&gt;not&lt;/strong&gt; need to touch your CSP — optimized &lt;code&gt;next/image&lt;/code&gt; requests are served same-origin from &lt;code&gt;/_next/image&lt;/code&gt;, so &lt;code&gt;img-src 'self'&lt;/code&gt; already covers them. CSP only enters the picture if you bypass the optimizer (see below).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;I was building the admin side of a portfolio site for an artist — a small CRUD panel where the website owner uploads artwork and video thumbnails instead of editing code. Uploads go to object storage (Vercel Blob), the public URL gets saved in Postgres, and the front end renders everything through Next.js's &lt;code&gt;&amp;lt;Image&amp;gt;&lt;/code&gt; component for automatic resizing and WebP conversion.&lt;/p&gt;

&lt;p&gt;The upload itself worked on the first try. The file landed in storage, the URL came back, and the row saved. Then the page tried to render the image and the whole thing threw a runtime error.&lt;/p&gt;

&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invalid src prop (https://&amp;lt;your-store&amp;gt;.public.blob.vercel-storage.com/artwork/file.webp)
on `next/image`, hostname "&amp;lt;your-store&amp;gt;.public.blob.vercel-storage.com"
is not configured under images in your `next.config.js`
See more info: https://nextjs.org/docs/messages/next-image-unconfigured-host
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important thing to notice: &lt;strong&gt;the upload didn't fail.&lt;/strong&gt; Storage was fine, the database was fine — you can open the URL in a browser tab and the file is right there. This is &lt;code&gt;next/image&lt;/code&gt; refusing to render a remote host it hasn't been told to trust: a hard runtime error, on purpose, not a broken-image icon. The error even hands you the docs link — which is genuinely the fastest path to the fix.&lt;/p&gt;

&lt;h2&gt;
  
  
  The diagnosis
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;next/image&lt;/code&gt; isn't an &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag; it's a front door to Next's Image Optimization API. By default, every image runs through the optimizer, which fetches the source server-side, resizes it, converts it to a modern format, and produces the result from your own domain. Because the optimizer makes a server-side request to whatever host you give it, an open &lt;code&gt;src&lt;/code&gt; would be an abuse vector — an optimizer that fetches arbitrary URLs is a free proxy wearing your domain name. So Next.js requires an explicit allowlist: &lt;code&gt;images.remotePatterns&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the host of your &lt;code&gt;src&lt;/code&gt; isn't in that list, you get the error above — before a single byte is fetched. The error is the security model working. Your job is to tell it, precisely, which hosts are yours.&lt;/p&gt;

&lt;p&gt;One detail that catches a lot of people off guard: the match is &lt;strong&gt;exact and case-sensitive across every part of the URL&lt;/strong&gt; — protocol, hostname, port, and pathname. &lt;code&gt;https&lt;/code&gt; is not &lt;code&gt;http&lt;/code&gt;. &lt;code&gt;assets.example.com&lt;/code&gt; is not &lt;code&gt;example.com&lt;/code&gt;. A too-shallow pathname (&lt;code&gt;/images/&lt;/code&gt; vs &lt;code&gt;/images/**&lt;/code&gt;) fails just as hard. So if you've added the host and it &lt;em&gt;still&lt;/em&gt; errors, you almost certainly have a part mismatch, not a missing entry.&lt;/p&gt;

&lt;p&gt;And if a tutorial shows &lt;code&gt;images.domains&lt;/code&gt; instead: that's the old way — &lt;strong&gt;deprecated since Next.js 14&lt;/strong&gt; in favor of &lt;code&gt;remotePatterns&lt;/code&gt; (which can scope protocol, port, and path, where &lt;code&gt;domains&lt;/code&gt; can't), and Next.js 16 lists it for removal in a future major version. Still works today with a warning; don't write new config with it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;

&lt;p&gt;Add the host to &lt;code&gt;remotePatterns&lt;/code&gt; in &lt;code&gt;next.config.ts&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="kd"&gt;type&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;next&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;NextConfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;remotePatterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;your-store&amp;gt;.public.blob.vercel-storage.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;pathname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;nextConfig&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On recent Next.js versions there's a terser shorthand that takes a &lt;code&gt;URL&lt;/code&gt; directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;images&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;remotePatterns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://&amp;lt;your-store&amp;gt;.public.blob.vercel-storage.com/**&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then restart the dev server — &lt;code&gt;next.config&lt;/code&gt; is read once at startup and isn't hot-reloaded, so without a restart you'll swear the fix didn't work. Editing the config and watching the same error is the classic second act of this bug.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# stop the dev server, then:&lt;/span&gt;
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Scope the pattern to &lt;em&gt;your&lt;/em&gt; store, not the platform
&lt;/h3&gt;

&lt;p&gt;A word on wildcards, because a pattern you'll see in a lot of posts is subtly wrong:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;hostname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;*.public.blob.vercel-storage.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;   &lt;span class="c1"&gt;// don't do this&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That looks account-scoped. It isn't — it matches &lt;strong&gt;every Vercel Blob store on the platform&lt;/strong&gt;, including anyone else's. If someone can get a URL into your pages, your optimizer will happily fetch and serve images from a stranger's store under your domain. And the fully open &lt;code&gt;hostname: "**"&lt;/code&gt; is worse still: it makes the error vanish and reopens the exact open-proxy problem the allowlist exists to close. Scope the pattern to the narrowest true thing — your exact store hostname and a path prefix.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;One more thing about that error message: it was doing me a favor. An image&lt;br&gt;
optimizer that fetches from any URL on the internet is a free proxy wearing&lt;br&gt;
your domain name. The allow-list that interrupted my afternoon is the only&lt;br&gt;
thing standing between "renders my images" and "renders anyone's."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The CSP twist (the part most posts get wrong)
&lt;/h2&gt;

&lt;p&gt;If you run a strict Content-Security-Policy, you might expect to also add the Blob host to your &lt;code&gt;img-src&lt;/code&gt; directive — some posts even frame this error as a "two files" fix. &lt;strong&gt;You usually don't have to&lt;/strong&gt; — and here's the reasoning, because it's worth understanding rather than copy-pasting.&lt;/p&gt;

&lt;p&gt;When optimization is on (the default), the browser never requests the Blob URL directly. It requests &lt;code&gt;/_next/image?url=...&lt;/code&gt; from your own origin, and Next.js fetches the remote source server-side. So as far as the browser's CSP is concerned, the image is same-origin and &lt;code&gt;img-src 'self'&lt;/code&gt; already allows it. That's why this site's CSP never listed the Blob host, yet the images rendered.&lt;/p&gt;

&lt;p&gt;You only need the remote host in &lt;code&gt;img-src&lt;/code&gt; when you've taken the image &lt;em&gt;out&lt;/em&gt; of the optimizer's path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you set &lt;code&gt;unoptimized&lt;/code&gt; on the image or globally,&lt;/li&gt;
&lt;li&gt;you use a custom loader that returns the remote URL,&lt;/li&gt;
&lt;li&gt;you render it with a plain &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt; tag or a CSS &lt;code&gt;background-image&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;or you reference it in an Open Graph / &lt;code&gt;&amp;lt;meta&amp;gt;&lt;/code&gt; tag (those aren't &lt;code&gt;next/image&lt;/code&gt; at all).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the honest rule is: &lt;strong&gt;&lt;code&gt;remotePatterns&lt;/code&gt; is the fix; CSP is a conditional follow-up that only applies if you bypass optimization.&lt;/strong&gt; The two allowlists answer different questions — &lt;code&gt;remotePatterns&lt;/code&gt; is Next's permission to &lt;em&gt;fetch and optimize&lt;/em&gt; the image; &lt;code&gt;img-src&lt;/code&gt; is the browser's permission to &lt;em&gt;display&lt;/em&gt; whatever URL actually ends up in the page. With the default loader, that URL is your own origin, so the browser's question is already answered.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd do differently
&lt;/h2&gt;

&lt;p&gt;Set up &lt;code&gt;remotePatterns&lt;/code&gt; the moment you wire in object storage, before the first upload — not after the first crash. It's two minutes of config that turns a confusing runtime error into a non-event. And scope the pattern to the exact host and path prefix you control; the wildcard is a smell, not a shortcut.&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The upload worked but the image won't render — why?&lt;/strong&gt;&lt;br&gt;
Different systems. Storage happily accepts and serves the file; &lt;code&gt;next/image&lt;/code&gt; separately refuses to optimize from hosts you haven't allowlisted. A reachable URL proves nothing about the allowlist. Fixing &lt;code&gt;remotePatterns&lt;/code&gt; doesn't touch the upload at all.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I added the pattern and it still fails. Why?&lt;/strong&gt;&lt;br&gt;
In order of likelihood: you didn't restart the dev server; or the pattern mismatches in one strict part (protocol, subdomain, port, pathname depth). If it works locally but fails in production &lt;em&gt;and&lt;/em&gt; you've bypassed optimization (&lt;code&gt;unoptimized&lt;/code&gt;, custom loader, plain &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;), then — and only then — check your CSP's &lt;code&gt;img-src&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I just set &lt;code&gt;unoptimized&lt;/code&gt; and skip this?&lt;/strong&gt;&lt;br&gt;
You can — per-image or globally — and you give up resizing, format conversion, and blur placeholders. It's an escape hatch for special cases (SVGs, tiny icons), not the fix for an unconfigured host. Note that &lt;code&gt;unoptimized&lt;/code&gt; also puts the remote URL back in the browser's path, so a strict CSP would then need the host in &lt;code&gt;img-src&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do local images need &lt;code&gt;remotePatterns&lt;/code&gt;?&lt;/strong&gt;&lt;br&gt;
No. &lt;code&gt;remotePatterns&lt;/code&gt; only governs &lt;em&gt;remote&lt;/em&gt; hosts. Images you import or serve from &lt;code&gt;/public&lt;/code&gt; are local and exempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js — &lt;code&gt;next/image&lt;/code&gt; Un-configured Host&lt;/strong&gt; (the page the error links to; explains exact-match rules and the &lt;code&gt;new URL()&lt;/code&gt; shorthand): &lt;a href="https://nextjs.org/docs/messages/next-image-unconfigured-host" rel="noopener noreferrer"&gt;https://nextjs.org/docs/messages/next-image-unconfigured-host&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js — Image component API reference&lt;/strong&gt; (&lt;code&gt;remotePatterns&lt;/code&gt;, the &lt;code&gt;domains&lt;/code&gt; deprecation, loaders, the &lt;code&gt;/_next/image&lt;/code&gt; optimization path): &lt;a href="https://nextjs.org/docs/app/api-reference/components/image" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/api-reference/components/image&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Next.js — Image Optimization guide&lt;/strong&gt; (how the default loader fetches remote images and serves them from your own server): &lt;a href="https://nextjs.org/docs/app/getting-started/images" rel="noopener noreferrer"&gt;https://nextjs.org/docs/app/getting-started/images&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;{/* AFFILIATE (internal): Bunny.net optional closing aside when machinery fires up.&lt;br&gt;
    Cross-links at publish of the targets: → P-02 (why object storage),&lt;br&gt;
    → P-03 (the CSP companion — 'self' covering /_next/image explained in full),&lt;br&gt;
    → P-06 (cache/restart). SEO title variant for seoTitle field if the site adds&lt;br&gt;
    one: "Fix next/image 'hostname is not configured' in Next.js" */}&lt;/p&gt;

</description>
      <category>debugging</category>
      <category>nextjs</category>
      <category>react</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
