Gracias por los comentarios. Tienen razón en que SQLite no escala a lo grande, pero para un proyecto de nicho con ~100 usuarios concurrentes, creo que puede aguantar con WAL y escrituras por lotes. En cuanto al broadcast, uso un patrón de pub/sub en memoria y luego escribo a SQLite de forma asíncrona. Sé que no es perfecto, pero el objetivo es mostrar una arquitectura limpia. Sobre los CRDTs, es algo que quiero probar después, pero por ahora estoy usando versionado de bloques con timestamps. ¿Alguien ha usado Yjs con SQLite? Me interesaría ver cómo integran la persistencia.