Looks interesting, was looking for something like this as currently for Flutter I use Loro via flutter_rust_bridge as the CRDT data store, but it's not SQL so some things like big queries are annoying. How are you handling CRDTs in a SQL database? I thought those were notoriously hard as relational wasn't built for CRDT style syncing?
That’s kinda the tension I wanted to avoid. I’m not trying to make the whole SQL database a CRDT. CRDTs are opt-in per column. A row can keep normal, queryable fields like project_id, status, and title, while one doc column stores Yjs/yrs bytes. Concurrent edits to that column are merged by the server; normal columns still use versions and explicit conflicts. Flutter uses yrs through the shared Rust core. The trade-o…
Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
31–40 of 44 posts
Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#32No mention of conflict resolution? I suspect it's far too naive to be useful for anything real.
Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#33Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#34No mention of conflict resolution? I suspect it's far too naive to be useful for anything real.
https://github.com/syncular/syncular/blob/0ff4fed6b7e538293e...
(If it is manually written I don't trust the LLM-written docs.)
Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#35How do you handle browser storage eviction? I shipped a DuckDB-Wasm in-browser and found that survives reloads isn’t isnt really reliable.
Since pending writes live in the OPFS SQLite database, does the recommended setup request persistent storage or warn the user that an unsynced outbox could disappear if the origin is evicted?
Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#36No mention of conflict resolution? I suspect it's far too naive to be useful for anything real.
https://github.com/syncular/syncular/blob/0ff4fed6b7e538293e...
Trying to guess what's going on from what is there... looks like conflicts are raised on a per row basis, and the app resolves the conflicts.
Per-row is going to make it hard to handle a lot of data models. Maybe there's some way to see the whole transaction, but how? And how can you see the server vs local data? You'll want that for many cases.
It's right to leave it to the app to resolve conflicts -- there is no one-size-fits-all answer to this. But by providing no tools and, seemingly pushing everything through a per-row API, it's going to be essentially impossible for apps to get things right. You'll end up with incoherent data -- data that isn't valid within one node, and nodes different from each other. Generally, not what you want when you implement sync.
Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#37Pretty cool. How do you handle browser storage eviction? I shipped a DuckDB-Wasm in-browser and found that survives reloads isn’t isnt really reliable. Since pending writes live in the OPFS SQLite database, does the recommended setup request persistent storage or warn the user that an unsynced outbox could disappear if the origin is evicted?
Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#38Re: Show HN: Syncular – offline-first SQL sync with TypeScript and Rust cores
#39Earlier quoted context omitted.
https://github.com/syncular/syncular/blob/0ff4fed6b7e538293e...
There's not much there. Trying to guess what's going on from what is there... looks like conflicts are raised on a per row basis, and the app resolves the conflicts. Per-row is going to make it hard to handle a lot of data models. Maybe there's some way to see the whole transaction, but how? And how can you see the server vs local data? You'll want that for many cases. It's right to leave it to the app to resolve con…