A dataset is not a folder. It is a history.

Every save is a commit. Branching, diffing and merging run on the annotations themselves, not on files, so you can rebuild and defend a release after everyone who made it has left.

Object stores version files and know nothing about a label. Annotation tools understand tasks and keep no version graph. Nothing sits in the middle, and the middle is where the inspection record has to live.

Become a design partner
castings-batch-114 / 4 branches, 61 commitsDesign mockup
Version graph for the dataset castings-batch-114A trunk branch named main runs left to right. A service commit ingests the batch, then a person commits taxonomy v3. A branch called sam-proposals carries three model executions; a branch called review/reyes carries two commits by a person; a dashed branch called taxonomy-v4 is still open and ends in an agent commit. The proposal branch merges back into main, and main ends in the frozen release Q3, drawn as a hollow ring.mainsam-proposalsreview/reyestaxonomy-v4 · openingesttaxonomy v3mergerelease Q3
humanmodel executionagentserviceSynthetic sample

A diff a metallurgist can read.

A line diff over a mask file says nothing about the part. Changes read as volume, boundary and class, in millimetres and counts.

Semantic diff

9e21ba7 → 4f3c9d1
Added14 voids added across 9 slicessam-2.1@4f3c9d
Revised6 boundaries revised, −1.8 mm² median areaA. Reyes
Rejected2 voids rejected as imaging artefactA. Reyes
Migratedtaxonomy v3 → v4, porosity split into gas and shrinkagemigration
affects 38 studies · 412 slices3 merge conflicts to resolve

Conflict, resolved by a person

sam-2.1 · slice 412
gas porosity, 5.9 mm²
A. Reyes · slice 412accepted
shrinkage, 4.1 mm², sub-critical
Take expertTake model

Resolving is itself a commit, attributed and reversible. Cherry-picking that one correction onto another branch is one action, not a re-labelling job.

A semantic diff between two commits, and the conflict a person resolved. Interface render, synthetic sample.

A release states how much of itself a model wrote.

Named, then frozen

A release is a named selection over the graph, frozen at a commit. Run the selection again next year and it returns the same slices, not whatever the dataset has drifted into.

Composition is a fact, not a footnote

Every release reports its pseudolabel mix, and one filter cuts it down to human-approved labels. A training set cannot hide where its labels came from.

Rollback includes the rules

Reverting a dataset reverts its taxonomy and workflow configuration with it. You get a past decision back under the rules in force at the time, not today's.

It rebuilds without us

The manifest reconstructs outside Nitsor, from your own storage, in documented formats. Evidence only one vendor can read is not evidence.

Dataset release

frozen
castings-2026-Q34,200 slices · 38 studies · manifest 4f3c9d1
Composition by author4,200 labels
71% human-approved24% model draft5% agent
Filter to human-approved only
export
DICOM SEG · NIfTI · Zarr v3
frozen at
2026-08-14 09:41 UTC
taxonomy
v4
One dataset release, frozen at a commit, with its composition by author. Interface render, synthetic sample.

All of this is in the source-available core.

Every save is a commit, so the version graph cannot be carved out and sold back to you. It is also the one thing the free annotation tools do not have, which makes putting it behind a licence the wrong trade. Calibration and Certificates sit on the enterprise side. Branching, diffing, merging and releasing do not.