My Mid-Life Crisis M1 MacBook Pro

Yes, I got myself an M1 MacBook Pro. A week or so before my birthday I decided to bite the bullet, take some of the money I’ve been putting aside and just order one, and it arrived a few days ago. This was actually around a week before the original estimate if my memory serves me correctly, so global logistics haven’t packed up yet.

Still, don’t leave your holiday shopping for the last minute, it’s getting really weird out there.

First Impressions

What I did the day I got it was pretty trivial–unpacked it, set up an admin account, set up my own account, waited 30 minutes for iCloud to do its thing while I went on a conference call, and then unplugged the Thunderbolt cable hooking up my 2016 MacBook to my and replaced it with the M1 Pro.

Remember when you used to plug in a machine to a monitor and they would both hem and haw and have this elaborate little dance flashing displays and moving windows about?

Well, this time that didn’t happen–everything I had open moved instantaneously to the big screen, and I pulled Remote Desktop off the App Store, set up my Bluetooth keyboard and trackpad, and carried on using it as the world’s (second) most expensive thin client without missing a beat.

It soon dawned on me that this thing is insanely fast.

Cosmetics

What notch? Seriously, I barely notice it (although to be fair I’m mostly using the machine with an external display, so I’m not staring at the internal one all the time).

But to be honest I’ve already tuned it out, although I did chuckle at the way the default wallpaper has a very dark band crossing the screen…

Well, at least this time around we got more dynamic wallpapers.

The round screen corners at the top are also unremarkable (the screen is gorgeous, so you’re not going to be gazing at the bezels) and I don’t mind the black keyboard backplate at all.

I suspect that Apple will go and do a white (or tinted) version for consumer laptops, and that it will actually look great.

Ergonomics

Although its primary use is on my desk, hooked up to my and with an external Bluetooth keyboard and trackpad, I am also using it around the house, so here are a few impressions of it as an actual laptop:

  • The first thing I noticed (flat on a desk) was the increased thickness, which made it higher than I expected when I placed my hands on it. However, that extra thickness vanishes when using the machine as an actual laptop.
  • The second thing was that the heel of my hand was not coming up against a razor sharp edge when resting my hand on the trackpad, which is a welcome change from the old models.
  • To compensate, you do feel the sharp-ish edges of the side air intakes when picking up the machine, but that’s a minor thing (the back vents are a tad unsightly, though).
  • Although I bought a PT keyboard layout, I’m using it as a US one, so I miss the long Return key I have on all my non-Apple keyboards (I have mostly switched to a US layout for the past couple of years).

This last bit is not Apple’s problem, but it likely means I will be getting a US Magic Keyboard for that extra TouchID goodness.

Either way, the built-in keyboard feels amazing when compared to my 2016 MacBook Pro.

What and Why

Which is a good segue into the specs I chose and why I chose them, because after years of having a Mac Mini and on my desk (both running my trademark multi-monitor setups), moving to a laptop is a major plot twist.

Hardware Specs

Since I intend this machine to last me at least five years, I went for the full M1 Pro die (10 CPU cores, 16 GPU cores and 16 ML cores), 32GB of RAM and 1TB SSD, in a 14” form factor (because it is almost exactly the size of my 13” and I don’t really like laptops the size of canteen trays).

The full set of cores and RAM will ensure I can run whatever I need for a good while, but more Apple-priced storage would be eye-wateringly expensive (at well over the going rate for SATA SSDs, at least).

So I chose 1TB based on the fact that even with a few VMs, multiple tens of gigabytes of photos, audio samples and music stuff galore, I was hardly taking up over 300GB on any of my other machines, OS included.

Plus most of my hobbies seem to be on a , so even if I started hammering out media content instead of writing there ought to be enough local storage for a good while.

If I already did any real amount of video work things would probably be different, but if that ever becomes an issue I can always rely on my NAS and scratch drives for editing.

So why a MacBook instead of a Mini?

