Build1 distinct publisher3 min readUpdated
A dev.to writeup argues tuned SQLite replaces pgvector or Pinecone on a $5 VPS. The connection discipline is the real lesson; the headline count of millions of vectors is not evidenced.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
Someone building NGP 4.5, which the writeup calls the NetGlyph Knowledge Protocol, has published the SQLite configuration used to run vector search and a document vectorizing pipeline on a cheap 2GB VPS with no swap space [1]. The reason to read it is not the pragma list but the ordering of the failures: the first thing that fell over was not the database's capacity, it was the application leaking file descriptors [4].
The framing is familiar. The post argues that pgvector, Pinecone or Milvus would be killed by the out-of-memory reaper on a 2GB machine before initialisation even finished, so the project chose embedded SQLite instead [2]. That is an assertion, not a benchmark, and nothing in the text measures those alternatives.
The diagnosis is more useful than the framing. An auto-import agent called Hermes had a save path that opened a brand new connection with sqlite3.connect inside an argument list, purely so it could ask SQL for a formatted timestamp via strftime, and then left that connection open [3]. Each one held a file descriptor. After a stream of 2,258 documents, the operating system ran out of descriptors and memory [4]. The post also says the kernel OOM killer would terminate the process before the first hundred documents were processed [5], which does not reconcile with the 2,258 figure [6]; read both as illustration rather than measurement.
The fix was to stop asking the database for things the runtime already knows: time.time() or a native datetime string instead of a SQL round trip, and idiomatic `with sqlite3.connect(...) as conn:` blocks in place of hand-managed handles [7]. The post states that the context manager guarantees a commit or rollback and closes the descriptor even if the transaction fails [8]. That is the load-bearing assertion in the whole piece, and it is the one to verify against your own Python version before you build a pipeline on top of it.
Then the tuning. WAL journalling, synchronous=NORMAL, temp_store=MEMORY, and busy_timeout=5000 to avoid deadlocks under concurrent writers [9]. Two settings do the memory work: mmap_size set to 268435456 bytes, or 256MB, in place of what the author describes as a 32GB default [10], and cache_size set to -131072, the negative form that expresses the page cache strictly in KiB, capping it at 128MB [11]. Those two caps together account for about 384MB, roughly 19 percent of the 2GB box [12], and the mmap change alone is a factor of 128 reduction from the default the author cites [13].
Where the claims outrun the evidence: the post reports hundreds of transactions per second, no descriptor leaks, and flat memory within a negligible margin [14], with no numbers behind any of the three. The headline promises millions of vectors on a $5 VPS [15], but the text carries no vector count, no index structure, and no query latency [16]. The similarity engine is named LossySpinBosonEngine and the excerpt never says how it searches [17], which is the part that decides whether SQLite is doing a brute-force scan or something with an index.
Worth watching if you are sizing this yourself: descriptor count and resident set size under sustained ingest, not at startup; and whether the 384MB of caps still holds once your working set exceeds them and SQLite starts evicting pages instead of mapping them.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
A dev.to post describes running a vector search engine and document vectorizing pipeline (the "Harvest" pipeline) for NGP 4.5, the NetGlyph Knowledge Protocol, on a cheap virtual machine with 2GB of RAM and no swap space, using SQLite.
An AI agent called "Hermes", responsible for auto-importing data, had a save_vector_to_db function that called sqlite3.connect(self.db_path) directly inside an argument list to run a strftime query for the current formatted time, and left that connection open.
The fix replaced the SQL-based time request with native Python calls (time.time(), or datetime.datetime.now().strftime) and migrated to context managers, using 'with sqlite3.connect(self.db_path) as conn:'.
The recommended configuration sets PRAGMA journal_mode=WAL, PRAGMA synchronous=NORMAL to relax disk sync for WAL, PRAGMA temp_store=MEMORY to keep temporary tables in RAM, and PRAGMA busy_timeout=5000 to prevent deadlocks under concurrent load.
The configuration sets PRAGMA mmap_size=268435456, described as a modest 256MB in place of a massive 32GB default.
The configuration sets PRAGMA cache_size=-131072, hard-limiting the page cache to 128MB in RAM; the post notes a negative value configures the cache strictly in Kibibytes.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Code is verifiable, outcomes are not
The reproducible parts of the story are strong: the leaking pattern, the refactor and the six pragma values are all shown as code and can be inspected directly. Every outcome claim, however, is bare assertion, and the article contradicts itself on when the original pipeline died, which undercuts the diagnostic narrative.
One self-reported deployment
Adoption evidence amounts to a single project describing its own single-VPS setup. There is no third-party user, no release artifact, no repository activity and no corpus or traffic disclosure in the cluster.
Headline far ahead of the evidence
The claim ledger supports a competent file-descriptor leak fix and a sane small-host pragma set. The headline sells millions of vectors on a $5 VPS and displacement of pgvector, Pinecone and Milvus, with no vector count, index structure, latency figure or comparison run, and the post does not even explain how similarity search is executed. The gap is large but not total, because the technical core is genuine and reproducible.
Author promoting own protocol
The article is published by the team behind NGP 4.5 / NetGlyph Knowledge Protocol and its LossySpinBosonEngine, and it advances that project's minimalist architecture choice while disparaging three named commercial and open-source alternatives. That promotional interest is visible on the face of the source; no sponsorship, funding or commercial relationship is disclosed either way.
Low: single interested source
One self-published article, one publisher, no replication or rebuttal, and an internal inconsistency in the failure narrative. Confidence is high only for what the code shows and low for everything the article claims about scale and performance.
build
DuckDB's vss extension removes a database from your RAG stack, then names the price1 distinct publisher
build
isinstance(amount, (int, float)) is not a number check: NaN walks through a withdrawal guard1 distinct publisher
build
Force the tool call, then hand Lightsail a long-lived key1 distinct publisher
build
Stop timing your GraphQL tests and start counting loader calls1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 19, 2026