Build a contact form with Astro and Resend ๐
I try to keep my email address from appearing on public websites to avoid spam. But I do like people to be able to contact me if they have something I [...]
a collection of dev rss feeds - blogroll
Posts
I try to keep my email address from appearing on public websites to avoid spam. But I do like people to be able to contact me if they have something I [...]
Showing related posts beneath a blog post is a great way to give your visitors more to read and encourage them to spend more time on your site. Existi [...]
Much like almost every other developer on the planet, I have been trying to work out my relationship with coding agents. I have been using AI-assisted [...]
I have been speaking publicly at developer conferences for over a decade and in that time Iโve seen plenty of other people giving talks. Everyone give [...]
After the recent supply chain attacks on the npm ecosystem, notaby the Shai-Hulud 2.0 worm, GitHub took a number of actions to shore up the security o [...]
The Date object in JavaScript is frequently one that causes trouble. So much so, it is set to be replaced by Temporal soon. This is the story of an is [...]
When youโre building a retrieval-augmented generation (RAG) app, the first thing you need to do is prepare your data. You need to: collect your unstru [...]
This is one of those cathartic blog posts. One in which I spent several frustrating hours trying to debug something that really should have just worke [...]
Scraping web pages is one way to fetch content for your retrieval-augmented generation (RAG) application. But parsing the content from a web page can [...]
Have you ever had one of those times when you think youโre doing everything right, yet still you get an unexpected bug in your application? Particular [...]
When youโre building a retrieval-augmented generation (RAG) app, job number one is preparing your data. Youโll need to take your unstructured data and [...]
Retrieval-augmented generation (RAG) applications begin with data, so getting your data in the right shape to work well with vector databases and larg [...]
Generative AI enables us to build incredible new types of applications, but large language model (LLM) responses can be slow. If we wait for the full [...]
Grouping items in an array is one of those things youโve probably done a load of times. Each time you would have written a grouping function by hand o [...]
With the recent release of version 20.6.0, Node.js now has built-in support for .env files. You can now load environment variables from a .env file in [...]
Generating pagination links is not as straightforward as it may seem. So, while rebuilding my own site with Astro, I released a <Pagination /> compone [...]
Bluesky is the new social network in town and itโs an exciting place to explore right now. I was fortunate enough to get an invite early on and take p [...]
ChatGPT has taken the world by storm and this week OpenAI released the ChatGPT API. Iโve spent some time playing with ChatGPT in the browser, but the [...]
I recently came across this blog post from Ruud van Asseldonk titled โThe yaml document from hellโ. Iโve always heard that yaml has its pitfalls, but [...]
Two factor authentication (2FA) is a great way to improve the security of user accounts in an application. It helps protect against common issues with [...]
Mastodon is different to most online services. It is a federated network, so when you set up an account you need to choose a server to use. Your usern [...]
Link shortening has been around for a long time and Bitly is arguably the king of the link shorteners. It has support for shortening long URLs as well [...]
Sometimes the platform we are building on provides more functionality than we can keep in our own heads. However, depending on the problem, we often f [...]
When I am developing web applications in Node.js, I like the server to restart when I make changes, so I use nodemon. When I am developing an applicat [...]
Time zones are hard. Not only are there a lot of them, but they donโt fit nicely into whole hour blocks, daylight savings time changes individual zone [...]
Got is a Node.js library for making HTTP requests. It has both promise and stream based APIs and in this post I want to explore how to use the stream [...]
Over the Easter weekend, a four day weekend characterised by lockdowns all over the world, I decided to use the extra time I had at home to start a ne [...]
Iโve been trying out streaming live code on Twitch which is a lot of fun. I wanted to share on my own site that I was streaming so I have built a page [...]
The list on GitHub of repositories that depend on your repository is scary. Thereโs something nice about writing and releasing a library, module, Ruby [...]
Some things you do as a developer can work for you for years, then turn around and bite you when you were least expecting. These are the things that y [...]
So youโve decided to speak at a developer conference? You have a story you want to share with your peersโhow you built something, how you learned some [...]
Recently Iโve been refactoring the tests for a gem I maintain and I needed to test that it sets the right cookies at the right time. But the cookies i [...]
Array sorting is one of those things you donโt spend too long thinking about, until it stops working for you. Recently I was working with array of ite [...]
Sometimes I write blog posts to remind myself what Iโve learned and sometimes I write them because someone else shares something and I want to remembe [...]
Iโve never been one for writing a review of my year. This year Iโve found myself not only reading, but comparing myself to othersโ reviews. I realised [...]
Youโve implemented a service worker to cache some assets. Everything is working well, your service worker is a success, youโre feeling good. But thenโฆ [...]
I recently experimented with audio visualisation in React on the Twilio blog. While I meant to teach myself more about the web audio API I found that [...]
Crystal is still a young language, there arenโt a lot of libraries available yet. For some this could be offputting, but for others this is a chance t [...]
Iโve seen the following tweet about git making its way around Twitter recently: I โค๏ธ Git. But honestly, it intimidated me for years. I thought I neede [...]
Development machines can build up such a lot of cruft. Old versions, oudated programs and unused caches litter the hard drive. Itโs good to take time [...]
Iโm a fan of the web share API but I was not happy with my initial implementation of the API. It was all a bit complex for what is a very simple API. [...]
There are a whole bunch of CSS selectors available to web developers, but sometimes thereโs still not enough. I found this recently when building the [...]
At the start of the year I looked into how to better compress the output of a Jekyll site. Iโll write up the results to that soon. For now, hereโs how [...]
I am a fan of progressive web apps and the powers that they bestow on web developers to build the next generation of applications. We can write web ap [...]
I had the fortune of attending the wonderful Brighton Ruby conference last week. It was full of excellent advice, wisdom and code. There was one talk, [...]
The service worker API is expanding as more ways to use the background dwelling worker emerge. Iโve written before about push notifications and backgr [...]
Did you know bundler can download and install gems in parallel? Thatโs right, using the --jobs option for bundle install means you can set the number [...]
Hereโs a quick tip for anyone who uses rbenv and ruby-build to manage installing and switching Ruby versions. When installing a new version of Ruby I [...]
Recently I implemented the web share API for my site as a means of testing it out. If you are using version 55 or above of Chrome on Android then you [...]
I wrote a blog post last week and bits of it were wrong. This is not a retraction of that blog post, I just wanted to share the feedback that I got, t [...]
I think the ES2015 destructuring syntax is pretty cool. It might not grab the headlines like Promises, Generators or the class syntax, but I find it r [...]
Sometimes open source work is just fixing one tiny thing that bugs you. However, rolling up your sleeves and delving into even the smallest amount of [...]
Browser dev tools are so full of features itโs hard to keep up. I bet every developer knows a different set of features to each other. I wanted to sha [...]
Git may be the best version control software Iโve used but it is a complex beast and makes it easy to shoot yourself in the foot. Recently, however, I [...]
Last week I was blown away by the response to a problem I was experiencing from maintainers of two of the larger open source projects in the Ruby worl [...]
Thereโs been some interesting updates in service workers recently. The big news is that the Microsoft Edge development version now has service workers [...]
June saw me ask for your help as I started to learn Swift. July was busy with travel. Now August is iOS month. Iโm lucky that part of my job as a deve [...]
When I started again on this site, I wanted to make sure it was going to load fast. Performance matters. Bundling, minifying and caching the static as [...]
I am currently in the middle of a Swift and iOS course with the excellent Big Nerd Ranch. Taking a week to dedicate to learning a new language and fra [...]
Building up and sending an Ajax request is so much easier than it ever used to be. No longer must we hassle ourselves with XMLHttpRequest, never mind [...]
No running site is ever completely finished. This one is no exception. There is more to build, more to style and more to write. Itโs a challenge. Welc [...]