Recovering Data from Orphaned Fly.io Volumes

After a hardware failure on Fly.io triggered a migration to new hardware, I encountered an issue where the new machine didn't mount to the old volume but instead created a new one. Despite attempts to mount the old volume, persistent errors prevented me from attaching it to the application. This

2 min read
New blog

I had to make a new blog because we can't have nice things.

1 min read
Handling classes in Phoenix LiveView components

With Phoenix LiveView you can build components that encapsulate styling. This is especially useful when using a class-based CSS framework like Tailwind CSS.Often you will want to make your component configurable by allowing the users of the component to pass in additional classes. The CoreComponents module that is created with

2 min read
Handling Empty Slots in Phoenix LiveView Components

As I was writing a Phoenix LiveView component I determined that I wanted to provide a default "empty state" when a slot provided to the component rendered to a blank value. A good example is a detail list component that may be used as follows:<.list><:itemtitle="Email"><%=@contact.email%></:item><:itemtitle="Mobile Phone"><%=@contact.mobile_phone%></:item></.list> In the component you

3 min read
Phoenix LiveView External Upload Cancellation

While implementing a LiveView external upload to S3 I noticed that the default cancellation mechanism doesn't properly terminate the upload. The upload is cancelled within the LiveView state, but the browser will continue to upload the file via XMLHttpRequest and never gets terminated. When uploading large files or handling file

2 min read