We run an in-app support chat for a marketplace: buyers, sellers and support agents talk in one-to-one and small group conversations, on web and mobile, often on flaky mobile networks. The first version stored messages in PostgreSQL, pushed them over WebSocket, and set a read boolean when the recipient opened the thread. It worked in the demo. In production we collected three kinds of bug reports: messages appearing in the wrong order, the same message showing twice after a reconnect, and "...