From May 30 to June 3, we will ride from Paderborn in Germany to Aarhus in Denmark in four days. The route covers 625 kilometers of road cycling with 3,190 meters of elevation gain. The event is organized by the Rotary Fellowship Cycling to Serve in collaboration with local cycling clubs and everyone is invited to join! The Rad-Treff Borchen planned the day-to-day routes.
Pinned
Latest
Use Email address obfuscation: What works in 2026? by Spencer Mortensen to keep your email address away from spammers.
This could be a case for a web component combining multiple of the presented techniques. Unfortunately, what really works requires JavaScript, which can be an issue. My favorite pattern so far is 2.10 User Interaction, which I am using pattern with the Intersection Observer API:
// email obfuscation
const mObserver = new IntersectionObserver(decode, {
root: document.querySelector("body"),
rootMargin: "0px",
scrollMargin: "0px",
threshold: 0.1
})
function decode(entries, observer) {
const parts = ["don", "ald", "@", "du", "ck", ".c", "om"]
for (const e of entries) {
if (e.isIntersecting && e.target.classList.contains("m-link")) {
e.target.setAttribute("href", "mai" + "lto:" + parts.join(""))
mObserver.unobserve(e.target)
}
if (e.isIntersecting && e.target.classList.contains("m")) {
e.target.innerText = parts.join("")
mObserver.unobserve(e.target)
}
}
}
function observe() {
for (o of document.querySelectorAll(".m-link,.m")) {
mObserver.observe(o)
}
}
if (document.readyState == "loading") {
document.addEventListener("DOMContentLoaded", observe)
} else {
observe()
}
To challenge the crawler a bit more, you could put that script into a dedicated file mail.js, and load it from inside of your head, like:
<script>
//challenge the crawler!
const s = document.createElement("script")
s.src = "/js/mail.js"
document.head.appendChild(s)
</script>
This will require the crawler to
- execute JS
- discover dynamic script
- load it
- execute it
to get your email address.
Selected posts
Here is a selection of posts I want to highlight. You can find more in the blog.
Web
- Accessibility
- Serverless
- Jamstack in 20 minutes
-
Simplifying light mode and dark mode CSS with the
light-dark()function - Text-to-Chart
- Prerender pages with the Speculation Rules API
- Searching a Jamstack site with Pagefind
- My first attempt with Tailwind CSS
- Toggles suck
- Checkboxes and radio buttons
- Responsive images that adapt in width and height