Skip to content

Hallam Chronicles Posts

2023 Cow In Review

In June 2021, we bought a heifer we later named Annabelle. She quickly befriended the other farm animals, and we fell in love with our new daily routine.

It took a few failed attempts with AI before we opted to borrow a bull, but just over 15 months later our patience was rewarded with a calf we named Brisket.

What started as a daily grooming routine now included a daily milking routine. We separated Brisket overnight and took our share of her milk in the morning.

Milk, butter, yogurt — not to mention the occasional sour cream, fresh mozzarella, and buttermilk!

For a while now, we’ve been asking ourselves: was it worth it? As a grass-fed cow — not a lick of corn in Annabelle’s diet… except for two unfortunate escapes! — the investment in hay and alfalfa was substantial, not to mention vet visits, minerals, and infrastructure costs.

Looking back to the receipts of 2023, we spent almost $5,000 on Annabelle:

A few health concerns bumped up the overall spend, but the single biggest cost was undoubtedly the 1600kg of alfalfa we used to boost Annabelle’s protein throughout the year:

On the milking front, we kept fairly rigorous records:

All told, we yielded approximately 2600L of grass-fed, “organic” (not certified) milk in 2023! From that milk, Charity estimated we separated about 2L of cream for every 8L of whole milk, with a litre of cream in turn yielding about a half pound of butter. We also made yogurt every two weeks, with about 8L of milk producing 5L of yogurt.

Here on the island, groceries are perhaps a tad more expensive than back on the mainland:

If we imagined ourselves buying the same quantity of these products, we net a very decent “revenue” of just over $2600!

But this isn’t the whole story. The reality is that the milk we drink isn’t just 2% — it’s even better than the 3.25% homogenized milk. And the butter is “grass-fed”, plus the yogurt has the texture and density more like Greek yogurt. And then there’s Brisket who yielded over 400lbs of meat this past October.

If we compare against similar products from the grocery store, and the very reasonable bulk price of $5.45/lb for a whole cow, the numbers look even better!

At the end of the day, these are all just imaginary numbers (except the expenses!). There’s just no way to attach a price to a homemade latte using milk from that very morning and delivered with a flair from a very loving daughter:

We love you, Annabelle!

Leave a Comment

Merseyside & Greater Manchester

Despite arriving home from Europe nearly three months ago, the business of life have distracted me from documenting this last leg of our journey. It’s amazing how much easier it is to focus on writing when you step outside the usual hustle and bustle. So it is that I finally finish this post while travelling on a completely unrelated trip — but more on that in another post.

After the excitement of Zürich, Paris & London, we made our way to North West England? Why? The most treasured part of our trip thus far: family!

Some fifty four years ago, my mom and her parents emigrated from the Liverpool, England to Cambridge, Ontario, Canada. She and her mom — my Nanna — would return every few years for a visit, some sausage butties, and the family favourite: fish & chips.

So it was very special for Charity and I to first stay with Lynsey & Steve, cousins on my mom’s side. Despite it being more than 13 years since we’ve met in person — when Charity and I wedded! — we reunited around old memories of our shared family, homemade sausage butties, and brown sauce (known here as HP sauce).

1st cousins once removed

And after seeing her grow up only on social media, we were thrilled to meet God’s little blessing and addition to their family:

Steve and Lynsey took time off work to show us the area, including a trip to the renowned Lake District and the town of Ambleside.

This quaint, cobble-stoned town through which we walked would have been special just for the age of its buildings, but it held a special place in Charity’s heart as the home of one Charlotte Mason, the British educator on whose teachings we structure our homeschooling adventures.

After a so-so dinner of fish and chips in London, Charity and I were eager to taste the authentic dish of which my mom and Nanna spoke so often. Their first question every time they used to get picked up by Steve from the airport: “Can we go to the chippy?”

Unfortunately, by some freak accident, the fries in my dish were undercooked. There I was, surrounded by my wife and cousins feasting while I’m scratching my head wondering if something was wrong with my tastebuds: the pasty starch sticking to my tongue and ruining even the otherwise tasty fish.

Actually realizing something was wrong took longer than it should have, because I had also made the mistake of checking my work email and was distracted by the news of a layoff earlier that day. While my job was not affected, a number of my closest colleagues were now unemployed. (Between then and when I write this post, we’ve had a second layoff — again I was unaffected, but once again lost many of the people with whom I loved working. More on that, perhaps, in another post.)

After just two short days in Wigan, we caught the train to Liverpool to reunite with another cousin we last saw almost five years ago, but who often visited family when I was much younger.

2nd cousin

I made a new little friend and was gifted some old photos of my mom!

