As someone who very closely watches this CRDT and local-first space, it's really quite a bit harder than doing it the old fashioned client-server-model way, because you have to architect your systems to sync seamlessly when offline and then online. I've used tRPC and GraphQL before and I've really been thinking of something where we'd have the same DX as the client-server model such as with tRPC and GraphQL but in a way where there is no difference between client and server state, there is only "state." This makes sense because for local-first, the entire state of the app must be replicated locally anyway.

Recently there have been CRDT solutions that try to solve this problem, however, such as Triplit [0], or ElectricSQL [1].

[0] https://triplit.dev

[1] https://news.ycombinator.com/item?id=37584049

Also https://github.com/vlcn-io/cr-sqlite/ which is SQLite + CRDTs

Runs/syncs to the browser too which is just lovely.