In short, the things that made me get a MacBook sort of compounded over the years:

  • I was () tired of waiting for a silent compact and powerful desktop machine that I had no idea when Apple would get around to launching, nor if it would do what I wanted when it did.
  • I keep getting the impression that the Mini is an afterthought in the Mac product line, and I have a feeling it’s likely to ship with an M2 and sit somewhere between the M1 and the M1 Pro for another cycle.
  • The experience of using my 2016 MacBook alongside my as a “temporary” desktop was actually much better than I expected (except for the slowness), and largely made up for having let that 2016 machine linger for a long time (I abhor waste, and often felt I wasn’t using the MacBook enough).
  • That experience showed me I could survive with a single massively big display and contiguous real estate instead of a massive array of monitors (although I am using the laptop’s internal panel, and planning to have the option to add another display soon…).
  • I now have less stuff plugged in than when I had the . This is partly because I want a cleaner desk, and partly because my and a tiny 4-port USB3 hub provide me with enough connectivity for a Microsoft Gigabit Ethernet adapter, a Logitech Brio webcam and my , which is plenty of gear already.
  • With my spending working in my home office, personal projects and unwinding have started happening somewhere else. Unlike in the “before times”, I now have very little inclination to step into the office on weekends.
  • Along that same line of thought, the Ryzen laptop I got recently has pretty much become my go-to leisure machine since it is fast, long-lived and I can use it to zone out on the couch to write or code in the evenings and weekends.

So getting a new, insanely fast Mac I can bring out from the office, use throughout an entire weekend on a single charge1 and then hook back up through a single Thunderbolt cable seemed… almost perfect, really2.

And yes, the irony of wanting a laptop and favoring mobility after nearly two years of being stuck at home isn’t lost on me, but I suppose the bottom line is that I needed a change.

Setting Up

Given that I am switching hardware architectures and I have relentlessly simplified my setup over the years to deviate the least possible amount from the defaults, I decided not to use Migration Assistant and set up everything from scratch so as not to fill my machine with legacy crap.

So everything that was migrated across came either via iCloud (contacts, calendar, keychain, etc.) or later via and .

Baptism

Naming things is hard, but even in this era of “cattle vs pets” and cloud computing, I still like naming personal machines.

In particular, I’ve long had a sci-fi theme going with my desktops–my was (ironically) called serenity, (and now KVM host) is named rogueone, and since I’ve been watching The Expanse for six years now, the last season is soon upon us and I do have the occasional feeling of , there was really only one name I found appropriate for a new trusty steed:

I had quite a bit of fun doing the detailing on this.

Changing system volume names (and icons) is an old tradition that harks back to the original Mac OS 6 days and that gave quite a bit of character to our machines, and I missed that.

Macintosh HD and Rui's MacBook Pro are, well, just not fun at all.

The effort that went into that icon may seem meaningless these days since the Finder now defaults to not displaying internal volume icons on the desktop, but I know the icon is there, and in the end, that is what really matters.

Plus whenever an installer asks me where to put things in the future I’m going to be reminded of why I named the drive that way, and it’ll bring a splash of color to my day.

A Minor Note on Apple’s Software QA

The very first app I opened after setting up Remote Desktop was Contacts. And yes, in 2021, Apple’s Contacts app still beachballs when you try to edit an iCloud contact, even on an M1 Pro.

As many people have put it far less kindly, Apple doesn’t have a Pro hardware problem anymore – but they still have some major consumer software QA problems, and Contacts is still my go-to canary for whether they finally fixed a macOS release.

…and Another

Also, I would really like to know why AvatarPickerMemojiPicker is running constantly, with a dedicated instance of avatarsd for each user:

Seriously, Apple? Are memojis that important?

HDR support

One of the improvements I got from upgrading is that the M1 Pro suports DisplayPort 1.4 properly, whereas my 2016 Pro only worked correctly with the monitor configured for 1.2.

While setting it up, I noticed that my preferences now featured an HDR checkbox, which I temporarily toggled on for the sake of science:

HDR is much more palatable when you're in dark mode. In a cave. At midnight.

This immediately turned my desktop into a dim grayish landscape because the macOS UI doesn’t take advantage of HDR–so the way to manage HDR displays seems to be to dim everything but HDR-enabled content so that it can use your monitor’s “extended” color range.

I had read about this before and need to figure out if there is any sort of workaround, but it’s not a priority–and yet again, I think Apple has some software quirks to iron out here.

Software Compatibility

Like I pointed out, I set up my account as a non-admin user (my ancient is still mostly valid), and went through the App Store to grab my core set of apps (1Blocker, Office, OneDrive, Secrets, etc.) and then set up a few notable extras manually:

  • brew for pyenv, vim and the usual rigmarole of development tools and runtimes. So far all the “bottles” I’ve come across are arm64, except the dotnet one (which is still the outdated 5.0 version and x64, so I ended up downloading and installing the manually).
  • Phoenix, which I use for window management and tiling (because it’s fully scriptable and I coded some SnapAssist-like keyboard behaviors).
  • Parallels Desktop to have a local Docker VM (more on that later).
  • MonitorControl, which now works great with my and affords me brightness and volume control using the standard hot keys.
  • , which brought along with it all my “dotfiles” and terminal settings.
  • , which serendipitously was updated to 3.0 this week and has an M1 build that just flies when editing large meshes.
  • and , both of which also have M1 builds.
  • , DecentSampler and all my Arturia VSTs and filter effects, the latter of which were also recently updated with M1 support.