Charl took us on a tour of the grounds of Croxteth Hall — the manor itself being closed for the day — chatting through the many years that have passed since we last met at the passing of my mom.

Despite my expertise navigating Canadian winters, I found myself genuinely cold, donning a toque and winter jacket despite the early signs of spring everywhere. I think it was the humidity and low temperature as compared to the typically drier and colder winters back home in PEI.

Before heading back to the house, Charl took us round to Asda. My mom and Nanna were notorious for bringing back sweets and treats they couldn’t find in Canada — and hiding them from my dad, who would surely have disapproved of so much candy! Charity and I followed in at least part of this tradition, but of course made no secret of our treasure trove and fully intending to share with our children.

And on our final full day in England, my cousin rectified the fish and chips situation by bringing us to the local chippy. So good!

Nearly as quickly as it began, our 24 hours in Liverpool came to a close with an early morning trip back to the Manchester airport, connecting us back through London, then Toronto, and finally Charlottetown.

Pro-tip #1 for travelling: if you’re going to pay for the lounge while waiting at the Heathrow — worth it for the food alone! — go the one nearest your gate, that way you’re not once again panicking at the last minute worried you’ll miss your connecting flight back to your children desperate to see you again. No chance I made that mistake (again) on this trip. Nope.

Pro-tip #2 for travelling: yes, the more expensive seats by the emergency exits offer a tremendous amount of legroom for a long trip — plus quick access to the restrooms! Unfortunately, they can also become a loitering zone for passengers weary of sitting. If you value privacy, double check the plane layout first and consider a different row instead.

Finally headed back to Canada!

Everyone was thrilled to see us — and partake in the treats we brought home. We celebrated our first morning back together with a cuppa of Yorkshire tea and a packet of dark chocolate digestives — new favourites we can now simply order on Amazon whenever we want!

I don’t know when we’ll back back this way again, but I hope the next time includes our children. For now, Charity and I will treasure this unique chance together, with grateful hearts to our family in PEI taking care of our children and homestead in our absence.

Leave a Comment

PEI Income Tax Changes

On May 26th, the PEI government announced income tax changes to take effect over the next two years. Two changes stand out that won’t take effect until the 2024 tax year:

  • Increasing the tax bracket thresholds
  • Reducing tax rates on lower brackets.

One has to dig deeply to find the actual changes being proposed:

What does this mean in practice? Ignoring tax credits like the basic personal amount (which is also changing), we can calculate the expected tax payable today to the province for an income of $60,000 annually as follows:

  • On income from $0 to $31,984, the provincial tax rate is 9.80%. Since the total income is $60,000, this entire tax bracket applies, and the tax owing is 9.80% * $31,984 = $3,134.43.
  • On income from $31,984 to $63,969, the provincial tax rate is 13.80%. Since the total income is $60,000, only part of this tax bracket applies, and the tax owing on the amount remaining is 13.80% * ($60,000 – $31,984) = 13.80% * $28,016 = $3,866.21.
  • Since the total income is $60,000, neither the tax brackets from $63,969 to $104,000 nor the tax bracket above $104,000 applies.
  • The total tax owing is thus $3,134.43 + $3,866.21 = $7,000.64.

What changes in 2024? Using the new tax brackets for 2024, we can calculate using the new tax brackets:

  • On income from $0 to $32,656, the provincial tax rate is 9.65%. Since the total income is $60,000, this entire tax bracket applies, and the tax owing is 9.65% * $32,656 = $3,151.30.
  • On income from $32,656 to $64,313, the provincial tax rate is 13.63%. Sinec hte total income is $60,000, only part of this bracket applies, and the tax owing on the amount remaining is 13.63% * ($60,000 – $32,656) = $27,344 = $3,726.99
  • Since the total income is $60,000, none the remaining tax brackets apply.
  • The total tax owing is thus $3,151.30 + $3,726.99 = $6,878.29.

After all is said and done, a person earning $60,000 annually will now pay $7,000.64 – $6,878.29 = $122.35 less taxes to the provincial government in 2024 than they would have in 2023. Instead of paying 11.7% of your income to the provincial government, you’re now only paying 11.5% — a savings of two tenths of a percent.

Time to celebrate? Unfortunately, not really. Unlike the federal government and most other provinces, PEI doesn’t index their provincial taxes to inflation. The purchasing power of that $60,000 annual salary changes drastically in the face of higher rents, more expensive groceries, and pricier fuel. Statistics Canada quantified this change in 2022:

The Consumer Price Index (CPI) rose 6.8% on an annual average basis in 2022, following gains of 3.4% in 2021 and of 0.7% in 2020.

If the CPI is an accurate average of the price increases most islanders face — it’s not, but that a separate debate! — then that $60,000 can now only afford $56,603 in goods and services. Saving $122.35 in face of a $3,397 shortfall is hardly a reason to celebrate.

