When you run a blog or website, the favicon — that small icon shown in the browser tab — is a surprisingly important part of your brand identity. While migrating from WordPress to the static site generator Hugo (PaperMod theme), I had to set up and verify the favicon from scratch, so I'm writing down the whole process here.
In particular, I'll go into detail on why checker sites like RealFaviconGenerator throw warnings or errors after you've set up your favicon, and how to deal with browser caching issues.
1. Preparing the favicon image files and the static/ folder location
In a Hugo project, everything inside the static/ folder is copied as-is to the site's root path at build time (e.g. https://ricosheaven.com/).
To generate a favicon, use a site like favicon.io or RealFaviconGenerator to produce the icon package, then place the following files directly under the static/ folder.
static/favicon.ico(a multi-size icon containing 16x16, 32x32, and 48x48)static/favicon-16x16.pngstatic/favicon-32x32.pngstatic/apple-touch-icon.png(180x180, used for saving to the iOS home screen)
static/images/favicon.ico. They must sit directly at the top level of static/ so they get served from the default path, /favicon.ico.
2. Adding the hugo.yaml configuration (PaperMod theme)
If you're using hugo.yaml instead of hugo.toml, register an assets: entry under the params: section, following YAML's indentation rules.
params:
# ... existing params settings ...
assets:
favicon: "/favicon.ico"
favicon16x16: "/favicon-16x16.png"
favicon32x32: "/favicon-32x32.png"
apple_touch_icon: "/apple-touch-icon.png"
/ (slash) before the file name, the PaperMod theme will build an exact absolute path when generating the <head> tags, like <link rel="icon" href="https://ricosheaven.com/favicon.ico">.
3. Tips for checking browser cache and confirming the change
Favicons are cached extremely aggressively, both inside browsers (especially Safari and Chrome) and on Google's search servers. If your old WordPress-era favicon keeps showing up, or you can't see your changes reflected, verify with the methods below.
① Access the file directly (the most reliable way)
Type https://ricosheaven.com/favicon.ico directly into the browser's address bar.
If the newly registered icon image appears centered on the screen with no 404 error, your Vercel and Hugo deployment succeeded perfectly.
② Safari private browsing window
In Safari, open a private browsing window with Cmd + Shift + N, then visit the site and check the tab icon.
4. Interpreting RealFaviconGenerator errors and how to respond
Don't panic if RealFaviconGenerator, the favicon checker site, shows a "Found 3 errors and 1 warning" message.
•
An implicit ICO favicon is found at /favicon.ico•
ICO favicon found (16x16, 32x32, 48x48)•
The touch icon is declared / downloadable / square (180x180)➔ Every essential favicon needed for PC browsers and smartphone access is working correctly!
Causes of the warning/error items:
- There is no SVG favicon: This is just a warning that there's no vector SVG favicon for dark mode. As long as you have
.icoand.pngfiles, it will display fine in every browser. - There is no 96x96 desktop PNG favicon: This is covered by the 48x48/32x32 layers embedded inside
favicon.ico, so it can be safely ignored. - No web app manifest: This just means there's no
site.webmanifestfile for PWA (Progressive Web App) support, which has no impact on running an ordinary tech blog.
5. Conclusion
When applying a favicon in the Hugo PaperMod theme, the key is to place the files at the very top level of static/ and specify the correct absolute path (/favicon.ico) in hugo.yaml.
If direct URL access shows the icon correctly, there's no need to worry about the checker tool's PWA-related recommendation warnings — you can just keep running your blog comfortably until the browser crawlers update their cache!