while the base protocol of Nostr is simple enough to implement, it's asynchronous, distributed and flexible nature makes it challenging in other ways.
distributed = you don't know where
asynchronous = you don't know when
flexible = you don't know what