Two closing thoughts. First, that $122.35 doesn’t come for free — notice the new tax bracket for those earning over $140,000? They now pay 18.75% for income above that threshold, compared to 18.37% before. Whether or not you think that’s fair, consider that these people are in the best position to leave PEI for more competitive tax rates offered by other provinces. Driving away islanders who contribute the most in taxes is not a sustainable plan.

Secondly, these changes will only apply starting in 2024. Inflation hasn’t exactly stopped growing in 2023, so by the time these tax brackets take effect, that remaining $56,603 will be worth even less.

Is there an alternative to all these changes? Yes, but that’s another debate.

Leave a Comment

London

From Paris to London, our whirlwind of a journey finally brought us back to the motherland. Foreigners as we still were, we felt like grandchildren returning to the old family manor.

Our third floor rooms were smaller than Paris, and yet somehow felt roomier and cozier. I couldn’t resist checking out the first (and only) wardrobe we encountered.

Our first attempt at fish and chips was ok, but nothing worth celebrating and not nearly as good as Brits Fish & Chips back home. We learned later that the downtown core tends to cater to tourists instead of featuring authentic British pub fare.

First & Chips: Attempt #1

Our highlight of this weekend was undoubtedly the theatrical performance of Les Misérables. I admit to having never read the book (despite owning it), but I have often enjoyed Focus on the Family’s Radio Theatre version.

Queueing for the performance

Naturally, no photos of the performance to share, but our view of the stage was unrivalled. My personal favourite was the commanding performance of David Thaxton as Javier, previously the Phantom in the Phantom of the Opera. Charity also appreciated the passion of Jon Robyns as Jean Valjean.

I admit to having previously had my doubts about musicals. Perhaps it was the format of spontaneously transitioning to singing only to return to the regular story telling. The format of Les Mis, by contrast, was almost exclusively singing, with just a handful of hushed words that fit beautifully in moments of necessary silence.

One critique. I appreciated the comedic relief offered by the Thénardiers, themselves secondary antagonists driven by the love of money to swindle everyone who crosses their path. But the sexual overtones of their characters seemed oddly out of place. While the moral undertone of mercy received by Jean Valjean and rejected by Javier remained intact, it seemed sullied by the humorous portrayal of these otherwise depraved characters.

The Sondheim Theatre itself was a work of art reminiscent of the detail we enjoyed at the Louvre barely 24 hours earlier (though with all the same caveats).

Our second and final day in London began with a trip to the British Museum.

Still tired from our seven hours at the Louvre, we agreed not to try to see everything, but just wander for an hour or two. The Egyptian mummies were fascinating, if not slightly disturbing, but my favourite discovery was the Lewis Chessmen, as I knew it would fascinate our children when we shared photos later that evening.

Our next planned stop was Evensong at Westminster Abbey, passing by Trafalgar Square, the Canada House, and the Elizabeth Tower (Big Ben, the bell, within).

In contrast to Notre Dame, there was little to obscure our view of this ancient edifice.

Gazing at the statues outside the entrance, I realized many were from relatively recent history, such as Martin Luther King Jr. and Dietrich Bonhoeffer. I wonder what goes into deciding who graces this entrance: and when “someone” gets removed!

Again no photos within the chapel, and while we hoped for a chance to sing alongside the congregation, the selected songs were unfamiliar and hard to follow on the magnificent pipe organ. To the credit of the Reverend, the sermon on “three transgressions … and for four” from the book of Amos was theologically sound and a practical reminder of God’s extended mercy and justice.

Parliament

Charity more than made up for the lacklustre congregational singing as we passed the Parliament buildings together.

Singing

Our evening came to a close aboard a double decker bus, a living art display, and takeout back at the hotel.

Monday morning marked our early departure from London to visit family in the Manchester region!

Heathrow Express

Leave a Comment

Paris

It’s difficult to summarize the transition from Zürich on Wednesday to Paris on Thursday. Before arriving, we were told we might be disappointed. We were warned about being pick-pocketed. We even knew about the rats — courtesy of Ratatouille. And as we slowed into Paris towards the Gare de Lyon, the sense of a dense metropolis complete with pervasive graffiti did little to dissuade these external impressions:

But after navigating the train station and subway lines towards our hotel, we ascended to encounter this first exposure to the incredible architecture of Paris, the Hôtel de Ville:

As we explored but a slice of the centuries of history interwoven with modern life in this enormous city, we quickly regained a sense of wonder. Though we still clutched our passports and wallets.

