Decrypted Payload Caching

NDK can cache decrypted plaintext separately from the original encrypted event.

Behavior

When a supported usecase needs encrypted content:

  • NDK first checks for a cached plaintext sidecar
  • if plaintext is already cached, the signer does not need to decrypt again
  • if plaintext is missing, NDK decrypts and stores it in the cache backend

The original event remains unchanged and stays encrypted in the canonical event store.

Cache key

Decrypted plaintext is cached per:

  • event id
  • viewer pubkey

This means the same event can have different cached plaintext entries for different viewers.

What this helps with

This is especially useful when:

  • the app re-renders the same encrypted content repeatedly
  • decryption depends on a remote signer
  • the signer is slow compared to local cache reads

Current use

Current NDK usecases that can reuse cached decrypted payloads include:

  • GiftWrap
  • private Nip51List content through Lists
  • NIP-17 direct message flows that unwrap gift-wrapped messages

What apps should assume

  • cached plaintext is an optimization and a persisted sidecar
  • encrypted event content is still the authoritative wire format
  • deleting the original event from cache should also remove the associated decrypted sidecar
  • using a persistent cache backend allows decrypted sidecars to survive restart