Generate PNG icons from SVG for iOS and PWA compatibility. A modern, flexible Node.js tool that converts your SVG favicon into all the icon sizes you need for mobile devices and progressive web apps.
- 🎨 Convert SVG to multiple PNG icon sizes
- 📱 iOS Apple Touch Icon support
- 🌐 PWA icon generation
- 🖼️ Automatic favicon size generation (16x16, 32x32)
- ⚙️ Configurable quality and compression
- 🎯 CLI with interactive mode
- 📦 ESM module for programmatic use
- ✅ Comprehensive test coverage
- 🚀 Built with modern Node.js (v20+)
# Using pnpm (recommended)
pnpm add @profullstack/favicon-generator
# Using npm
npm install @profullstack/favicon-generator
# Using yarn
yarn add @profullstack/favicon-generator# Using pnpm
pnpm add -g @profullstack/favicon-generator
# Using npm
npm install -g @profullstack/favicon-generatorSimply run the command without arguments to enter interactive mode:
favYou'll be prompted for:
- SVG file path
- Output directory
- PNG quality (1-100)
- Compression level (0-9)
- Whether to generate additional favicon sizes
# Basic usage
fav -i favicon.svg -o ./icons
# With custom quality and compression
fav -i logo.svg -o ./public/icons -q 90 -c 7
# Silent mode (no output)
fav -i favicon.svg -o ./icons --silent
# Skip favicon generation
fav -i favicon.svg -o ./icons --no-favicon
# Show help
fav --help
# Show version
fav --version| Option | Alias | Description | Default |
|---|---|---|---|
--input |
-i |
Path to SVG file | ./favicon.svg |
--output |
-o |
Output directory | ./icons |
--quality |
-q |
PNG quality (1-100) | 95 |
--compression |
-c |
Compression level (0-9) | 9 |
--no-favicon |
Skip additional favicon sizes | false |
|
--silent |
Suppress output messages | false |
|
--help |
-h |
Show help message | |
--version |
-v |
Show version number |
import { generateIcons } from '@profullstack/favicon-generator';
const results = await generateIcons({
svgPath: './favicon.svg',
outputDir: './icons',
});
console.log(`Generated ${results.icons.length} icons`);import { generateIcons } from '@profullstack/favicon-generator';
const results = await generateIcons({
svgPath: './logo.svg',
outputDir: './public/icons',
quality: 90,
compressionLevel: 7,
generateFavicon: true,
faviconSizes: [16, 32, 48],
verbose: true,
});
// Access generated files
results.icons.forEach((icon) => {
console.log(`${icon.name}: ${icon.path}`);
});import { generateCustomIcons } from '@profullstack/favicon-generator';
const customSizes = [
{ size: 48, name: 'icon-48.png' },
{ size: 96, name: 'icon-96.png' },
{ size: 144, name: 'icon-144.png' },
];
const results = await generateCustomIcons('./favicon.svg', './icons', customSizes, { quality: 95 });import { generateIcons, DEFAULT_ICON_SIZES, BACKGROUNDS } from '@profullstack/favicon-generator';
// Use default icon sizes
const results = await generateIcons({
svgPath: './favicon.svg',
outputDir: './icons',
iconSizes: DEFAULT_ICON_SIZES,
});
// Available background colors
console.log(BACKGROUNDS.transparent); // { r: 255, g: 255, b: 255, alpha: 0 }
console.log(BACKGROUNDS.white); // { r: 255, g: 255, b: 255, alpha: 1 }
console.log(BACKGROUNDS.black); // { r: 0, g: 0, b: 0, alpha: 1 }Generate PNG icons from an SVG file.
Parameters:
options(Object):svgPath(string, required): Path to the SVG fileoutputDir(string, required): Output directory for generated iconsiconSizes(Array, optional): Array of{size, name}objects. Defaults toDEFAULT_ICON_SIZESquality(number, optional): PNG quality (1-100). Default:95compressionLevel(number, optional): Compression level (0-9). Default:9generateFavicon(boolean, optional): Generate additional favicon sizes. Default:truefaviconSizes(Array, optional): Array of favicon sizes. Default:[16, 32]verbose(boolean, optional): Enable verbose logging. Default:true
Returns: Promise
{
icons: [
{ size: 64, name: 'icon-64.png', path: './icons/icon-64.png' },
// ...
],
faviconSizes: [
{ size: 16, path: './icons/favicon-16.png' },
// ...
],
outputDir: './icons'
}Generate icons with custom sizes.
Parameters:
svgPath(string): Path to the SVG fileoutputDir(string): Output directorycustomSizes(Array): Array of{size, name}objectsadditionalOptions(Object, optional): Additional options (quality, compressionLevel, etc.)
Returns: Promise (same as generateIcons)
The package generates the following icon sizes by default:
- 57x57, 60x60, 72x72, 76x76
- 114x114, 120x120, 144x144
- 152x152, 180x180
- 192x192, 256x256, 384x384, 512x512
- 16x16, 32x32
After generating your icons, add them to your HTML <head> section. See the complete example in examples/html-head-template.html.
<head>
<!-- Favicon -->
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<link rel="icon" type="image/png" sizes="32x32" href="/icons/favicon-32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/icons/favicon-16.png" />
<!-- Apple Touch Icons (iOS) -->
<link rel="apple-touch-icon" sizes="180x180" href="/icons/apple-touch-icon-180x180.png" />
<link rel="apple-touch-icon" sizes="152x152" href="/icons/apple-touch-icon-152x152.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/icons/apple-touch-icon-144x144.png" />
<link rel="apple-touch-icon" sizes="120x120" href="/icons/apple-touch-icon-120x120.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/icons/apple-touch-icon-114x114.png" />
<link rel="apple-touch-icon" sizes="76x76" href="/icons/apple-touch-icon-76x76.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/icons/apple-touch-icon-72x72.png" />
<link rel="apple-touch-icon" sizes="60x60" href="/icons/apple-touch-icon-60x60.png" />
<link rel="apple-touch-icon" sizes="57x57" href="/icons/apple-touch-icon-57x57.png" />
<!-- Web App Manifest (PWA) -->
<link rel="manifest" href="/manifest.json" />
<meta name="theme-color" content="#ffffff" />
<!-- iOS Web App -->
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
<meta name="apple-mobile-web-app-title" content="Your App" />
</head>Create a manifest.json file for Progressive Web App support. See examples/manifest.json for a complete example:
{
"name": "Your App Name",
"short_name": "App",
"icons": [
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png",
"purpose": "any maskable"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png",
"purpose": "any maskable"
}
],
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#ffffff"
}- iOS: Uses Apple Touch Icons (automatically adds rounded corners)
- Android/PWA: Uses icons from manifest.json
- Windows: Uses msapplication meta tags
- Modern Browsers: Prefer SVG favicon with PNG fallbacks
# Clone the repository
git clone https://github.com/profullstack/favicon-generator.git
cd favicon-generator
# Install dependencies
pnpm install# Run tests
pnpm test
# Run tests in watch mode
pnpm test:watch
# Run tests with coverage
pnpm test:coverage# Lint code
pnpm lint
# Fix linting issues
pnpm lint:fix
# Format code
pnpm format
# Check formatting
pnpm format:check- Node.js >= 20.0.0
- ESM support
MIT © profullstack
Contributions are welcome! Please feel free to submit a Pull Request.
If you encounter any issues or have questions, please file an issue on the GitHub repository.
See CHANGELOG.md for release history.