The highlight of our arrival day was the panoramic view of Paris from La Basilique du Sacré Cœur. After a tour of the inside — itself a marvel, but in which we honoured the request not to take pictures — we ascended some 270 steps to the dome of the building:

Perhaps because of the climb and the modest entrance fee, there were far fewer people seeking out this view than those at the base of the building. Encouraging signs along the way counted down the remaining distance. We definitely needed that encouragement — I think my Apple Watch recorded 37 flights of stairs that day!

But the climb was worth the exhausted calf muscles, not least because it gave us a glimpse of the Eiffel Tower: a destination we did not plan to see this trip.

Our second and only full day in Paris began with a traditional French breakfast of coffee, freshly squeezed orange juice, freshly baked bread, and of course a croissant and a pain du chocolat:

It has been explained to me that the wonder of Parisian croissants isn’t that they are miraculously better than croissants elsewhere — Receiver Coffee back home is almost as tasty, if not quite as lucious — it’s that croissants are incredible everywhere. Not once did we have mediocre bread of any kind, regardless of the restaurant we chose. There was also something about the ingredients or baking process that left us feeling “good” instead of “heavy” after each meal.

We expected the temperature to be warmer than back home — even accounting for the deep freeze briefly blanketing the east coast this weekend — but we were not prepared to see flowering plants and fruit trees simply sitting outside. A Parisian winter of slower growth contrast with the white bedsheets that shut down almost everything for months at a time in Canada.

The highlight of our second day was the Louvre museum. Newbies as we were, we expected to see the famous glass pyramid, but we had no idea that the surrounding building was the museum itself. None of our pictures can capture the scale of this ancient artifice, itself so often passed over to view the contents within.

Within, perhaps my favourite discovery were these twin paintings of David battling Goliath, mounted back to back and giving the appropriate perspective from that angle:

Charity and the children, as part of our homeschooling efforts, have been studying a variety of artists and their works. So it was with great joy that she found herself “reacquainted with old friends” as together we encountered familiar works from Delacroix, Gainsborough, Monet, Giotto, Constable, and Da Vinci.

Delacroix, Women of Algiers

Though we had read about the size of these paintings, once again we found ourself unprepared for the sheer size of many of these works of art.

Despite spending nearly seven hours at the museum, we really only explored the top floor, and that without spending more than a few minutes per room. After passing by the lineup to see the Mona Lisa and wandering deeper into that top floor, we once again found the crowds replaced by just a few brave souls willing to keep walking for so long. It was here we discovered the works of Jean Jouvenet and his masterful depiction of so many familiar Biblical scenes.

His works were also some of the widest paintings we had found!

A word to wise parents. While there is much to enjoy at the Louvre, it is impossible to avoid certain types of artwork or sculptures that many might find inappropriate. I fully recognize the significance of these artists’ works, but simultaneously remain aware of the inherent sinfulness of mankind. There is a reason Adam and Eve sought to cover themselves immediately after disobeying God.

After a last push through the Richelieu, we exited the Louvre to discover this curious mirrored construction, labeled on Google Maps as the Place du Palais Royal. What boggled my mind was the perfectly angled glass reflections designed to create the illusion that the building was transparent! My Google-fu has failed me in finding an explanation for this building — if anyone knows, please let me know!

Our final, half-day in Paris began peacefully with breakfast at another corner cafe and a walk around the Notre-Dame, currently under heavy renovation due to the fire in 2019. As we walked, Charity recounted the story of the Hunchback of Notre-Dame, a tale by Victor Hugo and author of the story behind a play we will see tonight in London.

Mindful of the time, we checked out and made our way to Gare du Nord to catch a train to London for the next leg of our journey. Our hope was to arrive relaxed, with plenty of time to board the train.

Unfortunately, this is when the flaws of the Paris transit system began to cause us grief. No doubt it works well for the millions of people accustomed to using it daily, but as new users, the onboarding flow deserves some serious scrutiny.

Our woes actually began back on day 1, when we purchased the Paris Visite travel pass. In Zürich, the equivalent pass was valid for 24 hours from the time of first usage, perfectly fitting our expected timeframe there. I purchased the 2-day pass, believing it would cover us until departing 48 hours later on Saturday. After paying, the ticket attendant asked me if I wanted it to start today, and then wrote the dates for Thursday and Friday on the little scrap of paper. I asked if it was good until Saturday, at which point she explained that it was only valid for “two days”, despite most of Thursday having already passed. Le sigh.

We then immediately had trouble using the little pieces of paper. Unlike the unrestricted access in Zürich, there were gates everywhere. After putting the tiny strip of paper into all the orifices we could find on top of the gate — presumably looking like the tourists we were! — we finally found the hole on the front into which the ticket was scanned and reappeared out the hole in the top. No arrows or explanation anywhere: you’re just supposed to know! Le sigh.

