← Back to Blog

Substack Image Hosting: Best Practices for Newsletter Writers

Formatting

Images make or break a newsletter’s visual quality. A well-placed chart, a clean data table, or a compelling header image can transform a wall of text into something readers actually want to engage with. But getting images right in Substack — especially in emails — requires understanding how the platform handles them behind the scenes.

This guide covers everything from Substack’s built-in image handling to advanced strategies for permanent hosting and optimization.

How Substack Handles Images

When you upload an image to Substack, the platform re-hosts it on its own CDN (Content Delivery Network) powered by Amazon S3. This means:

  • Your original file is copied to Substack’s servers
  • A new URL is generated (typically on substackcdn.com or substack-post-media.s3.amazonaws.com)
  • The original file on your computer or external host is no longer referenced

This re-hosting is generally a good thing. It means your images are served from fast, globally distributed servers, and they won’t break if you delete the original file.

Email vs. Web Rendering

Substack publishes every post in two formats: a web page and an email. Images behave differently in each:

Web version: Images display at full quality within the post’s content width (approximately 680 pixels). Readers can click to view full-size versions.

Email version: Images are embedded inline. Email clients impose their own constraints — some limit image width, some don’t load images by default, and some strip large images entirely. Substack optimizes images for email delivery, but the email version may look slightly different than the web version.

Optimal Image Formats

PNG

Best for: screenshots, tables, charts, graphics with text, anything requiring crisp edges.

PNG files support transparency and produce sharp, pixel-perfect rendering of text and lines. For data tables converted to images, PNG is the ideal format — numbers and text remain crisp at any size.

JPEG

Best for: photographs, complex illustrations with many colors, header images.

JPEG files are smaller than PNGs for photographic content. They use lossy compression, which can create artifacts around sharp edges and text. Avoid JPEG for tables or charts.

WebP

Best for: when you need smaller file sizes than PNG or JPEG.

Substack supports WebP uploads, and most modern email clients render them correctly. However, some older email clients (particularly older Outlook versions) may not display WebP images. If your audience skews corporate/enterprise, consider sticking with PNG or JPEG.

SVG

Substack does not support SVG uploads in the editor. If you have vector graphics, convert them to PNG before uploading.

Image Size Recommendations

Dimensions

  • Content-width images: 1360 pixels wide (2x resolution for retina displays of the ~680px content area)
  • Full-width images: 2400 pixels wide maximum
  • Inline/small images: at least 680 pixels wide to avoid pixelation on the web version

Substack automatically scales images to fit the content width, but starting with a higher resolution ensures sharpness on retina displays.

File Size

  • Target: under 500KB per image for optimal email loading
  • Maximum: Substack allows uploads up to 20MB, but large files slow down email loading
  • Compression: use tools like TinyPNG, Squoosh, or ImageOptim to reduce file size without visible quality loss

Smaller files mean faster loading, especially on mobile connections. This directly impacts whether subscribers actually see your images or scroll past a blank space while waiting.

Alt Text Matters

Always add alt text to your images. In Substack’s editor, you can click on any image and add a caption — this serves as both a visible caption and the image’s alt text.

Alt text serves three purposes:

  1. Accessibility: screen readers announce alt text for visually impaired readers
  2. Email fallback: when email clients block images (common in corporate environments), alt text displays in place of the image
  3. SEO: search engines use alt text to understand image content on your post’s web version

For data tables rendered as images, alt text should summarize the key data points: “Table showing Q4 revenue for top 5 tech companies, with Apple leading at $394B.”

External Image Hosting

While Substack re-hosts images you upload through the editor, you can also reference externally hosted images by pasting their URLs. This is relevant in a few scenarios:

When External Hosting Makes Sense

  • Automated workflows: if you generate images programmatically (e.g., table-to-image conversion), hosting them externally gives you a stable URL before publishing
  • Shared assets: logos, recurring graphics, or branding elements that appear across multiple posts
  • CDN control: when you want to manage caching, compression, and delivery yourself

Permanent URLs Are Essential

The most important rule for external image hosting: URLs must be permanent. If an image URL expires or is deleted, the image breaks in every post that references it — including previously published emails that subscribers might re-open.

Avoid:

  • Temporary upload services (some expire after 30-90 days)
  • URLs behind authentication
  • Local development server URLs
  • Free tiers with storage limits that might fill up

Reliable permanent hosting options include Cloudflare R2, Amazon S3, Backblaze B2, or any CDN with an object storage backend.

DownStack uses Cloudflare R2 for permanent image hosting. When it converts your markdown tables to images, each image gets a permanent CDN URL that won’t expire — so your table images stay visible in every post indefinitely.

Image Loading and Email Deliverability

Large or numerous images can affect email deliverability. Email providers may:

  • Clip emails that exceed a certain size (Gmail clips emails over ~102KB of HTML)
  • Delay delivery of image-heavy emails
  • Flag image-heavy emails as promotional

To keep deliverability high:

  • Limit the number of images per post (5-8 is a reasonable target for most newsletters)
  • Compress images before uploading
  • Use appropriately sized images (don’t upload a 4000px image if it displays at 680px)
  • Ensure images have alt text (emails without alt text look spammier to filters)

Responsive Image Behavior

Substack handles responsive scaling automatically. Images that are wider than the reader’s screen are scaled down to fit. This works well on mobile devices, but you should still consider:

Text in Images

If your image contains text (like a data table), make sure the text remains readable at mobile widths. A table image that’s 1200px wide with 10pt font will be scaled to roughly 375px on a phone — the text may become too small to read.

Solution: keep table images to 3-4 columns maximum, and use a font size of at least 14px in the rendered table. DownStack’s table rendering uses appropriately sized fonts optimized for mobile readability.

Tall Images

Very tall images (like long screenshots or infographics) can dominate the email viewport. Consider breaking tall content into multiple smaller images with explanatory text between them.

Image Workflows for Different Content Types

Data-Heavy Newsletters

For newsletters that regularly include charts, tables, or financial data:

  1. Create your data in a spreadsheet or markdown
  2. Convert tables to images using an automated tool
  3. Ensure images are hosted permanently
  4. Add descriptive alt text summarizing the data
  5. Include a text summary of key data points for accessibility

Photography or Visual Newsletters

For visually-driven content:

  1. Optimize images for web before uploading (1360px wide, compressed JPEG)
  2. Add meaningful captions to every image
  3. Consider the email weight — too many high-res photos will get clipped
  4. Use Substack’s image gallery feature for multiple photos in a grid

Technical or Tutorial Newsletters

For code-focused or tutorial content:

  1. Use screenshots for syntax-highlighted code
  2. Annotate screenshots with arrows or highlights if needed
  3. Keep screenshots focused — crop out unnecessary browser chrome
  4. Provide text alternatives for critical code examples

Key Takeaways

  • Substack re-hosts images on its own CDN, which provides fast global delivery
  • Use PNG for tables, charts, and text-heavy images; JPEG for photographs
  • Target 1360px width for content images (2x retina) and keep file sizes under 500KB
  • Always add alt text — it serves accessibility, email fallback, and SEO
  • External image hosting must use permanent URLs that never expire
  • Compress images to improve email loading speed and deliverability
  • Keep text in images readable at mobile widths (14px minimum font, 3-4 columns for tables)
  • Limit images per post to maintain email deliverability scores