NixOS on the Framework Laptop 16

Actually found some time to do it right away. Here’s my config fwiw.

2 Likes

Received mine today, glad to say I have NixOS up and running while typing this post! I’d like to experiment with fancier stuff but at the moment I’m happy to have my usual setup.

2 Likes

I am looking forward to not being underwater with work so that I can dig into your repos a little more. I love what I see so far!

The only fancier thing that is harder to retrofit on an existing system is impermanence, but it’s very far from being necessary.

Batch 4 here…

I received my FW16 on Monday. The NixOS install was incredibly straightforward, with no driver or other obvious issues. I’m still making time to test a few things, and to do some power tuning. My idle power consumption is sitting around 12W, which is more than I am comfortable with but not actually bad. I won’t have time to jump into that for a few weeks, though.

My HW configuration, for reference:

Susan’s Framework Laptop 16 DIY Edition

  • Ryzen™ 7 7840HS
  • Expansion Bay Shell (no dGPU)
  • DDR5-5600 - 64GB (2 x 32GB)
  • WD_BLACK™ SN770 NVMe™- M.2 2280 - 2TB
  • Laptop Bezel Black
  • Keyboard: International English - Linux
  • Numpad Module
  • I/O Expansion cards:
    • USB-A x1
    • USB-C x4
    • HDMI x1
    • Ethernet x1
    • Audio x1

It should be easy enough to get the power consumption down to less than 8 watts at idle with the screen at minimum brightness if you are using power profiles daemon for power management. Screen brightness does have a non-linear effect on power consumption though. If you use brightnessctl to set the underlying value between 0 and 255, a value of 50-80 is perceptually “50%” brightness, but consumes about a quarter the power of full brightness.

There is also the ABM feature for the panel that adjusts brightness based on screen content, and it is very subtle at lower levels (I have it at 1 out of 5), and that can save some battery too. See Mario Limoncello’s excellent work on that over on this thread: Adaptive Backlight Management (ABM)

TL;DR it should be coming to mainline linux in 6.9, or maybe later, and it should already be supported in PPD 0.20.

1 Like

Thanks for the info!

Hey everyone, spent quite some time trying to set up nix on my Batch 4 FW16. I based my config off the popular nix-starter-configs so they would be easier to understand for others and got it to a baseline I’m satisfied with. I hope my config can be helpful for others. My first time using nix so any feedback would be appreciated.

Here are the features of my config:

  • Root + Home Impermanence using encrypted ZFS datasets (you may have to adjust your disk path if you only have 1 ssd installed)
  • Fully automatic 1-command install and disk provisioning using nix-anywhere (see test.sh) and disko
  • home-manager + NUR for Browser Extensions
  • Secrets management via sops-nix. You will need to provision sops private keys to the target system manually at the moment.
  • Based on nix-starter-configs so hopefully easier for noobs like me to understand than configs from nix gods
  • Uses framework13 nix-hardware config
5 Likes

I hadn’t seen that example config repo before. I bet I can improve my config a lot by taking some features and best practices from it. Thanks for sharing!

Your config link is a 404 for me

Thanks for letting me know. Had my user visibility set to private. Should be accessible now!

1 Like

I’m surprised, in a good way, to see how many newcomers are ready to go all in with impermanence :smiling_face_with_three_hearts:
I went with ZFS too, but encrypting via LUKS instead.

2 Likes

My main issue is that the webcam currently looks horrible and has a red hue. I was able to create a good guvcview profile. Anyone know how I can declare this as part of my config? Anyone else experienc webcame issues?

Anyone else had any issues with DNS resolving not working after sleeping with s2idle?
Wpa_supplicant connects just fine and pinging IP addresses works, but trying to ping domains results in an error while resolving the domain.
Restarting the dhpc service using systemd temporarily restores it, but after a couple of minutes it doesn’t work again.
Dmesg and Journalctl unfortunately don’t have any useful information.

DNS often doesn’t work after waking up. I have been restarting tailscale to resolve it, so I assumed it was something to do with that.

I’m still not clear on what the benefits of impermanence are. Is it just to force you use best practices/define everything declaratively? Or does it have other benefits?

I haven’t had any issues with suspend using s2idle, but I have had that exact same issue when hibernating. I’ve been having other issues with hibernation though, including the system failing to hibernate, and fully locking up, so I’m not convinced it’s not just something misconfigured with my swap partition, or another part of my system.

Although I don’t have much experience with it, some benefits include:

  • 95%+ Reproducibility. If you also backup what you persist, you’re entire system and all of its state becomes up to 100% reproducible. In a matter of minutes you can have an identical computing environment with all accounts, sessions, etc. on a completely different system, VM, etc. If you use a flake with impermanence, it basically becomes the closest thing to a system-agnostic disk clone you can find.
  • Close to no config drift. You know that any behavior your system exhibits is because of what is in your flake.
  • Programs litter your $HOME and various other directory with lots of state that you may be unaware of when trying write a good config. Since impermanence deletes all of this state, it becomes obvious if something isn’t reproducible.
2 Likes

I don’t have any issues on Nix Unstable. What nix version are you on?

My personal plan is to use sanoid + syncoid or zfs_autobackup with my Proxmox machine at home to send incremental ZFS backups of my persist datasets each time I shutdown my machine. My dream is to never have to setup a computer again and to be able to take my work environment anywhere :laughing:

1 Like