<?xml version="1.0" encoding="utf-8"?>
<feed xml:lang="en-us" xmlns="http://www.w3.org/2005/Atom"><title>Simon Willison's Weblog: favicons</title><link href="http://simonwillison.net/" rel="alternate"/><link href="http://simonwillison.net/tags/favicons.atom" rel="self"/><id>http://simonwillison.net/</id><updated>2025-05-07T20:15:48+00:00</updated><author><name>Simon Willison</name></author><entry><title>llm-prices.com</title><link href="https://simonwillison.net/2025/May/7/llm-prices/#atom-tag" rel="alternate"/><published>2025-05-07T20:15:48+00:00</published><updated>2025-05-07T20:15:48+00:00</updated><id>https://simonwillison.net/2025/May/7/llm-prices/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.llm-prices.com/"&gt;llm-prices.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I've been maintaining a simple LLM pricing calculator since &lt;a href="https://github.com/simonw/tools/commits/main/llm-prices.html"&gt;October last year&lt;/a&gt;. I finally decided to split it out to its own domain name (previously it was hosted at &lt;code&gt;tools.simonwillison.net/llm-prices&lt;/code&gt;), running on Cloudflare Pages.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Screenshot of the llm-prices.com site - on the left is a calculator interface for entering number of input tokens, output tokens and price per million of each. On the right is a table of models and their prices, sorted cheapest first." src="https://static.simonwillison.net/static/2025/llm-prices.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;The site runs out of my &lt;a href="https://github.com/simonw/llm-prices"&gt;simonw/llm-prices&lt;/a&gt; GitHub repository. I ported &lt;a href="https://github.com/simonw/llm-prices/commits/b45e8f9c718c4ad3ab50b906a2c3882cbcffcb5b/index.html"&gt;the history&lt;/a&gt; of the old &lt;code&gt;llm-prices.html&lt;/code&gt; file using a vibe-coded bash script that I forgot to save anywhere.&lt;/p&gt;
&lt;p&gt;I rarely use AI-generated imagery in my own projects, but for this one I found an excellent reason to use GPT-4o image outputs... to generate the favicon! I dropped a screenshot of the site into ChatGPT (o4-mini-high in this case) and asked for the following:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;design a bunch of options for favicons for this site in a single image, white background&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="A 3x3 grid of simple icon concepts: green coins/circles, a green price tag with dollar sign, a calculator with dollar sign, a calculator with plus sign, a blue chat bubble with three dots, a green brain icon, the letters &amp;quot;AI&amp;quot; in dark gray, a document with finger pointing at it, and green horizontal bars of decreasing size." src="https://static.simonwillison.net/static/2025/favicon-options.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;I liked the top right one, so I cropped it into Pixelmator and made a 32x32 version. Here's what it looks like in my browser:&lt;/p&gt;
&lt;p&gt;&lt;img alt="A cropped web browser showing the chosen favicon - it's a calculator with a dollar sign overlapping some of the keys." src="https://static.simonwillison.net/static/2025/favicon-live.png" /&gt;&lt;/p&gt;
&lt;p&gt;I added a new feature just now: the state of the calculator is now reflected in the &lt;code&gt;#fragment-hash&lt;/code&gt; URL of the page, which means you can link to your previous calculations.&lt;/p&gt;
&lt;p&gt;I implemented that feature using &lt;a href="https://simonwillison.net/2025/May/6/gemini-25-pro-preview/"&gt;the new gemini-2.5-pro-preview-05-06&lt;/a&gt;, since that model boasts improved front-end coding abilities. It did a pretty great job - here's how I prompted it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;llm -m gemini-2.5-pro-preview-05-06 -f https://www.llm-prices.com/ -s 'modify this code so that the state of the page is reflected in the fragmenth hash URL - I want to capture the values filling out the form fields and also the current sort order of the table. These should be respected when the page first loads too. Update them using replaceHistory, no need to enable the back button.'
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here's &lt;a href="https://gist.github.com/simonw/9d4e15b58ccfaca9e08747225cb69fa2"&gt;the transcript&lt;/a&gt; and &lt;a href="https://github.com/simonw/llm-prices/commit/c9eee704d070d119e6c342d9a7ab6c41d09550dd"&gt;the commit updating the tool&lt;/a&gt;, plus &lt;a href="https://www.llm-prices.com/#it=5883&amp;amp;ot=16087&amp;amp;ic=1.25&amp;amp;oc=10&amp;amp;sb=input&amp;amp;sd=descending"&gt;an example link&lt;/a&gt; showing the new feature in action (and calculating the cost for that Gemini 2.5 Pro prompt at 16.8224 cents, after &lt;a href="https://simonwillison.net/2025/May/8/llm-gemini-0191/"&gt;fixing the calculation&lt;/a&gt;.)


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/projects"&gt;projects&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai"&gt;ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/cloudflare"&gt;cloudflare&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/generative-ai"&gt;generative-ai&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llms"&gt;llms&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/ai-assisted-programming"&gt;ai-assisted-programming&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/gemini"&gt;gemini&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/llm-pricing"&gt;llm-pricing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/text-to-image"&gt;text-to-image&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/vibe-coding"&gt;vibe-coding&lt;/a&gt;&lt;/p&gt;



