Label scans where they already live.
Nitsor registers scans in your S3-compatible storage by location. The browser reads viewed slices from it through short-lived signed links, and in hosted deployments model jobs use temporary copies.
A real chest CT series as its files: 140 DICOM Part 10 files, 73.7 MB, every sixth slice drawn. Armato et al., "Data From LIDC-IDRI", TCIA, case LIDC-IDRI-0003, CC BY 3.0 (opens in a new tab), modified: windowed and stacked by Nitsor. Sources

Bytes one view reads
1 572 864
of 268 435 456, which is 0.59 per cent
Each request is one slice, answered with 206 Partial Content.
- Range: bytes=99614720-100139007524 288 bytes
- Range: bytes=100663296-101187583524 288 bytes
- Range: bytes=101711872-102236159524 288 bytes
slice 0the whole objectslice 511
Real industrial CT, Gruber et al., Fraunhofer EZRT, CC BY 4.0 (opens in a new tab), modified: slices windowed for display by Nitsor.
Read slices by byte range.
A VGStudio volume is read one slice at a time, each slice as its own byte range. This public scan's first view reads three of them, about 0.6 per cent of the file, and the reader below shows what each view requests. The editor goes on to read every slice.
Check your scan format.
DICOM Part 10 (uncompressed) and VGStudio .vgi/.vol open in the viewer and editor. The table separates viewing from registration.
| Format | What it is | Registration | Viewing and editing |
|---|---|---|---|
| DICOM Part 10 (uncompressed) | What medical scanners write, and many industrial ones. | by reference, with geometry, slice-order and duplicate checks | viewer and editor |
| VGStudio .vgi/.vol | Volume Graphics, common on industrial CT benches. | by reference | viewer and editor |
| MRD | Raw MR acquisition data. | as raw acquisition data | does not open |
| TIFF projection stacks | CT projections before reconstruction. | as raw acquisition data | does not open |
| NSI legacy, NSI HRVOL, REK, FLT, CB, SBM | Industrial CT vendor formats. | records the format name only | does not open |
| Any other file | Anything registration does not recognise. | refused with a named code | does not open |
OpensRegistersNot supported
Know who can access each scan.
Check storage access, temporary processing and project permissions before connecting data.
A read refused
- Object
- scans/casting-0142/volume.vgi
- Status
- 409
- Code
- STORAGE_OBJECT_
CHANGED_ DURING_ READ - Next
- retry once the writes finish
The code is the product's own.
- What Nitsor holds
- File locations, checksums, scan geometry, and the labels with their history. Validating, converting and model jobs make temporary copies while they run.
- How Nitsor reaches the bucket
- Owners and admins submit keys through the dashboard or a personal token; Nitsor encrypts them. Agents cannot add keys. A connection binds a bucket and prefix, starts read-only and unlocks masks, stored previews and model outputs when you grant write access. Uploads also need an owner or admin to enable Accept uploads after the storage checks pass.
- A scan that changed gets caught
- Registration records each file's content identity, and a read that finds it changed is refused with an error that says the scan was replaced after registration.
- Named accounts, clear roles
- Community signs in through your own OIDC identity provider. Team signs in with email and password, Google or Microsoft. Enterprise uses single sign-on through your SAML or OIDC identity provider. Project roles control who can read, contribute, operate workflows or administer access.
- Give external reviewers read-only access
- Give reviewers access to the relevant project without adding a per-person charge.
- The handoff is a dataset version
- Fixed members and digests, read by ID through the API.
The API
- Contract
- /api/v1/openapi.json
- Capabilities
- /api/v1/capabilities
- Requests
- list, read, cancel, per-item reports
- Decisions
- GET /api/v1/decisions
The contract and the capabilities are served without an account.
Use the same dataset in your pipeline.
Register scans and read dataset versions through the HTTP API, with an agent credential issued in the hosted app.

What each frame shows
- Name the token and choose what it can do
- The token is shown once
- The new token is listed with its permissions
- Each token lists its status and expiry
Give each agent its own credential.
Agents and scripts call the HTTP API with an agent credential that an owner or admin issues with chosen scopes and an expiry of at most 365 days. The Python SDK and an MCP server for agents are on the way.
An agent credential
- Issued by
- an owner or admin
- Scopes
- chosen when it is issued
- Expires
- within 365 days
- Token
- shown once, stored as a hash
- Project authority
- operate at most: commits and merges, never grants access or deletes a project
Agent credentials are issued in the hosted app, on Team and Enterprise.
Show us what you inspect.
Start with a public CT or MRI scan. See how a model suggestion becomes a reviewed label and a fixed training dataset.
