Notes from
the build.
Thoughts from the years of making software, building businesses, learning in public, and figuring out what comes next.
Start with the story
FOUR NOTES ALONG THE WAYNivo Slider: The Story So Far
I should start this article by explaining the fact that I am not a born and bred entrepreneur. I’m a developer at heart who has literally stumbled upon “success” just as I was beginning to get interested in the whole business side of the web. I’ve been wanting to write this article for a ...
↗ 02 / 2016Selling My First Business (Dev7studios.com)
Last week I sold my first business. It’s not the first project I’ve sold, but it’s by far the biggest and was my main source of business income for five years.
↗ 03 / 2024Stripe acquires Lemon Squeezy
In an unexpected turn of events, Stripe has acquired Lemon Squeezy 🎉
↗ 04 / 20252025 Year In Review
As has been my custom for the past fifteen years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
↗The full archive
100 POSTS2025
2025 Year In Review
As has been my custom for the past fifteen years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
Business of Laravel Podcast
I was recently on the Business of Laravel podcast chatting with Matt Stauffer about using Laravel to build Lemon Squeezy as well as a bunch of other topics.
2024
2024 Year In Review
As has been my custom for the past fourteen years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
Stripe acquires Lemon Squeezy
In an unexpected turn of events, Stripe has acquired Lemon Squeezy 🎉
2023
2023 Year In Review
As has been my custom for the past thirteen years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
Indie Bites Podcast
I recently had the pleasure of talking with James McKinven, host of the Indie Bites podcast, about my background and why I love side projects.
2022
2022 Year In Review
As has been my custom for the past twelve years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
Automatically running Laravel queue worker and scheduler using PhpStorm
I recently switched to Laravel Valet instead of Laravel Sail. However, I wasn't sure on the best way to run Laravel's scheduler and queue worker locally when working on my projects. Luckily, PhpStorm has a feature called startup tasks which work great for this use case.
Creating alerts using Laravel, Vue 3 and Inertia.js
I'm currently working on a new side project using my favourite stack (Laravel, Vue and Inertia.js). I wanted to implement some "alerts" as toast notifications in the app and decided to share how I did it.
Running Laravel Pint in PhpStorm
To get Laravel Pint to automatically reformat your PHP code on save in PhpStorm, configure it as a file watcher to run as an "action on save".
10 lessons I’ve learned as a Software Engineer
I’ve been a Software Engineer and web developer for over a decade now. Companies such as Dell, AOL, and eBay have used my software to create unforgettable experiences for millions of people around the world. I’ve built, run, and sold software companies that have generated hundreds of thousand...
Staticus
I've done it again 🤦♂️ It all started when I wanted to add a menu to this site. "Simple!", I thought. The rabbit hole went like this:
Make Lemonade Podcast
Recently, JR Farr and I had a chat about my career and all the stuff I’ve been up to over the last decade for our new Make Lemonade podcast.
2021
2021 Year In Review
As has been my custom for the past eleven years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
Web Dev Advent 2021
In typical last minute fashion, I've decided to get into the festive spirit and do a "web development" advent newsletter this year. Each day of advent I'm going to highlighting a web development tool, tip, or app that I use or recommend in my day-to-day development.
LaterMail
Last week I launched a new side project I've been working on for the last month or so, LaterMail.
Enabling HTTPS (SSL) for Laravel Sail using Caddy
I've been using Laravel Sail since it launched and have loved the simple, Docker-based approach to running Laravel on my local machine. However, recently I ran across the issue that Laravel Sail doesn't support HTTPS (SSL). Under the hood Sail uses the php artisan serve command to serve web pages...
Using stripe-mock with Laravel
Recently, while building Lemon Squeezy I came across the issue of mocking Stripe classes in a Laravel application. If you've ever built any kind of billing system using Stripe in Laravel and want to test it (which you should) you'll understand the problem. Stripe objects tend to be large and comp...
Big Sur iPhone Wallpaper
I’ve taken up digital drawing on Procreate recently. I’ve never been much of an artist but I’m finding it’s an enjoyable escape during lockdown.
2020
2020 Year In Review
As has been my custom for the past ten years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
Making Lemonade
2020 has been a strange year, and not just because of all of the chaos of dealing with a global pandemic. In an unexpected turn of events, in March this year I was approached by Orman Clark (my old boss) about becoming a partner in a new venture he was starting with Jason Schuller and JR Farr.
Saaze CMS
This site has been powered by many different CMS's over the years. Every so often I would get the urge to build a flat-file CMS in PHP and convert this blog over to whatever I'd built (e.g. Pico, Baun, etc). However, in the end, I'd always move back to WordPress because it's easy to use (even if ...
AJAX in WordPress Themes
For some reason, it seems really hard to find a nice, simple, copy-and-paste-able resource for explaining how to do AJAX requests in WordPress themes the-right-way™. So here it is.
2019 Year In Review
As has been my custom for the past nine years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
2019
Yo! Podcast
This week Rob Hope was kind enough to invite me on to the Yo! Podcast to chat about the Nivo Slider, side projects, online tracking, productivity and Biffy Clyro (of course).
Grace
I'm delighted to be able to announce that on the 6th of August 2019, at exactly 8 pm, Grace Catherine Pellegrom came into the world weighing exactly 7lbs.
Redesign and Rebuild
Since moving back to WordPress I've been wanting to improve the design of this site to make it feel a bit less bland and bring it more in line with modern sites in terms of technology. My biggest gripe, in terms of design, was that the homepage was just a bunch of text and very uninteresting to l...
Expecting Again
We're thrilled to be able to announce that my wife and I are expecting again! Another wee bundle of joy is due to arrive in August 2019.
Moving Back to WordPress
It's been some time since this blog ran on WordPress. I can't remember when exactly, but some time ago I moved this blog to Medium for the convenience of not having to manage a site and the free exposure offered by Medium's network. However, these days hosting your own content is in vogue again a...
2018
2018 Year in Review
As has been my custom for the past eight years, I like to spend a bit of time at the end of the year reflecting on the year that has been, looking ahead to the year that is to come, and noting down these reflections for posterity.
Coming Around to Utility First CSS
This week I've been playing with Tailwind, which is a "Utility-First CSS Framework for Rapid UI Development". At first I was skeptical of the benefits of "utility-first" CSS but I'm pleased to say that after using Bootstrap 4 for a while (which contains some utility classes) a...
Custom Validation Attributes in Laravel
Recently, I was working on some Laravel validation that used the array syntax to validate fields.
Moving Away from Medium
For some time now my blog has been hosted on Medium.
Setting up Font Awesome 5 in Laravel using Vue.js
So you have a Laravel app set up and you want to use the new Font Awesome 5 goodness in your Vue.js components.
2017 Year In Review
As has been my tradition for the last seven years now I like to spend a bit of time at the end of the year reflecting on the year that has been and looking ahead to the year that is ahead, and note down some of these reflections for posterity.
2017
One week with my Google Pixel 2
Last week I traded my iPhone for a Google Pixel 2, after nine years of being a faithful iPhone fan. In the article I explained my reasons for wanting to switch away from Apple to Google.
I’ve been an iPhone owner for 9 years. Why did I just pre-order a Pixel 2?
Let me give you a bit of context. I’ve been an avid iPhone owner since I bought a 3G in 2008. I’ve loved iPhones since I first held one and earnestly upgraded to the new iPhone every 2 years (mostly skipping the “S” models).
My problems with utility-first CSS
If you’ve not already read it yet, you should read Adam Wathan’s article on how he reached the conclusion that using utility classes was the best way to build consistent components in CSS. As I read the article I followed his conclusions and agreed with his justifications. It sounded like a v...
Modifying Variables in PHP Closures
This one caught me out yesterday. If you use a variable in a PHP closure and try and modify it inside the closure, you will find that the variable outside the closure is not modified. You must pass the variable by reference for it to work.
Splashify — Beautiful Desktop Wallpapers for Mac and Windows
Yesterday I announced the release of my Christmas side project Splashify.
2016
2016 Year In Review
As has been my tradition for the last six years now, I like to spend a bit of time on the last day of the year to reflect, consider the year that has been and the year that is to come, and note down some of these reflections for posterity. What a year 2016 has been.
Selling My First Business (Dev7studios.com)
Last week I sold my first business. It’s not the first project I’ve sold, but it’s by far the biggest and was my main source of business income for five years.
Convert the Laravel Spark invoice email to a Mail Notification email
Recently when customizing the invoice email template for Laravel Spark I noticed that it didn’t have any styles applied (raw HTML emails are a bit 1999). Given how good the new Mail Notifications look in Laravel 5.3 I figured it would make sense to convert the existing invoice email template to...
Running PHPUnit Tests in Docker
Recently I came across the situation where I needed to run the PHPUnit tests for the project I was working on in PHP 5.6 as they were failing in Travis. The project was a Laravel project and so was running in a Homestead box using PHP 7.
Backing Up Laravel Homestead Databases
Laravel Homestead is an awesome tool for building Laravel sites. However, sometimes it would be nice if when you did a vagrant destory you wouldn’t lose all of the information in your databases. Or in my case, if you database crashes and you can’t get it back up, it would be great if you had ...
Conditional Breakpoints in PhpStorm
Here is a quick tip: Have you ever been debugging code in a loop and only wanted to trigger a breakpoint if a specific condition is met? In PhpStorm it’s actually very simple. Right click on the breakpoint and add a “Condition”.
How and why I built Web Uptime
Back in May this year I launched a new side project called Web Uptime. Web Uptime provides multi-location website uptime monitoring for your sites. I’m not going to talk so much about what Web Uptime does here, you can see the marketing site to find out more, rather I’m going to talk about ho...
Becoming a Father
On the 23rd March 2016 at 10:31pm my life changed. I had spent months pre-empting what it would be like to become a father.
Setting up Xdebug on Homestead 4.0 (PHP 7)
As Xdebug has been removed from the default Homestead box you now need to install it manually to be able to use it.
2015
2015 Year In Review
For pretty much five years running now I’ve taken time at the end of the year to reflect on the year that’s been, and look ahead to the year that’s to come. Last year I wanted to continue to work smarter, not harder and strike a better balance of “busyness” in my life. While I’m not s...
The Dangers of Selling under Non-Disclosure
Back in the summer I sold one of my small SAAS apps that had around 100 paying customers. After trying a few private channels someone recommended I try selling the app through a broker. I had sold a few apps on Flippa before but nothing of this value and I wanted to see if I could get a decent va...
Setting up Laravel 5 for Travis CI
Continuous integration testing is awesome and if you build software with a team you really should have it up and running. Travis CI is a free (for public repos) service which connects to your GitHub repositories and automatically runs your tests whenever someone pushes to your repo (all configura...
WordPress Dependency Management
Recently I’ve been thinking a lot about WordPress and Composer (see my recent series on using WordPress with Git & Composer over on Delicious Brains) and how WordPress might implement dependency management at the core level. As more and more plugin developers start making use of Composer to...
Up and Running with Grunt Part 3: Automating Grunt Tasks
In this tutorial we look at automating Grunt tasks (so you don’t have to re-run grunt all the time) using the “watch” task.
Up and Running with Grunt Part 2: Creating a Gruntfile
In this tutorial we look at setting up and Gruntfile and installing a SASS package to compile our style.scss file.
Up and Running with Grunt Part 1: Installing Grunt
For a while now I’ve been wanting to be better at “sharing everything I know”. I’ve also been wanting to start doing video tutorial series. So today I’m launching the Build The Web YouTube channel (as a partner to the Build The Web Newsletter) which combines these two goals.
Expecting
It’s great to finally be able to announce that my wife and I are expecting a wee bundle of joy in March next year. It’s been a bit of a long road for us with many trials along the way.
Testing defines in PHPUnit
This one tripped me up recently. Say you are wanting to test a bit of code using PHPunit that relies on a defined constant. You don’t want the define() to affect your other tests, you only want it to apply for this specific test.
Watching Our Words
Apparently your tongue only makes up 0.4% of your total body weight, yet it has the power to crush or empower people around you. I don’t think anyone would argue that our words have a strong impact on those we converse with each day, and yet how long do we take to consider what it is that leave...
My Mac OS X Bash Profile
For a while now I’ve been beefing up my .bash_profile script with useful aliases. If you don’t know what .bash_profile is then read this great article which explains what it is and contains loads of useful info for getting started.
WordCamp Miami 2015 Review
Last week I attended my fist WordCamp in Miami. As I said before it really was a week of firsts. It was my first time in the USA (and my first time in Miami obviously), my first long haul flight, my first WordCamp and the first time meeting the Delicious Brains team.
I’m Changing My Job
For the last 3.5 years I’ve been working as a web developer over at ZillaMedia. In my time there I have worked on some awesome projects including building Snippi, working on PremiumPixels and building WordPress themes for ThemeZilla.
Structuring Sass for Web Apps & Larger Projects
I’ve been using Sass (specifically Scss) as my preprocesser of choice for some time now and it’s invaluable for taming your CSS when building larger projects (such as web apps).
2014
2014 Year in Review
It’s that time of year again to look back, take stock and reflect on what a year has brought. At the end of last year I resolved to be working smarter, not harder. While I may have achieved this goal to a certain extent there have been certain unforseen situations in 2014 which have hindered my...
PHP concepts to learn before diving into Laravel 5
Laravel is an awesome framework for PHP and I have been using the upcoming version 5 (currently in alpha) for some time now. Being a big, powerful framework Laravel has always suffered from a steep learning curve, and the update from 4 to 5 is no different.
Git is Way Too Complex
Recently I have migrated over from Subversion to Git as my VCS of choice. While Git has many great features and is much faster than SVN I still think its way too complicated for the average user.
Fixing NPM EACCES Error on OS X
So if you’ve installed Node using root permissions you might get an npm ERR! Error: EACCES when trying to install npm packages. This means you need to use sudo every time you want to install a package (not ideal). Apparently this is the case when you use the .pkg installer on OS X.
On Scottish Independence
I’ve been wanting to get my thoughts on Scottish Independence down in a coherent fashion for a while now, so here goes.
The Ideal Image Slider
While a lot people seem to applaud the death of the image slider these days, I still see them used all over the place and I still have to occasionally implement them myself. In short I don’t think they are going away any time soon.
How Raneto got to the front page of Hacker News for $0
On Monday morning around 11am I released Raneto my new project for creating Markdown powered Knowledgebases in Nodejs. After I came back from lunch (around 2pm) I was stunned to see I was at spot no. 6 on the front page of Hacker News and remained there for the rest of the day.
How to Decrypt an Encrypted SSL Key
A couple of times recently I’ve ran into the issue where I have receieved an encrypted SSL key from my registrar, but my hosting software won’t allow me to use an encrypted SSL key. The good reason for this is that if the key is encrypted, you’d have to enter the passphrase every time the w...
Cow Launcher
Over Christmas I decided that I wanted to achieve two goals this year that I have been putting off for a while. I wanted to make a game, and I wanted to get an app on the Apple App Store.
Becoming a Devtrepreneur
Recently a fellow Devtrepreneur contacted me to ask a few questions about my path to becoming a Devtrepreneur. So I decided that I would make my answers public in the form of this blog post so that others might gain a bit of insight into what has worked for me.
2013
2013 Year in Review
I like to take the opportunity at this time of year to look back, take stock and be thankful for what the year has brought. As with last year, this year has had its up’s and down’s but in general has been a good year.
Pricing is Hard
Over at Dev7studios we sell WordPress plugins and Web Apps so I’ve had to make decisions on single product pricing as well as SaaS pricing over the years, and none of it has been simple.
Selling to a Mass Market
One of things I discovered after launching the Nivo Slider WordPress Plugin was that the people who bought the plugin were not the people that I had expected to buy the plugin.
PHP Relative Time Function
Nice and simple. Converts a date to a relative time (e.g. “3 weeks ago”).
OS X Terminal Command to Find All Assets
So here is something which just came in handy. This Terminal command finds and lists all of the assets (JS/CSS/Images) of your “assets” folder in your web project.
Bootstrapping a Small Software Business
I’ve been running a small Web Development company for more than two years now. Dev7studios has been successfully profitable from day one. That may sound great, but that is partly because we are such a small scale company. In fact Dev7studios started as more of an outlet for my development ideas...
JavaScript Date.toMysql()
This just came in handy for me. It extends JavaScript’s Date() object and adds a toMysql() function for when you need to convert a JavaScript Date object to a MySQL Datetime format (in UTC).
Devtrepreneur
I always feel a bit guilty calling myself an “entrepreneur”. I mean I do run a successful company which I’ve bootstrapped myself (“successful” here meaning that it is a profitable lifestyle business where I can afford to hire a few extra folks to help spread the load). But I don’t thi...
2012
2012 Year in Review
So it’s that time of year again to look back, take stock and generally be thankful for another year. This year has been very mixed for me with up’s and down’s, however the one thing that has stuck out for me this year is how busy I’ve been.
PHP Quick Convert String to Slug
Another quick and simple one.
Complexity Exists. Make it Clear.
I’ll always remember being taught how transistor switches worked in my Technical Studies class at high school. I just didn’t get it. I couldn’t wrap my head around how it worked. Then my teacher sat us down and explained it to us in such a simple way that everything just “clicked”. Ligh...
2011
Nivo Slider: The Story So Far
I should start this article by explaining the fact that I am not a born and bred entrepreneur. I’m a developer at heart who has literally stumbled upon “success” just as I was beginning to get interested in the whole business side of the web. I’ve been wanting to write this article for a ...
Getting My Web Development On
So today I started my new job as a full-time Web Developer working for Orman Clark. Working from home has been great so far, and I’m loving my new iMac that I purchased recently to help me get my work done more efficiently.
The Next Chapter
For the last 3 years (excluding my final year of uni in-between) I’ve been working as a Software Engineer with a company that specialise in North Sea Oil and Gas. While the job has been enjoyable enough, as time has gone on, one thing has become very clear. I don’t want to work in this industry.
BioThemes Closes
A year after starting development work on BioThemes, and about seven months in business, John O’Nolan and myself have decided to shut down BioThemes. We both feel this is the right decision and neither of us feel upset that we’ve reached this point.
Nivo Slider WordPress Plugin
So last week I launched the official Nivo Slider WordPress Plugin. It’s been a while in the making so it’s good to finally get it out. It’s also the first step towards the Nivo Slider Pro package, so this one isn’t free.
Forget the Recession, Start a Business
I was interested to hear Lord Alan Sugar’s opinion when asked about the new season of The Apprentice. Talking about the show’s new prize (£250,000 investment rather than a job) he said...
You Don’t Need a Brilliant Idea to Start a Startup
In this article Paul Graham states that “you don’t need a brilliant idea to start a startup”. I’ve been thinking about this recently and about how true it is.
The Nivo Slider is 1 Year Old
Today marks the 1 year anniversary of the now world renowned Nivo Slider. To celebrate here are some fun facts about the slider over the last year.
BioThemes
For the past few months now I’ve been hinting that I’ve been working on something huge and exciting but couldn’t tell anyone what it was all about. Well today I can finally reveal what it is that’s been keeping me busy and excited and I’m sure you’re going to love it.
2010
I don’t think I’ll forget 2010
As a year draws to a close I always find it helpful to look back and take stock of what has happened over the year, and this year has been an especially mental year for me personally. It’s good to be thankful for what you have in your life and what you have achieved or been blessed with over th...
Developers, Design is Important
I think part of the problem with a lot of developers today is that they don’t spend enough time caring about design. Maybe they are scared of design, maybe they simply don’t want to learn how to do it or maybe they just think it’s not their job.
Strict comparisons (===) in PHP
Have you ever seen a statement like if ($a === $b) and wondered what the whole triple equals thing is all about? Well it is actually quite simple. Assigning and comparing variables in PHP goes like this:
I’m Married
If you’ve maybe been wondering why I’ve been so quiet over the last few weeks and if you don’t follow me on twitter then you probably should know that I got married two weeks ago. I’ve been going out with Fiona now for 5 years and we had been engaged for 2 of those.
I’m Qualified
I received my exam results the other day. I’m now an officially qualified Software Engineer with a Bachelor of Science Honours degree from Strathclyde University. I received a Second Class Honours degree, upper division (which translates as a 2:1).
Developers, Sell Your Scripts
Before I even begin saying anything this article is not about encouraging developers to sell their scripts on sites like CodeCanyon (not that there is anything wrong with that). Rather I am going to take you through the process of things I did when creating the Nivo Slider, other than simply crea...