diff --git a/default.nix b/default.nix
index b76188d8d99200c565de8516773626570810a868..813a6cb432942fccd96b96ee07313ff84cf885c6 100644
--- a/default.nix
+++ b/default.nix
@@ -1,2 +1,14 @@
 { pkgs ? import <nixpkgs> { } }:
-pkgs.callPackage ./privatestorageio.nix { }
+let
+  # NixOS 19.03 packaged graphviz has trouble rendering our architecture
+  # overview.  Latest from upstream does alright, though.  Use that.
+  make-graphviz = (import (pkgs.path + /pkgs/tools/graphics/graphviz/base.nix) {
+    rev = "b29d8e369011b832f72e0d250a05a0a15dcb5daa";
+    sha256 = "1w61filywn9cif2nryf6vd34mxxbvv25q34fd34am1rx70bk08ps";
+    version = "b29d8e369011b832f72e0d250a05a0a15dcb5daa";
+  });
+  graphviz = (pkgs.callPackage make-graphviz { }).overrideAttrs (old: {
+    patches = [];
+  });
+in
+  pkgs.callPackage ./privatestorageio.nix { inherit graphviz; }
diff --git a/docs/source/architecture-overview.dot b/docs/source/architecture-overview.dot
new file mode 100644
index 0000000000000000000000000000000000000000..cc95fbb74a5b67fc290b80d53ac679a1d1c9d972
--- /dev/null
+++ b/docs/source/architecture-overview.dot
@@ -0,0 +1,50 @@
+digraph subscriptions {
+        rankdir=LR
+
+        subgraph cluster_usercontrolled {
+                label = "User Operated"
+                rankdir=LR
+                GridSync                 [label="GridSync",                          shape=circle]
+                Browser                  [label="Browser",                           shape=circle]
+                TahoeLAFS                [label="Tahoe-LAFS",                        shape=circle]
+        }
+
+
+        subgraph cluster_pscontrolled {
+                label = "PrivateStorage.io Operated"
+                rankdir = TB
+                PSWebServer              [label="PrivateStorage.io Web Server",      shape=box]
+                SubscriptionConfigWHPeer [label="Subscription Config Wormhole Peer", shape=box]
+                PaymentServer            [label="Payment Server",                    shape=box]
+                SATIssuer                [label="SAT Issuer",                        shape=box]
+                PSStorageGrid            [label="PrivateStorage.io Storage Grid",    shape=box]
+        }
+
+        User                     [label="User",                              shape=egg]
+        Stripe                   [label="Stripe",                            shape=pentagon]
+
+        User                     -> PSWebServer              [label="1. Get wormhole code",    fontcolor=red, color=red]
+        PSWebServer              -> User                     [label="2. 7-petulant-banana",    fontcolor=blue, color=blue]
+        User                     -> GridSync                 [label="3. 7-petulant-banana",    fontcolor=brown, color=brown]
+        GridSync                 -> SubscriptionConfigWHPeer [label="4. Get configuration",    fontcolor=black, color=black]
+        SubscriptionConfigWHPeer -> GridSync                 [label="5. Grid configuration",   fontcolor=magenta, color=magenta]
+        GridSync                 -> TahoeLAFS                [label="6. Instantiate",          fontcolor=aquamarine3, color=aquamarine3]
+        GridSync                 -> TahoeLAFS                [label="7. Redeem PRN",           fontcolor=crimson, color=crimson]
+        TahoeLAFS                -> PaymentServer            [label="8. Redeem PRN",           fontcolor=crimson, color=crimson]
+        PaymentServer            -> TahoeLAFS                [label="9. Payment required",     fontcolor=gold3, color=gold3]
+        TahoeLAFS                -> GridSync                 [label="10. Payment required",    fontcolor=gold3, color=gold3]
+        GridSync                 -> Browser                  [label="11. Open payment window", fontcolor=gold3, color=gold3]
+        User                     -> Browser                  [label="12. Enter payment info",  fontcolor=blue, color=blue]
+        Browser                  -> Stripe                   [label="13. Submit payment form", fontcolor=brown, color=brown]
+        Stripe                   -> Browser                  [label="14. Payment ok",          fontcolor=black, color=black]
+        Stripe                   -> PaymentServer            [label="15. Payment notification", fontcolor=magenta, color=magenta]
+        GridSync                 -> TahoeLAFS                [label="16. Redeem PRN",             fontcolor=aquamarine3, color=aquamarine3]
+        TahoeLAFS                -> TahoeLAFS                [label="17. Generate blinded tokens",        fontcolor=crimson, color=crimson]
+        TahoeLAFS                -> SATIssuer                [label="18. Redeem PRN, blinded-tokens=xs",  fontcolor=crimson, color=crimson]
+	SATIssuer                -> PaymentServer            [label="19. Check PRN",                      fontcolor=gold3, color=gold3]
+	PaymentServer            -> SATIssuer                [label="20. PRN Valid",                      fontcolor=gold3, color=gold3]
+	SATIssuer                -> TahoeLAFS                [label="21. PRN valid, signed-tokens=ys",    fontcolor=crimson, color=crimson]
+        TahoeLAFS                -> TahoeLAFS                [label="22. Store signed tokens",            fontcolor=crimson, color=crimson]
+        TahoeLAFS                -> GridSync                 [label="23. PRN Redeemed",                   fontcolor=red, color=red]
+        TahoeLAFS                -> PSStorageGrid            [label="24. Use storage, passes=y",          fontcolor=magenta, color=magenta]
+}
diff --git a/docs/source/architecture-overview.rst b/docs/source/architecture-overview.rst
new file mode 100644
index 0000000000000000000000000000000000000000..d8480a2483ebab1585287537f06b5a08664300d4
--- /dev/null
+++ b/docs/source/architecture-overview.rst
@@ -0,0 +1,4 @@
+Architecture Overview
+=====================
+
+.. graphviz:: architecture-overview.dot
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 50597866632a61920c8692f92f2e9db9fdd0e45b..0b25362aee9d1ba3c646123df5c45c58fcd57b1c 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -39,6 +39,7 @@ release = '0.0'
 # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
 # ones.
 extensions = [
+    "sphinx.ext.graphviz",
 ]
 
 # Add any paths that contain templates here, relative to this directory.
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 7fd7c24d958ad025072ad6e21896d5f932a75105..d06ae0d59b4ca91cbd00cd4a440da275f26f609e 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -10,7 +10,7 @@ Welcome to PrivateStorageio's documentation!
    :maxdepth: 2
    :caption: Contents:
 
-
+   architecture-overview
 
 Indices and tables
 ==================
diff --git a/privatestorageio.nix b/privatestorageio.nix
index 8595978216be317e2d85ee182ec8eeee4d3eae50..dd6dd425e8c6dd66860bcd758f11ae622a6ddd0c 100644
--- a/privatestorageio.nix
+++ b/privatestorageio.nix
@@ -1,9 +1,19 @@
-{ stdenv, python3Packages }:
+{ stdenv, graphviz, python3Packages }:
 stdenv.mkDerivation rec {
   version = "0.0";
   name = "privatestorageio-${version}";
   src = ./.;
+
   depsBuildBuild = [
-    python3Packages.sphinx
+    graphviz
   ];
+
+  buildPhase = ''
+  ${python3Packages.sphinx}/bin/sphinx-build -W docs/source docs/build
+  '';
+
+  installPhase = ''
+  mkdir $out
+  mv docs/build $out/docs
+  '';
 }