Start a project

Article · Web development · Branding · Social · 12 min read

Favicons, web manifests and share images

Favicons, Apple touch icons, a web app manifest and a share image are how a site appears when it is not on itself: in a browser tab, on a phone’s home screen, and in a chat preview. They are small files, and they cause outsized confusion, because every platform asks for a slightly different shape and then caches the result aggressively.

On this page 10 sections
  1. These files are how the site appears outside itself
  2. Favicons: SVG, PNG and the ICO leftover
  3. Apple touch icons and the files phones still request
  4. The web app manifest, icons and theme colour
  5. Open Graph and a large preview image
  6. Alt text, cache and the preview that will not update
  7. A minimum set that covers modern browsers
  8. How to check each surface
  9. Key takeaways
  10. Frequently asked questions

You do not need a dozen PNGs to look considered. You need a consistent mark, a short manifest, one large preview image, and a way to prove that each surface is using the file you think it is. I keep that set in the same release as the HTML on leej.uk, and I rebuilt the tools on this site — the Favicon Generator, the Web App Manifest Validator, the OG Image Maker and the Meta & Social Previewer — because I was tired of checking them by hand.

These files are how the site appears outside itself

A page can be typographically perfect and still look like a missing-image box in Slack, or a generic globe in a mobile tab. The files in this checklist do not change your search ranking on their own. They do change whether a person trusts a link, finds your tab again, or saves the site to their home screen.

Treat them as part of the design system, not as afterthoughts:

The rest of this article is the minimum set that covers current browsers, and the checks that catch a stale cache.

Favicons: SVG, PNG and the ICO leftover

A modern default I am happy to ship is:

In the document head:

<link rel="icon" href="/favicon.svg" type="image/svg+xml">
<link rel="icon" href="/favicon-32.png" sizes="32x32" type="image/png">
<link rel="shortcut icon" href="/favicon.ico">

A few practical rules:

The Favicon Generator will produce a reasonable set from a square source image. Start from a large, sharp original, not from a screenshot of the existing tab icon.

Apple touch icons and the files phones still request

Safari on iOS, and some other mobile browsers, look for a large PNG they can put on the home screen. The conventional file is a 180×180 PNG, declared as:

<link rel="apple-touch-icon" href="/apple-touch-icon.png">

A few related requests still appear in logs, even if you never advertised them:

You do not have to provide every historical size. You should:

Apple also uses the web app manifest, where it is present, for some install paths. The touch icon is still worth shipping, because a long-press or an “Add to Home Screen” from Safari has used it for years, and because a missing file becomes a generic screenshot of your page.

If you have a dark theme, do not automatically invert the touch icon. Home-screen icons sit on a wallpaper you do not control. A simple mark on a solid background is more reliable than a transparent one.

The web app manifest, icons and theme colour

A web app manifest is a JSON file that names the site, its start URL, its icons and a theme colour. You do not have to make the site installable as a PWA for a manifest to be useful; browsers also use it to pick icons and colours.

A small, honest manifest looks like this:

{
  "name": "Lee Johnson",
  "short_name": "Lee Johnson",
  "start_url": "/",
  "scope": "/",
  "display": "browser",
  "background_color": "#ffffff",
  "theme_color": "#ffffff",
  "icons": [
    {
      "src": "/icon-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/icon-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "any"
    }
  ]
}

And in the head:

<link rel="manifest" href="/manifest.webmanifest">
<meta name="theme-color" content="#ffffff">

Choices worth being deliberate about:

Validate the file rather than eyeballing it. The Web App Manifest Validator will catch missing names, broken icon paths, nonsense sizes and a start_url outside the scope. Serve the manifest with a JSON content type (application/manifest+json or application/json), not as text/html.

Open Graph and a large preview image

When someone pastes a URL into iMessage, Slack, LinkedIn, WhatsApp or a social network, the preview comes from Open Graph tags and a large image, not from the favicon. The Open Graph protocol is the usual convention; X also looks at Twitter Card tags, which can share the same image.

A minimum set:

