PHPackages                             ashallendesign/favicon-fetcher - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. ashallendesign/favicon-fetcher

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

ashallendesign/favicon-fetcher
==============================

A Laravel package for fetching website's favicons.

v3.11.0(2mo ago)190272.4k—2.6%133MITPHPPHP ^8.1CI failing

Since Apr 26Pushed 2mo ago1 watchersCompare

[ Source](https://github.com/ash-jc-allen/favicon-fetcher)[ Packagist](https://packagist.org/packages/ashallendesign/favicon-fetcher)[ Docs](https://github.com/ash-jc-allen/favicon-fetcher)[ GitHub Sponsors](https://github.com/ash-jc-allen)[ RSS](/packages/ashallendesign-favicon-fetcher/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (20)Versions (36)Used By (3)

[![Favicon Fetcher](/docs/logo.png)](/docs/logo.png)

[![Latest Version on Packagist](https://camo.githubusercontent.com/d3e1c175ea914ff27de81893e524d272a4941e77b06379bad01778e4c17c58f4/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f617368616c6c656e64657369676e2f66617669636f6e2d666574636865722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/ashallendesign/favicon-fetcher)[![Total Downloads](https://camo.githubusercontent.com/b834a3ae051461dd3eee0760275b02f2aacfe4ff8ba67af8f53d96ed7d3c8f88/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f617368616c6c656e64657369676e2f66617669636f6e2d666574636865722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/ashallendesign/favicon-fetcher)[![PHP from Packagist](https://camo.githubusercontent.com/fd18796b85eae7ec053ed9204d271401c7524d616eb233eec44edc839c28dce6/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f617368616c6c656e64657369676e2f66617669636f6e2d666574636865723f7374796c653d666c61742d737175617265)](https://packagist.org/packages/ashallendesign/favicon-fetcher)[![GitHub license](https://camo.githubusercontent.com/14ba6020396730bddeb4b3dfcebd6c35fd9647eb591789059caa85265e64206a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6173682d6a632d616c6c656e2f66617669636f6e2d666574636865723f7374796c653d666c61742d737175617265)](https://github.com/ash-jc-allen/favicon-fetcher/blob/master/LICENSE)

Table of Contents
-----------------

[](#table-of-contents)

- [Overview](#overview)
- [Installation](#installation)
    - [Requirements](#requirements)
    - [Install the Package](#install-the-package)
    - [Publish the Config](#publish-the-config)
- [Usage](#usage)
    - [Fetching Favicons](#fetching-favicons)
        - [Using the `fetch` Method](#using-the-fetch-method)
        - [Using the `fetchOr` Method](#using-the-fetchor-method)
        - [Using the `fetchAll` Method](#using-the-fetchall-method)
        - [Using the `fetchAllOr` Method](#using-the-fetchallor-method)
    - [Exceptions](#exceptions)
    - [Drivers](#drivers)
    - [Available Drivers](#available-drivers)
        - [How to Choose a Driver](#how-to-choose-a-driver)
    - [Choosing a Driver](#choosing-a-driver)
        - [Fallback Drivers](#fallback-drivers)
        - [Adding Your Own Driver](#adding-your-own-driver)
    - [HTTP Timeouts](#http-timeouts)
    - [TLS Verification](#tls-verification)
    - [HTTP User Agent](#http-user-agent)
    - [Storing Favicons](#storing-favicons)
        - [Using `store`](#using-store)
        - [Using `storeAs`](#using-storeas)
    - [Caching Favicons](#caching-favicons)
    - [Favicon Types](#favicon-types)
    - [Favicon Sizes](#favicon-sizes)
- [Testing](#testing)
- [Security](#security)
- [Contribution](#contribution)
- [Changelog](#changelog)
- [Upgrading](#upgrading)
- [Credits](#credits)
- [License](#license)

Overview
--------

[](#overview)

A Laravel package that can be used for fetching favicons from websites.

Installation
------------

[](#installation)

### Requirements

[](#requirements)

The package has been developed and tested to work with the following minimum requirements:

- PHP 8.0
- Laravel 8.0

### Install the Package

[](#install-the-package)

You can install the package via Composer:

```
composer require ashallendesign/favicon-fetcher
```

### Publish the Config

[](#publish-the-config)

You can then publish the package's config file by using the following command:

```
php artisan vendor:publish --provider="AshAllenDesign\FaviconFetcher\FaviconFetcherProvider"
```

Usage
-----

[](#usage)

### Fetching Favicons

[](#fetching-favicons)

Now that you have the package installed, you can start fetching the favicons from different websites.

#### Using the `fetch` Method

[](#using-the-fetch-method)

To fetch a favicon from a website, you can use the `fetch` method which will return an instance of `AshAllenDesign\FaviconFetcher\Favicon`:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::fetch('https://ashallendesign.co.uk');
```

#### Using the `fetchOr` Method

[](#using-the-fetchor-method)

If you'd like to provide a default value to be used if a favicon cannot be found, you can use the `fetchOr` method.

For example, if you wanted to use a default icon (`https://example.com/favicon.ico`) if a favicon could not be found, your code could look something like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::fetchOr('https://ashallendesign.co.uk', 'https://example.com/favicon.ico');
```

This method also accepts a `Closure` as the second argument if you'd prefer to run some custom logic. The `url` field passed as the first argument to the `fetchOr` method is available to use in the closure. For example, to use a closure, your code could look something like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::fetchOr('https://ashallendesign.co.uk', function ($url) {
    // Run extra logic here...

    return 'https://example.com/favicon.ico';
});
```

#### Using the `fetchAll` Method

[](#using-the-fetchall-method)

There may be times when you want to retrieve the different sized favicons for a given website. To get the different sized favicons, you can use the `fetchAll` method which will return an instance of `AshAllenDesign\FaviconFetcher\Collections\FaviconCollection`. This collection contains instances of `AshAllenDesign\FaviconFetcher\Favicon`. For example, to get all the favicons for a site, you can use the `fetchAll` method like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicons = Favicon::fetchAll('https://ashallendesign.co.uk');
```

The `FaviconCollection` class extends the `Illuminate\Support\Collection` class, so you can use all the methods available on the `Collection` class.

It also includes a `largest` method that you can use to get the favicon with the largest dimensions. It's worth noting that if the size of the favicon is unknown, it will be treated as if it has a size of `0x0px` when determining which is the largest. For example, you can use the `largest` method like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$largestFavicon = Favicon::fetchAll('https://ashallendesign.co.uk')->largest();
```

The `FaviconCollection` also provides a `largestByFileSize` method that you can use to get the favicon with the largest file size. You may want to do this if the package cannot detect the sizes of the icons for a given website, and so it can't detect the largest icon. This method works based on the assumption that the larger the file size, the larger the image dimensions. For example, you can use the `largestByFileSize` method like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$largestFavicon = Favicon::fetchAll('https://ashallendesign.co.uk')->largestByFileSize();
```

Note: Only the `http` driver supports retrieving all the favicons for a given website. For this reason, the `fetchAll` method does not support fallbacks. Support may be added for other drivers and fallbacks in the future.

#### Using the `fetchAllOr` Method

[](#using-the-fetchallor-method)

If you'd like to provide a default value to be used if all the favicons for a site cannot be found, you can use the `fetchAllOr` method.

For example, if you wanted to use a default icon (`https://example.com/favicon.ico`) if the favicons could not be found, your code could look something like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::fetchAllOr('https://ashallendesign.co.uk', 'https://example.com/favicon.ico');
```

This method also accepts a `Closure` as the second argument if you'd prefer to run some custom logic. The `url` field passed as the first argument to the `fetchAllOr` method is available to use in the closure. For example, to use a closure, your code could look something like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::fetchAllOr('https://ashallendesign.co.uk', function ($url) {
    // Run extra logic here...

    return 'https://example.com/favicon.ico';
});
```

### Exceptions

[](#exceptions)

By default, if a favicon can't be found for a URL, the `fetch` method will return `null`. However, if you'd prefer an exception to be thrown, you can use the `throw` method available on the `Favicon` facade. This means that if a favicon can't be found, an `AshAllenDesign\FaviconFetcher\Exceptions\FaviconNotFoundException` will be thrown.

To enable exceptions to be thrown, your code could look something like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::throw()->fetch('https://ashallendesign.co.uk');
```

If you attempt to fetch a favicon and the request times out or no website is found at the URL, an `AshAllenDesign\FaviconFetcher\Exceptions\ConnectionException` will be thrown. This will be thrown even if the `throw` method has not been used.

### Drivers

[](#drivers)

Favicon Fetcher provides the functionality to use different drivers for retrieving favicons from websites.

### Available Drivers

[](#available-drivers)

By default, Favicon Fetcher ships with 5 drivers out-the-box: `http`, `google-shared-stuff`, `favicon-kit`, `unavatar`, `favicon-grabber`, `duck-duck-go`.

The `http` driver fetches favicons by attempting to parse "icon" and "shortcut icon" link elements from the returned HTML of a webpage. If it can't find one, it will attempt to guess the URL of the favicon based on common defaults.

The `google-shared-stuff` driver fetches favicons using the [Google Shared Stuff](https://google.com) API.

The `favicon-kit` driver fetches favicons using the [Favicon Kit](https://faviconkit.com) API.

The `unavatar` driver fetches favicons using the [Unavatar](https://unavatar.io) API.

The `favicon-grabber` driver fetches favicons using the [Favicon Grabber](https://favicongrabber.com) API.

The `duck-duck-go` driver fetches favicons using the [DuckDuckGo Icons](https://duckduckgo.com) API.

#### How to Choose a Driver

[](#how-to-choose-a-driver)

It's important to remember that the `google-shared-stuff`, `favicon-kit`, `unavatar`, `favicon-grabber`, and `duck-duck-go` drivers interact with third-party APIs to retrieve the favicons. So, this means that some data will be shared to external services.

However, the `http` driver does not use any external services and directly queries the website that you are trying to fetch the favicon for. Due to the fact that this package is new, it is likely that the `http` driver may not be 100% accurate when trying to fetch favicons from websites. So, theoretically, the `http` driver should provide you with better privacy, but may not be as accurate as the other drivers.

### Choosing a Driver

[](#choosing-a-driver)

You can select which driver to use by default by changing the `default` field in the `favicon-fetcher` config file after you've published it. The package originally ships with the `http` driver enabled as the default driver.

For example, if you wanted to change your default driver to `favicon-kit`, you could update your `favicon-fetcher` config like so:

```
return [

    // ...

    'default' => 'favicon-kit',

    // ...

]
```

If you'd like to set the driver on-the-fly, you can do so by using the `driver` method on the `Favicon` facade. For example, if you wanted to use the `google-shared-stuff` driver, you could do so like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::driver('google-shared-stuff')->fetch('https://ashallendesign.co.uk');
```

#### Fallback Drivers

[](#fallback-drivers)

There may be times when a particular driver cannot find a favicon for a website. If this happens, you can fall back and attempt to find it again using a different driver.

For example, if we wanted to try and fetch the favicon using the `http` driver and then fall back to the `google-shared-stuff` driver if we can't find it, your code could look something like this:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::withFallback('google-shared-stuff')->fetch('https://ashallendesign.co.uk');
```

#### Adding Your Own Driver

[](#adding-your-own-driver)

There might be times when you want to provide your own custom logic for fetching favicons. To do this, you can build your driver and register it with the package for using.

First, you'll need to create your own class and make sure that it implements the `AshAllenDesign\FaviconFetcher\Contracts\Fetcher` interface. For example, your class could like this:

```
use AshAllenDesign\FaviconFetcher\Contracts\Fetcher;
use AshAllenDesign\FaviconFetcher\Favicon;

class MyCustomDriver implements Fetcher
{
    public function fetch(string $url): ?Favicon
    {
        // Add logic here that attempts to fetch a favicon...
    }

    public function fetchOr(string $url, mixed $default): mixed
    {
        // Add logic here that attempts to fetch a favicon or return a default...
    }
}
```

After you've created your new driver, you'll be able to register it with the package using the `extend` method available through the `Favicon` facade. You may want to do this in a service provider so that it is set up and available in the rest of your application.

You can register your custom driver like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

Favicon::extend('my-custom-driver', new MyCustomDriver());
```

Now that you've registered your custom driver, you'll be able to use it for fetching favicons like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::driver('my-custom-driver')->fetch('https://ashallendesign.co.uk');
```

### HTTP Timeouts

[](#http-timeouts)

Favicon Fetcher provides the ability for you to set the connection timeout and request timeout for all the drivers.

The connection timeout is the time that the package will wait for a connection to be made to the website. The request timeout is the time that the package will wait for the website to respond to the request.

To do this, you can update the `connect_timeout` and `timeout` fields in the `favicon-fetcher.php` config file after you've published it. For example, to set the connection timeout to 5 seconds and the request timeout to 10 seconds, you could update your config file like so:

```
return [

    // ...

    'connect_timeout' => 5,

    'timeout' => 10,

    // ...

]
```

If you'd prefer that no timeout be set, you can set the values to `0`.

Please note that these timeouts are applied to all HTTP requests that Favicon Fetcher makes, regardless of the driver that is being used.

### TLS Verification

[](#tls-verification)

Favicon Fetcher uses TLS verification by default, but this can be disabled. This can be useful in development environments or situations where you might be working with self-signed certificates or certificates from an untrusted certificate authority.

You can disable the verification by updating the `verify_tls` field in the `favicon-fetcher.php` config file after you've published it.

```
return [

    // ...

    'verify_tls' => false,

    // ...

]
```

Or by updating your `.env` file:

```
FAVICON_FETCHER_VERIFY_TLS=false
```

### HTTP User Agent

[](#http-user-agent)

You may find that your requests are sometimes blocked by websites when trying to retrieve a favicon. This may be due to the fact that the default Guzzle `User-Agent` header is passed in the requests.

Favicon Fetcher allows you to set the `User-Agent` header that is used in the package's requests. To do this, you can update the `user_agent` field in the `favicon-fetcher.php` config file after you've published it. For example, to set the `User-Agent` header to `My Custom User Agent`, you could update your config file like so:

```
return [

    // ...

    'user_agent' => 'My Custom User Agent',

    // ...

]
```

The `User-Agent` header will be set on all HTTP requests that Favicon Fetcher makes, regardless of the driver that is being used.

The `user_agent` config field is already configured in the config file to read directly from a `FAVICON_FETCHER_USER_AGENT` field in your `.env` file. So, if you'd prefer to set the `User-Agent` header in your `.env` file, you could do so like this:

```
FAVICON_FETCHER_USER_AGENT="My Custom User Agent"
```

### Storing Favicons

[](#storing-favicons)

After fetching favicons, you might want to store them in your filesystem so that you don't need to fetch them again in the future. Favicon Fetcher provides two methods that you can use for storing the favicons: `store` and `storeAs`.

#### Using `store`

[](#using-store)

If you use the `store` method, a filename will automatically be generated for the favicon before storing. The method's first parameter accepts a string and is the directory that the favicon will be stored in. You can store a favicon using your default filesystem disk like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconPath = Favicon::fetch('https://ashallendesign.co.uk')->store('favicons');

// $faviconPath is now equal to: "/favicons/abc-123.ico"
```

If you'd like to use a different storage disk, you can pass it as an optional second argument to the `store` method. For example, to store the favicon on S3, your code use the following:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconPath = Favicon::fetch('https://ashallendesign.co.uk')->store('favicons', 's3');

// $faviconPath is now equal to: "/favicons/abc-123.ico"
```

#### Using `storeAs`

[](#using-storeas)

If you use the `storeAs` method, you will be able to define the filename that the file will be stored as. The method's first parameter accepts a string and is the directory that the favicon will be stored in. The second parameter specifies the favicon filename (excluding the file extension). You can store a favicon using your default filesystem disk like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconPath = Favicon::fetch('https://ashallendesign.co.uk')->storeAs('favicons', 'ashallendesign');

// $faviconPath is now equal to: "/favicons/ashallendesign.ico"
```

If you'd like to use a different storage disk, you can pass it as an optional third argument to the `storeAs` method. For example, to store the favicon on S3, your code use the following:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconPath = Favicon::fetch('https://ashallendesign.co.uk')->storeAs('favicons', 'ashallendesign', 's3');

// $faviconPath is now equal to: "/favicons/ashallendesign.ico"
```

### Caching Favicons

[](#caching-favicons)

As well as being able to store favicons, the package also allows you to cache the favicon URLs. This can be extremely useful if you don't want to store a local copy of the file and want to use the external version of the favicon that the website uses.

As a basic example, if you have a page displaying 50 websites and their favicons, we would need to find the favicon's URL on each page load. As can imagine, this would drastically increase the page load time. So, by retrieving the URLs from the cache, it would majorly improve up the page speed.

To cache a favicon, you can use the `cache` method available on the `Favicon` class. The first parameter accepts a `Carbon\CarbonInterface` as the cache lifetime. For example, to cache the favicon URL of `https://ashallendesign.co.uk` for 1 day, your code might look something like:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::fetch('https://ashallendesign.co.uk')->cache(now()->addDay());
```

By default, the package will always try and resolve the favicon from the cache before attempting to retrieve a fresh version. However, if you want to disable the cache and always retrieve a fresh version, you can use the `useCache` method like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$favicon = Favicon::useCache(false)->fetch('https://ashallendesign.co.uk');
```

The package uses `favicon-fetcher` as a prefix for all the cache keys. If you'd like to change this, you can do so by changing the `cache.prefix` field in the `favicon-fethcher` config file. For example, to change the prefix to `my-awesome-prefix`, you could update your config file like so:

```
return [

    // ...

    'cache' => [
        'prefix' => 'my-awesome-prefix',
    ]

    // ...

]
```

The package also provides the functionality for you to cache collections of favicons that have been retrieved using the `fetchAll` method. You can do this by calling the `cache` method on the `FaviconCollection` class like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconCollection = Favicon::fetchAll('https://ashallendesign.co.uk')->cache(now()->addDay());
```

### Favicon Types

[](#favicon-types)

When attempting to retrieve favicons using the `http` driver, we may be able to determine the favicons' type (such as `icon`, `shortcut icon`, or `apple-touch-icon`). To get the type of the favicon, you can use the `getIconType` method like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconPath = Favicon::fetch('https://ashallendesign.co.uk')->getIconType();
```

This method can return one of four constants defined on the `Favicon` class: `TYPE_ICON`, `TYPE_SHORTCUT_ICON`, `TYPE_APPLE_TOUCH_ICON`, and `TYPE_ICON_UNKNOWN`.

You can make use of these constants for things like filtering. For example, if you wanted to get all the icons except the `apple-touch-icon`, you could do the following:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconCollection = Favicon::fetchAll('https://ashallendesign.co.uk');

$faviconCollection->filter(function ($favicon) {
    return $favicon->getIconType() !== Favicon::TYPE_APPLE_TOUCH_ICON;
});
```

### Favicon Sizes

[](#favicon-sizes)

When attempting to retrieve favicons using the `http` driver, we may be able to determine the favicons' sizes. To get the size of the favicon, you can use the `getIconSize` method like so:

```
use AshAllenDesign\FaviconFetcher\Facades\Favicon;

$faviconSize = Favicon::fetch('https://ashallendesign.co.uk')->getIconSize();
```

It's assumed that the icons are square, so only a single integer will be returned. For example, if a favicon is 16x16px, then the `getIconSize` method will return `16`. If the size is unknown, `null` will be returned.

Testing
-------

[](#testing)

To run the package's unit tests, run the following command:

```
composer test
```

To run Larastan for the package, run the following command:

```
composer larastan
```

Security
--------

[](#security)

If you find any security related issues, please contact me directly at  to report it.

Contribution
------------

[](#contribution)

If you wish to make any changes or improvements to the package, feel free to make a pull request.

To contribute to this package, please use the following guidelines before submitting your pull request:

- Write tests for any new functions that are added. If you are updating existing code, make sure that the existing tests pass and write more if needed.
- Follow [PSR-12](https://www.php-fig.org/psr/psr-12/) coding standards.
- Make all pull requests to the `master` branch.

Changelog
---------

[](#changelog)

Check the [CHANGELOG](CHANGELOG.md) to get more information about the latest changes.

Upgrading
---------

[](#upgrading)

Check the [UPGRADE](UPGRADE.md) guide to get more information on how to update this library to newer versions.

Credits
-------

[](#credits)

- [Ash Allen](https://ashallendesign.co.uk)
- [Jess Pickup](https://jesspickup.co.uk) (Logo)
- [All Contributors](https://github.com/ash-jc-allen/short-url/graphs/contributors)

License
-------

[](#license)

The MIT License (MIT). Please see [License File](LICENSE.md) for more information.

Support Me
----------

[](#support-me)

If you've found this package useful, please consider buying a copy of [Battle Ready Laravel](https://battle-ready-laravel.com) to support me and my work.

Every sale makes a huge difference to me and allows me to spend more time working on open-source projects and tutorials.

To say a huge thanks, you can use the code **BATTLE20** to get a 20% discount on the book.

[👉 Get Your Copy!](https://battle-ready-laravel.com)

[![Battle Ready Laravel](https://camo.githubusercontent.com/20876b9d7d30882812a8e9da128da0966cc0b72473fb9ed6b2941294475bbcb0/68747470733a2f2f617368616c6c656e64657369676e2e636f2e756b2f696d616765732f637573746f6d2f73706f6e736f72732f626174746c652d72656164792d6c61726176656c2d686f72697a6f6e74616c2d62616e6e65722e706e67)](https://battle-ready-laravel.com)

###  Health Score

62

—

FairBetter than 99% of packages

Maintenance86

Actively maintained with recent releases

Popularity52

Moderate usage in the ecosystem

Community25

Small or concentrated contributor base

Maturity69

Established project with proven stability

 Bus Factor1

Top contributor holds 88.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~67 days

Recently: every ~116 days

Total

22

Last Release

66d ago

Major Versions

v1.3.0 → v2.0.02023-03-23

v2.0.0 → v3.0.02023-09-04

PHP version history (2 changes)v1.0.0PHP ^8.0

v3.0.0PHP ^8.1

### Community

Maintainers

![](https://www.gravatar.com/avatar/b3920670b9243211cc80d219d943d782bd3ecae81b81c524e03538c0f094f392?d=identicon)[ashallendesign](/maintainers/ashallendesign)

---

Top Contributors

[![ash-jc-allen](https://avatars.githubusercontent.com/u/39652331?v=4)](https://github.com/ash-jc-allen "ash-jc-allen (240 commits)")[![StyleCIBot](https://avatars.githubusercontent.com/u/11048387?v=4)](https://github.com/StyleCIBot "StyleCIBot (13 commits)")[![laravel-shift](https://avatars.githubusercontent.com/u/15991828?v=4)](https://github.com/laravel-shift "laravel-shift (5 commits)")[![marispro](https://avatars.githubusercontent.com/u/5610414?v=4)](https://github.com/marispro "marispro (3 commits)")[![StyxOfDynamite](https://avatars.githubusercontent.com/u/946550?v=4)](https://github.com/StyxOfDynamite "StyxOfDynamite (2 commits)")[![mhoffmann-app](https://avatars.githubusercontent.com/u/62064486?v=4)](https://github.com/mhoffmann-app "mhoffmann-app (2 commits)")[![mikescito](https://avatars.githubusercontent.com/u/172016852?v=4)](https://github.com/mikescito "mikescito (1 commits)")[![moebrowne](https://avatars.githubusercontent.com/u/8448512?v=4)](https://github.com/moebrowne "moebrowne (1 commits)")[![philipsorensen](https://avatars.githubusercontent.com/u/5397535?v=4)](https://github.com/philipsorensen "philipsorensen (1 commits)")[![joedixon](https://avatars.githubusercontent.com/u/3438564?v=4)](https://github.com/joedixon "joedixon (1 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (1 commits)")

---

Tags

hacktoberfestlaravelphpfaviconiconashallendesignfavicon-fetcher

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

### Embed Badge

![Health badge](/badges/ashallendesign-favicon-fetcher/health.svg)

```
[![Health](https://phpackages.com/badges/ashallendesign-favicon-fetcher/health.svg)](https://phpackages.com/packages/ashallendesign-favicon-fetcher)
```

###  Alternatives

[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)[roots/acorn

Framework for Roots WordPress projects built with Laravel components.

9682.1M97](/packages/roots-acorn)[ashallendesign/short-url

A Laravel package for creating shortened URLs for your web apps.

1.4k1.9M4](/packages/ashallendesign-short-url)[omniphx/forrest

A Laravel library for Salesforce

2724.4M8](/packages/omniphx-forrest)[flarum/core

Delightfully simple forum software.

211.3M1.9k](/packages/flarum-core)[ashallendesign/laravel-exchange-rates

A wrapper package for interacting with the exchangeratesapi.io API.

485677.8k](/packages/ashallendesign-laravel-exchange-rates)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
