For years my reflex was: new project, new Postgres. The reasoning was lazy — “in case I need it later.” Most of the projects never grew into the database I provisioned for them.

The shift was small but real: assume SQLite, and only graduate when something specific forces the move. Since then I have shipped four small systems on SQLite that would have been more brittle, not less, with a server database behind them. Backups are a cp. Migrations are easier to think about. The file is the thing.

The cases where I still reach for Postgres:

  • More than one writer at meaningful concurrency
  • Genuine need for row-level access controls
  • Workloads that are dominated by analytical queries on large tables

Almost everything else is a SQLite project I have not admitted is a SQLite project yet.

← Back to Discoveries