Ok the third dimension is sync engine vs syncing datastore.
A syncing datastore is a backend datastore (that also syncs). It takes the place of postgres/mysql/whatever in your stack, and also takes the place of APIs. They *are* the system of record.
A sync engine is only a data transport layer. It takes the place of GraphQL/REST APIs, but not the place of the database.
Examples of sync engines are powersync, electric, replicache, zero, yjs, automerge, jazz tools .... and I guess I might put
@tinybasejs in this category too?
Examples of datastores are instant, triplit, convex, firebase, liveblocks ...
The difference here is ease of use vs flexibility. The syncing datastores are tightly integrated systems that generally are very easy (almost trivial) to setup. But the downside is that they are their own universes. Hard to integrate with the rest of the tools from the software world.
If your sync engine is backed by standard pg, then customers can use it alongside anything that talks to pg. They can easily swap you out for some other sync engine. They can also swap out pg and use a different database.
On the other hand, people are currently alpha testing zero and the biggest stumbling block they hit right away is just getting the connection to pg setup 🫠.
Tradeoffs.