Private
Every row and file is encrypted on the cloud. Key handling is idiomatic on every platform.
How it works
The life of a store
The phone inserts a row. It commits on-device; nothing waits on a network.
handle.sql(|sql| {
sql.execute("INSERT …", params)?;
Ok(())
}).await?;The cloud becomes the sync medium. Devices push sealed, signed objects and pull each other's; it only ever holds ciphertext.
handle.connect_sync(Some(key)).await?;Apart, both devices edit the same row. The next sync applies both: merge is column by column.
UPDATE notes SET body = 'oat, 2%' …A photo commits in the row's transaction. The laptop takes the row now and streams the photo on first view.
handle.write(
|b| { b.put_blob(ns, id, bytes); Ok(()) },
|sql| { /* INSERT the row */ Ok(()) },
).await?;The original moves to the cloud. Devices keep cache copies; a pin keeps one offline.
handle.make_remote("photos", id, false).await?;One flag shares a subtree. Flipping it on cascades the project's rows and files to peers; flipping it off retracts them from peers and keeps them local.
UPDATE projects SET shared = 1 …