A personal coffee journey that began in 2012, from Aeropress to espresso, and why making coffee at home now beats cafes almost every time.
Tailwind, layoffs, and a familiar open source tension
Tailwind CSS is a huge open source success, but its business model has limits. A look at layoffs, AI, and why adoption does not equal leverage.
Flexispot E7 pro standing desk review
A short review of the FlexiSpot E7 Pro standing desk, covering its sturdy C-frame design, built-in USB-C port, effective cable management, and clear, well-designed assembly instructions.
Home assistant bin collection schedule
I built a Home Assistant card that pulls in my local bin collection schedule so I always know which bin needs to go out each week.
HTML5 form Attribute Explained (Controls Outside Forms)
Learn how the HTML5 form attribute lets inputs and buttons work outside a <form> element, with clear examples and use cases.
Building a Pinterest-Style Layout with a Greedy Algorithm
A practical breakdown of creating a Pinterest-style grid layout using a greedy algorithm, with real implementation details.
Getting Started with Hugo: Fast Static Sites Explained
An introduction to Hugo, the fast static site generator, including setup, concepts, and when it’s a good choice.
React noop anti-pattern
Why I avoid a particular React pattern, what the "noop anti-pattern" is, and how to simplify component logic.
A Useful Git Alias: View Recent Branches Quickly
A simple Git alias that helps you list and switch to recent branches faster, with setup instructions.
Designing form validation the right way
Key principles and practices for creating form validation that’s both user-friendly and robust.
Setting Long-Term Goals: Running, Learning, and Consistency
Reflections on goal setting, running a marathon, and staying consistent with learning and personal projects.
Making sure your forms don't suck
Notes and tips from my talk on improving form usability and developer experience.
Reduce all the things
Practical examples and tips for using reduce effectively in JavaScript.
Git stash workflow
A simple Git stash workflow that keeps your changes safe and easy to restore.
Chrome DevTools
A roundup of useful Chrome DevTools features and shortcuts for frontend developers.
On programmers and empathy
Why clear communication and empathy matter in software teams — beyond just writing code.
Working from home misconceptions
My take on common myths about working from home and what really matters for productivity.
Batch file renaming in Bash
A quick Bash example for batch renaming files across nested directories.
Tips on writing a frontend developer CV
Practical advice on crafting a well-rounded CV for frontend developer job applications.
Exposing Rails routes in JavaScript
How to export Rails routes into JavaScript to simplify URL handling client-side.
The books I read in 2016
A list of books I read in 2016 with brief thoughts and recommendations.
The best books I read in 2015
My personal picks for the best books I read in 2015 and why they stood out.
Stubbing AngularJS $window
Tips for stubbing AngularJS $window in tests to make them more reliable.
Why am I going to that conference again?
A look at why tech conferences often prioritise inspirational talks over practical content, and what attendees actually want to learn.
CoffeeScript round two
My renewed thoughts on CoffeeScript, its pros and cons, and whether it’s worth learning.
Scotland.js
Notes and takeaways from attending the Scotland.js conference.
Moving to Android
My first thoughts and early impressions after switching from iOS to Android.
JavaScript North East
A recap of attending JavaScript North East and what I learned there.
jQuery UK conference
Highlights and insights from the jQuery UK conference I attended.
Speed up writing CSS backgrounds in Bash
A small Bash script that reads image dimensions with ImageMagick and outputs ready-to-paste CSS background shorthand to the clipboard.
jQuery inconsistencies
Exploring a jQuery API inconsistency where pseudo-selectors like :search throw errors but attribute selectors work perfectly fine.
HTML5 Validator Gem
How I built a Ruby gem around an HTML5 validation service to automate HTML checking.
iPhone style checkbox using only CSS3
A pure CSS3 iPhone-style toggle checkbox using the :checked pseudo-selector and sprite transitions — no JavaScript required.
My take on CoffeeScript
My experience with CoffeeScript and when (or if) it makes sense to use it.
Creating a Ruby Gem called Cineworld
Building my first Ruby gem — a simple wrapper around the Cineworld API for retrieving cinema listings, films, and showtimes.
Why I Use Haml
Why I prefer Haml templating in Rails and how it improves clarity and productivity.
Nearest Cineworld is now on GitHub
Open-sourcing the Nearest Cineworld web app — built with a custom Ruby gem, HAML templates, the 960gs grid, and Rake-driven cron tasks.
Nearest Cineworld project
A web app using HTML5 geolocation and the Cineworld API to find your closest cinema and browse showtimes with TMDb film data.
My top 10 most useful Ruby Gems
A curated list of ten essential Ruby gems for web development, from Devise and CanCan to Formtastic and Thinking Sphinx.
Current git branch in bash prompt
A quick bash prompt tweak that displays your current Git branch, helping you avoid committing and pushing from the wrong branch.
Ruby Date format gotcha
A date parsing gotcha between Ruby 1.8.7 and 1.9.2 where the same date string is interpreted with swapped month and day values.
Gowalla - where's my ROI?
A critical look at Gowalla after months of use — questioning whether location-based social services offer any real value in return.
Google map api with ym4r
Fixing a ym4r plugin bug in Rails where multiple domain configs caused Google Maps API key lookups to fail on deployment.
Nginx rewrite rule
A simple Nginx config snippet to redirect www to non-www domain.
jQuery Ajax Queue
Using jQuery's queue function to run AJAX requests sequentially without blocking the browser, a better alternative to async false.
New fangled technologies
A short reminder that excitement about new tools is a poor indicator of their production readiness — experiment and ship are different things.
Crafting Appropriate URLs with the Token API
Using Drupal's Token API with custom hooks to build dynamic URL patterns based on taxonomy terms, beyond what Pathauto provides.
Drupal Clear Cache Bookmarklet
Creating a bookmarklet to quickly clear cache in a Drupal site.
Why listen to audiobooks?
My goals for 2010: releasing a jQuery plugin, learning new tech, launching a side project, getting fitter, travelling more, and blogging consistently.
Why aren't you Huffduffing yet?
An introduction to Huffduffer and why it’s worth using for podcast discovery.
Goals for 2010
My personal goals for the year and reflections on ambition and planning.
Internet Explorer Stylesheet Limit
The little-known IE bug where the browser silently ignores all stylesheets after the first 30 requests, breaking page styles.
TextMate CSS Colour Picker
A handy CSS colour picker tip in TextMate to speed up your workflow.
Abusing JavaScript Frameworks
My take on misuse of JS frameworks and the balance between tools and over-engineering.
Moving to Linode
My experience switching to Linode for hosting and why it’s been a good choice.