</summary><category term="favicons"/><category term="projects"/><category term="ai"/><category term="cloudflare"/><category term="generative-ai"/><category term="llms"/><category term="ai-assisted-programming"/><category term="gemini"/><category term="llm-pricing"/><category term="text-to-image"/><category term="vibe-coding"/></entry><entry><title>fav.farm</title><link href="https://simonwillison.net/2024/Oct/7/fav-farm/#atom-tag" rel="alternate"/><published>2024-10-07T06:46:50+00:00</published><updated>2024-10-07T06:46:50+00:00</updated><id>https://simonwillison.net/2024/Oct/7/fav-farm/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://fav.farm/"&gt;fav.farm&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Neat little site by Wes Bos: it serves SVG (or PNG &lt;a href="https://github.com/wesbos/favicon/blob/dd3e2fcddfbb01cfb9080c70d0c89853d7372f68/index.ts#L69"&gt;for Safari&lt;/a&gt;) favicons of every Emoji, which can be added to any site like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;link rel="icon" href="https://fav.farm/🔥" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The source code is &lt;a href="https://github.com/wesbos/favicon"&gt;on GitHub&lt;/a&gt;. It runs on Deno and Deno Deploy, and recently added per-Emoji hit counters powered by the Deno KV store, implemented in &lt;a href="https://github.com/wesbos/favicon/blob/dd3e2fcddfbb01cfb9080c70d0c89853d7372f68/db.ts"&gt;db.ts&lt;/a&gt; using this pattern:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export function incrementCount(emoji: string) {
  const VIEW_KEY = [`favicon`, `${emoji}`];
  return db.atomic().sum(
    VIEW_KEY, 1n
  ).commit(); // Increment KV by 1
}
&lt;/code&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://www.tiktok.com/@wesbos/video/7421944278802287877"&gt;Wes Bos on TikTok&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/javascript"&gt;javascript&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/svg"&gt;svg&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/deno"&gt;deno&lt;/a&gt;&lt;/p&gt;



</summary><category term="favicons"/><category term="javascript"/><category term="svg"/><category term="deno"/></entry><entry><title>How to Add a Favicon to Your Django Site</title><link href="https://simonwillison.net/2022/Jan/20/how-to-add-a-favicon-to-your-django-site/#atom-tag" rel="alternate"/><published>2022-01-20T07:03:43+00:00</published><updated>2022-01-20T07:03:43+00:00</updated><id>https://simonwillison.net/2022/Jan/20/how-to-add-a-favicon-to-your-django-site/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://adamj.eu/tech/2022/01/18/how-to-add-a-favicon-to-your-django-site/"&gt;How to Add a Favicon to Your Django Site&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Adam Johnson did the research on the best way to handle favicons - Safari still doesn't handle SVG icons so the best solution today is a PNG served from the &lt;code&gt;/favicon.ico&lt;/code&gt; path. This article inspired me to finally add a proper favicon to Datasette.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="https://twitter.com/adamchainz/status/1483490873405018115"&gt;@adamchainz&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/django"&gt;django&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/adam-johnson"&gt;adam-johnson&lt;/a&gt;&lt;/p&gt;



</summary><category term="django"/><category term="favicons"/><category term="adam-johnson"/></entry><entry><title>Dynamically changing favicons with JavaScript</title><link href="https://simonwillison.net/2017/Oct/26/dynamically-changing-favicons/#atom-tag" rel="alternate"/><published>2017-10-26T19:56:24+00:00</published><updated>2017-10-26T19:56:24+00:00</updated><id>https://simonwillison.net/2017/Oct/26/dynamically-changing-favicons/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="https://mathiasbynens.be/demo/dynamic-favicons"&gt;Dynamically changing favicons with JavaScript&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I just spotted GitHub using this trick to swap out the favicon on a pull request that hadn’t passed its tests yet for github.com/favicon-failure.ico with a little cross icon in the corner.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;&lt;/p&gt;



