Evolu now has local auth
Evolu now creates the user's account on the device, keeps it there, and unlocks it with a passkey, the iOS Keychain or Android Keystore, or without a prompt. Until now, every app built on Evolu 8 had to do that itself.
Restore data ownership
Evolu now creates the user's account on the device, keeps it there, and unlocks it with a passkey, the iOS Keychain or Android Keystore, or without a prompt. Until now, every app built on Evolu 8 had to do that itself.
One SQLite core in C now runs Evolu on the web, in React Native without expo-sqlite, and in Node.js without better-sqlite3. It encrypts in constant time, on the CPU's own AES and SHA-512 instructions where it has them, and runs Evolu's sync storage in C.
Every Evolu release waits on npm until I approve it with a Trezor, so a stolen push key, token, or GitHub session can't publish it. Here is how it works and why a Trezor.
Evolu now writes down the decisions no single file owns as short architecture decision records, adapted for AI agents working in parallel: named, not numbered, with proposals agents must not implement and a test that keeps code pointing at accepted decisions.
a minimal writing style with exact rules, a normal form, and a function in evolu
Evolu Type is a TypeScript validation library whose errors are plain, typed data and whose constraints stay in the type. Evolu 8.20 adds redacted secrets, form errors at the right field, and Types for common formats, dates, numbers, and collections.
Evolu for the web now runs plain SQLite, compiled by Evolu, through our own TypeScript layer that also encrypts databases. Here is why we did it, how we tested it, and what it costs.
Evolu 8 makes Evolu Library a complete foundation for straightforward TypeScript and rebuilds the storage, synchronization, schema, and ownership architecture behind Evolu local-first.
Why MessageChannel with simple callbacks often beats Comlink's Proxy-based RPC for Web Workers and SharedWorkers.
Creating deterministic identicons for Evolu's collaboration turned into an interesting exploration of working with LLMs on creative coding tasks.
I have an idea for a copy‑pasteable TypeScript standard library — a collection of code snippets so small and simple that you can just copy-paste them.
Effect is a vast ecosystem that embraces proven patterns like structured concurrency, tracing, resource safety, and dependency injection. But if you don’t want to—or can’t—use the full Effect, you can still write Effect-like code (to some extent). This post explores how to apply some of its core ideas using simple, focused TypeScript utilities, without committing to the full framework.
Building local-first apps is already a challenge, and making them scalable is an even greater one. It's not just about keeping data local; scalability touches multiple dimensions—from data volume and user count, to varying authentication models, growing code complexity, developer experience, and support for diverse use cases.
Most apps store users' data on someone else's server. This creates problems: privacy breaches, vendor lock-in, and apps that stop working when the internet goes down. Local-first apps fix this by storing data on users' devices first.