Some conventions: * Directories / file names: lowercase, and use dashes between words, no camel case. I.e., all-packages.nix, not all allPackages.nix or AllPackages.nix. * Don't use TABs. Everybody has different TAB settings so it's asking for trouble. * Use 2 spaces of indentation per indentation level in Nix expressions, 4 spaces in shell scripts. (Maybe 2 is too low, but for consistency's sake it should be the same. Certainly indentation should be consistent within a single file.) * Use lowerCamelCase for variable names, not UpperCamelCase. * Function calls with attribute set arguments are written as foo { arg = ...; } not foo { arg = ...; } Also fine is foo { arg = ...; } if it's a short call. * In attribute sets or lists that span multiple lines, the attribute names or list elements should be aligned: # A long list. list = [ elem1 elem2 elem3 ]; # A long attribute set. attrs = { attr1 = short_expr; attr2 = if true then big_expr else big_expr; }; * Short lists or attribute sets can be written on one line: # A short list. list = [ elem1 elem2 elem3 ]; # A short set. attrs = { x = 1280; y = 1024; }; * Breaking in the middle of a function argument can give hard-to-read code, like someFunction { x = 1280; y = 1024; } otherArg yetAnotherArg (especially if the argument is very large, spanning multiple lines). Better: someFunction { x = 1280; y = 1024; } otherArg yetAnotherArg or let res = { x = 1280; y = 1024; }; in someFunction res otherArg yetAnotherArg * The bodies of functions, asserts, and withs are not indented, so assert system == "i686-linux"; stdenv.mkDerivation { ... not assert system == "i686-linux"; stdenv.mkDerivation { ... * Function formal arguments are written as: {arg1, arg2, arg3}: but if they don't fit on one line they're written as: { arg1, arg2, arg3 , arg4, ... , argN }: