Skip to main content

Website Favicon and App Icon Checker

Inspect all favicon variants, Apple touch icons, and PWA web app manifest assets configured on any URL.

Additional Information (https://hrekov.com)

Theme Color: #25c2a0

Web App Manifest: https://hrekov.com/manifest.json

Found icons: 2

icon preview
Relationicon
Sizes32x32
Typeimage/x-icon
↗
apple-touch-icon preview
Relationapple-touch-icon
Sizes180x180
Typeimage/png
↗

Technical Architecture: Reverse-Engineering Multi-Platform Icon Detection​

Modern web applications must supply distinct icon assets tailored for desktop browser tabs, iOS home screen shortcuts, Android Progressive Web App (PWA) launcher matrices, and dark mode themes.

Because direct browser requests are blocked by CORS restrictions, the Icon Checker queries a serverless proxy endpoint (/api/fetchFavicon) to parse HTML link elements and fetch remote web app manifests.


The backend parses the remote document using Cheerio, querying standard and vendor-specific <link> rel attributes:

// api/fetchFavicon.js (extract)
const cheerio = require('cheerio');

module.exports = async (req, res) => {
const { url } = req.query;
const targetUrl = new URL(url);
const origin = targetUrl.origin;

const response = await fetch(targetUrl.href, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) IconChecker/1.0'
}
});

const html = await response.text();
const $ = cheerio.load(html);
const icons = [];

// Query DOM for standard and mobile icon declarations
$('link[rel="icon"], link[rel="shortcut icon"], link[rel="apple-touch-icon"], link[rel="mask-icon"]').each((_, el) => {
const href = $(el).attr('href');
const rel = $(el).attr('rel');
const sizes = $(el).attr('sizes') || 'any';
const type = $(el).attr('type') || '';

if (href) {
try {
const absoluteUrl = new URL(href, targetUrl.href).href;
icons.push({ url: absoluteUrl, rel, sizes, type });
} catch (e) {
// Ignore invalid URL strings
}
}
});

// Always check default root fallback if no favicon was discovered in HTML
if (!icons.some(i => i.rel.includes('icon'))) {
icons.push({ url: `${origin}/favicon.ico`, rel: 'icon (default fallback)', sizes: '32x32', type: 'image/x-icon' });
}

// ...
};

2. PWA Web App Manifest Parsing​

If a <link rel="manifest" href="..."> tag is discovered, the serverless function fetches the JSON payload and inspects the icons array for high-resolution Progressive Web App icons:

async function parseManifestIcons(manifestUrl, icons) {
try {
const res = await fetch(manifestUrl);
if (!res.ok) return;
const manifest = await res.json();

if (Array.isArray(manifest.icons)) {
for (const icon of manifest.icons) {
icons.push({
url: new URL(icon.src, manifestUrl).href,
rel: `manifest (${icon.purpose || 'any'})`,
sizes: icon.sizes || 'any',
type: icon.type || 'image/png'
});
}
}
} catch (err) {
// Graceful fallback if manifest is inaccessible
}
}

3. Modern Cross-Platform Icon Specifications​

Icon TypeTarget Size (px)MIME Type / FormatPurpose & Platform
Legacy Favicon32 &times; 32image/x-icon (.ico)Legacy desktop browsers, IE/Edge fallback
Modern VectorScalableimage/svg+xmlModern Chrome/Firefox; dark & light theme auto-switch
Apple Touch Icon180 &times; 180image/pngiOS Safari "Add to Home Screen" launcher icon
PWA Standard192 &times; 192image/pngAndroid Chrome homescreen app icon
PWA Splash / High-DPI512 &times; 512image/pngPWA splash screens and app store installation listings
Maskable Icon512 &times; 512image/png (purpose: maskable)Adaptive safe-zone icons cropped into circle/squircle by Android

4. Client-Side Security & Proxy Data Guarantee​

  • Ephemeral Inspection: All network calls execute in stateless Vercel edge containers.
  • No Cache Retention: Remote icons are inspected for HTTP header headers (Content-Type, Content-Length) and returned without disk caching.
  • SSRF Shield: Blocks probes targeting private subnets (10.0.0.0/8, 192.168.0.0/16, 127.0.0.1).

Get notified about updates to this tool

No spam. Just high-quality updates about new features and guides.