The next hurdle was navigating one’s way within the subway station. To their credit, the signs clearly identified the metro line and direction of travel, but we frequently found forks in the subsequent hallways with no additional signage, forcing us to backtrack after we inevitably went the wrong way.

We figured out enough to survive our stay thereafter, buying a second single ticket on Saturday to make our way to the train station. Unfortunately, this required us to change metro lines, and we once again took the wrong hallway, “exited” the station (all while staying underground), and found our tickets didn’t allow us to re-enter the adjoining metro. The staff were kind enough to issue us a replacement ticket, explaining that it was the “other hallway.” Le sigh.

Finally, upon our arrival at Gare du Nord, we were shocked to discover that one had to have a ticket simply to exit the facility. That’s right, there was no way out unless you had held onto that strip of paper. To their credit, there were signs… right on the exit gates themselves. We had kept the tickets, praise the LORD, but at this point I began panicking slightly as I worried about the time.

Two more exit gates, and we were finally out. Our train didn’t appear on the timetable, but I was expecting not to see it given how many other trains were supposed to leave first. Charity and I began to hunt for a coffee shop, when my Googling suggested I take a peek upstairs for boarding this particular train. To my surprise, I found we still had a full fledged customs process to get through — presumably courtesy of Brexit. Le sigh. Clearly I’ve been spoiled by the Eurozone transition from Switzerland to France.

We made our way through security with minimal fuss — thankfully, no need to dispose of fluids like boarding an airplane — and with 17 minutes to spare finally decided to get that coffee and a meal for the ride. As the final coffee was being poured, I hear over the loudspeaker, “The train to London St. Pancras is departing… momentarily.” PANIC!

Charity and I rushed to the platform, looking for carriage 7, and as we passed carriages 9 and 8 the doors there began to close. I flailed wildly at the staff outside, thinking we had literally just missed our only chance to get to London and the play that night, misinterpreting their raised hand as “stop, you’re too late.” Charity, to her credit, kept her calm, realizing far more quickly that they had simply closed the doors to the dining car and that the staff were encouraging me to slow down as I didn’t have to rush.

My face must have betrayed my panic, as the staff laughed as I hurried on, rushing into the right car, finding our seats and hoping we were actually even on the right train. It took a good 20 minutes before I de-stressed and realized we hadn’t missed anything, and actually would have been fine for another 10 minutes or so. Le sigh.

I hope you can understand why I captured very few photos in this dastardly attempt to make our way to the next leg of our journey. Excited to finally be heading to the motherland!

Leave a Comment

Zürich

On Tuesday, January 31st, Charity and I began our first significant trip together since our honeymoon some 13+ years ago.

Originally planned as an extension to a work trip, we flew overnight to Zürich, Switzerland, landing bleary eyed at what our bodies believed to be 4AM but the clocks and sun clearly at 10AM:

At the advice of my colleague and travelling companions to Zurich, we avoided sleeping upon arrival and instead made our way to the local Zoo. I can’t remember ever going to a zoo without being a child or having one in tow, but we made good use of the time to keep walking, stay awake, and overcome jet lag.

Public transportation in Canada cannot compare to the speed and quality of what we experienced in just 24 hours. The 24-hour Zürich Card we purchased at the airport gave us unlimited access to the train and tram network. But to my surprise, not once did I have to present my stamped ticket. Boarding a tram was as simple as stepping inside any doorway, with no length delay to scan your ticket or fumble with change.

Trams came quickly and often, giving us both the courage to travel throughout the downtown core:

After checking in at our hotel and a much needed shower and power nap, we endeavoured to buy Swiss chocolate as gifts for our friends at home watching the children and homestead:

A little wandering through back alleys on our way to dinner with our travelling companions yielded some incredible architecture:

Going to sleep at 9PM that night and getting up at 5:30 AM felt almost normal, though our eyes continued to betray some sleepiness. Nothing a fancy Swiss coffee couldn’t fix on our way to the train station!

While Swiss German seems to be the primary language, everyone we interacted with also spoke English well enough to help us find our way or order food. And while the city was remarkably clean and free of graffiti, we even found some sentiments expressed in English at a tram stop:

The Zürich Hauptbahnhof — the major train station in the capital — is what I wish every airport could be. A thriving metropolis of small shops, friendly patrons, minimal security, and the ability to simply step aboard your train within two minutes of its departure.

A long train ride ahead for the next leg of our journey, but oh so much more legroom!

2 Comments

A new MacBook (Day 1)

A week ago Monday, just 30 minutes after Apple concluded their Unleashed event, I had filed the requisite paperwork for a replacement work computer. My office manager approved the request nearly immediately, forwarding me the Apple tracking information that I’ve been refreshing daily since.

