Lately I've had the opportunity to travel by train and coach, during which time I also tend to work. It's really only during these periods that I'm reminded of how web sites fail so terribly over a slow connection. On the odd occasion I can be guilty of this too. I had a tiny tool that takes markdown and renders it for quick reading (no apps, or split view in VS Code, etc). When I loaded it up on…
I saw recently saw a blog post (which annoyingly I can't find any more, but I'll link it if I do), showing off a web component that if I recall correctly, would show (or hide) it's contents depending on a browser feature (I'd guess using the @supports query). That reminded me that I wrote a web component that I use quite a bit (particularly with FFConf), which should really be called do-when, but…
Just a brainfart here, but it's odd that even though we have wildcard selectors throughout CSS, and even partial selectors (I'll explain in a bit) we don't have partial wildcard selectors on top level elements. I'm not talking about the "star" rule, but what I imagine would be a wildcard on elements selector.
In my RSS reader, I stumbled upon this code-golfed (i.e. minimised to death) snippet that's fairly clever, but from the code, utterly opaque. I couldn't immediately see how it worked, and since Copilot autocompletes most of my code for me - whether I want to or not, I figured it was a good bit of practice to decompress and understand. First things first: snooze the little copilot bastard for an…
As with each year for the FFConf web site, I have a distinct idea of the visual style I want. It has zero to do with the content we're presenting each year, but I do love how FFConf's site can be creative. It was like that from the very first web site - the logo was designed in early 2009 in 12 variations (which you can see from years 2009, 2010 and 2011 before they were really redesigned). Before…
Today is the anniversary of the first blog post on this website from two decades ago. It was about client side JavaScript to automatically (albeit blindly) select the "active" navigation. Ironically, I'd probably do this on the server side these days. Admittedly, it's imported from my prior blog and the first time I posted on on this domain was in September, but the post in June counts! But then,…
For the second year running, as part of our "stay sane" strategy for FFConf, Julie and I write and send a weekly newsletter. It's structured the same way so it means we have a much better line of sight as to what we have to say. The open rate is usually around 40% (though I know some email systems synthetically do this), but our click rates are also usually pretty good. This week however, open…
Today I'm releasing my Game Boy game called Marbles² (or Marbles Squared). It's a port of a game that I originally wrote back in 2002, but is a game that started in my life in (or around) 1996. The development this iteration of the game, the one in 2026, took me about a week and I haven't written a single line of code. Here's how things have changed.
After attending recent conferences and learning that I can swap out buckets of JavaScript for the HTML native popover property, I've been using it liberally throughout my own projects. For little pop out menus it's perfect. Then I also started using it for modal boxes (yes, you might be thinking ahead of me: dialog, still, let's find out what happened). The popover property was really easy for…
This is a literal TIL but was so handy I had to put it my blog so that I wouldn't forget it later. Thanks to Big Brain Keith Cirkel for sharing this. As (hopefully) you know, there's the $ and $$ functions in devtools. For querySelector and querySelectorAll respectively. Well there's also $$$ to query through the shadow DOM. This means the query will cut through and into the nested DOM inside of…
This is a cheap post to share some of the apps (macos, sorry Windows users) that I use on a fairly regular basis and think some of you might not have heard of before (whilst still being useful).
For a while now both my desktop Mac (running Sonoma) and my laptop (running Tahoe - do not recommend) have had sub-optimal network speeds. My Android phone, on our network, on the same SSID, speed tests at 1.1Gbps. My laptop gets around 160Mbps and my desktop pulls in around 80Mbps. That's quite a difference, and even though I don't need the gigabit speeds - sometimes I can tell when the desktop…
Okay, that's a stupidly obscure title. It's meant to represent the combined events: State of the Browser and Web Day Out - two events I attended in the last month. The short version is: if you get the chance to attend these events or even anything similar, I'd highly recommend that you grab that ticket and let the event wash over you. For those that didn't attend (or maybe you did and wanted to…
Mega short blog post, mostly for me to remember, but also might be useful to you. In a project I'll often work on and move around different branches throughout the day, and as the years wear on it's rather dulled my memory - that's to say, I quickly forget what branch I was working on!
January 27th I got an email notification saying that JS Bin had become unavailable. Then next day real life human beings were asking what's going on. By 11pm on the 30th the last of the issues were resolved. Earlier today Jake asked me: what went wrong? Fucking, everything.
For the last few years my work-work has mostly focused on back end software (particularly around APIs). This meant that any front end work I was doing was for myself. Being an long-in-the-tooth old dog, I tend to learn and trick, and roll it out again and again typically without taking the time to find whether I still need the trick. Case and point, I learnt about the JavaScript performance trick…
This post is mostly data driven (from my own web site's data) to give me a sense of the quality of the books I've read, otherwise individual reviews are all linked in this post or available on my books page. Longest book: Empire of AI: Dreams and Nightmares in Sam Altman's OpenAI - 496 pages Shortest book: The Time Machine - 107 pages Quickest read: 3 days - The Radleys by Matt Haig (341 pages)…
I've been doing these posts ending my years, aiming to publish on the 31st, so I'm pleased that I've managed to get this post out the door. Mostly for my own reading, but perhaps yours too.
Context: back in March 2025 I decided to put aside my scepticism and try AI driven development for the day. I appreciate that in 8 months, the AI landscape, particularly around agentic software dev has moved along, and perhaps this should have been posted originally back in March. All the same, maybe this is useful to some degree, if only to capture what it was like in time. Whilst I sit squarely…
I've been wanting to write and share my experience of this year's event but a number of things have slowed me down - not least of all that it was Julie's birthday the following Tuesday (the first year her birthday was entirely swallowed by the event). So now as I sit writing this a full eight days later - sat on the side of the swimming pool as many kids, including my own, do their swimming…
A simple but effective fix to working with web components and VS Code. I wanted to get syntax highlighting and prettier support (to auto fix indenting, quotes, etc) in my component's templates. The extremely quick read is, add /* HTML */ to the front of the template. Case sensitive and space sensitive (though hopefully one day it won't be so strict). Now highlighting and prettier (with save and…
Besides the name, the entire core foundation has changed. This question came up recently by someone who had either attended back in the early days or that knew of our event, but they (understandably) saw us as it was in 2009. I think the vibes you came away with in the 2009 and 2010 events would be recognised, but content and the core messaging has changed quite significantly.
Very recently I was forced to sign up to Meta due to a product purchase (don't at-me!) and I had forgotten what it was like to be part of the algorithms. Our entire family browse the internet (the web and internet) from behind a DNS proxy that blocks a lot of social media including Facebook/Meta/Insta/whatever it's actually called.
I'd been waiting for the grief to find me. I wasn't actively looking for it, I know which memories to poke to feel real pain, but I wanted to create space for it to find me, and throughout the month of August, this year, it couldn't find me. Until today. 30th August. This day is the knife edge. The day, 15 years ago, that Tia still had a heartbeat, still kicked, was on her way. Julie was in (long)…
It's not an intuitive process and requires a few speciality commands to work, so it made sense that I write up the process so I can duck myself later on.
I've been immersing myself in the AI news for the last few months, trying to get understanding of the landscape, what and why there's excitement, whether the ethics (both from a copyright and climate change perspective) are being considered, and what's the impact of my own usage. In particular lately I've been looking at the idea of vibe coding. I've been playing with Claude Code which, as an…
Over the years we, as a family, have been moving our purchases away from Amazon, except in one single place: Kindle ebooks. For me it's that I'm incapable of reading physical books (but my kindle unlocked my reading), and with a Kindle, I was limited as to where I buy my books. When I read that it was relatively easy to jailbreak all the Kindle models I used this as my opportunity to move to…
There's no denying that the web industry, as with many others, has AI and LLMs as a ubiquitous presence. There's all kinds of different uses for LLMs, and comes with all the ethical concerns - ignored or perhaps at the heart of your use. More recently "vibe coding" has me…wary.
After jailbreaking my Kindle and seeing how simple it was and how all existing functionality was retained, I spotted that there was a My Clippings.txt file on the Kindle when mounted (I'm sure it's always there, I just hadn't mounted before). This prompted me to get all my clippings (or as I think of them highlights) onto my blog since I already have all my books.
…by just a little. Our family bathroom has a cabinet with an IR sensor that turns on LEDs in the side of the cabinet. The IR sensor is "wave your hand under the cabinet" and the lights go on or off. The littlest uses this light (instead of the overhead which is connected to the extractor fan - i.e. loud) as a night light. Since it's usually left on at night, I wanted to give the LEDs some smarts…
This question has been asked before and discussed before and I've always looked on from the sidelines, even though, as a conference organiser, I do in fact have fairly strong opinions about this.
It certainly wasn't today. It was some time ago, but I wanted to mark this in my blog as a reminder that once, long ago, piracy was, well, stealing. That's all changed now.
This post is for my developers out there, web and otherwise. We have super powers. We can make something functional from practically nothing. And you know what they say about great power… So this is short and sweet: know where you draw the line and stick to your god damn guns.
For a small home project, my son suggested adding some under lights to a plant stand we recently added to our kitchen. I figured we could do this with a cheap LED strip and it could connect to the "house" using Zigbee and Home Assistant. All was well until I realised the plug socket nearest the plants already had it's USB port in use and only the USB-C port was available. No worries, I'll just…
I remember seeing something very similar doing the rounds on that site we used to use called "Twitter", possibly back in 2007. Anyway, fast forward a full grown adult and it's making the rounds, except this time instead of looking dough eyed from afar, that lovely man Stuart tagged me (though arguably Jeremy also tagged everyone in his post too). So here's my hat in the ring.
There's a number of ways to get real-time electricity readings into Home Assistant. I'm currently using a Puck.js to read the blinking light on my meter but our gas meter is one of the new ultrasonic ones (in particular there's no readings or lights without physically interacting with it), so there was no obvious means to getting this data. Most UK based energy companies don't have public methods…
My son, aged 13, was given this question for his homework recently. As someone (me!) having worked on the web professionally since 1999, I felt a connection to this particular bit of homework. Obviously we clashed (homework sucks, both for kids, parents and teachers) - but I thought it would be a good exercise for me to try to answer. I will add that I don't consider myself the authority on this…
As part of the ZX Spectrum community I wrote a tool that can download content over HTTP from a ZX Spectrum Next, but one prerequisite is that the content-length header is present (so it operate properly). A friend from the community runs a server and built a (really nice) GUI tool on top the .http command where users can find and download software for their Spectrum. However, for reasons unknown,…
This year zipped past for me, mostly because I had my eye on an event in November for most of the year, but here we are: the close of '24 and on the doorstep of '25. In this post I'll try to remind my future self of what I did, but unlike previous years, there's a lot less public work (side projects), a lot less blogging content…and generally, I think, a lot less. So, with that bulge of joy, let's…
Our 16th year, 17th outing (it's complicated with doubles for 3 years and skipping the pandemic years…) completed two weeks ago, and it is high time I post my thoughts. There are two parts this post breaks into: the day itself and the amazing talks, and the lead up and its future.
I don't like waking up on this particular day. I almost want to just skip the day and not face it. I don't like it because I know there's a version of me that's waking up to this particular morning in 2010 still innocent and full of hope and excitement that our first child is on their way. That version of me doesn't know that this would be the last day. That in the hours that lead into the night,…
And no, I didn't just pop a bow tie on my doorbell! I recently installed Home Assistant on a spare Raspberry Pi I had laying around, and though our house isn't very smart-enabled, I thought it wouldn't be too hard to improve our cheap doorbell to notify through our Google home speakers (or even phone).
In a recent (personal) audit of accessibility and continued struggle to get my head around Voice Over (for macos), I remembered that the spoken sound of "ffconf" (as I'll usually display it) is "ef-conf" all sounded out in two syllables (it's hard to explain). So I wanted to revisit if it was possible to have a screen reader pronounce it the way I wanted and keep the visual style (as it's a brand…
Over the last year+ I've seen AI quickly increase its dominance in the social feeds I follow. I know I'm in an echo chamber, but it feels like working on the web, you/we must understand how AI works and have some kind of integration in our products. It feels like it's being bulldozed by private companies clambering over each other to gain control of user intimacy, whilst we live in a world that…
Aside from the cringe inducing stack I've got layered, with client projects you (actually, me) work with the hand you've been dealt. I needed to add tests to this particular project (which will eventually be open source) and the typical route would have been Jest, but that failed hard. So here's what I did to get tests working.
I do love my Pebble mostly because it still uses tactile buttons and it's a slim watch. Though recently I saw that Casio offered a design in a bright orange colour (and then found a multitude of colours available) and really wanted to brighten up my style. Obviously, quickly it got out of hand!
A little while ago (read: 14 years ago) I wished for a parent selector, and we finally have :has 🎉. Now, how about the ever useful jQuery selector :contains but reusing the text fragment syntax?
More of a TIL but my blog is rather bare lately, so this will do. I was browsing the excellent MDN to check something and came across both Map.groupBy and Object.groupBy. A handy static method for keying an array by some property (I'll show working example in a moment). Pretty useful, but I quickly realised that I'm very much stuck in the camp of the old dog not quite learning the new tricks.