Most favicon size charts list a dozen dimensions without saying who uses them. The useful question is narrower: which files does a browser, a phone home screen or Google Search actually request, and at what size? This guide answers it from the specifications (the HTML Standard, Apple’s Safari documentation, the Web App Manifest and Google Search Central) and from a test run on 2026-10-02 in Chromium 152 on macOS with a device pixel ratio of 2, where a local server logged every request each test page caused.

The sizes that have a job

SizeFileWho uses itSource
16×16, 32×32 (and 48×48)favicon.ico or PNG via <link rel="icon">Browser tabs, bookmarks, historyHTML Standard, rel=icon
Any, larger than 48×48 recommendedThe icon your home page declaresGoogle Search resultsGoogle Search Central
180×180apple-touch-icon.pngiPhone “Add to Home Screen”Apple: Configuring Web Applications
192×192 and 512×512PNGs listed in the web app manifestInstalled web apps on Android and desktop Chromeweb.dev install criteria
ScalableSVG via <link rel="icon" type="image/svg+xml">Browsers that support SVG iconsHTML Standard (sizes="any")

Most other numbers in big charts (57, 72, 114 and 144 from older iOS devices, 150 and 310 from Windows tiles) come from platform conventions that none of these sources require today. Apple’s guide, for example, still lists 152×152 and 167×167 for iPad alongside 180×180 for a Retina iPhone; if you list several, Safari picks the closest size and otherwise “the smallest icon larger than the recommended size”.

What Chromium actually requested

Each test page below was served from its own port, so no cached icon could interfere. The icons were a package made with the ZeroTool generator (letter “Z” on a blue background).

Page <head>Requests after the HTML
No icon links at all/favicon.ico
The generator’s snippet: ICO link, PNG links for 16, 32 and 48, apple-touch-icon, manifest/site.webmanifest, /favicon.ico
Only the three PNG links (16, 32, 48)/favicon-32.png
The three PNG links followed by the ICO link/favicon.ico
ICO with sizes="32x32", then an SVG link, then apple-touch-icon/icon.svg
Only a 32×32 PNG link/favicon-32.png

Four things follow from this log.

First, /favicon.ico is fetched only when a page declares no icon. That is the HTML Standard’s fallback: in the absence of an icon link, the user agent “may” fetch /favicon.ico from the site root. With a PNG link and no ICO link, Chromium did not request /favicon.ico at all.

Second, when an ICO link was present, Chromium chose the ICO over the PNG links, in either order. A 2× screen needs a 32-pixel image for a 16-point tab, and the ICO already contains one. The 16, 32 and 48 PNG links were never used in that case.

Third, an SVG link won over the ICO. With SVG, one file serves every size.

Fourth, desktop Chromium did not request apple-touch-icon.png, but it did fetch the manifest on page load. The HTML Standard leaves the choice among icon links to the browser, so Firefox and Safari may decide differently; this test covers Chromium only.

What Google Search requires

Google shows a favicon next to each result and reads it from the home page of the host. The rules in Define a favicon to show in search results:

  • The icon must be square and at least 8×8 pixels. Google recommends “larger than 48x48px so that it looks good on various surfaces”.
  • Supported formats are BMP, GIF, ICO, PNG, JPEG, PPM and TIFF. SVG is not in that list, so keep an ICO or PNG icon link next to an SVG one.
  • One favicon per hostname: example.com and news.example.com can differ, example.com/news cannot.
  • Googlebot must be able to crawl the home page and Googlebot-Image the icon file. A Disallow for the icon path in robots.txt keeps it out of results.
  • Keep the icon URL stable, and expect days to weeks before a change appears. Google accepts icon, shortcut icon, apple-touch-icon and apple-touch-icon-precomposed as the rel value.

Search Console has no favicon report. To speed up a change, request indexing of the home page with the URL Inspection tool.

apple-touch-icon: 180 pixels and the root fallback

iOS uses apple-touch-icon for the home-screen icon. Apple’s guide documents two ways to provide it: a <link rel="apple-touch-icon" href="..."> in the page, or, if no link is present, a file in the site root whose name starts with apple-touch-icon. The 180×180 size is the one Apple labels for a Retina iPhone (60 points at 3×). Apple’s rule for a missing size covers iPads too: Safari uses the smallest icon larger than the recommended size, so one 180-pixel file also serves an iPad that wants 152 or 167.

iOS adds its own rounded corners, so draw the icon as a full square. Apple’s guide does not say how transparent pixels are rendered, so give this file an opaque background to get the same result on every device.

Manifest icons, maskable and the safe zone

For a site to be installable as an app, Chrome’s install criteria require a manifest with name or short_name, a start_url, a display value of fullscreen, standalone, minimal-ui or window-controls-overlay, and icons that include a 192px and a 512px icon.

Android launchers crop installed icons to their own shapes. An icon with "purpose": "maskable" tells the system it may crop; the visible mark must then fit inside a centered circle whose radius is 40% of the icon width, because the outer 10% can be cut off (web.dev: maskable icons). web.dev also warns against declaring one file as "any maskable": an icon padded for masking looks too small where it is shown unmasked. Ship two entries instead:

{
  "icons": [
    { "src": "/icon-192.png", "sizes": "192x192", "type": "image/png", "purpose": "any" },
    { "src": "/icon-512.png", "sizes": "512x512", "type": "image/png", "purpose": "any" },
    { "src": "/maskable-512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
  ]
}

Chrome DevTools shows the result under Application → Manifest, with an option to preview only the minimum safe area.

Inside favicon.ico

An ICO file is a 6-byte header, one 16-byte directory entry per image, then the images. Each entry stores width and height in one byte each (0 means 256), the bits per pixel, the image’s byte length and its offset from the start of the file. Since Windows Vista an image may be a complete PNG file instead of a bitmap, and browsers read PNG-based ICO files.

This is the directory of the favicon.ico the generator produced in the test above, read back with Python’s struct module:

EntryWidth × heightBits per pixelBytesOffsetPayload
116 × 163234354PNG
232 × 3232539397PNG
348 × 4832714936PNG

The first image starts at byte 54 (6 + 3 × 16), and the file is 1,650 bytes. Putting 16, 32 and 48 into one ICO covers 1× and 2× tabs and Windows shortcuts. Larger sizes belong in PNG files that the manifest and the apple-touch-icon link point to.

SVG favicons

An SVG icon scales to any tab size and can contain a prefers-color-scheme media query in its own <style> block, so one file can switch colors with the system theme:

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

This was the fifth test page above, and Chromium requested only icon.svg. The ICO line stays for browsers without SVG icon support and for Google Search, which does not list SVG among its formats. Whether a browser re-renders the tab icon when the theme changes is up to the browser; the test did not check it. An SVG favicon must be self-contained: an icon is drawn as an image, so external fonts, images and scripts inside it do not load.

Generating the set with the ZeroTool favicon generator

The favicon generator draws an emoji, one to four characters, an uploaded image or pasted SVG onto a canvas in your browser and packs eleven files into a ZIP. Nothing is uploaded. These are the files from the test, generated twice: once from the default rocket emoji on a transparent background, once from the letter “Z” on blue.

FilePixelsRocket emojiLetter “Z”Used by
favicon.ico16, 32, 486,029 B1,650 BTabs (Chromium picked it)
favicon-16.png16855 B343 BLinked, not fetched by Chromium
favicon-32.png321,770 B539 BLinked, not fetched by Chromium
favicon-48.png483,350 B714 BLinked, not fetched by Chromium
favicon-64.png645,382 B904 BNot linked
favicon-96.png9610,278 B1,328 BNot linked
favicon-128.png12816,203 B1,852 BNot linked
apple-touch-icon.png18029,689 B2,744 BiOS home screen
android-chrome-192.png19233,238 B3,003 BManifest
android-chrome-512.png51298,017 B9,286 BManifest
site.webmanifest—438 B438 BFetched on load

The tool reported “11 files · 200.4 KB” for the emoji and “11 files · 22.3 KB” for the letter. Color emoji have many gradients, so their PNGs are about ten times larger than a flat letter. The emoji is drawn with the system emoji font, so the same emoji looks different when generated on Windows or Linux; use the Image or SVG input when the result must not depend on the machine.

The tool’s HTML snippet is:

<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32.png">
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48.png">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<link rel="manifest" href="/site.webmanifest">
<meta name="theme-color" content="#ffffff">

And its site.webmanifest, here with “Example Site” in the site name field, “Example” in the short name field, the default theme color and a transparent background:

{
  "name": "Example Site",
  "short_name": "Example",
  "start_url": "/",
  "display": "standalone",
  "icons": [
    {
      "src": "/android-chrome-192.png",
      "sizes": "192x192",
      "type": "image/png",
      "purpose": "any"
    },
    {
      "src": "/android-chrome-512.png",
      "sizes": "512x512",
      "type": "image/png",
      "purpose": "any"
    }
  ],
  "theme_color": "#ffffff",
  "background_color": "#ffffff"
}

This manifest meets the manifest part of Chrome’s install criteria: it has name and short_name, "start_url": "/", "display": "standalone" and the two icon sizes. If you leave the site name field empty, the tool leaves out name and short_name instead of writing empty strings, and warns that Chrome will not offer to install the site. Both icons are declared "any", because the package has no image padded for masking. If you want a maskable icon, generate a separate 512-pixel file whose mark stays inside that central circle: about 10% padding on each side for a round mark, about 22% for a square one, whose corners must fit inside the circle too (the generator’s padding slider goes to 30%) and add it with "purpose": "maskable". If you like, also delete favicon-64.png, favicon-96.png and favicon-128.png, which no tag references, and the 16/32/48 PNG lines, which Chromium did not use when the ICO line was present.

Upload the files to the site root, because the snippet and manifest use root paths. Then check the result in DevTools under Application → Manifest, on an iPhone with Add to Home Screen, and, after Google recrawls the home page, in a search for your site. Related tools: SVG to PNG Converter for making a high-resolution source, and Image to Base64 if you want to inline a small icon.