Soil v5 released

I announced this release at ESUG 2026 in Plovdiv, but only now found the time to actually write it up. Soil v5 is out. Quick side note on what that even means: Soil doesn't do releases as git tags or semantic versioning. We never found MAJOR.MINOR.PATCH to be as clear as it pretends to be, so instead there's just a branch per version - v1, v2, v3, and so on - each one a moving pointer you can load if you want "the latest v5, hotfixes included." Higher number, newer. That's the whole scheme, and the actual risk assessment lives in the changelog, not in the version number.

The headline change in v5: Soil now tracks changes automatically. Until now, if you modified an object inside a transaction, you had to remember to call `markDirty:` on it yourself, or your change would silently not get committed. v5 computes a recursive content hash for every object and uses it to detect what actually changed, so `markDirty:` isn't required anymore - a small API surface, but one that removed a genuinely annoying way to lose data by forgetting a single call.

The other big one: a first working garbage collector, though this one is a preview, not a finished feature. `Soil>>garbageCollect` compacts an object segment by building a clean copy and atomically swapping it in, offline. This is worth calling out because until v5, GC in Soil didn't really exist - the object heap only ever grew. There's also a separate, opt-in `Soil>>checkConsistency` if you want a structural check without slowing the GC itself down. Just as important as the offline GC itself: v5 also lands the underlying data-layer primitives a future online, always-on GC will need - they're not wired up to anything yet, but the foundation is there.

Beyond those two: read-only transactions are stricter now (an intentionally read-only transaction and a writable one that just happened not to change anything are no longer treated the same), indexed collections like `SoilPersistentDictionary` can live anywhere in the graph instead of only at the root, and every commit-time failure now shares a common `SoilCommitError` so you can catch them all in one place instead of guessing which specific exception applies. A handful of crash and silent-data-corruption bugs got fixed along the way too, mostly around the graph exporter/importer and backup.

No migration needed if you're coming from v4.

What's next for v6: integrating the Windows support work that's already sitting there, process-specific variables, and a preview of an online GC building on the primitives that landed in v5.

Full changelog is here, the announcement Marcus and I wrote for the repo itself is here, and the code as always is on github.

 
Found something worth flagging? Send feedback.
This work is licensed under CC BY 4.0.