Security News
Node.js EOL Versions CVE Dubbed the "Worst CVE of the Year" by Security Experts
Critics call the Node.js EOL CVE a misuse of the system, sparking debate over CVE standards and the growing noise in vulnerability databases.
React Hooks library for local-first apps with end-to-end encrypted backup and sync using SQLite and CRDT.
React Hooks library for local-first apps with end-to-end encrypted backup and sync using SQLite and CRDT.
Evolu is designed for privacy, ease of use, and no vendor lock-in.
NonEmptyString1000
, PositiveInt
, etc.)filterMap
ad-hoc migrationLocal-first apps allow users to own their data. Evolu stores data in the user's device(s), so Evolu apps can work offline and without a specific server. How is it different from keeping files on disk? Files are not the right abstraction for apps and are complicated to synchronize among devices. That's why client-server architecture rules the world. But as with everything, it has trade-offs.
Client-server architecture provides us with easy backup and synchronization, but all that depends on the ability of a server to fulfill its promises. Internet is offline, companies go bankrupt, users are banned, and errors occur. All those things happen all the time, and then what? Right, that's why the world needs local-first apps. But until now, writing local-first apps has been challenging because of the lack of libraries and design patterns. That's why I created Evolu.
strict
flag enabled in your tsconfig.json
fileexactOptionalPropertyTypes
flag enabled in your tsconfig.json
file{
// ...
"compilerOptions": {
// ...
"strict": true,
"exactOptionalPropertyTypes": true
}
}
npm install evolu
Note Evolu uses several peer dependencies that are installed automatically with NPM and PNPM. If you are using Yarn, install them manually.
The complete Next.js example is here.
To start using Evolu, define schemas for your database and export React Hooks.
import * as Schema from "@effect/schema/Schema";
import * as Evolu from "evolu";
const TodoId = Evolu.id("Todo");
type TodoId = Schema.Schema.To<typeof TodoId>;
const TodoTable = Schema.struct({
id: TodoId,
title: Evolu.NonEmptyString1000,
isCompleted: Evolu.SqliteBoolean,
});
type TodoTable = Schema.Schema.To<typeof TodoTable>;
const Database = Schema.struct({
todo: TodoTable,
});
export const {
useQuery,
useMutation,
useOwner,
useOwnerActions,
useEvoluError,
} = Evolu.create(Database);
Learn more about Schema.
import * as Schema from "@effect/schema/Schema";
import * as Evolu from "evolu";
Schema.parse(Evolu.String1000)(title);
Mutation API is designed for local-first apps to ensure changes are always merged without conflicts.
const { create, update } = useMutation();
create("todo", { title, isCompleted: false });
update("todo", { id, isCompleted: true });
Evolu uses type-safe TypeScript SQL query builder kysely, so autocompletion works out-of-the-box.
const { rows } = useQuery(
(db) => db.selectFrom("todo").select(["id", "title"]).orderBy("updatedAt"),
// (row) => row
({ title, ...rest }) => title && { title, ...rest },
);
Evolu encrypts data with Mnemonic, a safe autogenerated password based on bip39.
const owner = useOwner();
alert(owner.mnemonic);
Leave no traces on a device.
const ownerActions = useOwnerActions();
if (confirm("Are you sure? It will delete all your local data."))
ownerActions.reset();
Restore data elsewhere. Encrypted data can only be restored with a Mnemonic.
const ownerActions = useOwnerActions();
ownerActions.restore(mnemonic).then((either) => {
if (either._tag === "Left") alert(JSON.stringify(either.left, null, 2));
});
Evolu useQuery
and useMutation
never fail, it's the advantage of local first apps, but Evolu, in rare cases, can.
const evoluError = useEvoluError();
useEffect(() => {
// eslint-disable-next-line no-console
if (evoluError) console.log(evoluError);
}, [evoluError]);
And that's all. Minimal API is the key to a great developer experience.
Evolu uses end-to-end encryption and generates strong and safe passwords for you. Evolu sync and backup server see only timestamps.
“There are no solutions. There are only trade-offs.” ― Thomas Sowell
Evolu is not P2P. For reliable syncing and backup, there needs to be a server. Evolu server is very minimal, and everyone can run their own. While it's theoretically possible to have P2P Evolu, I have yet to see a reliable solution. It's not only a technical problem; it's an economic problem. Someone has to be paid to keep your data safe. Evolu provides a free server for testing. Soon we will provide a paid server for production usage.
All table columns except for ID are nullable by default. It's not a bug; it's a feature. Local-first data are meant to last forever, but schemas evolve. This design decision was inspired by GraphQL nullability and versioning. Evolu provides a handy filterMap
helper for queries.
The Evolu community is on GitHub Discussions, where you can ask questions and voice ideas.
To chat with other community members, you can join the Evolu Discord.
It should be. The CRDT message format is stable.
Storage quotas and eviction criteria
Use OPFS Explorer Chrome DevTools extension.
Evolu monorepo uses pnpm.
Install the dependencies with:
pnpm install
Build Evolu monorepo:
pnpm build
Start developing and watch for code changes:
pnpm dev
Lint and tests:
pnpm lint test
Describe changes for release log:
pnpm changeset
FAQs
React Hooks library for local-first apps with end-to-end encrypted backup and sync using SQLite and CRDT.
The npm package evolu receives a total of 96 weekly downloads. As such, evolu popularity was classified as not popular.
We found that evolu demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Critics call the Node.js EOL CVE a misuse of the system, sparking debate over CVE standards and the growing noise in vulnerability databases.
Security News
cURL and Go security teams are publicly rejecting CVSS as flawed for assessing vulnerabilities and are calling for more accurate, context-aware approaches.
Security News
Bun 1.2 enhances its JavaScript runtime with 90% Node.js compatibility, built-in S3 and Postgres support, HTML Imports, and faster, cloud-first performance.