In 2015 I got myself a brand new MacBook Pro Mid 2014. The beefiest configuration I could find on the market. This thing was a BEAST! Fast-forward to 2025 and it’s collecting dust, any update or installing any software is a pain. 80% of the brew packages aren’t working because of the expiry date of the laptop is long past due. I could actually install a new MacOS on it using OpenCore Legacy Patcher, but I decided to think different, and went a different route. NixOS, baby!
TL;DR
- Built a custom NixOS ISO with Broadcom Wi-Fi support
- Flashed it, booted with EFI, used GNOME installer
- Partitioned manually with parted
- Installed NixOS with GNOME environment (Plasma is also a great option, but I personally allergic to KDE since 2012)
Why?
Because even if I’m able to install Sequoia on this machine, it’d still be incredibly slow. See, systems rarely get less complex, which applies to operating systems too. Each new release of MacOS will add more background services, and UI overhead. I would be able to use new software, but it will be practically unusable for what I’m planning to use it for anyway. With NixOS I can make it as slim as possible and make it run smooth.
Second why?
Docker.
How?
So I want fully functional machine with working:
- Wi-Fi
- Bluetooth
- Trackpad
- Audio
I don’t really care about the camera. I only realised this while writing these words, I need to check if it’s working. If it’s not, not a big deal.
Building the ISO
First, I’ve built the NixOS ISO with proprietary Broadcom drivers for the wifi module using my NAS that runs N100, because as far as I know you can’t do it on MacOS.
It requires a few steps:
Install nix package manager
Just grab the command from the nixos website. For Linux:
sh <(curl --proto '=https' --tlsv1.2 -L https://nixos.org/nix/install) --daemon
Clone nixos github repository
git clone --depth=1 --branch release-25.05 https://github.com/NixOS/nixpkgs.gitcd nixpkgs # don't forget to CD !
If you don’t need whole git history (and to compile an ISO image you don’t), you can do a shallow copy, hence --depth=1
Create a nix installer that includes Broadcom drivers
Edit nixos/mac-installer.nix
and include Broadcom proprietary drivers. For this we need to add nixpkgs.config.allowUnfree = true;
{ config, pkgs, ... }:
{ imports = [ ./modules/installer/cd-dvd/installation-cd-graphical-gnome.nix ];
nixpkgs.config.allowUnfree = true; hardware.enableAllFirmware = true;
boot.initrd.kernelModules = [ "wl" ]; boot.kernelModules = [ "wl" "kvm-intel" ]; boot.extraModulePackages = [ config.boot.kernelPackages.broadcom_sta ];
networking.networkmanager.enable = true;
environment.systemPackages = with pkgs; [ vim git wget curl ];}
Build the ISO
Now all we need to do is to run the nix-build
(installed as part of the nix package manager installation):
NIXPKGS_ALLOW_UNFREE=1 nix-build '<nixpkgs/nixos>' -A config.system.build.isoImage -I nixos-config=./nixos/mac-installer.nix
As soon as the process finishes (took less than 1 hour on N100) the ISO can be located inside the result
directory:
ls -la resultlrwxrwxrwx 1 root root 100 May 26 07:50 result -> /nix/store/xqmqwlvjclmxlfzsprg35f7kg08awg0n-nixos-gnome-25.11pre805949.bdac72d387dc-x86_64-linux.iso
It’s only 2.4Gb, so virtually any USB stick (unless you still possess one from 2006) you have around will do.
Flashing the image and installing the NixOS
Flash the ISO onto a USB stick with dd
:
I’m using block size of 4MB for better performance:
# dd if=result/iso/nixos-gnome-25.11pre805949.bdac72d387dc-x86_64-linux.iso of=/dev/sdX bs=4M status=progress oflag=sync2524971008 bytes (2.5 GB, 2.4 GiB) copied, 180 s, 14.0 MB/s606+1 records in606+1 records out2542665728 bytes (2.5 GB, 2.4 GiB) copied, 180.987 s, 14.0 MB/s# eject /dev/sdX
Make you replace sdX
with your device, - grab it from lsblk
. Mine was /dev/sdd
, but I didn’t want someone accidentally overwriting their primary HDD, so double-check yours.
Now, plug the the stick into a USB port of Mac, and (re)boot it, and while it’s booting hold the Alt/Option (⌥) key, select EFI boot, choose arrows and select the USB stick, and press Enter.
As soon as GNOME Live environment launches you can connect to Wi-Fi and use terminal to proceed the installation.
Make partitions
I used [parted](https://www.redhat.com/en/blog/partitions-parted)
which comes with the system itself:
Double-check your disk device name with lsblk
before proceeding — mine was /dev/sda
, but yours, albeit unlikely, might be different. Using the wrong one will erase the wrong disk.
sudo parted /dev/sdaparted> mklabel gptparted> mkpart ESP fat32 1MiB 513MiBparted> set 1 boot onparted> mkpart primary ext4 513MiB 100%parted> quit
Next up, we need to format the partitions.
Formatting partitions
sudo mkfs.fat -F32 /dev/sda1
sudo mkfs.ext4 /dev/sda2
sda1
is the EFI partition (around 512MB, FAT32, with boot flag). And sda2
is the root partition.
I decided to go with only 1 partition for the system and documents, feel free to slice up your disk the way you want it.
As soon as the partitions are formatted, we need to mount them to proceed the installation.
Mounting partitions
mkdir -p /mnt/bootmount /dev/sda2 /mntmount /dev/sda1 /mnt/boot
Quite straightforward, I don’t think it requires any commentary. Let’s move on to generate the nix config and finish the installation
Config and installation
To generate initial config use this command:
nixos-generate-config --root /mnt
The config file will be generated into /mnt/etc/nixos/configuration.nix
which you can then edit using editor of your choice. In my case it’s vim which I included in the ISO (scroll up to the ISO build stage).
My initial configuration included only bare bones things I needed. Unfortunately I don’t have a snapshot, but something like this would do (everything else can be installed/configured after the installation of the system on the hard drive):
{ config, pkgs, ... }:
{
nixpkgs.config.allowUnfree = true;
networking.hostName = "thinkdifferent"; # Because I'm a dork
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
time.timeZone = "Australia/Sydney";
users.users.nemoden = { # before I was coffeeaddict I was know by this tag :)
isNormalUser = true;
extraGroups = [ "wheel" "networkmanager" "input" ];
shell = pkgs.fish;
};
environment.systemPackages = with pkgs; [
git vim curl wget htop
];
services.xserver.enable = true;
services.xserver.displayManager.gdm.enable = true;
services.xserver.desktopManager.gnome.enable = true;
networking.networkmanager.enable = true;
services.libinput.enable = true;
security.sudo.enable = true;
security.sudo.wheelNeedsPassword = false;
system.stateVersion = "25.05";
}
If everything looks good in your configuration.nix
, you’re ready to go. Just run this and you are golden running NixOS on your relic:
nixos-install
reboot and enjoy your mac’s new life.