The Local-First SDK
Philosophy
There is no cloud, it's just someone else's computer.
The Local-First SDK offers a stack to write applications as productively as when
using state-of-the-art cloud-based architectures, while providing the Seven
Ideals for Local-First Software 0 -- basically for free:
- Software can respond near-instantaneously to user input.
(No waiting on server round-trips, no spinners.)
- Cross-device synchronization.
(Pick up work on your mobile device just where you left off with your laptop.)
- "Offline-First" as a subset of Local-First.
(Connectivity is irrelevant when interacting with the application>0
- Seamless collaboration with other peers.
(Edit and sync shared data without fear of conflicts.)
- Full data agency.
(Do what you want with your data, it's yours only.)
- Secure and private data management.
(Everything is encrypted, only you have the keys.)
- Full ownership and control over the application's data.
(No one can take away a service from you.)
Components
The Local-First SDK comprises the following components:
- User and Access Control:
... (key management, acl)
- Multi-Device Support and Collaboration:
... (device auth, p2p, peer discovery (mdns and via cloud peer))
- Data Persistence
... (cloud peer or self-hosted)
- Multi device support and interoperability
... (browser, native, android/ios?)
Artifacts
The Local-First SDK comes in three flavours:
- An opinionated Javascript package (with Typescript bindings) to write
Local-First applications targeting the browser.
- A library which can be embedded into other applications, either as a rust
library or a C-compatible FFI.
- A native, permanent process shepherding the user's data. Applications can
interface with this daemon via HTTP.
The Local-First Javascript SDK
As the browser's API guarantees are weak, its environment has to be considered
ephemeral[^1]. This is why the optional Cloud-Peer supplemental services
complement the browser environment very well (data persistence, peer discovery).
As of now, the SDK is just offered as an ES module, requiring asynchronous
import:
import * as localFirst from 'local-first';
await localFirst.init();
[..]
[^1]: Most notably this is about persistence of user data (key material and
application data). However, it's easy to lose one's browsing data by switching
to another browser profile/container, etc.
Under the hood
Rust, libp2p, crdts, cambria, ..
--> INSERT AWESOMENESS HERE <--
License
Licensed under either of
at your option.
Contributing
Be respectful. Check out our Contribution Guidelines for
specifics.
Any contribution intentionally submitted for inclusion in the work by you, as
defined in the Apache-2.0 license, shall be dual licensed as above, without any
additional terms or conditions.