So I was working on jsonresume.io this weekend and really wanted a favicon for the page. I don't know about you but I kind of dislike having to add a favicon. I don't really know how to make a icon and so I keep reaching more and more into the ever expanding unicode emoji sets.
I really wanted just to drop a 📝 into a <link />
tag and call it a day. As far as I knew this wasn't possible, prompting this tweet:
Which technical committee do I need to submit a proposal to in order to get emojis as favicons? @WHATWG ?
To make a long story short, I made my way to whatwg.org to figure out how to make a proposal. That lead me to this issue #661. That mentions that you can set the favicon dynamically with a data uri.
Turns out I don't need to do a proposal at all! Even though it's not as easy as <link rel="icon" value="🍕" />
it's still pretty straightforward if you can write some JavaScript. Here's the code I wrote to set the favicon of this post:
const canvas = document.createElement('canvas')
canvas.height = 64
canvas.width = 64
const ctx = canvas.getContext('2d')
ctx.font = '64px serif'
ctx.fillText('🛰', 0, 64)
console.log(canvas.toDataURL())
const favicon = document.querySelector('link[rel=icon]')
favicon.href = canvas.toDataURL()
You could even wrap this in a function and dynamically set the favicon.
Let me know if you enjoyed this post on twitter 🙌.
update.
I refined the script a bit and it ends up looking like this:
const favicon = document.querySelector("link[rel=icon]");
if (favicon) {
const emoji = favicon.getAttribute("data-emoji");
if (emoji) {
const canvas = document.createElement("canvas");
canvas.height = 64;
canvas.width = 64;
const ctx = canvas.getContext("2d");
ctx.font = "64px serif";
ctx.fillText(emoji, 0, 64);
favicon.href = canvas.toDataURL();
}
}
This change means that I only need to include this script and set the emoji I want as a favicon like so:
<link rel="icon" data-emoji="🛰" type="image/png" />
Exactly what I wanted orginally! 🤙