- We use worker threads for data encoding and network I/O
- We use the MutationObserver API for capturing diffs of the DOM
- We pull static resources directly from an application's servers (vs uploading from the client)
- Loading method shims first (and later the rest of our SDK asynchronously) to reduce initial loading time
- Batching requests and waiting for network downtime to send data
- We use Protobufs as a wire format for reducing bandwidth
I'm sure Session Stack employs some similar techniques- would be curious to hear about methods they're using as well.