About the favicon generator
What it does, exactly how it builds each file, and what it honestly cannot do.
Why this exists
Turning one logo into a correct, modern favicon set means exporting six sizes and hand-assembling a legacy binary format most design tools do not expose directly. That is a small, mechanical, and slightly obscure task — exactly the kind this site collects. This tool does the whole job in one page load, with no account, no install, and no file ever leaving your device.
How it works
When you drop or choose an image, the browser's own createImageBitmap decodes it (falling back to a plain <img> element and an object URL for anything that method rejects). The decoded image is drawn onto six separate square <canvas> elements, one per output size, using a centre-crop "cover" fit so a non-square source keeps its proportions instead of being squashed.
Each canvas becomes a PNG file via canvas.toBlob('image/png') — the browser's own PNG encoder, the same one behind any "save image as" action. Those six PNGs are what the individual download buttons hand you.
favicon.ico is then assembled from the 16, 32 and 48px PNGs by writing the container format directly: a 6-byte header, one 16-byte directory entry per image recording its width, height, bit depth and byte offset, followed by the three PNGs' bytes one after another. No BMP encoder and no icon library are involved — the whole assembly is arithmetic over a byte array, which is why the pure logic that does it (ico.js) has no dependency on the DOM, a canvas, or a network connection, and is unit-tested under Node against fixed byte arrays rather than real images.
What "nothing is uploaded" actually means here
There is no server behind this page to upload to. Decoding, drawing, encoding and assembling all happen inside this browser tab using standard Web APIs — createImageBitmap, <canvas>, Blob and object URLs. What you drop never leaves your device, and downloads are handed to your browser directly from an in-page object URL rather than fetched from anywhere.
Honest limitations
- It crops and scales the image you give it; it does not redesign a logo that is illegible at small sizes.
- It does not remove backgrounds or add transparency — whatever the source file has, every output size inherits.
- It does not generate a
site.webmanifest, only PNGs at the sizes one would reference. favicon.icointentionally bundles only 16, 32 and 48px — nothing on the modern web reads a larger size from that file format.- One image in, one icon set out — there is no batch mode.