RSSAmplifier

Blog

(untitled)

benholmen.comRSS feed ↗26 posts

Latest posts

A custom instrument for a one-of-a-kind festival

I built an instrument/art installation for the best music + art festival around

The Kilopixel recap - season one

I made a crazy display and the internet loved it.

I spent 6 years building a ridiculous wooden pixel display

The world's most impractical 1000-pixel display and anyone in the world can draw on it

A photo a day for 30 days

Inspired by my friend Zuzana and her #30in30 experiment , I decided to make a photograph each day for 30 days. I found it very challenging! I'd fight to come up with one good image, post it at the end of the day, and then wake up and have to do it again the next day. Some were easy - I'd notice some good light, grab a few photos, done. Other days were a grind - walking or driving around looking…

Building howtall.is

Yet again, Joe provided the spark: I immediately knew I needed to build an app to let internet friends guess your height and find out just how much they were under- or over-estimating how tall you are. Justin Jackson's a great example : he gives off 6'1" energy (to me, anyhow) but he's actually 5'8". And I've seen him in person and I still thought he was taller! I have some experience building…

The Art of Pairing with Strangers - Over Engineered Podcast

My buddy Chris Morrell was kind enough to have me on his extremely chill podcast, Over Engineered , to talk about my Pair-amid Scheme . We nerded out over making - Chris has an obsession with sewing pants, and I shared my Kilopixel project. I honestly didn't know this was going to be a video podcast, so...let me know if I did anything embarrassing. Give it a listen !

Just how old is a 45 year old soup (and would you eat it)

On my absurd podcast Cheese & Weather we covered a topic Jason Beggs has been requesting: what do we think of this soup that has been continuously simmering for 45 years ? Since that article was written in 2019 it's actually a 50 year old soup! I'll let you listen to the podcast to hear our take, but I was wondering: is there a single molecule of the soup that went into the pot in 1974? That's…

Growing Into a Leadership Role, and Pairing With Strangers - The Business of Laravel Podcast

I was honored to chat with my friend Matt Stauffer on his new podcast, The Business of Laravel . We chatted about building a large wholesale platform on the TALL stack, building a team of happy and productive developers, effectively managing a remote team, and of course, my Pair-amid Scheme . Give it a listen! Thanks for having me, Matt!

Timezone Management in Laravel - for Laravel News

I recorded my first tip video for the good people at Laravel News . Enjoy! There are a LOT of weird time zones in PHP Some favorites in America : eight in Indiana, three in North Dakota, twelve in Argentina, but I'm partial to America/Chicago. They come from timelib , which uses tz maintained by the Internet Assigned Numbers Authority . And honestly? tz is a pretty fascinating Git repo. Read this…

Pairing with Strangers (the Pair-amid Scheme)

Take a chance on an internet stranger and see what happens

Migrating from Homebrew MySQL/Meilisearch/Redis to Laravel Herd Pro Services

Laravel Herd is a fantastic application from the Germans wizards at Beyondco.de that makes it so easy to run PHP applications on your Mac or Windows machine. They offer a paid Pro version that provides MySQL, Meilisearch full text search, Redis, and more. I've been running those with Homebrew , and I wanted to consolidate my tooling. How to migrate from Homebrew MySQL to Laravel Herd Pro 1…

Fluently removing global scopes with Laravel's new ScopedBy Attribute

Laravel v10.44 just shipped with a new approach to global scopes: #[ScopedBy] . Using my codebase as an example: Products have a global scope that hides them if their Company is not visible. 1 <?php 2 3 namespace App\Models ; 4 5 use App\Models\Scopes\ CompanyVisibility ; 6 use Illuminate\Database\Eloquent\Attributes\ ScopedBy ; 7 8 #[ScopedBy([ CompanyVisibility ::class ])] 9 class Product 10 {…

Mapping a Hyper key on MacOS with Karabiner Elements (the easy way)

I was just helping someone set up a hyper key and was surprised at how confusing most of the guides were. So here's my very simple version! Wait a sec, what's a hyper key? A hyper key is mapping a single key to <shift> + <control> + <option> + <command> so when you push that single key, you're really getting all of the modifier keys at once. It's useful for setting up global keyboard shortcuts…

Processing Shopify Webhooks with Laravel Queues

I run a large marketplace application that has a Shopify sales channel application. Our users can connect this Shopify application to synchronize product data from their Shopify shops into our application, and to do that, we register webhooks via the Shopify API. Shopify uses webhooks to notify your application when an interesting event happens in a connected shop - for example, a new order, a…

