Quick answer
Use the public or static convention of the deployed framework. Custom Build Output API projects place public files in .vercel/output/static, where they are exposed from the deployment root without renamed extensions.
- Last verified
- July 31, 2026
- Evidence
- Primary documentation plus a route-specific implementation example
- Primary sources
- 2
Project paths and constraints
Use the public or static convention of the deployed framework. Custom Build Output API projects place public files in .vercel/output/static, where they are exposed from the deployment root without renamed extensions.
Every deployment has its own immutable URL while the production alias advances. Framework metadata conventions and Output API static files must ultimately resolve in that deployment.
Connected next stepGitHub Pages Favicons: Base Paths and Deployment for the closest prerequisite or comparison.
Declare favicon metadata once
Keep link declarations in the framework’s shared document metadata layer. Verify that a rewrite or function route does not shadow /favicon.ico, /favicon.svg, or site.webmanifest.
Let the deployed framework own head generation and keep static assets in its supported public convention. Check route and rewrite rules for collisions with favicon.ico, favicon.svg, and site.webmanifest.
Connected next stepCloudflare Pages Favicons: Assets, Headers and Cache for the next connected implementation decision.
Build, deploy, and verify
Check the Resources view for static assets, request each file on the production domain, and compare the preview deployment when a change appears stale. Static files are cached through Vercel’s CDN.
A successful preview does not prove the production alias was promoted, and a rewrite can intercept an asset even when it appears in build output. Compare both responses.
Connected next stepOpen the most relevant production tool and verify the decision with a working output.
Compare the immutable preview with the production alias
Open the exact deployment URL first and verify that the expected static resources were included. Then test the production alias after promotion; these hostnames can expose different deployments even though they share a project dashboard.
For every icon response, capture x-vercel-cache, Cache-Control, Content-Type, and final bytes. If a rewrite or function returns application HTML, exclude the asset path before purging the CDN because cache invalidation cannot create an omitted file.
Production file tree and code: Vercel static assets and cache policy
The framework should emit these public files before vercel.json applies response headers. Exclude them from catch-all rewrites so the CDN caches image bytes rather than an application page.
public/
├── favicon.svg
├── favicon.ico
├── apple-touch-icon.png
└── site.webmanifest
vercel.json{
"headers": [{
"source": "/(favicon\.ico|favicon\.svg|site\.webmanifest)",
"headers": [{ "key": "Cache-Control", "value": "public, max-age=86400" }]
}]
}Review the headings, sources, implementation artifact, and update record for this guide as structured JSON.
Download guide evidence ↓- Guide
- Vercel Favicons: Static Files, Rewrites and CDN Cache
- Coverage
- Client behavior can change by browser, operating system, platform version, cache state and deployment configuration. Unperformed manual observations are not claimed.
Questions, answered
Why is the new favicon visible on preview only?+
The production alias may still reference an older deployment, or its CDN object may differ. Confirm promotion and compare the response headers and bytes on both hostnames.
Can vercel.json fix a file absent from the build?+
No. Headers and rewrites operate on deployed output; first ensure the framework copied the icon into its public build result.