<meta property="og:type" content="website">
<meta property="og:site_name" content="Lee Johnson">
<meta property="og:title" content="Favicons, web manifests and share images">
<meta property="og:description" content="A checklist for favicons, Apple touch icons, a web app manifest and Open Graph images.">
<meta property="og:url" content="https://leej.uk/articles/favicons-manifests-and-share-images">
<meta property="og:image" content="https://leej.uk/og/favicons-manifests-and-share-images.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="The title of the article on a plain background, next to the site mark.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://leej.uk/og/favicons-manifests-and-share-images.png">

A few constraints are more important than a perfect design:

You do not need a separate “Twitter image” unless you want a different crop. If you set twitter:image, keep it in sync with og:image, or you will debug the wrong file when a preview is stale.

Alt text, cache and the preview that will not update

og:image:alt is the alt text of the share image. Write it as you would for any other image: what the picture shows, not “image” or the file name. Some platforms ignore it; some will use it, and it is cheap to get right.

The harder problem is cache. Chat apps and social platforms fetch the image once and keep it. After you replace a file at the same URL, previews can show the old image for a long time.

A process that works:

  1. Change the URL when you change the image. A query string (?v=20261110) or a hashed file name is enough, as long as the tag points at the new URL.
  2. Fetch the image URL yourself with curl -sSI and confirm a 200, a sensible content type, and that you are not being redirected to a login or a homepage.
  3. Use each platform’s official debugger where it has one, after the new URL is live, to ask it to refetch. I will not list every vendor’s tool here because those URLs change; search for the current one when you need it.
  4. Don’t test only in a chat thread that already saw the old URL. Open a new conversation, or a private window, after the debugger has been run.

The Meta & Social Previewer will show you what your tags currently say, which is the right first check. It cannot force another company’s cache to update.

If a preview is still wrong, look at the obvious causes before you redesign the image: HTTP rather than HTTPS, a relative og:image, a 404, a blocked path in robots.txt, or a login wall. A crawler that cannot fetch the image cannot show it.

A minimum set that covers modern browsers

If you want a punch-list for a small site, this is the set I ship and then stop expanding until there is a reason:

You can add maskable icons, a dark SVG favicon, and per-article images later. You do not need an old-fashioned list of ten PNG sizes in the head, and you do not need a Windows tile tag unless you have a reason to support it.

Put the files in the same deploy as the HTML that points at them. A new article with an old, unversioned logo in the share image is a release bug, not a design choice — the same kind of completeness I want before an App Store launch, and the same versioning discipline as App Store screenshots and previews.

How to check each surface

Work through the surfaces, rather than trusting a single validator:

If you change the mark, run the list again. Icon work is only finished when the last cached surface has caught up.

Key takeaways

If you want a second pair of eyes on a set of site icons, tell me about it.

Frequently asked questions

Which favicon sizes does a website still need?

A practical modern set is an SVG, a 32×32 PNG, and a favicon.ico at the site root for tools that still request it. Add a 180×180 Apple touch icon and 192 and 512 PNGs for the manifest. You can skip the long historical list of extra PNG sizes until a specific platform you care about requires one.

What belongs in a web app manifest?

A name, a short name, a start URL, a scope, a display mode, a theme colour, and icons that exist at the paths you list. For a content site, display: "browser" is an honest default. Validate the file, and serve it as JSON.

What size should an Open Graph image be?

The widely documented large-card size is 1200×630 pixels. Confirm against the platform you are targeting if it publishes its own figures, keep important content away from the edges, and always reference the file with an absolute HTTPS URL.

Do I need a separate Twitter/X image?

No, not if the Open Graph image already works as a large card. If you set twitter:image, keep it identical to og:image unless you have a deliberate, tested crop for that platform.

Why is my link preview still showing an old image?

The file URL was probably reused, and the chat or social cache has the old bytes. Change the URL, confirm the new file returns 200, refetch it in the platform’s debugger if it has one, and test in a thread that has not seen the old URL.

Written by Lee Johnson. Published 10 November 2026.

All articles · Swift A–Z · Apps

Questions, or an app in mind?

Let's bring your ideas to life. Whether you're envisioning a game-changing Apple Watch app or a transformative iOS experience, I'm here to make it happen.

Start a project