nix flakes for busy people

TL;DR

To enable flakes on a NixOS system

Just put

  nix.settings.experimental-features = [
    "nix-command"
    "flakes"
  ];

in your configuration.nix. IMO it's a shame that flakes have been locked behind experimental for so long, it's a large part of why they have a bad reputation. It's absolutely worth enabling them since they're so useful.

To use a flake from github

nix shell github:ggerganov/llama.cpp

or to install a specific flake output:

nix shell github:ggerganov/llama.cpp#rocm

To list the outputs for a specific flake, you can usually type nix shell github:ggerganov/llama.cpp#<tab> and your shell may or may not list the outputs. If anyone has a better way to do this, please let me know.

To install a flake in your system profile, use

nix profile install github:ggerganov/llama.cpp

Here is the greatest power of nix flakes: the ability to install and use them as first-class packages just like anything from nixpkgs. It feels a lot better integrated than something like the AUR.

To create a nix flake for your own project

nix flake init -t templates#go-hello

Replace go-hello with whatever template you want that most closely matches your project configuration. Unfortunately many of these templates have the questionable behavior of also overwriting source files in the current directory, so I recommend only running nix flake init in an empty directory, and copying the flake.nix file over to your existing project.

A philosophical intro to nix flakes

Flakes are a way to replace the centralized nixpkgs repository with decentralized packages controlled directly by upstream. In many ways Linux packaging has been moving more and more towards upstream with things like appimages or flatpak, and being able to remove many of the distro-specific hacks needed to make things run on various systems. Nix flakes address this same issue, by allowing upstream to control their own flake.nix, and pull in the specific versions of any dependencies they might need. They also give an easy way to install any programs that might not be packaged yet for nixpkgs, as long as anyone has written a flake and published it online.

The bad parts

Nix flakes are still rough around the edges, and the worst part for a new Nix user is the lack of documentation. This is a large part of why I'm writing yet another nix flakes tutorial! https://xeiaso.net/blog/nix-flakes-1-2022-02-21 is really good, but reading this as a new user, I only wanted to know how to install an app packaged with flakes, and I didn't care so much about how to package my own stuff yet.