When I joined Mattermost almost four years ago, I explicitly asked for a 2015 MacBook Pro, wary of the keyboard troubles and general issues from the newer laptops available at that time. Despite being eligible for a replacement for some time now, I’ve been holding off, hoping Apple would get their act together and ship a laptop inspired by the success of that 2015 model instead of the madness of the past half decade.

Today, that laptop arrived: a 16″, 2021 MacBook Pro, with an M1 Pro chip, 32 GB of RAM, and 1TB SSD.

But it’s been so long since I’ve owned a new computer, that I’ve nearly forgotten how I arrived at my custom configuration. This blog post, aimed at the more technical reader, is a summary of just that. Perhaps it will also serve as a useful reference for my future self.

Startup

All new Apple computers have a predictable startup routine, prompting for a language, WiFi password, and how to configure various knobs and permissions No, I don’t want to enable “Hey Siri” on this work laptop. Yes, I’ll allow Apple to glean anonymous information about my computer and share crash reports with other developers. Yes, it’s ok to enable location support. And since I often rely on handoff between my other Apple devices, I opt to configure this computer with my personal Apple ID.

I double check my username conventions on my old work laptop — just the first name — and configure my user account accordingly. I’ll setup a profile picture later.

Crucially, I enable FileVault. This feature transparently encrypts the contents of the hard drive using a key derived from my system password. While unlikely to be stolen, encryption gives me peace of mind knowing that the files therein would remain inaccessible to any would-be-thief.

Homebrew

Before installing anything else — not even my beloved iTerm2 — I begrudgingly launch Terminal and install Homebrew. I rely on this open source package manager for most of the system-wide applications I install on my Mac, including that better terminal experience.

Installing Homebrew automatically install the requisite XCode developer tools, and I smile remembering just how much faster this step is on the impressive M1 Pro chip. Paired with my 1Gbps fibre-to-the-home connection, I think my biggest bottleneck is actually my Ubiquiti equipment. Time to think about a Dream Machine and upgraded WiFi 6 access points.

System Configuration

While in the terminal, I realize my system name is a descriptive but boring BMP16inch2021. I navigate to System Preferences > Sharingand attempt to reuse the same macbook-mattermost name from the old laptop next to me. The two computers realize the conflict, and force me to pick a non-conflicting name for my network. I eventually rename the old computer, knowing it will be erased and kept as a personal device thanks to Mattermost’s generous Hardware Buy Back Policy.

I pause to think about all the other settings I want to configure here — keyboard repetition, trackpad options, sounds — but decide to avoid doing this by hand and see if I can finally codify these settings in a more programmatic fashion.

Thinking the system name requires a reboot to take effect, I restart the computer for the first time — about 15 seconds from start to finish — and realize I haven’t even bothered to plug it in yet. Despite all the background activity from syncing iCloud Photos and Documents, I’m sitting at a comfortable 82%, down from 91% when I first opened it.

Hmm, the system name isn’t changed. After a rabbit-hole of Google searching yielding conflicting advice, I decide to run:

> scutil –-set HostName macbook-mattermost

Voila, no system restart required. Funny how much I’m tripping over the really basic stuff!

Dotfiles

To avoid an excess of manual configuration, I version control a myriad of scripts and config files to share between my devices. I need to get these configuration files onto this machine, but first I need to remember how I configured the custom encryption module I’m using with Git. I think it was gcrypt? Checking the old computer:

> git remote -v
digitalocean	gcrypt::rsync://root@digitalocean:gcrypt/dotfiles (fetch)
digitalocean	gcrypt::rsync://root@digitalocean:gcrypt/dotfiles (push)
origin	keybase://private/lieutdata/dotfiles (fetch)
origin	keybase://private/lieutdata/dotfiles (push)

Aha, yes. There’s the old Keybase configuration using their free, encrypted Git support, but also my custom gcrypt configuration I setup after Zoom bought Keybase.

I copy the upstream URL in hopes that handoff works between Big Sur and Monterey. Oh well, something else to investigate (or probably ignore). I brute force type it instead. I know this won’t work yet — not least of all the custom hostname — but I’m hoping it will give me a clue on what to setup next. Oh, interesting, copying from Monterey to Big Sur works without a charm. Good thing, too, since I haven’t installed 1Password yet and don’t want to type a long password to get into this blog on the new computer.

> gcrypt::rsync://root@digitalocean:gcrypt/dotfiles
Cloning into 'dotfiles'...
git: 'remote-gcrypt' is not a git command. See 'git --help'.

Ah, remote-gcrypt. Homebrew to the rescue? It helpfully suggests git-remote-gcrypt, and a few seconds later I try again to discover my next challenge:

