diff --git a/NOTES.md b/NOTES.md
index 5c70ec9..b5dfe09 100644
--- a/NOTES.md
+++ b/NOTES.md
@@ -1,3 +1,5 @@
+# Bootloaders
+
Commands for installing Grub:
```shell
@@ -24,3 +26,114 @@ cp /usr/lib/systemd/boot/efi/systemd-bootaa64.efi boot/EFI/BOOT/BOOTAA64.efi
cp /usr/lib/systemd/boot/efi/systemd-bootarm.efi boot/EFI/BOOT/BOOTARM.efi
```
+# Verity Streams
+
+At some point, we may want to support checking of streamed updates to make sure that only verified data is written to disk.
+
+Ensuring the integrity of update artifacts is paramount.
+
+When streaming an artifact to Rugpi, we may want to ensure that it has not been tempered with.
+To this end, Rugpi supports *verity streams*.
+The goal is that we do not want Rugpi to write anything to a partition or some other place that has not been verified *prior* to writing it.
+
+The verity stream can then contain an image or a Rugpi bundle.
+
+```
+rugpi update install --verity-hash sha256:uU0nuZNNPgilLlLX2n2r-sSE7-N6U4DukIj3rOLvzek ...
+```
+
+A verity stream is a linked list of blocks.
+The provided hash is used to verify the header, containing the hash of the first block.
+The first block then contains the hash of the next block and so.
+In addition, the header contains the size and other information such that we can make sure that data is not truncated and that we can efficiently decode a stream if we do not care about hashing at all.
+
+Binary format:
+
+```
+HEADER:
+MAGIC: [u8; 16]
+VERSION: u16
+ALGORITHM: u16
+SIZE: u64
+BLOCK_SIZE: u32
+HASH_SIZE: u16
+FIRST_HASH: u8[HASH_SIZE]
+
+BLOCK:
+NEXT_HASH: u8[HASH_SIZE]
+DATA: u8[BLOCK_SIZE]
+```
+
+Some commands that we may want to build:
+
+```
+rugpi-verity create