Generate AI-powered related links for your Astro content
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. Existing methods of showing related ...
Feed
Latest entries from Phil Nash.
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. Existing methods of showing related ...
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 coding since the GitHub Copil...
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 gives talks differently, and if yo...
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 of publishing packages to hope...
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 issue that I faced that will be ...
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 unstructured data split it into chun...
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 worked. Once I had finally found ou...
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 be a pain. Mozilla's open-sour...
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? Particularly when it is state-related an...
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 split it up into chunks , tur...
Retrieval-augmented generation (RAG) applications begin with data, so getting your data in the right shape to work well with vector databases and large language models (LLMs) is th...
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 response before updating the u...
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 or perhaps reached for lodash's...
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 into process.env in your Node.j...
Generating pagination links is not as straightforward as it may seem. So, while rebuilding my own site with Astro, I released a component on npm as @philnash/astro-pagination that ...
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 part in the early community. Bu...
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 best way to really get on bo...
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 hadn't looked into the detail...
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 passwords, like users picking...
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 username then becomes a combinatio...
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 as custom short links, custom...
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 find ourselves trying to write ...
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 application that consumes webhooks or...
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 zones some of the time, and zones ...
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 API to download files. Using ...
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 new project and learn a new skil...
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 dedicated to it . The page wi...
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 gem, whatever. It is code tha...
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 you wish another developer had ...
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 something new, how you became a be...
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 in use in the gem are signed co...
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 items in JavaScript that were not...
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 remember that better. This post is on...
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 that this is not particularly...
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... Some time passes and you de...
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 I picked up a few techniques ...
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 to learn about a language and p...
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 needed to understand all its powerf...
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 once in a while to clean all o...
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. I wanted something more decla...
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 speaking section of my site an...
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 to gzip a file using Ruby. En...
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 applications that work offline, ...
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, however, that urged me to go ...
The service worker API is expanding as more ways to use the background dwelling worker emerge. I've written before about push notifications and background sync and I recently explo...
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 of gems that can download and ...
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 cannot think of a situation in...
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 can see it in action by clicki...
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, the things I changed and some l...
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 really useful. It's also surpri...
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 code can lead to surprising re...
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 share a few little tips that I us...
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 learned of one way that you c...
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 world. And not just your average l...
There's been some interesting updates in service workers recently. The big news is that the Microsoft Edge development version now has service workers, alongside push notifications...
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 developer evangelist for Twilio is...
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 assets was high on the priority...
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 framework means I can block out ...
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 the horror of ActiveX's Activ...
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. Welcome to the new version of my s...