> git clone gcrypt::rsync://root@digitaloean:gcrypt/dotfiles
Cloning into 'dotfiles'...
/opt/homebrew/bin/git-remote-gcrypt: line 403: gpg: command not found
gcrypt: Repository not found: rsync://root@digitaloean:gcrypt/dotfiles
warning: You appear to have cloned an empty repository.

Ah, gpg. Homebrew to the rescue! (You can see why this tool gets installed first!) This one takes a few minutes to download and install all the dependencies, so I launch Apple Music and play a favourite album from The Corner Room. Not expecting much from the built-in speakers, I’m briefly startled by the volume and clarity of the opening guitar strums of Psalms Songs, Vol. 1. Nice! Removing the empty dotfiles from the last failed attempt, I try again:

> git clone gcrypt::rsync://root@digitaloean:gcrypt/dotfiles
Cloning into 'dotfiles'...
gpg: directory '/Users/jesse/.gnupg' created
gpg: keybox '/Users/jesse/.gnupg/pubring.kbx' created
gcrypt: Repository not found: rsync://root@digitaloean:gcrypt/dotfiles
warning: You appear to have cloned an empty repository.

Ok, that’s not… terribly helpful. But I’m guessing it’s the custom .ssh/config hostname? The one configured in the repository I’m trying to clone? Replacing it with the real value prompts for a ED25519 key fingerprint validation, confirming my suspicions. Of course, I don’t expect to be able to authenticate yet without the proper credentials, but gcrypt once again fails to succeed but leaves me with an empty repository. Time to crack the knuckles and just get across this hurdle.

> ssh-keygen -t ed25519 -C "jesse@mattermost.com"

Yay, handoff seems to have started working from Monterey to Big Sur, and I can copy the resulting public key to my old laptop and off to the ~/.ssh/authorized_keys on the host I use for this repository. At this point, I realize I could have probably saved time by just cloning the repository directly from the old machine across the network, but hey: this is fun!

No more issues authenticating to the host, but it looks like there’s something else I need to remember about how to setup gcrypt:

> git clone gcrypt::rsync://root@<the real host name>:gcrypt/dotfiles
Cloning into 'dotfiles'...
gcrypt: Decrypting manifest
gpg: public key decryption failed: No secret key
gpg: decryption failed: No secret key
gcrypt: Failed to decrypt manifest!

Time to read the git-remote-gcrypt documentation. Time to generate a GPG key — mostly using the defaults, but adding a comment to clarify what this key is used for. I copy the key id back to the old laptop, and attempt to authorize that key on the digitaloean host:

> git config remote.digitalocean.gcrypt-participants "<old key id> <new key id>"
> git push digitalocean master
gpg: error reading key: No public key

Ugh, now I’ve broken it locally. Fortunately, it’s easy to revert:

> git config remote.digitalocean.gcrypt-participants "<old key id>"                                                                                                               > git pull
gcrypt: Decrypting manifest
gpg: Signature made Tue  2 Nov 17:10:25 2021 ADT
gpg:                using RSA key <...key...>
gpg: Good signature from "..." [ultimate]
Already up to date.

Ok, so I think I know why I just had a single key configured. Let’s just copy that key to the new machine for now.

> gpg --armor --export <key id> | pbcopy
> gpg --armor --export-secret-key <key id> | pbcopy

After each of the above commands, I imported the public and then private key onto the new machine — magically syncing thanks to Handoff:

> pbpaste | gpg --import

We’re making progress! (Reminder to self to either clean up that newly generate GPG key, or better yet, figure out how to support multiple keys properly.)

