Favicon Compression Guide
Master favicon file size optimization: compression tools, lossless/lossy techniques, format comparison, bandwidth reduction, and performance best practices.
Why Compress Favicons?
Faster Loading
Reduce page load time
Less Bandwidth
Save server costs
Mobile-Friendly
Better on slow networks
SEO Boost
Page speed ranking
Typical Savings: 50-80% file size reduction with proper compression (e.g., 50KB ? 10KB)
Compression Tools
Best Tools for Each Format
PNG Compression Tools
| Tool | Type | Compression | Usage |
|---|---|---|---|
| TinyPNG | Web/API | Lossy (60-80%) | tinypng.com |
| OptiPNG | CLI | Lossless (10-30%) | optipng -o7 favicon.png |
| PNGCrush | CLI | Lossless (15-40%) | pngcrush -brute favicon.png output.png |
| Squoosh | Web | Both | squoosh.app |
Command Line Examples
# OptiPNG (lossless)
optipng -o7 favicon-32x32.png
# -o7 = maximum optimization
# ImageMagick (lossy with quality control)
convert favicon.png -quality 85 -strip favicon-compressed.png
# pngquant (lossy, excellent quality)
pngquant --quality=80-95 favicon.png --output favicon-compressed.png
# Batch compress all PNGs
for file in *.png; do
optipng -o7 "$file"
doneICO Compression
ICO files contain PNG data internally, so compress before converting:
# 1. Optimize individual PNG sizes
optipng -o7 favicon-16x16.png
optipng -o7 favicon-32x32.png
optipng -o7 favicon-96x96.png
optipng -o7 favicon-512x512.png
optipng -o7 favicon-48x48.png
# 2. Create ICO from optimized PNGs
convert favicon-16x16.png favicon-32x32.png favicon-48x48.png favicon.ico
# 3. Further optimize ICO
# (ICO format doesn't compress well beyond PNG optimization)Format Comparison
Best Format for File Size
| Format | Typical Size (32x32) | Compression | Browser Support | Best Use |
|---|---|---|---|---|
| PNG | 1-5 KB | Excellent (lossless) | All modern browsers | ? Recommended |
| ICO | 5-15 KB | Good (contains PNG) | All browsers | Legacy support |
| SVG | 1-3 KB | Excellent (text-based) | Modern browsers | Simple icons |
| WebP | 0.5-2 KB | Best (lossy/lossless) | Chrome, Edge, Firefox | Modern sites only |
| AVIF | 0.3-1 KB | Best (next-gen) | Chrome 85+, Firefox 93+ | Experimental |
Recommendation: Use PNG for best balance of size, quality, and compatibility
SVG Optimization
Optimize Vector Favicons
SVGO (CLI Tool)
# Install
npm install -g svgo
# Basic optimization
svgo favicon.svg
# Aggressive optimization
svgo --multipass --pretty favicon.svg
# Custom configuration
svgo --config svgo.config.js favicon.svgManual SVG Optimization
Before (Unoptimized)
<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg"
width="32" height="32"
viewBox="0 0 32 32">
<!-- Comments -->
<metadata>...</metadata>
<defs>
<style>.cls-1{fill:#000}</style>
</defs>
<circle class="cls-1"
cx="16.000"
cy="16.000"
r="12.000"/>
</svg>After (Optimized)
<svg xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 32 32">
<circle fill="#000"
cx="16"
cy="16"
r="12"/>
</svg>Optimizations Applied:
- ? Removed XML declaration (not needed)
- ? Removed width/height (use viewBox instead)
- ? Removed comments and metadata
- ? Removed
<defs>and<style> - ? Inlined fill attribute
- ? Removed decimal places (16.000 ? 16)
- ? Minified whitespace
Server-Side Compression
Gzip & Brotli Compression
Nginx Configuration
# Enable Gzip compression
gzip on;
gzip_vary on;
gzip_types image/x-icon image/png image/svg+xml;
gzip_min_length 1024;
gzip_comp_level 6;
# Enable Brotli (better than gzip)
brotli on;
brotli_types image/x-icon image/png image/svg+xml;
brotli_comp_level 6;
# Specific location for favicons
location ~* \.(ico|png|svg)$ {
gzip on;
brotli on;
expires 1y;
add_header Cache-Control "public, immutable";
}Apache Configuration
# .htaccess
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE image/x-icon
AddOutputFilterByType DEFLATE image/png
AddOutputFilterByType DEFLATE image/svg+xml
</IfModule>
# Set compression level
DeflateCompressionLevel 6
# Favicon caching
<FilesMatch "\.(ico|png|svg)$">
Header set Cache-Control "public, max-age=31536000, immutable"
</FilesMatch>Test Compression
# Test if gzip is enabled
curl -H "Accept-Encoding: gzip" -I https://yoursite.com/favicon.ico | grep -i "content-encoding"
# Should show: content-encoding: gzip
# Test if brotli is enabled
curl -H "Accept-Encoding: br" -I https://yoursite.com/favicon.ico | grep -i "content-encoding"
# Should show: content-encoding: br
# Compare sizes
curl -H "Accept-Encoding: gzip" https://yoursite.com/favicon.ico | wc -c
# vs
curl https://yoursite.com/favicon.ico | wc -cCompression Best Practices
? Do
- Use lossless compression (OptiPNG, PNGCrush)
- Enable server-side compression (Gzip/Brotli)
- Optimize before uploading to server
- Use PNG for most favicons (best compression)
- Consider SVG for simple, monochrome icons
- Test file size vs. quality trade-off
- Automate compression in build pipeline
- Aim for < 10KB total for all favicon files
? Don't
- Use uncompressed favicons (>50KB)
- Over-compress with lossy methods (quality loss)
- Use JPEG for favicons (not supported)
- Forget to compress SVG files (can be large)
- Disable server compression for images
- Include unnecessary metadata/comments
- Use overly complex designs (harder to compress)
- Skip testing after compression
Automated Build Pipeline
CI/CD Integration
package.json Scripts
{
"scripts": {
"compress:png": "imagemin src/favicons/*.png --out-dir=public/favicons --plugin=pngquant",
"compress:svg": "svgo -f src/favicons -o public/favicons",
"compress:all": "npm run compress:png && npm run compress:svg",
"build": "npm run compress:all && ..."
},
"devDependencies": {
"imagemin": "^8.0.1",
"imagemin-pngquant": "^9.0.2",
"svgo": "^3.0.0"
}
}GitHub Actions Workflow
name: Optimize Favicons
on: [push]
jobs:
optimize:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Optimize PNG favicons
uses: calibreapp/image-actions@main
with:
jpegQuality: 90
pngQuality: 90
webpQuality: 90
- name: Optimize SVG
run: |
npm install -g svgo
svgo public/*.svg
- name: Commit optimized files
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git add public/
git commit -m "Optimize favicons" || echo "No changes"
git pushGenerate Optimized Favicons
Create compressed, performance-optimized favicon packages
Generate Favicons