Heating a wood shop with a passive solar heater

I'm located in Wisconsin, where we typically have harsh winters - in January our average daily low is 15 °F (-15 °C) and our average daily high is 23 °F (-5 °C). I have a single car garage wood shop, and it's not easy or cheap to heat it, so I was intrigued when I learned about passive solar heaters. The idea is simple: you build a dark box that absorbs the sun and warms the air inside, which is…

Defragment your PHPUnit tests

Let's mash up two concepts: automated tests and disk defragmentation. MS-DOS 6.x included a defrag utility that honestly was just so satisfying to watch . The 90s were a different time, folks. Disk defragmentation took about an hour and physically rearranged the data on your hard drive so it was more efficient to read off the disk. When coding, we spend a lot of time looking at test output, and it…

Backing up to Amazon S3 with Restic

This is the easiest backup solution I've found! I'm backing up production servers to specific S3 buckets using Restic . Create a new S3 bucket Log in to your S3 console and create a new bucket. You'll want to give it a sensible name - I like something like benholmen.server-name.backup - and be sure that you don't enable public access. Create AWS credentials You'll want to create some credentials…

The long and winding Kilopixel road

Update July 2025 : you can now experiment with the Kilopixel and submit art to be drawn! Please, submit anything and everything at kilopx.com . A few years ago I had an idea to build a large, inefficient display with a web interface that anyone could interact with. I've noticed Danny Rozin's unconvenional mirrors over the years and then saw a 24 frames per hour movie player that got me thinking…

A manifesto on shower temperature control

I had a very shower-y shower thought: why does turning my shower handle a tiny bit make such a huge difference in the comfort of the shower? Why are we wasting so much potential control area on water temperatures that no one wants? Who cares about ice cold, mildly cold, cold, or lukewarm water - that entire section of the control is wasted. I propose a more refined and humane control strategy.…

Building an heirloom custom cribbage board

My nephew was graduating from high school and my sister in law asked me if I could recreate a sentimental cribbage board for him. She couldn't find anything quite like it, so a custom build was necessary. I love cribbage and I needed an excuse to get into the shop, so I said yes! Reference materials I never held the original cribbage board in my hands - just saw it in photos with a ruler for…

Building With The TALL Stack (and Tighten) - Twenty Percent Time Podcast

When you have a chance to work with some of the best developers in the Laravel ecosystem, you take it. And take it I did - my company hired Tighten to help get Hubventory off the ground and get a solid development team running. I was glad to chat with my friends Dave and Zuzana about working with Tighten on the project: Update: it turns out our silly cheese curd intro was the most popular part of…

Set up lsyncd to synchronize files between two or more servers

lsyncd runs a daemon to watch your filesystem for changes, and when a change occurs, copy files to another location. This can be a different location on the same server or an entirely different location. I used it to sync a Wordpress installation from one server to another behind a load balancer, so uploading files or upgrading plugins on the primary server would immediately synchronize the…

Running Laravel Horizon in a multi-server environment with Laravel Forge and Envoyer

I just set up Laravel Horizon to manage our queue in a multi-server environment. The documentation is a little thin in this area but the ultimate solution is pretty simple. Our environment We have a load balancer, two web servers, a database server, and a queue server. The database server runs Redis and the web servers and queue server are all configured to connect to it. We only want to process…

Load balanced environments with Laravel Forge and Envoyer

Here's how I set up a load balanced environment on Laravel Forge and deployed with Envoyer. What the heck are Forge and Envoyer? Forge is a service run by the Laravel crew that provisions and configures servers. They don't run the actual servers - you'll pay Amazon or DigitalOcean for that - but they provide a management layer that makes your life easy. You can host Laravel projects, general PHP…

Create a timelapse video with free and open source tools

I've recently become interested in creating timelapses with my Canon 20D DSLR and have discovered a workflow that uses all free and/or open source software to take your digital photo sequence and turn it into a timelapse video. Let's start with the camera. I'm using my 20D and I purchased an intervalometer from Amazon that allows me to shoot at virtually any interval and not have to haul my laptop…

Adding PNG Watermarks to JPEGs with PHP

This took up a good chunk of my afternoon. I have a client who wants to upload JPEG images to his website and have them automatically resized and watermarked with copyright information to discourage image theft. Resizing is a piece of cake --- I've done that before --- but getting the alpha transparency of a 24-bit PNG to overlay correctly was maddening. It turns out that the solution is actually…