v0.15.4 — Apache-2.0
YantrikDB is now Apache-2.0. AGPL was buying protection against a hosted-service competitor while costing every commercial evaluation that ends at legal review. The moat is the ecosystem — engine, server, MCP, plugin, packs — not the licence.
Apache-2.0 rather than MIT because a patent has been filed: §3 grants patent rights explicitly and its retaliation clause terminates the licence of anyone who sues over patents. Using this implementation carries no patent exposure; an independent reimplementation of the methods is outside that grant.
Releases through v0.15.3 remain available under AGPL-3.0.
Also in this release
A Python embedder can no longer silently open a store it did not build (#117, #138). The engine already refused a same-dimension, different-digest swap in its own set_embedder, but Python embedders never reached that path — both the constructor and the pyo3 set_embedder stored the object on the wrapper, so every query and write was encoded by an object the engine had never seen.
Measured on 0.15.3 before the fix: open accepted, recall returned similarity 0.595 against vectors built by a different model, writes accepted. That number is the point — cosine distance between two unrelated spaces still looks like a weak-but-real match, so nothing in the response told the caller the answer was meaningless.
Both surfaces are now gated. An embedder declares identity via a fingerprint or digest attribute; a mismatch or an undeclared identity is refused when the store has recorded provenance. allow_unverified_embedder=True is the documented escape hatch, and a store with no recorded identity is not gated — BYO-embedder users keep working.
Upgrading
No migration. If you attach your own embedder to an existing store, either set .fingerprint to the store's recorded digest, call reembed(), or pass allow_unverified_embedder=True.