Skip to content

Discover Favicons

Feedscout can discover favicon URLs from webpages and feeds. Favicons are site icons used in browser tabs, bookmarks, and feed readers.

Basic Usage

typescript
import { discoverFavicons } from 'feedscout'

const favicons = await discoverFavicons('https://example.com')

Each result contains the favicon URL and validation status:

typescript
{
  url: 'https://example.com/apple-touch-icon.png',
  isValid: true,
  method: 'html',
}

By default, all discovery methods are used (platform, feed, html, headers, guess). You can customize which methods to use:

typescript
const favicons = await discoverFavicons('https://example.com', {
  methods: ['html', 'headers', 'guess'],
})

Discovery Methods

Favicons use the same discovery pipeline as feeds — see the Feeds section for details on how each method works.

MethodWhat It Looks For
PlatformAvatars/icons from known platforms (GitHub, Mastodon, Bluesky, etc.)
Feed<icon> in Atom feeds, favicon/icon in JSON Feeds
HTML<link> tags with rel="icon", rel="shortcut", rel="apple-touch-icon"
HeadersLink headers with icon-related rel values
GuessCommon paths like /favicon.ico, /apple-touch-icon.png

Supported Platforms

The Platform method extracts avatars and icons directly from known platforms using their public APIs or URL conventions:

PlatformWhat It ExtractsMethod
GitHubUser avatarURL pattern
GitHub GistUser avatarURL pattern
GitLabUser or group avatarPublic API
MastodonProfile avatarPublic API
BlueskyProfile avatarPublic API
RedditSubreddit icon or user avatarPublic API
TumblrBlog avatarURL pattern
CodebergUser avatarURL pattern
LobstersUser avatarURL pattern
SourceForgeProject iconURL pattern
DeviantArtUser avatarURL pattern
Dev.toProfile imagePublic API

Extracting Icons from Feeds

When given a feed URL, favicon discovery can extract icons directly from the feed content. Atom feeds provide an <icon> element, and JSON Feeds include favicon and icon fields:

typescript
// Pass a feed URL to extract its icon
const favicons = await discoverFavicons('https://example.com/feed.xml')

// Or provide existing feed content
const favicons = await discoverFavicons({
  url: 'https://example.com/feed.json',
  content: feedContent,
})

Configuration

Customize discovery the same way as feeds:

typescript
const favicons = await discoverFavicons(url, {
  methods: {
    html: true,
    guess: {
      uris: ['/favicon.ico', '/icon.svg'],
    },
  },
})

Default Guess Paths

typescript
import { defaultGuessPaths } from 'feedscout/favicons'

// [
//   '/favicon.ico',
//   '/apple-touch-icon.png',
//   '/apple-touch-icon-precomposed.png',
//   '/favicon.png',
//   '/favicon.svg',
// ]

Favicon discovery looks for these rel values in HTML <link> tags and HTTP Link headers:

typescript
import { defaultIconRels, linkSelectors } from 'feedscout/favicons'

// ['icon', 'shortcut', 'apple-touch-icon', 'apple-touch-icon-precomposed']