Intel Stragglers

As is to be expected, there are still a few apps that are not built for Apple Silicon and that I have to run in Rosetta. The biggest and most impactful one is , but it’s been publicly announced a native version is in the works, so that’s sort of OK… I guess?

Either way, it has been very fast on this machine (especially when compared to my old MacBook) and has not yet exhibited its usual CPU hogging behavior.

There are other things I would have really liked to have gotten native versions for, though:

  • Microsoft Teams still only has an Intel build, but you can work around that by using Edge and running it as a PWA (which works fine but has no camera effects, so no background blurring for you).
  • , sadly, still doesn’t have an official native M1 build (you can build it yourself, but it will lack the built-in browser and hence none of my overlays work). I haven’t gone that way yet since the Intel version is very responsive (unlike Teams).
  • , which I use to control my work laptop (it has a place on my regular desk beside my Mac), is also not yet Universal.
  • ImageOptim, alas, which I use for optimizing and posting most of my images here, is also not ported to Apple Silicon yet, and I would have loved to see it crunch images natively.
  • and Ultimaker Cura (which I dabble with routinely and was designing a new case with) also do not have native builds, although they seem snappy enough for casual use.
  • Native Instruments support for Apple Silicon also seems to be missing.

This last one is really weird considering their market clout and the amount of people out there who are running Kontakt…

Running Windows

A lot of people seem to be worried about this, and yet Parallels Desktop 17 just went and installed Windows for ARM in… less time than on actual physical Intel hardware, which was extremely impressive.

I haven’t used it extensively since I pretty much live inside Remote Desktop (and read all my corporate e-mail via Edge), but what little I could test comparatively (like a heavy browser session accessing my work e-mail and previewing documents) felt much faster on this machine than on my Surface Book 3, which is… interesting.

All in all, a nice thing to have around.

Although I’m curious as to the performance of Windows’ own Intel emulator, I did not install any Intel applications on it since I have plans to use it to give an arm64 build of Office 365 a spin first–it’s already been out there for Surface X users for a good while.

But the main point is that it works seamlessly–in fact, perhaps too seamlessly given the overall experience of using Windows in Parallels is still the same: you will either love or hate Coherence mode and having a mix of both Mac and Windows applications on the same display.

In my case, I always end up turning off Coherence because it’s tied to application integration, and I want to avoid launching the VM by accident (invoking the wrong version of Microsoft Edge from Spotlight and starting the VM by accident gets old really fast, even if it only takes two seconds to boot).

The notable thing is that a 4-core VM takes up less than 5% idle CPU on this machine, so I suspect most people will be delighted with having it as an alternative.

So yes, Windows on arm64 works fine in Parallels. But since I have dedicated Windows machines for work, running it on my Mac is more of a curiosity than an actual tool right now.

However, I expect to use it for soon.

Docker, The Whale In The Developer Echo Chamber

A lot of people are worried about using on these machines, though, either because they need to run Intel containers or because they lack the time or initiative to build their own arm64 versions.

Since I’m quite used to running cross-platform builds remotely for ages now (either in the cloud or against a local VM, but always via ssh or VS Code instead of using the abomination that is Docker Desktop), there is zero impact on my workflow–I plan to just keep doing the same thing and avoiding Docker Desktop altogether.

However, in case I do need to run Intel containers locally, I’ve already tried a few things:

  • I installed Docker inside an Parallels VM running Ubuntu LTS arm64 (20.04) and got that to run Intel containers by simply typing sudo apt install qemu-user-static (which is pretty much what Docker Desktop uses to run Intel containers as well).
  • I set up a pokey, but usable amd64 Ubuntu VM inside UTM, and came to the conclusion that on this machine it’s not much slower than the little Celeron box I routinely use for testing (although emulating the full kernel quickly adds to the slowness, so it was just a curio).
  • I checked Multipass again (which I used in the past), and it is evolving to where it will be a likely solution for running both amd64 and arm64 binaries. But I will only try that when #1437 is fixed. The bonus there is that you have cloud-init support (and nice toys like microk8s) out of the box and based on a Linux distribution that has some of the best arm64 support out there, so it’s worth checking back.
  • And, finally, prompted by Carlos, I tried podman, which is available on brew and can be made to run amd64 containers like this:
podman machine ssh
sudo -i
rpm-ostree install qemu-user-static
systemctl reboot

Either way, I see zero issues with doing container development on an M1 if you know what you’re doing, because:

  • Unless you’re doing very specific stuff (like hardware-dependent ML work or the ever-dwindling set of things that are just not available for arm64), you will easily find equivalent base images or build your own very quickly. Hard if you’re a newbie, mildly annoying if you’re experienced, will likely stop being a problem within a year or so.
  • You can always resort to emulation, another machine or both. Probably easiest for a newbie.
  • None of the containers you build yourself should be going into production – i.e., you should have a CI/CD system doing reproducible builds, and you can have that generate images for whatever architecture you need before deploying.

Which is what anyone delivering production code should be doing anyway.

Of course, some teams will probably need to lay out guidelines for base image use and/or build cross-platform base base images (which is probably what you should be doing anyway if you want to have full control over your dev stack), but most savvy developers will just fix it once and move on.

I do expect a lot of people who just want do download random container images from the Internet and run them to keep complaining, though, because things like docker-compose and Kubernetes have given birth to a culture where people expect to deploy highly complex solutions by just invoking a YAML file without understanding what it actually does or how the components are built.

But I digress–let’s have some fun.

Gaming

I will eventually have a go at getting Xbox Game Streaming or Steam over NVIDIA running on this (both should just work), but right now the only thing I’ve tried is , since ioquake3 recently came out with revamped Universal builds and playing it with a high-res texture pack at 5120x2160 and 120fps was… too tempting:

ioquake3 in half the size (I had to shrink down the image to 2048 pixels wide for your sake, dear reader).

As usual, this took a little bit of fiddling with q3config.cfg:

seta com_maxfps "1024"
seta cg_drawFPS "1"
seta r_mode "-1"
seta r_customheight "2160"
seta r_customwidth "5120"
seta cg_fov 100

…and yes, I was trying to see if it would go past 120 fps, but I suspect that is an engine cap. Still, the new Universal builds seem to be delightfully modern:

Kudos to the maintainers for keeping this up.

I might have a serious go at getting running locally, but I would have to use Crossover or Parallels and it , so I don’t see the point right now.

But I will be checking out what other classics I can run (I wish there was an Apple Silicon build of Homeworld Remastered, for instance).

Things I Miss

A touchscreen.

Seriously, using my Lenovo with either Linux or Windows 11 has made me enjoy the affordance of dismissing and arranging windows with a few quick taps. (I’m also missing Windows 11 SnapAssist mouse-driven layouts to tile windows, but that’s not a hardware thing).

Touchscreens are the future, Apple just hasn’t read its own memo.

Other than that, nothing else on is relevant, although I could extrapolate that I would like to have Face ID and Center Stage on this machine (which I fully understand the bezel can’t accomodate).

In practice, though, I’m so used to Touch ID that I hardly ever think about how effective the Windows Hello face recognition feature is on my Surface. They’re just different, and I’ve come to terms with it.

Surprisingly, I also miss the Touch Bar a bit–not just for text suggestions, but also for dismissing dialog prompts quickly (which, again, a touchscreen would be great for).

But I much prefer the “normal” full-height function keys and having a full-sized Esc key back on my laptop again, even if I had to spend an eye-watering amount of money to get the insanely fast computer it comes attached to.

Update: Bootstrapping pyenv

Quick note if, like me, you have your CFLAGS and LDFLAGS set since the dawn of time and were having trouble installing custom runtimes: Remove all of those and install pyenv from git (the brew version is fine, but there are some newer tweaks that are handy).

Then install these:

brew install openssl readline sqlite3 xz

…and if you need Python 3.8.6 (like I do, although I’m moving straight to 3.10.0), you’ll need this patch:

CFLAGS="-I$(xcrun --show-sdk-path)/usr/include" \
pyenv install --patch 3.8.6 <<(curl -sSL https://raw.githubusercontent.com/Homebrew/formula-patches/113aa84/python/3.8.3.patch\?full_index\=1)

  1. The battery lasted me around sixteen hours of use (over two days of wall time) from the first charge cycle out of the box, most of the time installing and downloading things. ↩︎

  2. So much so that I haven’t yet used the MagSafe charger yet. ↩︎

This page is referenced in: