-- Group chats. The server stores group METADATA (name + membership) so members -- can discover each other, but message content is still E2E: the sender encrypts -- each message separately to every member (pairwise Signal fan-out). CREATE TABLE groups ( id TEXT PRIMARY KEY, name TEXT NOT NULL, created_by TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, created_at INTEGER NOT NULL ); CREATE TABLE group_members ( group_id TEXT NOT NULL REFERENCES groups(id) ON DELETE CASCADE, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, added_at INTEGER NOT NULL, PRIMARY KEY (group_id, user_id) ); CREATE INDEX idx_group_members_user ON group_members(user_id);