Evolu blog

Restore data ownership

Architecture decision records for coding agents

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.

introducing leancase

a minimal writing style with exact rules, a normal form, and a function in evolu

What's new in Evolu Type

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 builds its own SQLite

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 is released

Evolu 8 makes Evolu Library a complete foundation for straightforward TypeScript and rebuilds the storage, synchronization, schema, and ownership architecture behind Evolu local-first.

You might not need Comlink

Why MessageChannel with simple callbacks often beats Comlink's Proxy-based RPC for Web Workers and SharedWorkers.

Building identicons with AI

Creating deterministic identicons for Evolu's collaboration turned into an interesting exploration of working with LLMs on creative coding tasks.

The Copy‑Paste TypeScript Standard Library

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-like code without Effect

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.

Scaling local-first software

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.

Why the world needs local-first apps

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.