Ghost CMS: Unsplash Images vs Local Upload (Performance & SEO Compared)
Someone on the Ghost forum asked a simple question this week: when you pick an image from Unsplash inside Ghost, it stays hosted at Unsplash — not on your server. Is that actually a problem for performance?
Short answer: yes, in most cases. Unsplash images skip Ghost's local image processing pipeline, can't be sized properly for PageSpeed, and add a third-party DNS lookup to every page load. If you're running PageSpeed Insights and wondering why your LCP score keeps slipping, this might be why.
Quick answer: When you use Ghost's built-in Unsplash picker, images stay hosted on Unsplash's servers and bypass Ghost's image optimisation. For better PageSpeed scores, lower LCP times, and consistent image serving, download the image from Unsplash and upload it directly to Ghost instead.

What happens when you use Ghost's Unsplash picker?
Ghost has a native Unsplash integration in the editor — you click the image card, search Unsplash, and drop an image into your post. It looks seamless. But behind the scenes, the image URL points to images.unsplash.com, not your Ghost server.
That creates a few problems:
- No local processing: Ghost normally resizes and compresses uploaded images. Unsplash-hosted images skip this entirely.
- Wrong dimensions: Ghost's image card may request a full-resolution Unsplash image even on mobile, unless your theme handles
srcsetmanually. - Third-party DNS resolution: Every visitor's browser has to resolve
images.unsplash.combefore loading the image. That's an extra round-trip on page load. - Unsplash's CDN, not yours: You can't set your own cache headers, convert to WebP, or serve via your Cloudflare zone.
Forum user BruceInLouisville noticed exactly this via PageSpeed — Unsplash images weren't being optimised at all. It's a common trap for new Ghost users.
How do local (uploaded) images work in Ghost?
When you upload an image directly to Ghost, the CMS processes it before saving. Here's what Ghost does automatically:
- Generates multiple
srcsetsizes (300w, 600w, 1000w, 1600w by default) - Converts images to WebP where supported
- Strips EXIF metadata to reduce file size
- Serves images from your own domain — so they pass through your Cloudflare cache
This matters for PageSpeed Insights scores and Core Web Vitals. The LCP (Largest Contentful Paint) element on most blog posts is the featured image — if that image loads from a slow third-party server without proper sizing, your LCP time increases.
For a deeper guide on Ghost image optimisation strategies, see How to Optimize Images for SEO on Ghost CMS.
Does Unsplash have its own CDN and optimisation?
Yes — Unsplash uses Imgix to serve images, which handles resizing and format conversion. If your Ghost theme correctly passes w and auto=format params to Unsplash URLs, images can load reasonably fast.
But here's the reality: most Ghost themes don't do this correctly for Unsplash-embedded images. The default integration just drops in the full-resolution Unsplash URL with no width params. PageSpeed flags it as "serve images in next-gen formats" or "properly size images" even though Imgix is capable of both.
The other issue: Unsplash images load from a different origin than your site. Chrome has to open a new TCP connection and do a TLS handshake for images.unsplash.com. That's measurable latency — typically 100-300ms on first load.
What about image rights and attribution?
Unsplash's license allows commercial use without attribution. But there are some edge cases worth knowing:
- You can't redistribute Unsplash images as a standalone product (e.g., reselling them)
- You can't use them in AI training datasets without a separate agreement
- Hotlinking (using Unsplash's hosted URL in your posts) is allowed, but using their API requires following their guidelines
If you download and re-host the image, the license still applies — you're just serving it from your own server, which is fine.
How do I download and upload an Unsplash image to Ghost?
The process is quick:
- Find the image on Unsplash and click the download button (this counts as a download for the photographer's stats)
- Rename the file to something descriptive — e.g.
ghost-cms-setup-guide.jpg - In Ghost editor, add an Image card and click "Upload image"
- Select your downloaded file
Ghost will then process it through its image pipeline: resize, compress, WebP conversion, srcset generation. The image now lives on your domain.
For Ghost Pro users, images are automatically backed up and served via Ghost's CDN. For self-hosted Ghost, they're stored in content/images/ and served from your own server — so you control caching, compression, and delivery.
Does it affect Core Web Vitals in practice?
Yes. Here's a practical comparison:
| Factor | Unsplash (hotlinked) | Local Ghost upload |
|---|---|---|
| Hosting domain | images.unsplash.com | Your domain |
| Image compression | Only if theme passes params | Automatic by Ghost |
| WebP conversion | Only via Imgix params | Automatic |
| srcset support | Partial (theme-dependent) | Full Ghost srcset |
| Third-party DNS | Yes (extra latency) | No |
| CDN / cache control | Unsplash controls this | You control this |
| LCP impact | Can hurt mobile LCP | Faster, more predictable |
If you're already working through a Cloudflare caching setup for Ghost, locally hosted images pass through your Cloudflare cache zone. Unsplash-hosted images don't — Cloudflare only caches assets on your domain.
Should I go back and fix Unsplash images in older posts?
If your site has a few posts with Unsplash images, it's worth replacing them — especially if those posts have high traffic or rank for competitive keywords. The fix takes about 2 minutes per post.
For large sites with many posts, prioritise by traffic. Check Google Search Console for your top landing pages and fix those first. Improving LCP on your highest-traffic posts has the most impact on Core Web Vitals.
Replacing featured images is easier than replacing in-content images. In Ghost's post editor, click the featured image, then click "Replace" — upload your local version and you're done.
If you're also working on other performance improvements, check the guide on improving PageSpeed scores on Ghost CMS for a full checklist.
Does Ghost Pro handle this differently?
Ghost Pro doesn't change how Unsplash images are stored — they still stay on Unsplash's servers when inserted via the picker. Ghost Pro's image CDN only applies to images you upload directly to Ghost.
So the same advice applies: download the image from Unsplash and upload it to Ghost. Ghost Pro's CDN then takes care of the rest.
Are there any reasons to keep using Unsplash images as hosted?
A few edge cases where it's acceptable:
- You're on Ghost Pro and your theme correctly passes Imgix sizing params to Unsplash URLs
- It's a low-traffic post and the performance hit is negligible
- You're testing a draft and haven't finalised the image yet
For production posts on any Ghost site optimising for SEO, local uploads are better in every way that matters.
Related Ghost Guides
- How to Optimize Images for SEO on Ghost CMS — covers alt text, file naming, and image compression strategies
- How to Improve Google PageSpeed Insights Score on Ghost CMS — full PageSpeed checklist for Ghost
- How to Cache Your Ghost Blog with Cloudflare — set up Cloudflare correctly so images and pages cache properly
- Ghost CMS Mailgun Alternatives — related discussion on avoiding locked-in third-party services
- Ghost SEO Hacks: Supercharge Your Blog's Visibility — broader SEO guide for Ghost sites
- XML Sitemaps in Ghost — ensure search engines can find and index your content
Frequently Asked Questions
Are Unsplash images free to use on a Ghost blog?
Yes. Unsplash images are licensed for free commercial use with no attribution required. You can use them in posts, featured images, and social cards without crediting the photographer.
Do Ghost's automatic image optimisations apply to Unsplash images?
No. Ghost's image processing (WebP conversion, srcset generation, compression) only runs on images uploaded directly to Ghost. Unsplash-inserted images bypass this pipeline entirely.
Will using Unsplash images hurt my Google PageSpeed score?
It can. Unsplash images add a third-party DNS connection, and most Ghost themes don't pass correct sizing parameters to Unsplash URLs. This can trigger "properly size images" and "serve images in next-gen formats" warnings in PageSpeed Insights.
Can I hotlink Unsplash images instead of downloading them?
Yes, Unsplash allows hotlinking for non-commercial and commercial use. But for performance reasons, downloading and uploading to Ghost is the better approach for production sites.
What size should I download Unsplash images for Ghost?
Download at least 1280px wide. Ghost will generate smaller srcset versions automatically from whatever you upload — so starting with a larger image gives Ghost more room to work with.
Does Ghost Pro serve images differently from self-hosted Ghost?
Ghost Pro serves locally uploaded images via its own CDN. Self-hosted Ghost serves them from your own server. In both cases, the CDN/cache only applies to images you've uploaded — not Unsplash-hosted images.
How do I replace Unsplash images in existing Ghost posts?
Open the post in Ghost Admin, click the image card, select "Replace image", and upload your downloaded version. For featured images, hover over the feature image and click the replace option that appears.
Does this affect Ghost's structured data or Open Graph images?
Yes. Ghost uses the featured image URL in its Open Graph and Twitter card meta tags. If the featured image is Unsplash-hosted, social media previews pull from Unsplash's servers — which is fine, but you lose control over caching and load speed for link previews.