Pillar 3 · Privacy

What is offline-first
architecture?

Offline-first means your app works without internet. You edit, create, and use features locally. When you reconnect, everything syncs. It's the opposite of cloud-first. And it changes everything about privacy, reliability, and user experience.

Web Architecture April 11, 2026 14 min read

Most web apps work like this: your data lives on a server. You make changes locally. Those changes upload to the cloud. You depend on internet to function.

Offline-first flips this: your data lives on your device. You make changes locally. When internet returns, changes sync. You work whether the network exists or not.

This simple inversion solves three massive problems: privacy, reliability, and speed.

If the server can't see your data, the server can't sell it, analyze it, or leak it. Offline-first is the architecture of actual privacy.

Cloud-first vs. Offline-first: The fundamental difference

Understanding the distinction requires understanding where data "lives" and who controls access.

Dimension Cloud-First Offline-First
Data location Server (source of truth) Device (source of truth)
Network requirement Required at all times Not required for basic use
Sync direction Device → Server Device ↔ Server (bidirectional)
Privacy model Server knows everything Device is sovereign (optional sync)
Speed Limited by latency Instant local (no latency)
Offline capability Limited or broken Full functionality
Conflict resolution Server decides Device + Server negotiate

The philosophical difference is crucial: Who owns the data?

In cloud-first, the server owns it. You're a guest. In offline-first, you own it. The server is optional infrastructure.

The architecture layers: How offline-first actually works

Building offline-first requires three distinct layers:

The offline-first stack

📱
Layer 1: Local Storage
IndexedDB, SQLite, or local file system. Your app stores everything locally. Survives network failures, browser restarts.
Layer 2: Sync Engine
Detects changes, queues updates, handles conflicts. When network returns, pushes changes up. Pulls remote changes down. Reconciles conflicts.
🔒
Layer 3: Encryption (Optional but Recommended)
Client-side encryption (AES-256-GCM). Server stores encrypted data. Only your device holds the key. Server cannot read your data even if it tried.

CHRONOS implements all three layers. Your vault data lives in IndexedDB (Layer 1). When you connect, a sync engine (Layer 2) pushes encrypted data to Vercel (Layer 3). The server stores ciphertext. Even Vercel can't read your vaults.

Building offline-first: The technical patterns

There are three main architectural patterns for offline-first apps:

1

Local-first (no server)

Data never leaves the device. Examples: offline note apps, local todo lists, browser extensions. Advantages: maximum privacy, instant UX, no infrastructure cost. Disadvantages: no cross-device sync, backup is user responsibility.

2

Sync-optional (local + optional server)

Data is local by default. User can opt-in to sync. Examples: Logseq, Obsidian vaults. Advantages: privacy respected, sync is optional, works without server. Disadvantages: user responsibility for backup, sync setup requires user knowledge.

3

Sync-by-default (local + automatic sync)

Data is local. Sync happens automatically when network available. Examples: CHRONOS, Apple Notes (with encryption), Google Docs offline mode. Advantages: convenience, cross-device access, backup is automatic. Disadvantages: requires infrastructure, must handle sync conflicts carefully.

CHRONOS uses pattern #3: sync-by-default with client-side encryption. You edit locally (instant). When you connect, changes sync to Vercel (encrypted). You can access from any device. The server never sees unencrypted data.

The sync conflict problem (and how to solve it)

The hardest part of offline-first isn't offline functionality. It's conflict resolution.

Imagine: You edit a vault on your phone (offline). At the same time, you edit the same vault on your laptop (also offline). Both go online. Now you have two versions of the vault. Which one wins?

Cloud-first apps never have this problem because the server is always the source of truth. Only one version can exist at a time.

Offline-first must choose a conflict resolution strategy. Common approaches:

Conflict Resolution Strategies

Last-write-wins (LWW): The most recent edit wins. Simple. Loses earlier edits. Bad for important data.

Operational transform (OT): Google Docs approach. Transforms conflicting operations into a consistent order. Complex. Works well for collaborative editing.

CRDT (Conflict-free Replicated Data Type): Each change has a unique ID + timestamp. All versions converge to the same state without a server. Best for offline-first.

Three-way merge: Compare original, your version, and their version. Merge intelligently. Used by git. Requires user input sometimes.

Shapiro, M., Preguiça, N., Baquero, C., & Zawirski, M. (2011). Conflict-free replicated data types. In Proceedings of the 13th International Symposium on Stabilization, Safety, and Security of Distributed Systems.

CHRONOS uses a simpler approach: device isolation. Each device has its own vault instance locally. Syncs are merge-safe because they're additive (new vault entries append, they don't modify existing ones). This avoids conflicts entirely.

Why privacy requires offline-first

Privacy advocates have a saying: "If you can't read it, you can't sell it."

Cloud-first architecture gives servers access to everything. Even with end-to-end encryption claimed, the infrastructure exists for surveillance:

Offline-first inverts this. The server never sees:

The only thing the server can observe is: "This encrypted blob changed." That's it. No value extraction possible.

Offline-first isn't just a tech choice. It's a statement: You own your data. Not the platform. Not the government. You.

When to use offline-first (and when not to)

Offline-first isn't always the right choice. It adds complexity. Use it when:

Don't use offline-first when:

Building CHRONOS: A case study in offline-first

CHRONOS was built offline-first because the use case demands it:

Problem: People need a place to put thoughts they don't want anyone to see. Vaults for anxiety, anger, secrets, vulnerability.

Cloud-first solution: Send encrypted data to a server. Hope the server is trustworthy. Hope no one hacks it. Hope the government doesn't subpoena it.

Offline-first solution: Data never leaves your device unless you explicitly sync. Sync is encrypted. The server sees ciphertext, not your thoughts. You control when/if you sync.

Here's how CHRONOS implements it:

// User creates a vault entry locally const vault = { id: 'unique-id', content: 'My private thought', createdAt: Date.now(), timelock: '1 day' }; // AES-256-GCM encrypts it before leaving device const encrypted = await encryptAES256GCM(vault, userKey); // Result: encrypted data only // Stored in IndexedDB (local storage) await db.vaults.add(encrypted); // When network returns, sync engine pushes encrypted blob // Server stores: random bytes, cannot decrypt // Only your device holds the key

The result: Your vault data is unreadable to CHRONOS, to Vercel, to anyone but you.

The future of web apps: Local-first and offline-first

The industry is shifting. Major products are adopting offline-first:

Why? Because users realize: cloud-first is convenient but expensive. Offline-first is better for privacy, speed, and reliability.

The architecture question is becoming: Does the company own your data, or do you?

Offline-first is the technical answer to the ownership question.

CHRONOS

Your data stays
on your device.

Offline-first architecture means your vaults are always yours. Even we can't read them.

Open CHRONOS