</summary><category term="favicons"/></entry><entry><title>Muck Rack: Links posted by Guardian Journalists on Twitter</title><link href="https://simonwillison.net/2009/May/22/muckrack/#atom-tag" rel="alternate"/><published>2009-05-22T22:02:34+00:00</published><updated>2009-05-22T22:02:34+00:00</updated><id>https://simonwillison.net/2009/May/22/muckrack/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://muckrack.com/guardian/links"&gt;Muck Rack: Links posted by Guardian Journalists on Twitter&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
I’m rather impressed by the Sawhorse Media collection of Twitter aggregation sites (Muck Rack aggregates journalists)—a simple idea very well executed. Here’s a nice example—this page shows links posted to Twitter by known Guardian journalists, but goes a step further and scrapes in the favicon, the real title of the page and resolves the domain from any shortened links.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/aggregation"&gt;aggregation&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/guardian"&gt;guardian&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/journalists"&gt;journalists&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/mashups"&gt;mashups&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/muckrack"&gt;muckrack&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/sawhorsemedia"&gt;sawhorsemedia&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/twitter"&gt;twitter&lt;/a&gt;&lt;/p&gt;



</summary><category term="aggregation"/><category term="favicons"/><category term="guardian"/><category term="journalists"/><category term="mashups"/><category term="muckrack"/><category term="sawhorsemedia"/><category term="twitter"/></entry><entry><title>favikon.com</title><link href="https://simonwillison.net/2009/Apr/13/favikon/#atom-tag" rel="alternate"/><published>2009-04-13T12:09:49+00:00</published><updated>2009-04-13T12:09:49+00:00</updated><id>https://simonwillison.net/2009/Apr/13/favikon/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://favikon.com/"&gt;favikon.com&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Small, easy to use online favicon generator.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/favikon"&gt;favikon&lt;/a&gt;&lt;/p&gt;



</summary><category term="favicons"/><category term="favikon"/></entry><entry><title>Google's undocumented favicon to png convertor</title><link href="https://simonwillison.net/2008/Aug/30/favicons/#atom-tag" rel="alternate"/><published>2008-08-30T20:40:48+00:00</published><updated>2008-08-30T20:40:48+00:00</updated><id>https://simonwillison.net/2008/Aug/30/favicons/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.google.com/s2/favicons?domain=simonwillison.net"&gt;Google&amp;#x27;s undocumented favicon to png convertor&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Showing the favicon of a domain next to a link is a really nice trick, but it’s slightly tricky to achieve as IE won’t display a .ico file if you link to it from an img element, so you need to convert the images server-side. This undocumented Google API does that for you, meaning it’s much easier to add favicons as a feature to your site.

    &lt;p&gt;&lt;small&gt;&lt;/small&gt;Via &lt;a href="http://www.reddit.com/r/programming/comments/6ytnt/googles_free_favicon_png_online_converter/"&gt;reddit.com&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/apis"&gt;apis&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/google"&gt;google&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/png"&gt;png&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/undocumented"&gt;undocumented&lt;/a&gt;&lt;/p&gt;



</summary><category term="apis"/><category term="favicons"/><category term="google"/><category term="png"/><category term="undocumented"/></entry><entry><title>In rainbows</title><link href="https://simonwillison.net/2007/Oct/23/dopplr/#atom-tag" rel="alternate"/><published>2007-10-23T22:39:15+00:00</published><updated>2007-10-23T22:39:15+00:00</updated><id>https://simonwillison.net/2007/Oct/23/dopplr/#atom-tag</id><summary type="html">
    
&lt;p&gt;&lt;strong&gt;&lt;a href="http://blog.dopplr.com/index.php/2007/10/23/in-rainbows/"&gt;In rainbows&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
Dopplr generates a unique colour for each city using an MD5 hash. The colours are then used in subtle but intelligent ways throughout the design—right down to the favicon.


    &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/colour"&gt;colour&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/design"&gt;design&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/dopplr"&gt;dopplr&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/hashing"&gt;hashing&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/matt-biddulph"&gt;matt-biddulph&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/matt-jones"&gt;matt-jones&lt;/a&gt;, &lt;a href="https://simonwillison.net/tags/md5"&gt;md5&lt;/a&gt;&lt;/p&gt;



</summary><category term="colour"/><category term="design"/><category term="dopplr"/><category term="favicons"/><category term="hashing"/><category term="matt-biddulph"/><category term="matt-jones"/><category term="md5"/></entry><entry><title>New favicon</title><link href="https://simonwillison.net/2003/Apr/3/faviconAdded/#atom-tag" rel="alternate"/><published>2003-04-03T18:43:56+00:00</published><updated>2003-04-03T18:43:56+00:00</updated><id>https://simonwillison.net/2003/Apr/3/faviconAdded/#atom-tag</id><summary type="html">
    &lt;p&gt;This site now sports a funky favicon, care of &lt;a href="http://www.natbat.co.uk/"&gt;Nat&lt;/a&gt;.&lt;/p&gt;
    
        &lt;p&gt;Tags: &lt;a href="https://simonwillison.net/tags/favicons"&gt;favicons&lt;/a&gt;&lt;/p&gt;
    

</summary><category term="favicons"/></entry></feed>