ExampleTech
Example post, written to show this format.
SQLite is the database I start with
A single file, a few pragmas, and a clear point where I stop using it.
When a project is still mine alone, I start with SQLite. Not as a toy I plan to throw away, and not as a dare. A database that lives in a file matches the way personal software actually gets backed up: you copy the file.
The alternative, for a long time, was to stand up a server before I had a user. Postgres is a wonderful piece of software. It is also a process to keep running, a port to remember, and a dump to schedule. If the thing I am building is a notebook, a recipe box, or a small internal tool, that ceremony is how projects stall. SQLite is already there when the process starts, and it is still there when the process exits.
I turn on three settings and then I stop fiddling.
PRAGMA foreign_keys = ON;
PRAGMA journal_mode = WAL;
PRAGMA strict = ON;
Foreign keys should have been the default. WAL mode is what makes a small app feel calm: readers do not block the writer, and a crash is much less likely to leave a half-written page. Strict tables refuse the kind of type confusion that SQLite will otherwise store with a straight face. None of this is exotic. It is the difference between a file format and a database I trust with my own data.
The queries stay boring on purpose. A personal site does not need a query planner story. It needs an index on the column I filter by, and a willingness to read the plan once when something feels slow. EXPLAIN QUERY PLAN is short enough to run every time I add a screen.
I know the shape of the limit, and I do not negotiate with it. SQLite allows many readers and one writer. That is a good deal until two different services both need to commit at the same moment, or until the database has to live somewhere other than the disk next to the app. When I get there, the migration is real work, and I would rather do it on purpose than pretend the file was always a server. The schema I wrote for SQLite, if I kept it to ordinary SQL, is mostly the schema I take with me.
There is a cultural habit of treating SQLite as the database you use in tests and something else as the database you use in production. I use it in production for anything that has one owner. A tool that needs queries, constraints, and a backup I can copy to another disk is a SQLite file. The strict-tables note in the SQLite docs is the page I send people who think the types are a suggestion: STRICT tables.
The rule I actually keep is smaller than the essay. Start with the file. Leave when a second writer shows up.