A modern, efficient PHP library and CLI tool to generate a complete favicon set from a single SVG or PNG source.
It follows the modern best practices (2025) to generate a minimal yet robust set of icons for all browsers and devices.
- Minimal Output: Generates only the necessary files to cover all modern use cases.
- SVG Support: Preserves your vector logo for modern browsers (
icon.svg). - Legacy Support: Generates a 32x32
favicon.icofor older browsers. - Mobile Ready: Generates
apple-touch-icon.pngand Android icons (icon-192.png,icon-512.png). - PWA Ready: Automatically generates a
manifest.webmanifest. - Search Friendly: Optionally generates a 48x48 PNG for Google Search results.
- HTML Snippet: Outputs the exact HTML tags you need to include in your
<head>. - Flexible Rasterization: Supports multiple adapters for image processing:
- SVG:
rsvg-convert,inkscape, orimagemagick(CLI) - PNG:
ext-imagickorext-gd
- SVG:
- PHP 8.3 or higher
- For PNG processing:
ext-imagick(recommended) ORext-gd - For SVG input, one of the following must be installed on your system:
rsvg-convert(part oflibrsvg, recommended)inkscapeimagemagick(magickorconvert)
composer require alto/faviconRun the tool using the binary:
vendor/bin/favicon path/to/logo.svgYou can use the FaviconGenerator class directly in your PHP application (e.g., in a CMS, build script, or controller).
use Alto\Favicon\Generator\FaviconGenerator;
use Alto\Favicon\Options\FaviconOptionsBuilder;
// 1. Configure options
$options = (new FaviconOptionsBuilder(
inputFile: 'assets/logo.svg',
outputDir: 'public/favicons'
))
->publicPath('/favicons')
->appName('My App')
->themeColor('#0b0b0b')
->build();
// 2. Generate
$generator = new FaviconGenerator();
$report = $generator->generate($options);
// 3. Use the result
echo "Generated " . count($report->files) . " files.\n";
echo "HTML Snippet:\n" . $report->htmlSnippet;| Method | Description | Default |
|---|---|---|
__construct(string $inputFile, string $outputDir) |
Initialize with input file and output directory. | - |
publicPath(string $path) |
Set the public URL prefix for generated files. | / |
appName(string $name) |
Set the application name for the manifest. | App |
themeColor(string $color) |
Set the theme color (meta tag & manifest). | #0b0b0b |
backgroundColor(string $color) |
Set the background color (manifest). | #ffffff |
generateManifest(bool $generate) |
Enable/disable manifest generation. | false |
generateSearchPng48(bool $generate) |
Enable/disable 48x48 PNG generation. | false |
force(bool $force) |
Enable/disable overwriting existing files. | false |
build(): FaviconOptions |
Build the options object. | - |
The generate() method returns a GenerationReport object with the following properties:
outputDir(string): The directory where files were written.publicPath(string): The public URL prefix used.files(array<string, int>): Map of generated filenames to their size in bytes.htmlSnippet(string): The HTML tags to include in your<head>.manifestFile(?string): The name of the manifest file (if generated).totalBytes()(int): Helper method to get total size of generated files.
| Option | Description | Default |
|---|---|---|
--output, -o |
Output directory for generated files | public |
--public-path |
Public path prefix used in HTML/manifest | / |
--app-name |
Application name used in the manifest | App |
--theme-color |
Theme color for browser UI and manifest | #0b0b0b |
--background-color |
Background color for the manifest | #ffffff |
--manifest |
Generate manifest.webmanifest and Android icons |
false |
--search-png |
Generate the 48x48 PNG favicon | false |
--force, -f |
Overwrite existing files | false |
Basic usage (Minimal set):
vendor/bin/favicon assets/logo.svgFull set with Manifest and Search Icon:
vendor/bin/favicon assets/logo.svg --manifest --search-pngCustomizing output and colors:
vendor/bin/favicon assets/logo.svg \
--output public/assets/favicons \
--public-path /assets/favicons \
--app-name "My Awesome App" \
--theme-color "#3b82f6"Using a PNG source (if you don't have SVG):
vendor/bin/favicon assets/logo.pngNote: When using PNG input, icon.svg will not be generated, and 16x16/32x32 PNGs will be used as fallbacks.
The tool generates the following structure in your output directory:
favicon.ico(Legacy support)icon.svg(Modern browsers)apple-touch-icon.png(iOS)favicon.html(HTML snippet to include)
Optional files (with --manifest and --search-png):
icon-192.png(Android)icon-512.png(Android)icon-maskable.png(Android maskable icon)manifest.webmanifest(Web App Manifest)favicon-48x48.png(Google Search)
To run the test suite:
composer testThis project is licensed under the MIT License.