Communitygithub.com

Adamparishspok/skills

Install a complete, lean favicon set on any website or web app — the five files modern browsers, iOS and Android actually use, one block of head markup added once in the root layout, and a check that every file resolves. Covers finding the public folder per framework, generating the set from one SVG (or from a RealFaviconGenerator package), dark-mode SVG icons, maskable manifest icons, cache busting and verification. Use when adding, replacing or auditing a favicon, app icon, apple-touch-icon or web manifest. Triggers on: favicon, favicon.ico, favicon.svg, apple-touch-icon, site.webmanifest, manifest.json, app icon, PWA icon, maskable icon, tab icon, RealFaviconGenerator.

What is skills?

skills is a Claude Code agent skill that install a complete, lean favicon set on any website or web app — the five files modern browsers, iOS and Android actually use, one block of head markup added once in the root layout, and a check that every file resolves. Covers finding the public folder per framework, generating the set from one SVG (or from a RealFaviconGenerator package), dark-mode SVG icons, maskable manifest icons, cache busting and verification. Use when adding, replacing or auditing a favicon, app icon, apple-touch-icon or web manifest. Triggers on: favicon, favicon.ico, favicon.svg, apple-touch-icon, site.webmanifest, manifest.json, app icon, PWA icon, maskable icon, tab icon, RealFaviconGenerator.

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/Adamparishspok/skills/tree/HEAD/skills/favicon-setup

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation


name: favicon-setup description: Install a complete, lean favicon set on any website or web app — the five files modern browsers, iOS and Android actually use, one block of head markup added once in the root layout, and a check that every file resolves. Covers finding the public folder per framework, generating the set from one SVG (or from a RealFaviconGenerator package), dark-mode SVG icons, maskable manifest icons, cache busting and verification. Use when adding, replacing or auditing a favicon, app icon, apple-touch-icon or web manifest. Triggers on: favicon, favicon.ico, favicon.svg, apple-touch-icon, site.webmanifest, manifest.json, app icon, PWA icon, maskable icon, tab icon, RealFaviconGenerator. license: MIT

Favicon setup

Five files and five tags cover every current browser, iOS home screens and Android installs. More sizes (mstile-*, browserconfig.xml, 57/72/114px Apple icons, mask-icon) are legacy: skip them.

1. The set

FileSizeUsed by
favicon.svgvectorModern browser tabs. Scales sharply and can switch for dark mode.
favicon-96x96.png96×96Browsers without SVG favicon support, and Google search results.
favicon.ico16, 32, 48 in one fileLegacy browsers and tools that request /favicon.ico directly, without reading HTML.
apple-touch-icon.png180×180, opaqueiOS and iPadOS home screen.
web-app-manifest-192x192.png, web-app-manifest-512x512.png192, 512Android home screen, PWA install, splash screen.
site.webmanifest—Points Android at the two PNGs above.

2. Get the files

From a RealFaviconGenerator package. It gives a set of download URLs. Download every file into PUBLIC_FOLDER (see step 3) under its exact name:

base=https://realfavicongenerator.net/files/<package-id>
for f in favicon.svg favicon-96x96.png favicon.ico apple-touch-icon.png \
         web-app-manifest-192x192.png web-app-manifest-512x512.png site.webmanifest; do
  curl -fsSL "$base/$f" -o "PUBLIC_FOLDER/$f" || echo "FAILED: $f"
done

If a download fails, stop and report it. Don't ship a partial set. Report generator bugs at https://github.com/RealFaviconGenerator/realfavicongenerator/issues/new?template=ai_prompt_bug_report.yml.

From one source SVG (needs rsvg-convert and ImageMagick, or use the generator):

cp logo.svg PUBLIC_FOLDER/favicon.svg
rsvg-convert -w 96  -h 96  logo.svg -o PUBLIC_FOLDER/favicon-96x96.png
rsvg-convert -w 192 -h 192 logo.svg -o PUBLIC_FOLDER/web-app-manifest-192x192.png
rsvg-convert -w 512 -h 512 logo.svg -o PUBLIC_FOLDER/web-app-manifest-512x512.png
# iOS fills transparency with black: flatten onto the brand background, with ~10% padding
rsvg-convert -w 144 -h 144 logo.svg | magick - -background '#ffffff' -gravity center -extent 180x180 -flatten PUBLIC_FOLDER/apple-touch-icon.png
magick -background none logo.svg -define icon:auto-resize=48,32,16 PUBLIC_FOLDER/favicon.ico

3. Find PUBLIC_FOLDER

It is the folder served at the site root, so PUBLIC_FOLDER/favicon.ico loads at /favicon.ico.

StackFolder
Vite, Next.js, Create React App, Astro, Remix, Nuxt 3public/
SvelteKitstatic/
Angularpublic/ (v17+) or src/ with the file listed in angular.json assets
Hugo, Jekyll, Eleventystatic/, the site root, or the passthrough-copy folder
Plain HTMLNext to index.html

Next.js App Router: delete the default app/favicon.ico. It wins over public/favicon.ico and is usually the Next.js logo.

4. Add the markup once

Put this in the <head> of the one file that renders the root <html> tag. Never add it per page.

<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="shortcut icon" href="/favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
<link rel="manifest" href="/site.webmanifest" />
StackRoot file
Vite, CRA, plain HTMLindex.html
Next.js App Routerapp/layout.tsx, through the metadata export (below), not raw tags
Next.js Pages Routerpages/_document.tsx inside <Head>
AstroThe base layout, for example src/layouts/Layout.astro
SvelteKitsrc/app.html
Remix / React Router 7links export in app/root.tsx
Nuxtapp.head.link in nuxt.config.ts

Next.js App Router equivalent:

