Async Conf – An Asynchronous Online Conference

Ever since the world of tech conferences went to shit last year, I’ve not attended any virtual ones. They don’t appeal to me at all. The main reason is that when I attend conferences, it’s to meet up with my fellow attendees, greet old friends, meet new ones, and discuss all manner of topics. Attending talks and workshops is usually a secondary activity, and I typically only attend a handful, generally, those that really interest me. Trying to replicate the in-person format via a virtual event holds no interest to me whatsoever, without that in-person element.

A couple of nights ago, an idea for a different type of virtual conference came to me, one that I might prefer actually to be part of.

Based on the limited (45 votes) feedback I got, it seems a number of folks I know on social media would be interested to be part of such an event, and so I’ve decided to make it happen.


For now, I’m calling it async conf. Firstly, because I can make use of the JavaScript async keyword for the website.

async () => { 
    return "conf" 

Secondly, well, I’m sometimes terrible at naming things. 😞 I’m open to ideas, but I want the name to reflect the asynchronous nature of the conference, and be web technology related.

I also don’t want it to be tied to one specific web technology that I’m involved in, I’d prefer it to be something more open to a wider audience.

Next up is cost. I’m going to need a few pieces to make this happen.

  • A domain – currently, the one I want will cost $20 if I can buy the damn thing.
  • Hosting – I can get away with using one of my own SpinupWP managed servers, but it might be a good idea to at least host the site on its own DigitalOcean instance. I’ll probably need it for at least a month, so $10.
  • A website – it’s going to need to allow member registration as well as the ability to host member restricted content. I could roll something myself with Laravel, but it will probably be easier to use WordPress and something like Paid Memberships Pro. I also happen to know the PMPro folks, and I might be able to swing a free license from them if I need any of their paid add ons.
  • Time zone-based emails – I might have to develop myself, as I’m not sure of any existing WordPress plugin that does this. Basically, attendees need to set their time zone and a time at which they would like to receive the email.
  • Email deliverability – no idea what this might cost, but Mailgun starts at $35 a month for 50 000 emails, and I doubt I would need that much.
  • Video hosting – I have no idea what I’m going to need here. Vimeo’s Pro plan has 20GB of streaming and 1TB of storage. Hopefully, that should be enough, at around $25. The other option is to go with YouTube and use unlisted videos, which might not be a bad idea.
  • Pop up Slack-style messaging platform – I already know how I’m going to handle that.

All in all, that works out to around $100 in costs, less if I use YouTube for the video hosting, but it’s a nice round number. If I charge folks $10 to take part, I need 10 attendees to break even. I don’t want to make any money off this, so if I do make a profit, I’ll either be looking to donate the surplus or use it to sponsor open source development.

I’m also going to need help, both in organizing it, and also finding folks to speak. I think once I’ve managed to purchase the domain, and set up the basic site, a call for organisers and speakers is in order.

Development Experiences Laravel

From Digital Ocean App Platform to Self Hosted SpinupWP Managed VPS

Earlier this year, I threw together a silly little joke app built on Laravel in a couple of hours. I had merely wanted to participate in the Digital Ocean App Platform Hackathon and had no further plans for the app.

Another App Platform Hackathon participant liked it enough to contribute some substantial improvements, including a shiny new front end built in Tailwind and, more recently, some logos.

Over time I’ve had a few additional ideas for the app, and I’ve been hacking on some of them on the weekends. As the feature set has grown, so have the infrastructure requirements. This past weekend, I needed a database to store the Jokes.

While the original App Platform implementation was sufficient, I wanted something I could customize a bit more in line with my own hobbyist sysadmin experience, managing a site on a server I control.

Enter SpinupWP

I’ve previously blogged about how straightforward it was to move my WordPress sites to my new SpinupWP managed instances, so I wondered how hard it would be to install and manage a Laravel app. It turns out it was a lot easier than I expected.

Disclaimer: I currently work for the company behind SpinupWP. That doesn’t take away from the fact that they’ve built an awesome cloud server dashboard that I am learning fun new things about every day. It is, however, one of the reasons I applied to work there.

The only webserver software I needed to install myself was Node.js and npm to build the Tailwind front end. To do this, I used the NodeSource Node.js Binary Distributions. I had some problems following the default install of the latest LTS version of Node.js, but I got around it by manually adding the apt repository.

sudo add-apt-repository -y -r ppa:chris-lea/node.js

Once that was done, I could follow the install instructions for Node.js LTS (v14.x) on Ubuntu.

curl -fsSL | sudo -E bash -
sudo apt-get install -y nodejs

Next up, I created a new site on one of my SpinupWP managed servers. Instead of choosing the WordPress install option, I went with the “Clone a Git Repository” option. I entered my Git repo URL, branch name, and any build commands I needed for the Laravel app.

I didn’t check the “Enable push to deploy” option. For now, I’m happy to manually push the “Deploy Now” button whenever I make changes, but I’m keen to set this up next.

All that was left was to create the database in the next step of the new site wizard, wait about 30 seconds while SpinupWP provisioned the new site, add the relevant credentials to the Laravel .env file in the project webroot, and click “Deploy Now”. While the site was deploying, I canceled the App Platform app and set up the new DNS settings to point to the server, and in the space of about an hour, things were up and running.

I know SpinupWP markets itself as specifically a WordPress self-hosted server product, but it was really cool to see that it could manage pretty much any modern web app, with just a few small tweaks.


WordPress Developer Educator at Delicious Brains

This week I started my new journey as the WordPress Developer Educator at Delicious Brains. I could not be more enthusiastic about where this path will take me.

Why Delicious Brains?

Delicious Brains is a WordPress focused company that not only I admire but they have a solid standing in the WordPress community.

They build, in my opinion, some of the best free and paid developer-focused products for WordPress available.

WP Migrate DB has been my default plugin for exporting a WordPress database since I first started developing for WordPress. While I’ve never needed the Pro version, I’ve heard great things about it from people I trust. In my freelance days, I had the opportunity to build an extension for WP Offload Media (when it was still called Offload to S3) for a Codeable client. The experience of working with their code was a delight.

I also had the opportunity to incorporate some of their development team’s open-source packages into my own client projects.

Every time I’ve had the pleasure to work with their open-source code, it’s been well written, clearly documented, and easy to extend.

SpinupWP, their cloud-based server control panel for WordPress, is an exciting product in the self-hosted WordPress space, which was launched to rave reviews. I recently had the opportunity to finally try it out, and I can completely see why folks love it so much.

I had the privilege to share a beer or two with Brad and a part of the team in Berlin in 2019 and had continued chats with them since then online. They are always super helpful and friendly.

When I shared the news of my joining Delicious Brains privately with a few friends who work in WordPress land, they could not speak more highly of the company. As someone said to me in a private message, “They have a great reputation in the ecosystem.” And it’s true; you will probably find it hard to find anyone who doesn’t like the company, the team, or their products.

Finally, and more importantly, Delicious Brains puts out some of the best developer-focused content on the web. They are one of only a few WordPress developer-focused newsletters I subscribe to and make a point of reading every article they publish.

What is a WordPress Developer Educator?

The easiest way to explain that is to quote from the original job posting:

First, this is not a Technical Writer position. While we can appreciate talented writers who can understand technical concepts and explain them to a non-technical audience, this job is not that.

Our audience is developers, so we need a great writer with lots of experience in advanced web development. Or an advanced web developer who is a great writer and wants to explore development through writing full-time.

As the dedicated writer on our team, you’ll write tutorials, documentation, and marketing copy and help our team with their writing. You’ll also do a little customer support and might even help out with the development of our products and sites from time to time.

But you’re a developer. Why throw it all away to be a writer and educator?

As far back as I can remember, I always wanted to be a writer.

My earliest memories are of writing. I would create mostly fantastic stories based on Roald Dahl’s works or science fiction adventures in worlds I would create in my own imagination. As I grew older, this morphed into jokes, anecdotes, and cartoons that gave me an outlet for my teenage angst and an attempt to make sense of the world around me. 

The writing was not something that I ever saw as a possible career path, and so it remained in the realm of a hobby. I didn’t anticipate how the introduction of the internet would change how we consume information and that creating online content would become such a large part of what we do.

I started blogging in 2009, mostly documenting things I learned as a PHP developer, and as time passed, I found that my love of writing could be beneficial to my job. At several companies, the developers were not big on writing things down, so internal developer documentation efforts suffered. This was before we had tools like phpDocumentor. That meant that I would often champion these internal documentation efforts, from new developer manuals to user-facing documentation. The sentence “Is there documentation for this?” is often something that you would have heard me repeating during a stand-up.

In 2016, when I became a freelance WordPress developer, I discovered something interesting. Not only could the art of writing help generate traffic to my blog, which converted into work, but it was also a way of sharing knowledge with a wider audience. Since discovering that my writing enjoyment could be beneficial to my freelance development journey, I’ve spent the past 4 years doing as much writing as possible. I’m proud to say I have published articles about various WordPress related topics for many online platforms, including WPTavern, the Go blog, Jetpack blog, and Smashing Magazine.

Craig at Castos first shared the Delicious Brains job posting with me more than a year ago now. And as much as I told myself I was happy where I was then, the idea embedded itself into the back of my brain and stayed there, popping up now and then. I never did take the plunge, though.

And then, a series of fortunate events occurred. I’d written a post for WPTavern about getting ready for the upcoming PHP 8 release. Brad from Delicious Brains included it in an email about their plugins being PHP 8 ready. I was amazed that he thought my article was useful to his developer community, and that idea in the back of my brain jumped up and started banging on the inside of my eyeballs. The rest, as the saying goes, is history.

Will you still be building software?

I don’t think I’ll ever stop being a developer, much in the same way that I probably never stopped being a writer. I don’t expect to do much product development in my new position, other than possibly coding examples for the developer-focused content I’ll be working on. I’ll still be taking part in any open source projects I currently contribute to, like WP Notify, or on my hobby side projects, like Dev Dad Jokes. It just won’t be what defines me anymore.

To be honest, I’m quite happy about that.


4 Years at Castos – and Why It Was Time to Leave.

This year marks my 4th working at Castos on our podcast hosting, analytics, productions platform and Seriously Simple Podcasting, our podcasting plugin for WordPress.

Today also happens to be the last.

Looking back

Craig Hewitt, founder, and CEO of Castos, first contacted me on December 27, 2016. He let me know he’d recently purchased the Seriously Simple Podcasting plugin from my friend Hugh. He also mentioned that he was wanting to build a podcast hosting SaaS application to support the plugin. At the time, I was on vacation, and we agreed to chat when I got back.

I treated Craig like any other freelance client; I invited him to post a project through the Codeable platform. We started our first project discussions on Jan 9, 2017.

The first plugin update we pushed out to Seriously Simple Podcasting was version 1.15.2 on April 19, 2017, which only included adding support for certain iTunes fields in the RSS feed and a filter for the post meta key that stores the audio file URL. However, in the background, we were feverishly working towards version 1 of Craig’s podcast hosting SaaS idea.

On Apr 6, 2017, Seriously Simple Hosting went live at Only one capture for that URL exists on the Internet Archive because it was renamed to Castos soon afterwards. A little known fact of that first version was that Craig, an admitted non-technical person, built all the front end you see on that home page!

On June 01, 2017, Craig and I switched to an ongoing, part-time contractor agreement. Along the way, the team grew to include a second Laravel developer, Danilo, a Customer Support Specialist, Eileen, and our Analytics Engineer, Stefan.

At the end of 2018, I switched from spending a smaller percentage of my time on Castos to spending quite a large portion of my time working on the project. The business was accepted into the first cohort of the TinySeed accelerator, and we added a Growth Marketing Specialist, Denise, to grow our customer numbers. By the time Craig, Danilo, and I met in person in June 2019 at WordCamp EU in Berlin, we were a team of 6 and growing rapidly.

I consider myself extremely fortunate that when the global pandemic hit in 2020, Castos continued to thrive and grow. During that time, we welcomed our new Director of Podcast Success, Matt, bid farewell to Denise, welcomed Becky from Craig’s other business, Podcastmotor, which merged into Castos as Castos Productions, and were joined by Kim on Customer Support, Dennis in Marketing, and Alec and Sergey as our newest Laravel and WordPress developers respectfully.

I recently reached out to my social media community, to see how many folks I know use our products. The response was humbling.

Coming to a fork in the road

During the latter half of 2020, Craig and I started having some discussions about my role in the company and where he saw it going in the future, with the development team’s growth.

Those discussions made me stop and take a critical look at my professional career and whether I really wanted to keep going down this path.

It reminded me of a poem I’d once had to memorise when I was younger called “The Road Not Taken” by Robert Frost. I was about 12 or so, and I took part in our local poetry Eisteddfod, reciting this poem. For whatever reason, the words have stuck with me since then.

As I thought about my future, I recalled the final stanza, and the words seemed apt to my situation.

I shall be telling this with a sigh
Somewhere ages and ages hence:
Two roads diverged in a wood, and I—
I took the one less travelled by,
And that has made all the difference.

Robert Frost

Asking Why

About six months before I started working with Craig on Castos, I wrote a blog post, mostly for myself, as a reminder of why I’d chosen the current path I was on. At the time, I wrote these words:

The honest truth is that I shouldn’t be working as a freelancer. I should be working for a company, where I am simply a small cog in a bigger machine.

Remembering ‘Why?’ – July 15, 2016

As I took a look back at the last 4 years with Castos and the 12 odd years of software development before that, I found myself re-reading that post and asking myself why again. Surprisingly, the answer I got was very different from what it was before.

In that same post I had said the following:

I became a software developer for the simple reason that I like writing, be it code, a technical document or a tutorial or a blog post. I’m not what I would call a ‘creative’, I can’t draw or design something to save my life. What I can do is develop software that solves a specific problem or write an article or tutorial that helps someone achieve a specific task.

Remembering ‘Why?’ – July 15, 2016

And as I read it, I realized that that statement had changed. I no longer wanted to write code for a living. I no longer wanted to develop software to solve someone’s specific problem. I’d reached a point where I wasn’t enjoying the process of software development anymore. After 16 years of building software, I desperately needed to do something else.

The realisation that I was not enjoying the well-known path anymore, coupled with the fact that my future was looking very much tied into that path, made me stop and consider whether this was the road I wanted to stay on.

As it turns out, the answer was, no.

Now what?

During this process of self-realisation, I took the 16 Personalities Test. As I read it, I discovered that how I felt about my future as a developer had a lot to do with my personality. The frustrations I experienced were less because of the people/product I was working with and more about the actual work. I understood what I probably should be doing, and the path in front of me was very different. It was time to take a chance and see if it would be possible to make a change now or continue down a path that might not work out for the best in the future.

And so today, I leave my position as Lead Developer at Castos to take on an exciting, but also scary, new journey. I will be taking off my developer cap and putting on another one. It’s a path that will challenge me in interesting, new ways. It will promote new learning and growth. Finally, it is a path that I feel is more in-line with my personality and able to do my best work.

I’m taking the road less travelled by, and I believe it will make all the difference.

Development Experiences Ubuntu WordPress

Migrating My Cloud Virtual Servers to SpinupWP

I’ve never been a fan of managed WordPress hosting. Don’t get me wrong; I appreciate what managed WordPress hosts do, and they are definitely doing amazing work, but it’s just not for me.

As a developer and server admin hobbyist, I prefer to own my own VPS (virtual private servers). I started using Rackspace Cloud VPS in 2008 and managed a few personal and client sites on virtual servers. When Digital Ocean launched, I moved all of my sites to Digital Ocean droplets. I’ve always enjoyed using VPS environments, as they give me complete control over my web hosting infrastructure.

The two downsides to this DIY approach is security and site management. Not being an experienced Linux sysadmin, I was always concerned that I might miss something important that led to my servers getting hacked. Setting up new sites on the same server meant manually creating site folders, databases, and virtual host configurations.

So when I discovered ServerPilot in 2016, it was almost a no brainer. It gave me the flexibility to own my virtual servers to create and manage new sites on the fly. It has some shortcomings, but I could find workarounds for them to get things the way I wanted.

Then, early in 2019, Delicious Brains launched SpinupWP.

I’ve been a fan and follower of the team at Delicious Brains for a few years now, and their take on the cloud-based server control panel was exciting to me. The features listed on the website provided a better feature set than the ServerPilot service. I had to try it out.

Unfortunately, time, work and life got in the way. It took me almost two years to finally give it a try, and now that I have, I’m annoyed I didn’t do it earlier.

What makes SpinupWP better?

There are quite a few reasons I like SpinupWP more; this is just a shortlist of my initial thoughts during the process of migrating my sites over.

1. API Access

SpinupWP connects to your cloud service provider via their API. This is great because it means you can actually spin up 😀 a server from the dashboard. With ServerPilot, you have to create the server from your VPS provider first, and you have to provide root user access, which is a bit of a security risk.

2. Easy setup wizards

Setting up a new server instance to creating a new site, you are guided through the process using step-by-step setup wizards. One of the things I like about these setup processes is they’ve thought of the different types of site migration and provide options like setting up a new site to simply provisioning an empty one to be migrated over.

3. Handy help sections

This is one of my favourite parts of the setup wizards. For almost every field you have to enter, there is a help area to the right of the view that describes what that field is for or includes more information or links to a help document. This is very handy when you’re not 100% sure of what you need to input.

4. Click to Copy

Every single piece of text (and I mean every single one) that you might need to copy to be pasted elsewhere can be copied to your clipboard via a single click. You have no idea how much time this saves when you migrate sites over to a new platform.

If I have one complaint here, the domain portion of the TXT record I needed to copy for the SSL certificate generation copied the entire text when I just needed the part before the domain name. That being said, this was the only hiccup I encountered using the product on my first try.

5. Event log

At the top right of the screen is a button to view an entire log of everything you’ve done on the platform. This is extremely useful if you need to see the status of some task running in the background.

6. Security first

Because SpinupWP creates new server instances for you, they automatically disable root access. Then, any time a new site is created, a new user is created to manage that site. These site users do not have sudo access, which means they can only manage the specific site’s files and data. You can create separate sudo users to give you a higher level of control. Finally, you can choose to access your servers using SSH public key authentication for an enhanced level of security.

7. Faster out of the box.

I moved my main domain (this blog) over to a new server first. I specifically chose PHP 7.3 as the PHP version because it was running on the older server. I don’t do any specific speed tuning, and just by migrating my site from a ServerPilot managed instance to SpinupWP, I gained an 11% speed increase on GTMetrix.


I managed to move all 3 of my personal “production” domains over to a SpinupWP managed server over the weekend. I’ve not really had a chance to dive into the dashboard fully, but I’m looking forward to seeing what else is possible. I really appreciate the product because you can see it’s the result of years of working with different WordPress hosting types. It’s designed for developers to make it as straightforward as possible to leverage the power, and cost-saving, of cloud-based virtual private servers, with the speed and security of a managed solution.

If you’re a WordPress developer, and you have sites you host yourself, or you want to self manage your client’s web hosting but are concerned about ease of use, stability, and security, I highly recommend giving SpinupWP a spin.

Development Experiences

How Taking the 16 Personalities Test Helped Me Understand Myself Better

For the past three years, I have been having some serious thoughts about my future as a software developer. Since I turned 40 in 2017, I’ve been wondering if the path I was on was the right one for me. This led to a lot of frustration in my work, especially when it came to the minutiae of managing the process and the people involved in building a software product.

Around mid way through last year, someone I follow on social media posted an article titled “Builders and architects: two types of programmers“. In the article, the author summarizes the differences in this way.

The first ones, the builders, are the programmers who get things done. They work efficiently. Besides their daytime job, they come up with these amazing side projects and to the outside world, it looks like writing code comes naturally to them.

On the other hand, there are architects. They are concerned about sturdy and structurally sound code. They spend hours, sometimes days, debating the right way to solve a problem.

Now, I’ve always known that I am more a builder than an architect. As I’ve gotten older/more experienced I’m starting to think more like an architect, concerning myself with code quality and spending hours, even days, debating the right way to fix a problem. Given the choice, however, I’d rather find a library that an architect has built, and use that to get things done. So reading the article was more of a case of wanting to know how the author perceived it, less about understanding myself

What I didn’t expect was that there was something else in the content that evoked a response in me. In the article, the author discusses the Myers–Briggs Type Indicator test, also more commonly known as the 16 Personalities test. He references the test, how each member of his team had taken it, and how it had helped them work with each other better.

Not only did the majority of people recognise themselves in their profile, it also exposed struggles and hidden frustrations that were never shared before, because no one knew how to deal with them. Now we did.

I had heard about the 16 Personalities test but never taken it. The article inspired me to take the time to run through the questions, and I received my result. As it turns out, I am a Mediator Personality (INFP-T), and as I read the result, I was surprised to discover things about myself that I’d never realized were true until I thought about them.

Mediators tend to crave opportunities for creative self-expression. It comes as no surprise that many famous Mediators are poets, writers, and actors.

It did in fact come as no surprise that I seek writing opportunities whenever I can find them. I even made it one of my personal and professional goals for 2021.

Mediators may feel directionless or stuck unless they connect with a sense of purpose for their lives. For many Mediators, this purpose has something to do with helping and uplifting others.

This could not be more true, I often feel as though software development is my job (ie it pays the bills), but helping and uplifting others through software development (writing, speaking, mentoring) is my purpose. I’ve just never had many professional opportunities to do so, so I actively seek out volunteer activities that allow me to express this purpose, and then become frustrated when my job gets in the way.

Mediators can expect so much from themselves that they inevitably fall short. When this happens, they may accuse themselves of being selfish or woefully inadequate. This self-criticism can erode their motivation to get things done and their willingness to prioritize necessary self-care

Which I’m sure doesn’t help my imposter syndrome any…

Mediators generally prefer to avoid conflict. They can put a great deal of time and energy into trying to please everyone. This desire to please others can drown out their own inner wisdom and make them painfully sensitive to even constructive criticism.

This was an eye-opener and explained how I rarely will bring up frustrations and issues I have at work, or at home. Rather I opt to try and put on a brave face, which fails miserably, or rant and rave in my own headspace, where no one can see what I’m going through.

Mediators can succeed nearly anywhere, but certain fields seem to be especially attractive to these personalities. With their curiosity and their love of self-expression, many Mediators dream of becoming writers. They might write novels, seek out interesting freelance niches, or even find themselves doing communications in a corporate field or for a nonprofit organization.

There’s that writing thing again… my favourite year of freelance work was 2019 when I was actively writing for the Go blog.

Mediators may find it demotivating to work in high-stress, bureaucratic, or hectic environments. They may also become frustrated by workplaces that are highly critical or competitive.

Software development….high-stress, check…hectic, check…critical, check…competitive, check…

In reading through my personality type, I came to realise that the way I had been feeling about myself and my career, was less about the work itself, and more about my personality. The part I struggled with was what to do with this information.

What I did know was that I needed to actively look for ways to figure this problem out. I did not want to end up somewhere down the road making a rash decision, which would have unexpected consequences. I needed to take some time and consider my options…


My freeCodeCamp Article on PHP Error Reporting

Earlier this year I shared my professional goals for 2021. One of those goals was that I wanted to seek out more writing opportunities for other online publications.

While the crux of that goal was to get paid to write more, sometimes an opportunity comes along that is worth more than money.

Sometime in 2019, I saw a Twitter conversation with Quincy Larson, the founder of freeCodeCamp.

If you’ve never heard of freeCodeCamp, they are a nonprofit community that helps you learn to code by building projects for other nonprofits. I’ve followed their story since around 2015, and I was really impressed by their curriculum, the way they teach, how varied the community is, and how much great coding content they put out.

So anyway, back to the Twitter conversation, his interest in PHP articles intrigued me, so I sent Quincy a DM, and we got to chatting about it.

Fast forward to 2021, and I’m happy to say that my first PHP related article on freeCodeCamp has been published:

How to Display PHP Errors and Enable Error Reporting on freeCodeCamp.

My goal here is to introduce a new generation to all the fun things that are possible developing in PHP, while also sharing some useful knowledge bombs along the way. I plan to try and put out at least one PHP related article on freeCodeCamp every month.

If you like the post, please feel free to share it directly from the freeCodeCamp site.


Why I (still) love PHPMyAdmin

Sometime in 2019, I was sitting at a conference, when we could still do such things, listening to the first speaker of the day, while getting some Castos support work wrapped up. Someone behind me tapped me on the shoulder, pointed, and laughed saying “You should be using the command line!” It took me a moment to realise what he was mocking me for. I had phpMyAdmin open.

phpMyAdmin is (from their website) “a free software tool written in PHP, intended to handle the administration of MySQL over the Web.” I honestly don’t recall when I first started using it to manage my MySQL databases, but I’m pretty sure it came installed with Wampserver, which was my first PHP local development environment. 16 years later, and I still use phpMyAdmin to this day, both in my local development environment, and, in some cases, to access production databases.

Authors note: if you choose to use phpMyAdmin in a production environment, make sure you secure it properly. This article isn’t about that, but there is plenty of information on how to secure your phpMyAdmin install in the official documentation.

Security concerns around using PHP software to access your production databases aside, I’ve tried all sorts of applications as replacements for phpMyAdmin, from MySQL Workbench to Navicat, and even the command line, and I still come back to phpMyAdmin like an old, comfortable pair of shoes.

1. It’s Free and Open Source

As someone who supports paying for premium products, the fact that it has remained free and open source for 21 years is quite an amazing feat. It’s probably the longest-running piece of open source PHP software still relevant today.

2. It’s easy to install

It can be installed on any web server that supports PHP, which means probably either Apache or Nginx, with one single command. As it’s a PHP web app with an HTML front end, there are no real requirements other than what you might already have for a regular PHP web app.

3. It’s light weight

It’s a PHP app, so it doesn’t take up any extra memory when it’s being used, other than what it needs to perform the next request. The download is only 13mb in size, and that includes all the different language files.

4. The search functionality is pretty cool

This is about my favourite feature of phpMyAdmin, the fact that it has a search form for each table. Using the form, you can search for any data, across any of the fields, in a table, using any combination of operators, including LIKE queries, in a matter of seconds. In my opinion, it’s the fastest way to lookup data when you need to.

I do use a GUI like MySQLWorkbench, mainly when I need to prepare complex SQL queries or export larger sets of specific data because the PHP memory limits sometimes mean exports via PHPMyAdmin can’t cut it, but for the most straightforward tasks, like data lookups, I’ve not found anything on Linux that beats PHPMyAdmin.


Zero-configuration debugging PHP with Xdebug in PHPStorm on Ubuntu

As with many of my blog posts, this one also started with a Tweet

I’ve been using Xdebug on Ubuntu in PHPStorm for going on 4 years now, and as I’ve been actively blogging about my development set up, I thought for sure I’d written about this. Turns out I had not, and so here we are.

Why Zero-configuration debugging?

To be honest, if you can read the Zero-configuration debugging help doc from PHPStorm, you probably don’t need this article. I think that doc might even be the reason I’ve never blogged about it. It really is the quickest way to get up and running debugging your code inside PHPStorm with Xdebug.

The PHPStorm Zero-configuration debugging process requires almost zero configuration. Install a few tools, turn a few things on, hit refresh in your browser, and you’re step debugging your PHP code.

It might not be as completely integrated into your PHPStorm environment as a fully configured set up, but it quickly gets you into the world of debugging PHP line by line.

A note on local environments. This article covers using either Apache or Nginx installed directly on your Ubuntu machine with PHP, and not running inside any virtual environment. It is possible to use this set up if you are using some form of virtualisation, but that’s a topic for another post.

So let’s dive into the details.

Install Xdebug

The Xdebug installation docs include a detailed list of install commands for a wide range of Linux operating systems. On Ubuntu, since 18.04, it’s as straightforward as running the following command.

sudo apt-get install php-xdebug

The instructions also include how to install a specific version of Xdebug if you’re using a different version of PHP than what is available on your version of Ubuntu’s repositories, like if you’re using Ondřej Surý’s PPA.

A note on versions. Depending on your Ubuntu version, the version of Xdebug in the repository might be out of date. For example on my old 20.04 LTS workstation, the Xdebug version is 2.9.3 for some reason, while on my 20.04 LTS laptop it’s 3.0.1, and the latest version is 3.0.2. It’s recommended to use the latest version available version of Xdebug, but I suggest first getting used to it by using the version available in the Ubuntu repositories, before attempting a manual install to make sure you’re always on the latest and greatest.

Once Xdebug is installed, you need to tell PHP to use it, which requires some additions to your php.ini. First, check where the (“Shared Object”) file is located. This is usually in your /usr/lib/php/ directory, in a directory named after a date (eg 20190902). Inside it you’ll find the file, which you need to configure by adding it to your php.ini.


You also need to enable Xdebug debugging , which depending on your Xdebug version, requires a slightly different php.ini line.

;Xdebug 2.x
;Xdebug 3.x

Then, restart your web server, and check that Xdebug has been enabled.

php --version

You should see something like this, which confirms Xdebug is enabled with PHP.

PHP (cli) (built: Dec 26 2020 10:32:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.25, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

Install one of the Xdebug Browser debugging extensions for your browser

The PHPStorm help docs have a list of all the different popular browsers, and the extension(s) needed for each. Essentially all these extensions do is allow you to set a special GET/POST or COOKIE parameter needed to trigger debugging from a browser request. You could do this yourself manually, but who has time for manual processes?

Set up PHPStorm for debugging

At this point, it’s a good idea to validate the Xdebug configuration within PHPStorm. Open the PHPStorm Settings (File -> Setttings) and browse to Languages and Frameworks -> PHP -> Debug.

Under Pre-configuration, click the Validate link.

Make sure the Path to create validation script is set to the web root for your project, and the URL to validation script points to the local URL that you’d use to browse to your projects web root. Click the Validate button, and you should see a list of validation checks passing.

The last thing you need to do is set PHPStorm to start listening for PHP debug connections from the browser. You can set this from the Run menu in PHPStorm.

Once that’s done, you’re good to go.


You can now start adding breakpoints in your code, by clicking in the grey area next to your line numbers in PHPStorm. The breakpoint appears as a red dot, next to the line you want to start debugging at.

You can then use the browser extension for your browser you installed earlier, to turn debugging on from the browser, which ensures the browser will send the special GET/POST or COOKIE parameter on subsequent requests, and refresh the web page.

If you’ve set it all up right, you should see your browser page sit on a loading screen, while the debug toolbar pops up at the bottom of your PHPStorm window.

Success! You can now step through your code, and debug what it’s doing.

Final note, the first time you trigger a debug session for a site/project, PHPStorm will probably pop up a window detecting an incoming debug connection. It then asks to confirm some details about the connection. Mostly you can leave this as the defaults, but it’s good to just check that everything is set correctly.

I’ve found the zero-configuration debugging set up to be the quickest way to start step debugging on PHPStorm, and I’ve not used anything else in the past 4 years. I especially enjoy how I can enable everything in the IDE, but then just turn on the browser extension, to kick things off, and turn it off again when I don’t need it.

During development I still use things like die() or dd()when I want to quickly see the contents of things, and I’ve started using PsySH via Laravel’s artisan tinker or via WP-CLI more and more to test snippets of code and see their output, but Xdebug is essential when I’m hunting down bugs or hard to replicate edge cases.

If you do end up setting up Xdebug, and you find it useful, please consider supporting the project.

Experiences General

Kicking 2021 into High Gear with an Electronic Standing Desk

I’ve been interested in using a standing desk for about 3 years now. Soon after I moved into my own office space, one of the first things I did was purchase a decent ergonomic chair, and then a standing desk. Not wanting to buy an expensive adjustable desk I wasn’t sure I would actually fully utilize, I found a second hand, manually adjustable one.

Unfortunately, after I took it home I discovered that adjusting the height required me to climb under the desk, unscrew two large locking screws, manually raise the stand on either side and then tighten the screws again. This desk was meant to be set to one position, either standing or sitting, and not meant to be used to switch between either during the course of a day.

Crawling under my desk and using these on either side when I wanted to adjust the height was not what I had in mind.

I’d since been eyeing the TekDesk v2.0. This was a locally produced product from the Cape Town based company that launched the DeskStand, a unique way to turn a regular desk into a standing desk, back in 2015. While the DeskStand was not what I needed, I’ve followed the company since that launch, and recently they launched the updated TekDesk, which was exactly what I was looking for.

The price had always put me off though, so I stuck with the other desk and my ergonomic chair, until I badly injured my lower back late last year. One of the contributing factors to this injury was the fact that I sit for at least 8 hours a day. Not being able to walk properly for 2 weeks gave me food for thought as to my work habits. So this past Black Friday, I decided to take advantaged of their sales and invest in a TekDesk.


The TekDesk ships in two separate packages, one for the desk top, and one for the stand kit. The desk top is still manufactured locally in Cape Town, using the same material as the original DeskStand, and the stand kit is sourced from China. I will say that it’s all very safely wrapped in solid packing materials, so that everything is well protected, and nothing had a scratch on it.

Desk top and stand kit packages
The stand kit unpacked


On the product video on their website, DeskStand claim installation takes less than 5 minutes.

What they don’t tell you is that’s specifically for setting up the stand kit, but the process of actually attaching the stand to the desk top, and then sorting out the motor wires and cable tying them to the desk means the entire affair will take about 30 minutes. That’s still pretty quick and I had the entire thing set up, with all my computer hardware and peripherals in place, in under an hour.

Fully installed TekDesk

I would also point out that this was completed using an electronic screwdriver, as the combo allan key/screwdriver they ship with the stand is woefully incapable of being useful. Make sure you have a decent Phillips screwdriver handy.

My favourite features

The thing I love the most about the desk is the 3 memory presets for automatic height adjustment settings. Once I’d figured out my ideal sitting and standing height settings, and programmed the unit, it takes a mere 10 seconds to go from sitting to standing.

The other thing I really appreciate is the locally produced desk top. It is a natural birch top with a surface that is durable, but smooth enough to be used as as a mousepad. I will probably still keep using my actual mousepad, but it’s a really nice place to work on every day.

Local is lekker!

Finally, being locally produced, it also means if any goes wrong with it, I can take advantage of the 3 year warranty on the motors, or the 6 year warranty on the frame.

One final point I would mention, if you’re using a triple monitor set up with a PC, there’s not much space for the computer on the desk with the monitors, and unless all your cables are really long, you probably won’t be able to put it on the floor either. DeskStand does sell a separate holder for a PC, which can attach to the desk. Fortunately, I have a shelf next to my desk, so I put my PC on top of that.

If you’re in the market for a standing desk option, I highly recommend checking out the DeskStand range. They even sell the stand kit separately, if you want to use an existing desk top.