I’m a full-stack developer with a passion for coding clean, semantic, and functional websites and applications. I do a lot of PHP, I dabble in Rails, and I enjoy using HTML, CSS, and JavaScript to build slick, modern interfaces. By day, I’m working as a Senior Software Engineer at Liquid Web.

Over the past few years, I’ve developed quite a fondness for WordPress, the platform on which this site is built (You can view the source of this site over on GitHub). You may have come across one of my WordPress plugins, WP Password Generator or WP Client Reference, both of which are available through the WordPress plugin repository.

Latest Blog Posts

Simplify Project On-boarding with Laravel Homestead

Despite working on Liquid Web’s Managed WordPress and Managed WooCommerce hosting products, a fair amount of the development work I do these days has very little to do with WordPress. In fact, my main project right now is using Laravel, and it’s the sixth Laravel application (depending on how you count projects) I’ve worked on in just under two years at the company.

Laravel’s an incredibly powerful application framework with a thriving ecosystem. Thanks to tools like Composer and Packagist, I have access to thousands of libraries, extensions, and utilities to help me build the best applications possible. Even out of the box, the framework has support for (among many other things) multiple database and caching engines, event-driven architecture, and websockets, giving me a strong foundation for building modern web applications.

Of course, incorporating multiple platforms and tools into a single application can make on-boarding new team members more difficult. How do you make sure they’re running the right versions of PHP, your RDBMS of choice, Redis, and more?

Automatic, Whole-Home Time Machine Backups

Over the holidays, I decided to tackle a problem that’s been on the back-burner for a while: how can my wife and I automatically back up our Macs to a common Time Machine drive? We already have a router I’m happy with (the NETGEAR R6400, which is a couple years old now), so I didn’t want to replace a solid router with Apple’s Time Capsule, especially given that the line seems to have been discontinued. Is there a way to keep a common Time Machine drive on the network?

Up until this point, Kim and I have gotten by with our own Time Machine disks that live on our desks: when we’d remember, we’d plug in the disks and ensure a backup was made. I can’t speak for Kim, but I know my backup history was…spotty, to say the least.

When Kim started her own business in 2017, we upgraded her older MacBook Pro with a new SSD and kept the old drive housed where the rarely-used optical drive used to live. All told, she has just shy of a terabyte of storage on her machine, but was (just barely) backing up to a 500GB Time Machine disk. Wanting to ensure that client files and portfolio pieces alike were backed up securely, Kim asked if I could set something up to make the process easier; this is what I found.

Atomic Deployments from Scratch

Years ago, a mentor of mine introduced me to a Ruby-based server automation tool called Capistrano, and I immediately fell in love. Ready to deploy a new release? Rungit push && cap production deploy, then you’re done. Even better, Capistrano introduced me to what’s colloquially known as “atomic deployments” — checking out a full copy of the codebase and using symlinks to point to the new release for a zero-downtime deployment — which has since been my gold standard for deployment methods.

I continued to use Capistrano for a few years, until I started working on projects (and teams) large enough to justify a proper continuous delivery (CD) tool. Suddenly, building the application locally and pushing up with Capistrano became more complicated; at the same time, services like DeployBot began offering atomic deployments right out of the box, so it was easy to get up and running.

What about services that don’t offer atomic deployments as a default? I recently deployed a Laravel application via Codeship, where atomic deployments to a VPS becomes more complicated; here’s how I approached it:

Get your geeky fill on my blog!