export const metadata = {
  icons: {
    icon: [
      { url: "/favicon-96x96.png", sizes: "96x96", type: "image/png" },
      { url: "/favicon.svg", type: "image/svg+xml" },
    ],
    shortcut: "/favicon.ico",
    apple: { url: "/apple-touch-icon.png", sizes: "180x180" },
  },
  manifest: "/site.webmanifest",
};

Before adding the markup, search the project for existing rel="icon", apple-touch-icon and manifest tags. Replace them; don't add a second set. If the site is served under a sub-path (base / basePath), prefix every href.

5. Optimise

  • SVG dark mode. A dark logo vanishes on a dark tab bar. Add a media query inside the SVG:
    <style>path{fill:#111}@media (prefers-color-scheme:dark){path{fill:#fff}}</style>
    
  • Small sizes. At 16px, drop fine detail and text. Use the logomark, not the wordmark.
  • SVG weight. Run npx svgo favicon.svg and keep the file under about 2 KB.
  • Manifest. Fill in name, short_name, theme_color and background_color. Make the 512 icon maskable: keep the mark inside the centre 80% safe zone, use a solid background, and set "purpose": "maskable" on it. If the mark doesn't fit the safe zone, add a separate maskable icon instead.
    {
      "name": "My App",
      "short_name": "App",
      "icons": [
        { "src": "/web-app-manifest-192x192.png", "sizes": "192x192", "type": "image/png", "purpose": "maskable" },
        { "src": "/web-app-manifest-512x512.png", "sizes": "512x512", "type": "image/png", "purpose": "maskable" }
      ],
      "theme_color": "#ffffff",
      "background_color": "#ffffff",
      "display": "standalone"
    }
    
  • Caching. Browsers cache favicons hard. When you replace an icon, either rename the files or add ?v=2 to every href and to the manifest src values.

6. Verify

  1. Every file returns 200 with the right type. Run this against the dev server:
    for f in favicon.svg favicon-96x96.png favicon.ico apple-touch-icon.png \
             web-app-manifest-192x192.png web-app-manifest-512x512.png site.webmanifest; do
      printf '%s ' "$f"; curl -s -o /dev/null -w '%{http_code} %{content_type}\n' "http://localhost:PORT/$f"
    done
    
  2. The rendered HTML holds exactly one set of tags: curl -s http://localhost:PORT/ | grep -cE 'rel="(icon|shortcut icon|apple-touch-icon|manifest)"' prints 5.
  3. In DevTools, open Application → Manifest: it shows no errors and both icons render.
  4. Open a hard-refreshed tab in light and dark mode and check the icon is visible in both.
  5. On a deployed URL, run the RealFaviconGenerator checker (https://realfavicongenerator.net/favicon-checker).

Individual skills in this repo

This repo contains 4 individual skills — each has its own dedicated page.

Adamparishspok/skills

Make a website, web app or online store ready for AI agents. Scan it with Cloudflare's Agent Readiness checks, decide which checks apply to this kind of site, ship the discovery files and headers in priority order, and add the AI-first basics the scanner does not score (server-rendered content, JSON-LD, llms.txt). Covers robots.txt AI rules, Content Signals, sitemap, Markdown for Agents (Accept text/markdown), Link headers, API catalog, OAuth discovery, auth.md, MCP server card, A2A agent card, agent skills index, WebMCP, and commerce protocols (ACP, UCP, AP2, MPP, x402). Use when making a site AI-ready, agent-ready or AI-first, or fixing an isitagentready.com or Cloudflare Agent Readiness report. Triggers on: AI ready, agent ready, AI-first, agent readiness, isitagentready, AI Crawl Control, Markdown for Agents, text/markdown, llms.txt, GPTBot, ClaudeBot, AI crawlers, Content-Signal, ai-train, api-catalog, .well-known, oauth-protected-resource, auth.md, MCP server card, agent card, agent skills, WebMCP, a...

Adamparishspok/skills

Give an interface one shared tempo and a small vocabulary of hover and state micro-interactions: duration tiers (tap/pop/hover/card/layout) for CSS and Motion, swap hand-offs, rows whose highlight grows in, trailing arrows, chevron nudges, card lifts without translate, scroll-edge fades, and icon/label swaps for copy and toggle buttons. Use when animations feel inconsistent, durations are scattered magic numbers, hovers only change colour, or a product feels flat or unfinished. Triggers on: animation duration, transition timing, hover state, micro-interaction, polish, copy button feedback, menu icon to close, back arrow, card hover, scroll fade, motion tokens, Framer Motion durations.

Adamparishspok/skills

Consolidate several apps or prototypes onto one shared component library without flattening their looks. Covers finding duplicated local components (buttons, selects, fields, modals, pagers, toasts), making shared components token-sized so each suite or app sets its own measurements, mapping variant names, deciding what stays app-specific, and the tailwind-merge traps that silently break custom tokens. Use when several apps each grew their own Btn/Select/Modal, when a design system's components "don't fit" a second product, or when retheming a family of apps. Triggers on: shared component library, design system consolidation, duplicate components, retheme, suite of apps, shadcn retokened, token-driven components, cn tailwind-merge custom tokens, variant mapping.

Adamparishspok/skills

Build or migrate a UI's neutral palette (grounds, surfaces, lines, ink/text) as an OKLCH formula driven by a few inputs instead of dozens of hand-picked hex values, with light and dark themes, per-step ladder overrides, a fit script that reproduces existing colours, and a browser contrast audit. Use when creating a theme, adding dark mode, retinting a product, auditing text contrast, or consolidating several apps' palettes. Triggers on: palette, neutrals, grey ramp, dark mode, theme tokens, oklch, retint, hue, contrast audit, design tokens, Tailwind @theme colours.

Related Skills