Private
Every row and file is encrypted before it leaves the device. 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.write(|sql| {
sql.execute("INSERT …", params)?;
Ok::<_, CovenError>(())
}).await?;The cloud becomes the sync medium. Devices publish encrypted, signed slots in one shared order and read each other's; it only ever holds ciphertext.
handle.start_sync().await?;Apart, both devices edit the same row. The next sync applies both: merge is cell by cell.
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(move |sql| {
let file = sql.put_user_file("photos", photo, Place::Cloud)?;
sql.execute("INSERT INTO photos (id, file) VALUES (?1, ?2)", (id, file))?;
Ok::<_, CovenError>(())
}).await?;Each device caches what it reads, within a budget, and fetches only the chunks a read needs. A pin keeps a file whole for offline.
handle.pin(&[recording]).await?;Rows can belong to a circle. Moving a note into Gifts takes it off every device outside the circle; the rest of the store still syncs to everyone.
UPDATE notes SET audience = :gifts …