diff --git a/morph/README.rst b/morph/README.rst
index 96d03eb3cf522af6f1b0065105a2d57ab5c78f6a..6d26a1e52abe1a55ed4ec6bba9a198318ff6f37a 100644
--- a/morph/README.rst
+++ b/morph/README.rst
@@ -36,11 +36,14 @@ lib
 ---
 
 This contains Nix library code for defining the grids.
+It has all the details of how each type of node in our grid is configured, and does know about morph (so defines deployment.secrets, and has the logic for collecting data defined by other nodes); and defines options (i.e. grid.*) for things specific to how we configure grids (i.e. grid.publicKeyPath), metadata about nodes that we use on other nodes (i.e. grid.monitoringvpnIPv4 which is used to define various things on the monitoring node).
+Each top-level module here defines one type of node, with all (or at least most) of the configuration necessary for that node.
 
 grid
 ----
 
 Specific grid definitions live in subdirectories beneath this directory.
+They consist almost exclusively setting options defined in morph/lib (and few options defined elsewhere), and then delegating to the morph/lib modules.
 
 private-keys
 ~~~~~~~~~~~~
diff --git a/nixos/modules/README.rst b/nixos/modules/README.rst
new file mode 100644
index 0000000000000000000000000000000000000000..bf411a0839f6ab9a1d61376526c31cffaa469351
--- /dev/null
+++ b/nixos/modules/README.rst
@@ -0,0 +1,2 @@
+These are mostly modelled on upstream nixos modules, are generally fairly configurable (they don't tend to hard-code paths, they can be enabled or disabled), and they don't know anything about morph (e.g. deployment.secrets) or how the different grids are configured (i.e. grid.publicKeyPath). Each module here tends to define one service (or group of related services) or feature.
+Eventually, all of these will be imported automatically, and controlled by services.private-storage.*.enabled options.