Next.js Favicon: The Modern App Router Guide (2026)
Next.js Favicon: The Modern App Router Guide
So you’ve spun up a new Next.js project, dropped a favicon.ico in the public folder, and... nothing. Or worse, it works locally but breaks in production. What gives?
If this sounds familiar, you've likely stumbled upon the difference between the old pages router and the modern App Router. The good news is the new way is much simpler and more powerful once you know the convention.
The Official Way: File-Based Metadata
Forget manually adding <link> tags to your layout.tsx. The Next.js App Router uses a special file-based system. You place specifically named icon files in your app directory, and Next.js automatically generates the necessary HTML head tags for you.
This is my recommended approach. It’s cleaner, less error-prone, and leverages the framework's built-in optimizations.
Step-by-Step: Adding Your Favicon
Let's get this done in under five minutes. No prerequisites needed, other than a Next.js project running the App Router.
Step 1: Prepare Your Icon Files
You need a few key files for broad compatibility. While you can create these yourself, a generator ensures they're correctly sized and formatted. (Shameless plug: our free favicon generator handles this perfectly).
favicon.ico: The classic. Required for older browsers.
icon.png or icon.svg: The modern, high-resolution icon. I strongly recommend using an SVG. We have a whole guide on the benefits of SVG favicons.
apple-icon.png: For when users add your site to their iOS home screen. Check out our Apple Touch Icon guide for specifics.
Step 2: Place Icons in the Root of the `app` Directory
This is the most important step. Move your generated icons directly into the /app folder. Do not put them in the /public folder.
Your project structure should look like this:
app/
├── layout.tsx
├── page.tsx
├── favicon.ico <-- For legacy browsers
├── icon.svg <-- For modern browsers (recommended)
└── apple-icon.png <-- For iOS home screen
public/
└── ... (your other static assets)
Next.js will automatically detect these files and generate the corresponding <link> tags in your site's <head>.
Step 3: Remove Any Old or Manual Declarations
If you have an old favicon.ico in your public folder, delete it. The file in /app takes precedence, but it's best to avoid confusion.
Also, check your root layout.tsx and remove any manually added <link rel="icon" ...> tags. The file-based method makes them redundant.
Step 4: Verify the Result
Run your dev server (npm run dev) and inspect the source code of your page. You should see that Next.js has generated the tags for you, something like this:
Seeing these tags means it's working. The framework handled everything.
Real-World Example: How GitHub Does It
Curious how the pros handle this? Take a look at GitHub. They serve a favicon.ico, multiple PNG sizes for different devices, and a special monochrome SVG for the Safari Pinned Tab icon. The Next.js file-based approach is designed to build this kind of robust, multi-device support automatically, saving you from writing all those <link> tags by hand.
Common Pitfalls to Avoid
If your icon isn't showing up, it's usually one of these three things.
1. The `public` Folder Trap
Again, for metadata files like favicons, the app directory is the correct place in modern Next.js. While the public folder still works for general static assets, icons placed in /app have special meaning and take priority.
2. Aggressive Browser Caching
Your code is perfect, but you still see the old icon (or no icon). This is almost always the browser's fault. Browsers cache favicons very aggressively.
A simple page refresh often isn't enough. You'll need to do a hard refresh or clear your browser's cache. We wrote a detailed guide on how to force a favicon cache clear if you get stuck.
3. Incorrect File Names
The names favicon.ico, icon.png, icon.svg, and apple-icon.png are not arbitrary. They are conventions Next.js specifically looks for. A typo like my-icon.svg won't be picked up automatically.
And that’s it. By embracing the file-based convention, you're working with the framework, not against it. You get optimized, correct HTML for free, and your project stays clean. No more wrestling with <head> tags just to get your brand to show up in a browser tab.
Favicon en Next.js: La guía moderna para el App Router
Acabas de crear un nuevo proyecto en Next.js, pones un favicon.ico en la carpeta public y... nada. O peor, funciona en local pero se rompe en producción. ¿Qué está pasando?
Si esto te suena, probablemente te has topado con la diferencia entre el antiguo pages router y el moderno App Router. La buena noticia es que la nueva forma es mucho más simple y potente una vez que conoces la convención.
El método oficial: metadatos basados en archivos
Olvídate de añadir manualmente etiquetas <link> a tu layout.tsx. El App Router de Next.js utiliza un sistema especial basado en archivos. Colocas archivos de icono con nombres específicos en tu directorio app, y Next.js genera automáticamente las etiquetas HTML necesarias en el head por ti.
Este es mi enfoque recomendado. Es más limpio, menos propenso a errores y aprovecha las optimizaciones integradas del framework.
Paso a paso: Añadiendo tu favicon
Hagamos esto en menos de cinco minutos. No se necesitan requisitos previos, más allá de un proyecto Next.js que utilice el App Router.
Paso 1: Prepara tus archivos de icono
Necesitas algunos archivos clave para una amplia compatibilidad. Aunque puedes crearlos tú mismo, un generador asegura que tengan el tamaño y formato correctos. (Autopromoción descarada: nuestro generador de favicons gratuito se encarga de esto perfectamente).
favicon.ico: El clásico. Requerido para navegadores antiguos.
icon.png o icon.svg: El icono moderno de alta resolución. Recomiendo encarecidamente usar un SVG. Tenemos una guía completa sobre los beneficios de los favicons SVG.
apple-icon.png: Para cuando los usuarios añaden tu sitio a su pantalla de inicio de iOS. Echa un vistazo a nuestra guía de Apple Touch Icon para más detalles.
Paso 2: Coloca los iconos en la raíz del directorio `app`
Este es el paso más importante. Mueve tus iconos generados directamente a la carpeta /app. No los pongas en la carpeta /public.
La estructura de tu proyecto debería verse así:
app/
├── layout.tsx
├── page.tsx
├── favicon.ico <-- Para navegadores antiguos
├── icon.svg <-- Para navegadores modernos (recomendado)
└── apple-icon.png <-- Para la pantalla de inicio de iOS
public/
└── ... (tus otros archivos estáticos)
Next.js detectará automáticamente estos archivos y generará las etiquetas <link> correspondientes en el <head> de tu sitio.
Paso 3: Elimina cualquier declaración antigua o manual
Si tienes un favicon.ico antiguo en tu carpeta public, bórralo. El archivo en /app tiene prioridad, pero es mejor evitar confusiones.
Además, revisa tu layout.tsx raíz y elimina cualquier etiqueta <link rel="icon" ...> que hayas añadido manualmente. El método basado en archivos las hace redundantes.
Paso 4: Verifica el resultado
Ejecuta tu servidor de desarrollo (npm run dev) e inspecciona el código fuente de tu página. Deberías ver que Next.js ha generado las etiquetas por ti, algo como esto:
Ver estas etiquetas significa que está funcionando. El framework se encargó de todo.
Ejemplo real: Cómo lo hace GitHub
¿Tienes curiosidad por saber cómo lo manejan los profesionales? Echa un vistazo a GitHub. Sirven un favicon.ico, múltiples tamaños de PNG para diferentes dispositivos y un SVG monocromático especial para el icono de pestaña fijada de Safari. El enfoque basado en archivos de Next.js está diseñado para construir este tipo de soporte robusto y multidispositivo automáticamente, ahorrándote el tener que escribir todas esas etiquetas <link> a mano.
Errores comunes que debes evitar
Si tu icono no aparece, normalmente es por una de estas tres cosas.
1. La trampa de la carpeta `public`
De nuevo, para archivos de metadatos como los favicons, el directorio app es el lugar correcto en el Next.js moderno. Aunque la carpeta public sigue funcionando para archivos estáticos generales, los iconos colocados en /app tienen un significado especial y tienen prioridad.
2. El caché agresivo del navegador
Tu código es perfecto, pero sigues viendo el icono antiguo (o ningún icono). Esto es casi siempre culpa del navegador. Los navegadores guardan en caché los favicons de forma muy agresiva.
Una simple recarga de la página a menudo no es suficiente. Necesitarás hacer una recarga forzada o limpiar la caché de tu navegador. Escribimos una guía detallada sobre cómo forzar la limpieza de la caché del favicon si te quedas atascado.
3. Nombres de archivo incorrectos
Los nombres favicon.ico, icon.png, icon.svg y apple-icon.png no son arbitrarios. Son convenciones que Next.js busca específicamente. Un error tipográfico como mi-icono.svg no será detectado automáticamente.
Y eso es todo. Al adoptar la convención basada en archivos, estás trabajando con el framework, no contra él. Obtienes HTML optimizado y correcto de forma gratuita, y tu proyecto se mantiene limpio. No más peleas con las etiquetas del <head> solo para que tu marca aparezca en la pestaña de un navegador.
Next.js 파비콘: 최신 앱 라우터 가이드
새로운 Next.js 프로젝트를 시작하고 public 폴더에 favicon.ico 파일을 넣었는데... 아무것도 나타나지 않나요? 혹은 더 나쁘게, 로컬에서는 잘 되는데 배포 환경에서는 깨지나요? 대체 왜 그럴까요?
이런 경험이 있다면, 오래된 pages 라우터와 현대적인 앱 라우터(App Router)의 차이점에 부딪혔을 가능성이 높습니다. 좋은 소식은, 일단 규칙을 알고 나면 새로운 방식이 훨씬 더 간단하고 강력하다는 것입니다.
공식적인 방법: 파일 기반 메타데이터
layout.tsx에 수동으로 <link> 태그를 추가하는 것은 잊어버리세요. Next.js 앱 라우터는 특별한 파일 기반 시스템을 사용합니다. 특정 이름의 아이콘 파일들을 app 디렉토리에 넣기만 하면, Next.js가 필요한 HTML head 태그를 자동으로 생성해 줍니다.
이것이 제가 추천하는 접근 방식입니다. 더 깔끔하고, 오류 발생 가능성이 적으며, 프레임워크에 내장된 최적화 기능을 활용할 수 있습니다.
단계별 파비콘 추가하기
5분 안에 이 작업을 끝내봅시다. 앱 라우터를 사용하는 Next.js 프로젝트 외에는 다른 준비물은 필요 없습니다.
1단계: 아이콘 파일 준비하기
폭넓은 호환성을 위해 몇 가지 핵심 파일이 필요합니다. 직접 만들 수도 있지만, 생성기를 사용하면 정확한 크기와 형식으로 만들 수 있습니다. (뻔뻔한 광고지만, 저희 무료 파비콘 생성기가 이 작업을 완벽하게 처리해 드립니다).
favicon.ico: 고전적인 파일입니다. 오래된 브라우저에 필요합니다.
icon.png 또는 icon.svg: 현대적인 고해상도 아이콘입니다. SVG 사용을 강력히 추천합니다. 저희는 SVG 파비콘의 장점에 대한 전체 가이드를 제공합니다.
apple-icon.png: 사용자가 사이트를 iOS 홈 화면에 추가할 때 사용됩니다. 자세한 내용은 Apple Touch Icon 가이드를 확인하세요.
2단계: `app` 디렉토리의 루트에 아이콘 배치하기
이것이 가장 중요한 단계입니다. 생성된 아이콘들을 /app 폴더로 직접 옮기세요. /public 폴더에 넣지 마세요.
이 태그들이 보인다면 제대로 작동하고 있다는 뜻입니다. 프레임워크가 모든 것을 처리해 준 것입니다.
실제 사례: GitHub는 어떻게 할까?
전문가들은 이 문제를 어떻게 다루는지 궁금하신가요? GitHub를 살펴보세요. 그들은 favicon.ico, 다양한 기기를 위한 여러 크기의 PNG, 그리고 Safari 고정 탭 아이콘을 위한 특별한 단색 SVG를 제공합니다. Next.js의 파일 기반 접근 방식은 바로 이런 견고한 멀티 디바이스 지원을 자동으로 구축하도록 설계되어, 여러분이 그 많은 <link> 태그를 직접 작성하는 수고를 덜어줍니다.
피해야 할 흔한 실수들
아이콘이 나타나지 않는다면, 보통 다음 세 가지 중 하나가 원인입니다.
1. `public` 폴더의 함정
다시 말하지만, 파비콘과 같은 메타데이터 파일의 경우, 최신 Next.js에서는 app 디렉토리가 올바른 위치입니다. public 폴더는 여전히 일반적인 정적 자산에 사용할 수 있지만, /app에 위치한 아이콘은 특별한 의미를 가지며 우선순위가 더 높습니다.
2. 공격적인 브라우저 캐싱
코드는 완벽한데 여전히 오래된 아이콘(또는 아이콘 없음)이 보인다면, 이것은 거의 항상 브라우저 탓입니다. 브라우저는 파비콘을 매우 공격적으로 캐시합니다.
단순한 페이지 새로고침으로는 충분하지 않을 때가 많습니다. 강력 새로고침을 하거나 브라우저 캐시를 지워야 합니다. 만약 문제가 해결되지 않는다면, 파비콘 캐시를 강제로 지우는 방법에 대한 상세 가이드를 참고하세요.
3. 잘못된 파일 이름
favicon.ico, icon.png, icon.svg, apple-icon.png라는 이름은 임의로 정해진 것이 아닙니다. 이것들은 Next.js가 특별히 찾는 규칙입니다. my-icon.svg와 같은 오타는 자동으로 인식되지 않습니다.
이것으로 끝입니다. 파일 기반 규칙을 따름으로써, 여러분은 프레임워크에 맞서는 것이 아니라 함께 일하게 됩니다. 최적화되고 정확한 HTML을 무료로 얻고, 프로젝트는 깔끔하게 유지됩니다. 더 이상 브라우저 탭에 브랜드를 표시하기 위해 <head> 태그와 씨름할 필요가 없습니다.