Favicon not showing up? Find the cause and fix it
When a favicon does not appear, it is rarely a mystery — it is one of a short list of concrete failures: the browser is still holding the old file, the declared URL does not resolve, the sizes on offer do not match what the platform wants, or an icon specific to iOS, Android or search was never declared. This page walks through them in the order worth checking.
Start by checking the live site
Paste your URL into the checker and it lists every icon the page actually declares, whether each one loads, and the real pixel size behind it. Most of the causes below show up as a single red line in that report, which saves you from guessing.
Check my favicon1. The browser is still showing the cached icon
Browsers cache favicons far more aggressively than page HTML, and a CDN or service worker in front of the site can keep serving the previous file long after you deployed. Nothing is broken in this case — you are looking at an old copy.
- Open the icon URL in a tab and hard-reload it. If the correct image appears there, the file is fine and you are fighting a cache.
- Add a version to the URL and change it whenever the icon changes:
href="/favicon-32x32.png?v=2". - Purge the icon path in your CDN or reverse proxy, not just the HTML page.
2. The icon URL does not resolve
If no icon is declared, browsers fall back to requesting /favicon.ico at the domain root. If one is declared, that exact URL has to work: paths are case-sensitive on Linux servers, and a relative href resolves against the current page, so an icon that works on the home page can 404 on a nested article.
- Request the icon URL directly from the live domain and read the status code.
- Use root-absolute paths (
/icons/favicon.png), not relative ones. - Make sure the build copies the file into the served directory — assets inside
src/are not deployed unless your bundler is told to emit them.
3. You declared a size nobody asked for
A single 16×16 PNG is the classic setup, and it is the reason icons look soft or vanish on higher-density screens: the browser has to upscale it, and some platform pickers skip an icon whose declared size does not match what they want. Declaring a few sizes lets each consumer choose instead.
<link rel="icon" href="/favicon.ico" sizes="any" />
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png" />
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
<link rel="manifest" href="/site.webmanifest" />The ICO line covers legacy requests; the PNGs give modern browsers an exact match for the tab; the last two handle iOS and installed apps. For the full breakdown of which surface asks for which size, see every favicon size in one chart.
4. iOS has no apple-touch-icon
Safari does not use your tab icon for the home screen. Without rel="apple-touch-icon" at 180×180, iOS falls back to a screenshot of the page, which is why the icon looks nothing like the one you uploaded. Keep it square and opaque: transparency is composited onto a black background, and iOS applies its own corner rounding.
5. Android installs read the manifest, not your link tags
When someone adds the site to their phone, Chrome takes the icon from site.webmanifest. A manifest with no icons, or with only a 32×32 entry, produces a generic or blank icon on the home screen.
- Include 192×192 for the home screen icon and 512×512 for the install screen.
- For a maskable icon, add
"purpose": "maskable"and keep the artwork inside the centre 80% — the platform crops the rest into its own shape.
6. The file itself is invalid
A PNG renamed to .ico is not an ICO, and an ICO that only contains one size is no better than a single PNG. The same applies to a zero-byte upload, an SVG that references external assets, or a server returning the wrong Content-Type — browsers reject what they cannot decode and show nothing.
Rebuild the whole set instead of one file
Upload one source image and the generator exports the multi-size ICO, every PNG size, the Apple touch icon, the manifest icons and the matching link tags. It runs in your browser — the image is never uploaded.
Open the Favicon Generator7. The icon is not publicly reachable
An icon behind a login, a staging basic-auth prompt, hotlink protection or a Disallow rule in robots.txt is invisible to anyone who is not already signed in — including crawlers. Filter lists are the subtle variant: an icon served from a path matching common ad or tracking patterns gets blocked by extensions and never appears, while the same file loads fine for everyone else.
- Serve icons without authentication, from the same public origin.
- Allow the icon path in robots.txt.
- Avoid icon paths that look like ad or analytics routes.
8. Search results lag behind the fix
A correct icon can still be missing from search results, because the crawler re-fetches icons on its own schedule rather than on demand. Google also expects a square icon whose dimensions are a multiple of 48px, and it has to be able to crawl the URL. Beyond that there is nothing to do but keep the URL stable and wait for the next pass.
After the fix: confirm it end to end
Re-run the checker against the live URL. It requests each icon again and reports the sizes it actually received, so you can see whether the new files are being served or an old cached copy is still in the way.
Check the site againFrequently asked questions
Why does my favicon show in Chrome but not in Safari?
They read different declarations. Chrome and Edge use the rel="icon" tags or the web manifest; Safari uses rel="mask-icon" for pinned tabs and rel="apple-touch-icon" for the iOS home screen. They also cache icons separately, so a fix that shows up in one browser can lag in the other.
How long does it take Google to show my favicon in search results?
There is no way to force an immediate refresh. Google re-fetches the icon on its own crawl schedule, so a new or changed favicon typically takes several days and sometimes longer to appear. Keep the icon URL stable — changing it repeatedly restarts the wait.
Do I still need favicon.ico at the site root?
Yes, it is worth keeping. Browsers and crawlers request /favicon.ico by convention when no icon is declared or as a fallback, and a missing one produces a 404 in your server logs on every cold visit. One file at the root removes that whole class of failure.
Can I use an SVG favicon?
Current Chrome, Firefox and Edge all accept an SVG favicon, and one file covers every display size. Safari’s support has been uneven across versions, so declare an SVG and keep a PNG fallback at 32×32 for browsers that do not use it.
Why does my favicon look blurry?
A small source image is being scaled up. A 16×16 icon stretched to fill a 32×32 tab or a retina display has no extra detail to draw from. Export the icon at each size you declare instead of letting the browser resize one small file.
Why does my favicon work locally but not after deploying?
The three usual reasons: the build did not copy the file to the served directory (it must live in public/, not src/), a CDN or reverse proxy is still serving the previous version, or the declared href is relative and resolves against a different base URL in production. Open the icon URL directly on the live domain — that answer tells you which one it is.
Related tools
Favicon Checker
Paste a URL and see the icons that site declares, which of them actually load, and what is missing for browser tabs, iOS home screens and installable web apps.
Favicon Generator
Upload a single image and get every icon a modern site needs, packaged in one zip. Everything is generated on your device — nothing is uploaded.