← All notes
Note · September 2026 · 6 min read
September 2026 · 6 min read

Why it ended up being SQLite

On the size of problems – and the size of their solutions.

ArchitectureOSPOSQLite

For our OSPO work we needed a place where knowledge about our open-source usage comes together: packages, licences, SBOMs – and who knows their way around what. That sounded like a knowledge graph, and therefore like a graph database.

The comparison

I took a closer look at ArcadeDB and Neo4j, and asked along the way whether RDF and SPARQL or a property graph would fit better. Both databases can do considerably more than we need. That was exactly the problem: every capability we do not use still wants to be operated, updated and understood.

The size of the problem should determine the size of the solution – not the other way round.

The actual insight

The smaller answer

For the amount of data this is actually about, SQLite is enough: FTS5 for full-text search, sqlite-vec for semantic similarity and a few ordinary tables for the relations. One file, no service, nothing to operate.

SQLschema.sql
CREATE VIRTUAL TABLE docs_fts USING fts5(title, body);
CREATE VIRTUAL TABLE docs_vec USING vec0(embedding float[768]);

-- Relations stay perfectly ordinary tables
CREATE TABLE edges (src TEXT, rel TEXT, dst TEXT);

What I take away

Recommending a file feels less impressive than recommending a graph database. But good developer experience also means not having to operate anything you do not need. If we outgrow it, we will move – and we will know a great deal more precisely where to.

Thanks to everyone who read this through, and for the question that set it all in motion.

Read on

More notes

An address book with a memory

The start of the series: what Freundebuch is, what it is not, and where you can try it right away.