First CH Apps / Favicon Checker
Check a site's favicon from its URL: we fetch every favicon.ico, link rel=icon, apple-touch-icon and manifest icon and report its real format and size (e.g.
Enter a URL and we collect every icon the page declares (favicon.ico, link rel=icon, apple-touch-icon and the Web App Manifest icons), then fetch each one to confirm its real format, dimensions and weight. For ICO files we read every size packed inside.
Generating icons is the job of the favicon generator on First CH Tools (fully in-browser). Browsers cannot fetch another site's URL directly (CORS), so this server-side app takes over the checking half.
Need to generate icons? Favicon generator (tools.first-ch.com, in-browser)A website does not need one favicon but a small set, one for each place the icon appears. The table lists the favicon size and format this checker expects for each, which are the same rules behind the OK / Review / Missing findings in each report.
A favicon.ico can pack several sizes, and we read every size inside it. Keep a /favicon.ico at the site root even when you declare other icons: feed readers and some crawlers only look there.
| Where it appears | Declared with | Size and format we check for |
|---|---|---|
| Browser tab | /favicon.ico or <link rel="icon"> | 32×32 or larger (smaller icons look blurry on high-DPI screens). An SVG icon (type="image/svg+xml") stays sharp at any size |
| iOS Home Screen | <link rel="apple-touch-icon"> | 180×180 PNG. iOS does not render an SVG here, and without one it uses a screenshot of the page |
| Android Home Screen / PWA install | Web App Manifest icons[] | 192×192 and 512×512, plus one icon with purpose="maskable" so adaptive icons do not crop the edges |
| Every icon | — | Real pixels match the sizes attribute, under 100KB each, served over https:// |
Sent: only the URL you type. Our server (Cloudflare Workers) fetches that URL as a public page, then fetches the icons it declares (up to 12) and the manifest.
Stored: nothing. The check lives entirely inside one request and writes neither the URL nor the result to any database (no KV, no D1). It leaves memory when the request ends.
Returned: the declarations we found (rel, sizes, type) plus whether each icon loaded, its format, real dimensions and weight. We never re-serve the fetched HTML, manifest or images (preview images are loaded by your browser directly from the source site).
Note: public GET only. URLs pointing at internal networks, localhost or private IPs are rejected, and pages behind a login cannot be checked.
POST /favicon-check/api/inspect with JSON ({"url": "https://example.com/"}) or a form body and you get the same report back as JSON.
Browsers cache favicons aggressively. Right after replacing one, verify with a changed filename or a hard reload.