> git clone gcrypt::rsync://root@<the real host name>:gcrypt/dotfiles
Cloning into 'dotfiles'...
gcrypt: Decrypting manifest
gpg: Signature made Tue  2 Nov 17:10:25 2021 ADT
gpg:                using RSA key <...key...>
gpg: Good signature from "..." [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: <...key...>
gcrypt: Remote ID is :id:<...remote id...>
gpg: WARNING: "--secret-keyring" is an obsolete option - it has no effect
Receiving objects: 100% (1356/1356), 350.50 KiB | 20.62 MiB/s, done.
Resolving deltas: 100% (735/735), done.
gpg: WARNING: "--secret-keyring" is an obsolete option - it has no effect
Receiving objects: 100% (81/81), 40.87 KiB | 40.87 MiB/s, done.
Resolving deltas: 100% (28/28), done.
gpg: WARNING: "--secret-keyring" is an obsolete option - it has no effect
Receiving objects: 100% (3/3), done.
gpg: WARNING: "--secret-keyring" is an obsolete option - it has no effect
Receiving objects: 100% (9/9), 11.60 KiB | 11.60 MiB/s, done.
ssh: connect to host <the real host name> port 22: Connection refused
rsync: connection unexpectedly closed (0 bytes received so far) [receiver]
rsync error: unexplained error (code 255) at /System/Volumes/Data/SWE/macOS/BuildRoots/6b362bc7f6/Library/Caches/com.apple.xbs/Sources/rsync/rsync-55/rsync/io.c(453) [receiver=2.6.9]
gcrypt: Packfile 4fd09ebb03d8f0a4b27c9ccf6551dd65c728e357f6960d45729e2651ebc04d91 does not match digest!
fatal: early EOF

Hmm, gcryptic again. Especially the part about failing to connect. Maybe I have some rate limiting in place, and since I still don’t have my .ssh/config installed, I’m not setup to persist SSH connections. Lets’ do that by hand for now:

host *
  ControlMaster auto
  ControlPath ~/.ssh/ssh_mux_%h_%p_%r

Interesting, trying to connect in a new terminal shows the same connection issue — definitely rate limiting! Waiting a minute and then connecting succeeds this time:

> git clone ...
> ls dotfiles
Library		autoenv		dsl		fonts		homebrew	infrastructure	setup.sh	synergy.conf	unifi		upgrade.sh	vimgo_setup.sh

Hurrah! Wow, that took almost two hours, and I’ve barely got anything setup.

Let’s move that hand-configured ~/.ssh directory out of the way before I see if setup.sh still works.

> mv ~/.ssh ~/.ssh_manual
> cd ~/dotfiles
> ./setup.sh

Hmm, lots of spurious Git cloning issues:

...
lease make sure you have the correct access rights
and the repository exists.
fatal: clone of 'https://github.com/powerline/fonts' into submodule path '/Users/jesse/dotfiles/fonts' failed
Failed to clone 'fonts'. Retry scheduled
Cloning into '/Users/jesse/dotfiles/.tmux/plugins/tmux-logging'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
...

Hmm, maybe restarting my shell to get the newly installed configurations?

/Users/jesse/.fzf.zsh:source:13: no such file or directory: /usr/local/opt/fzf/shell/key-bindings.zsh
 ~  ls
zsh: no such file or directory: /usr/local/bin/gls

Yikes, I clearly haven’t tested this before. Let’s get brew install coreutils fzf out of the way. Looks like it needs a manual invocation of/opt/homebrew/opt/fzf/install. Yes to fuzzy auto-completion and key bindings. No, I don’t want to update my shell configuration files — I’m assuming those are part of my dotfiles — I hope!

Woot, no errors on starting a new shell! Back to Git — right, I need to import the SSH key into my GitHub profile:

cat ~/.ssh/id_ed25519.pub | pbcopy

Back to the old laptop and over to https://github.com/settings/keys. There we go, setup.sh successful. Is vim working?

> vim
[coc.nvim] "node" is not executable, checkout https://nodejs.org/en/download/
Press ENTER or type command to continue

So, almost. I guess we need to brew install node. No, wait, I think I want brew install nvm so I can juggle multiple versions. Hmm, despite a successful install, I see:

> nvm
zsh: command not found: nvm

I recall setting up some aliases in .zshrc to avoid pre-loading nvm until I needed it. Is ~/.nvm there?

> ls ~/.nvm
zsh: no such file or directory: /usr/local/bin/gls

Hey, I thought I fixed that with brew install coreutils. I guess there’s something in my old laptop’s config that’s not yet here. Weird, looks like I only did this for my old Bash install?

export PATH="/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH"

Oh well, let’s update .zshrc. Nope. Oh, I never modified $PATH before and just hard-coded an old path to /usr/local/bin/gls in an alias. I wonder how long this has been broken? Let’s undo that and keep the $PATH approach, while still customizing ls:

alias ls="ls --color -h --group-directories-first"

Fixed! But nvm is still not found — I’m going to solve this tomorrow. But at this point, the myriad of terminals on mys screen is killing me — brew install tmux to the rescue!

> tmux
[exited]

Ugh, something is failing inside my tmux configuration. I do vaguely recall this failure — brew install reattach-to-user-namespace. Voila!

tmux finally installed and running

Looks like my Powerline shell configuration isn’t working yet, though. I think I need to tell iTerm2 about the configuration settings?

A thing of beauty:

Yes, I’m excited about my terminals.

Battery Checkin

It’s getting late, but I wanted to check on battery performance so far. It’s down to 72% after about 2.5 hours of straight usage, including a brief foray into authorizing Apple TV and testing the HDR playbook and spatial audio of Spies in Disguise. Stunning!

Let’s see what I can accomplish in my spare time on Day 2!

1 Comment