Dataset Inspector is a desktop UI for inspecting local Lightning-AI/litData shards, MosaicML Streaming (MDS) shards, and WebDataset tar shards, with support for previewing Hugging Face and Zenodo datasets directly over HTTP without full downloads. Supported platforms: Windows, macOS, and Linux (web planned).
- Near-native access speed — Access dataset records as close to the raw protocol/filesystem speed as possible. Minimize overhead from format parsing, decompression, and serialization so that the bottleneck is always I/O, never the tool.
- Unified access interface — Provide a single API surface across all dataset formats (MDS, LitData, WebDataset, Parquet, etc.) and storage backends (local, NAS/SMB, SSH, HTTP). Callers should not need to know what the underlying format or transport is.
- Opportunistic acceleration — Use every available technique (in-memory caching, pre-decompressed shard indices, database-backed metadata, parallel I/O) to make repeated and bulk access as fast as possible.
dataset-inspector(this repo): dataset loading/inspection UI and core data preview workflow.
- Auto-detect local LitData indexes/chunks, MosaicML MDS, and WebDataset shards.
- Enhanced Hugging Face support: Direct Parquet streaming via DuckDB — preview datasets that huggingface.co cannot display.
- Preview Zenodo records and browse ZIP/TAR entries with HTTP range requests.
- Remote datasets are accessed in direct streaming mode: in-memory acceleration is used, but no remote on-disk cache is maintained.
- Rich previews for JSON/text, images, audio, and video.
- Open fields with the system default app.
Local LitData shards |
Local WebDataset tar shards |
Hugging Face dataset preview |
Zenodo record preview |
- Download Dataset Inspector installers from Releases.
- Paste a local dataset path or Hugging Face/Zenodo URL, then press Load.
- Local shards: pick a shard/chunk -> item/sample -> field, then preview fields.
- Hugging Face: pick a config/split -> row -> field (add a token if needed).
- Zenodo: pick a record -> file -> entry (ZIP/TAR), then preview/open files.
- Report issues/feature requests: https://github.com/binbinsh/dataset-inspector/issues
The running UI process exposes an HTTP API for dataset inspection, using the same in-memory state used by the desktop interface. The API is read-only and provides uniform concurrent access across all supported source protocols and dataset formats.
API response contract:
{
"ok": true,
"requestId": "175136....",
"apiVersion": "26.0228.1031",
"timestamp": "2026-02-28T00:00:00.000Z",
"meta": {
"path": "/api/v1/opened",
"method": "GET",
"durationMs": 12,
"requested": 1,
"returned": 1,
"count": 1,
"concurrency": 8
},
"data": {
"...": "..."
}
}响应头会回传 X-Request-ID,可用于日志链路追踪。
Error responses use:
{
"ok": false,
"error": {
"code": "INVALID_BOOLEAN",
"message": "Invalid boolean for `details`.",
"details": {
"field": "details",
"value": "maybe"
}
}
}Dataset payloads keep a unified shape:
id, identity, label, mode, sourceInput, isActive, selection,
details, and uniform (a format-agnostic summary).
- Start app with API enabled:
flutter run -- --api- optional:
--api-host 127.0.0.1 --api-port 8080 - optional headless mode:
--api-only(no UI window) - optional startup source(s):
--source remote://host/path/to/mds_shards(repeatable)--sources remote://host/path/to/train,remote://host/path/to/dev
- env var:
DATASET_INSPECTOR_SOURCESwith comma/newline/semicolon separated source list
- Query current opened datasets:
GET /api/v1/openedPOST /api/v1/opened(same semantics, supports body)- query/body params:
details(true/false, defaulttrue)fields(projection fields, comma-separated, default all; supports*)projection(alias forfields)concurrency(integer, default8, max64)ids(query only; for body use POST payload)ids=id1,id2,id3or repeatedids=id1&ids=id2
idList(query alias)datasetIds(query alias)includeMissing(true/false, defaultfalsefor GET list path)
POST /api/v1/openedwith body:ids: array of dataset IDsdetails: (true/false)fields/projectionconcurrencyincludeMissing
- POST endpoints require JSON body (
Content-Type: application/json). - response data for list:
activeDatasetIdsourceInput(if set)datasets(array of dataset snapshots)
- uniform field in each item:
uniform.mode: dataset modeuniform.kind: dataset kinduniform.status: loaded status of that datasetuniform.stats.recordCount: rough record/item count if availableuniform.stats.sizeBytes: rough total bytes if availableuniform.stats.hasMore: whether more pages/items exist
- Query one dataset by id:
GET /api/v1/opened/{datasetId}- query params:
details(true/false, defaulttrue)fields/projection
- Stream a bounded probe set from one opened dataset:
POST /api/v1/opened/{datasetId}/extract- body:
shardNameoffset/limitaudioFieldIndextextFieldIndex- optional
idFieldIndex - optional
responseMode(streamormaterialize, defaultstream) - optional
audioEncoding(base64ornone, defaultbase64)
- default stream response:
- content type:
application/x-ndjson - line 1:
type=meta - next lines:
type=recordand inline audio payloads - final line:
type=summary - no local manifest/audio files are created
- content type:
- optional materialized response:
- optional
outputDir - optional
manifestName - optional
audioDirName - optional
overwrite
- optional
- materialized response data:
manifestPathaudioDirrecordCountrecords
- Batch inspect multiple opened datasets (high-concurrency):
POST /api/v1/opened/batchPOST /api/v1/opened/_batch(legacy兼容)- body:
ids: array of dataset IDs or comma-separated stringdetails(true/false, defaulttrue)fields/projectionincludeMissing(true/false, defaulttruefor batch)concurrency(integer, default8, max64)
- optional query params:
concurrency,includeMissing,fields/projection
- Health check:
GET /health
- OpenAPI spec:
docs/openapi.yaml
Probe helper:
dart run tool/stream_mds_probe.dart --shard shard.00000.mds.zstd --limit 8
- LitData: docs/litdata.md
- MosaicML MDS: docs/mosaicml.md
- WebDataset: docs/webdataset.md
- Hugging Face: docs/huggingface.md
- Zenodo: docs/zenodo.md
- Audio preview: docs/audio.md
- Development: docs/development.md



