diff --git a/default.nix b/default.nix
new file mode 100644
index 0000000000000000000000000000000000000000..b3dc9eeefdf3fbc8f83b4de838a5916e649bc75b
--- /dev/null
+++ b/default.nix
@@ -0,0 +1,50 @@
+with import <nixpkgs> {};
+
+let
+  py = python36;
+  # crc16 does not exist in pythonPackages - bring in our own.
+  crc16 = py.pkgs.buildPythonPackage rec {
+    pname = "crc16";
+    version = "0.1.1";
+
+    src = py.pkgs.fetchPypi {
+      inherit pname version;
+      sha256 = "15nkx0pa4lskwin84flpk8fsw3jqg6wic6v3s83syjqg76h6my61";
+    };
+  };
+in stdenv.mkDerivation rec {
+  name = "card10";
+  nativeBuildInputs = [
+    bash
+    crc16
+    gcc-arm-embedded
+    meson
+    ninja
+    py
+  ];
+  src = ./.;
+  buildCommand = ''
+    build=$(pwd)/build
+
+    # Copy source over, as dev sources from '.' thend to have odd permissions.
+    cp -r $src $(pwd)/src
+    cd $(pwd)/src
+    # Ensure we have write right to patch shebangs.
+    chmod -R +w .
+
+    # The nix sandbox does not have /usr/bin/env bash, patch things up.
+    for f in lib/micropython/*.sh; do
+      patchShebangs "$f"
+    done
+
+    # Actually run the build.
+    meson --cross-file card10-cross.ini "$build"
+    ninja -C "$build" -j $NIX_BUILD_CORES
+
+    # Copy artifacts to derivation outputs.
+    install -D -m 444 "$build/bootloader/bootloader.elf" -t "$out/bootloader"
+    install -D -m 444 "$build/pycardium/pycardium_epicardium.bin" -t "$out/pycardium"
+    install -D -m 444 "$build/epicardium/epicardium.elf" -t "$out/epicardium"
+    install -D -m 444 "$build/pycardium/pycardium.elf" -t "$out/pycardium"
+  '';
+}