I’ve gotten a lot of flack throughout my career over my disdain towards test-driven development (TDD). I have met a lot of people who swear by it! And, I have also met a lot of people who insisted that I adopt it, too, often with the implied threat of appealing to my boss if appealing to me didn’t work.
The basic premise of TDD, for those unaware, is that one first writes a unit test that verifies the expected behavior for some function they want to write, observes the new test fail, and then one writes the implementation, iterating on it until the test passes.
Hidde de Vries in I'm back to building my own digital music collection:
Over the past months, I realised it was about time I moved away from music streaming, to keeping a personal music collection that I control.
Great post from Hidde on why he's now back to building his own digital music library. His reasoning is very much in line with why I embarked on the same journey last year.
Related post: Building a digital music library in 2025.
A couple of years back, I began experimenting with self-hosting. I dug out an old laptop and set it up as an always on home server. It did many jobs. Stuff like acting as a file server with access to external storage and backups, automating tasks with scripts, music server, running a torrent client for my legally acquired content and more.
It worked fine. But, the added complexity of another machine bugged me slightly. Most of the tasks could be solved on my daily driver laptop. There was also the fact that it didn't run the latest software from Apple. This caused a lot of friction. I couldn't run Homebrew. It caused a lot of issues when trying to install or update packages. Most current programs would not run on my ancient version of MacOS.
These issues made me want to shut down this "server" and simplify my setup. To do so, I had to solve two problems:
I've solved both problems and decommissioned my old home server. The light bulb moment? Realising that my "home server" doesn't need to be a separate machine. My regular, daily driver laptop can do the job! A server is, after all, just a computer that's always on. My regular laptop can do that, too.
Let's dive into each of the specific problems mentioned above.
As mentioned, my laptop doesn't have enough space for all my data. Using cloud storage and an external drive for local backups, I've been able to work around this limitation.
The past year I've been using a remote installation of Nextcloud for cloud storage, and much more. With the aim of simplifying my setup, I wanted a solution that required less maintenance. After considering multiple solutions, I landed on going back to Apple's iCloud.
Both my laptop and phone are Apple devices. iCloud services are neatly integrated. And, having migrated away from iCloud recently, I feel like I have a solid grasp of what my setup should look like to minimise dependency and vendor lock-in.1 After shopping around, I also realise that the 2TB storage tier is actually reasonably priced. Lastly, it let me go back to using iCloud Photos to browse my photos and videos. It works well and I like it.
I don't want to rely solely on a third party and "the cloud" to preserve all of my data. Especially precious photos and videos. To solve this, I've landed on the following routine:
At the beginning of each month, I export all of my photos and videos from the previous month from Photos to my external drive.2 I then export every other file and document stored on my cloud drive to the drive.
Is it bullet proof? No. I'm susceptible to losing as much as a month's worth of data with this approach. In contrast to a total wipe out, something I can live with.3
Above I mentioned two specific cases of remote access that I had come to rely on:
By setting up my laptop as a de facto server, I've solved both.
I iterated through several approaches for making my music collection available remotely. I first tried Doppler and their sync to iOS feature. While I think Doppler is hands down the best app for playing music on both Mac and iPhone,4 I found the sync cumbersome.
Next, I thought of using iCloud Drive as a "music server". Surely some app could watch a folder in my iCloud Drive and automatically add new files to my music library? Well, you'd think so. But no. I couldn't find any decent app(s) that solved this to my expectations. Plus, my phone doesn't really have enough storage to save my full music library locally. Which really only left me with one option: Setting a full-fledged music server.
This was the solution I had been using for the last few months, running Nextcloud Music on my Nextcloud instance. I resigned myself to the fact that I needed a remote virtual server to solve this. As I'd been wanting to test out Pikapods, I decided to try out Airsonic Advanced. It was too advanced (I have no right to be surprised) and I couldn't get it set up exactly to my liking. Instead, I switched to Navidrome and I found it an absolute delight. I couldn't believe how fast and lightweight it was!
It worked well and, as a bonus, I could continue using Amperfy which I had become comfortable with these last few months. One thing was still bothering me: Streaming and caching my music collection from a remote server, when it was already stored in full on my Mac, was incredibly wasteful. Realising I was (again) on the lookout for a music player to play music on my Mac left me feeling like I was back to square one. Eventually, though, the penny finally dropped:
"Navidrome is so lightweight, I could probably run it on my laptop without any issues!"
Using Homebrew, setting up Navidrome on my laptop was a five minute job. Configuring my laptop to automatically launch Navidrome on startup took me another five minutes. Now we're (rocking and) rolling! The native Navidrome web interface is perfect for playing music on my laptop. And all I had to do to access my music collection from Amperfy on my phone was change the server URL and authentication details.
I didn't really mind only being able to access my full library while on my home network. Amperfy has great caching and downloading the albums I want is no hassle. The only inconvenience was keeping my laptop open and awake to access my music.
Luckily, the other penny dropped at this point. This is a solved problem! I already set up a Macbook as a "home server" and there's no reason I can't do it with this particular Macbook. So, I ran the terminal command5 and I was off to the races. Despite decommissioning my home server, I once more had a "server" running at home. Just one that doubles as my daily driver laptop.
With my laptop running as a server, this problem was solved as well. It was simply a matter of updating my old workflows to rely on iCloud Drive instead of my old Nextcloud instance.
Because I'm not the smartest guy around, my site generator is quite simple: A script monitors a "content" directory. When a new file appears, the site generator runs to process this file and upload all the new and modified files to the server that hosts my website. This lets me update my website from anywhere without having to worry about remote access to my home server. All I have to do is save a text file to the content directory. Whichever cloud service I'm using then does the sync magic, and my home server a.k.a. my laptop, updates my website.
Even images exist only as a file in my content directory. If I reference them in a text document, the site generator picks them up and uploads the file(s).
And that's it. I can now create posts and notes from my phone while I'm on the go. I don't know that I ever will, but at least I can rest comfortably knowing that I can. And that's the most important thing.
I tweaked a setting on my laptop to make sure it doesn't go to sleep when power is connected. I connect to it with my phone to listen to my music and update my website when I'm on the go.
You didn't think I'd actually settle on not being able to access my full music collection while on the go, did you? About five minutes after thinking I could live with that, I remembered Tailscale. With my "server" running a current version of MacOS, I could actually install it and rely on it for proper remote access.
That topic probably deserves its own post. The short version is: Make sure that you control your own data, and that it is stored in open file formats. Picking up your files and going elsewhere is always easier than trying to export data from a proprietary storage solution. ↩
Photos and videos is a great example of where you should make sure that you have your data stored as actual files on a disk. ↩
I always imagine that somehow a "delete all" command will hit my cloud data. Because of syncing, it also wipes out my local copies. That's why I want complete separation for my backups. In that sense, a disconnected external drive makes perfect sense. ↩
Doppler's refund policy also deserves a shoutout. I bought the Mac version and tried it for a couple of days. When I found it wasn't for me, I sent them an email and requested a refund. My money was promptly refunded, no questions asked. This experience made me want to purchase more software from Brushed Type. ↩
sudo pmset -b sleep 0; sudo pmset -b disablesleep 1 disables sleep on a Macbook while connected to power, even when you close the lid. ↩
The front of the American grocery store contains a strange, liminal space: the transitional area between parking lot and checkstand, along the front exterior and interior of the building, that fills with oddball commodities.
Say one thing for Robin Hobb, say she knows how to write a trilogy.
The Tawny Man trilogy is the third three-book collection set in the "Realm of the Elderlings". After Liveship Traders took us south to the Satrap's lands of Bingtown, the Rain Wilds and Jamaillia, Tawny Man takes us back North to the Six Duchies. It was here the story kicked off with the Farseer Trilogy.
Tawny Man is a reunion. It centres around the same main cast of characters as the original trilogy, but not without adding new ones to the mix.
As with both previous trilogies, I found myself unconvinced at the outset. Hobb takes her time to set the scene. But, also as with both previous trilogies, this one grew. And grew. By the middle of the second book, I had a good idea of where the story was going. I was hooked. I didn't get many pages (or locs, to be more precise) into Fool's Fate before I was struggling to put the book down.
This is not unusual with Robin Hobb. All of the three trilogies I've read so far all have the feel of one big book split into three, rather than three distinct stories. The middle books in particular don't even pretend to be stand-alone stories. Instead, they build on the foundation of the first book and creates momentum in the story towards the eventual climax in the final third.
I think it's great.
Although Tawny Man doesn't reach the heights of Liveship Traders, it was a very enjoyable read. In terms of where it falls short, I think there's something about the first person storytelling that is limiting. You don't really get enough perspectives to make all the characters (bar one) feel as real and fully fleshed out. That said, I enjoyed getting closer to what is the most interesting character of all of them throughout these stories.
All in all, this felt like a worthy send off for both Fitz and the Fool. But I still wonder if we aren't going to get to hear more about the former's maternal origin. There's a story yet to be told there, I think, and there are some hints that we will learn more about "Keppet" in time.
I'll close with some of my highlighted quotes and passages from the books:
It could not compare to that moment of completion when minds joined and one sensed the wholeness of the world as a great entity in which one's own body was no more than a mote of dust.
Fool's Errand
Hobb has a way with framing that sense of belonging to something greater than just yourself that one can sometimes experience.
Sometimes I think there is more rest in that place between wakefulness and sleep than there is in true sleep. The mind walks in the twilight of both states, and finds the truths that are hidden alike by daylight and dreams. Things we are not ready to know abide in that place, awaiting that unguarded frame of mind.
Fool's Errand
It is a magical place.
It was a boy's thing to do, this immediate offering to share a prized possession, and my heart answered it, knowing that no matter how long or how far apart we had been, nothing important had changed between us.
Fool's Errand
That's true friendship.
His air of petulant command mimed perfectly that of a foppish dandy of the noble class.
Fool's Errand
I just loved that sentence. Poetic.
… (I) knew that, as it always would, the past had broken free of my effort to define and understand it. History is no more fixed and dead than the future. The past is no further away than the last breath you took.
The Golden Fool
The more history I read, the more I come to agree with this world view.
How many words have I set down on paper or vellum, thinking to trap the truth thereby? And of those words, how many have I myself consigned to the flames as worthless and wrong? I do as I have done so many times. I write, I sand the wet ink, I consider my own words. Then I burn them. Perhaps when I do so, the truth goes up the chimney as smoke. Is it destroyed, or set free in the world?
Fool's Fate
More on the futility of capturing the moment, of defining it, and the truth. Doesn't mean we should stop trying. Just that we can never fully succeed.
Every small, unselfish action nudges the world into a better path. An accumulation of small acts can change the world.
Fool's Fate
It is. And it can.
Give him to me, she said with a woman's weariness at a man's incompetence.
Fool's Fate
Close to home!
No man, in the fullness of his years, should have to experience afresh all the passion that a youngster is capable of embracing. Our hearts grow brittle as we age.
Fool's Fate
I've been pondering this. Is it true? Is it self defence that our emotions dwindle as we age?
Home is people. Not a place. If you back there after the people are gone, then all you can see is what is not there anymore.
Fool's Fate
Home is people.
Wildwood is an upcoming stop-motion movie by the studio Laika. I cam across the trailer earlier today, and it looks awesome. The work and passion that goes into creating a good stop-motion movie is mind boggling.
What really caught my mind, however, was one the main characters, a golden eagle (emphasis mine):
The General, voiced by Honorary Academy Award recipient Angela Bassett, a fierce warrior and leader of the skies
My cousin used to call my grandmother "The General". When I watch this movie I'll undoubtedly imagine that character a representation of my grandmother.
Can't wait!