Where it stops being a good idea
Honest defense of SQLite includes naming the cases where it is clearly the wrong tool. Reach for Postgres or another network database when:
- Many writers across many machines — SQLite serializes writes inside a single file. Multiple application servers behind a load balancer all writing to the same logical database is a Postgres workload.
- Network access required — if your data must be queried from clients on different hosts, you need a server. SQLite has no built-in network protocol.
- Granular per-user authentication / row-level security — Postgres has rich RBAC and RLS. SQLite has filesystem permissions and that's it.
- Very large datasets with hot writes — SQLite handles terabytes for read-heavy / append-heavy workloads, but a 10 TB OLTP system with thousands of concurrent writers belongs on a real database server.
- Replication / HA out of the box — Postgres has streaming replication and managed services everywhere. SQLite needs Litestream / LiteFS / Turso to add replication, and those have different semantics.
- Built-in role-based access — multi-tenant SaaS where each tenant must be isolated by SQL-level credentials.
Warning: The most common SQLite footgun is putting it behind a load-balanced web app on multiple servers without a replication layer. Each server gets its own copy of the file and they silently diverge. If you find yourself reaching for NFS, Glusterfs, or 'just rsync it', stop — pick a different database or add Litestream/Turso.
The honest version of 'SQLite scales' is: SQLite scales vertically and read-wise on a single node, dramatically better than people assume. It does not scale horizontally for concurrent writers without a real replication layer.