The Sparrow Dataset Format

Open specification, v1.0-draft · 2026-08-07

A Sparrow dataset is a folder of self-describing time-series files that any client can serve as live, formula-addressable data. It is deliberately boring: columnar files, a naming rule, a metadata sidecar, and one honesty rule about timestamps. Anything that can host static files can publish it; anything that can read Parquet can consume it.

The same folder works over every transport:

file:C:\datasets          local disk
file:\\nas\share          SMB / network share
https://host/path         any static web host or CDN
s3://bucket/path          any S3-compatible object store

The words MUST / SHOULD / MAY are used in the RFC-2119 sense.

1 · The folder

A dataset folder contains one data file per dataset prefix, plus optional underscore-prefixed sidecars:

PET.vortex           data for all series whose ID starts "PET."
ELEC.parquet         data for all series whose ID starts "ELEC."
ACME.vortex          a third publisher's dataset — coexists freely
_META.parquet        series catalog (names, units, frequencies)   [optional]
_INDEX.json          file listing for HTTP hosting                [optional]

2 · Data files

Each data file holds exactly three columns:

columntyperules
series_idstringUTF-8; dot-separated hierarchy; first segment MUST equal the file's prefix; no spaces recommended
perioddate (date32 recommended)see period semantics below
valuefloat64nulls permitted; readers MAY drop them

3 · _META.parquet — the catalog

One row per series makes the folder self-describing: search, names and units work with no server anywhere.

columntypenotes
series_idstringunique key
namestringhuman-readable; empty allowed
unitsstringe.g. Dollars per Barrel; empty allowed
freqstringD W M Q A or empty

4 · _INDEX.json — HTTP discovery

Static HTTP has no directory listing, so hosted datasets SHOULD publish:

{
  "sparrow_spec": "1.0",
  "files": ["PET.vortex", "ACME.vortex", "_META.parquet", "_INDEX.json"],
  "generated": "2026-08-07"
}

Only files is required. Extra keys (sizes, hashes, timestamps) are permitted and ignored by readers that don't understand them. Readers MUST fall back to probing PREFIX.vortex / PREFIX.parquet when the index is absent, and SHOULD remember misses.

5 · The honesty rule — freshness

This is the load-bearing rule that makes "NEW DATA" signals trustworthy:

  1. Publishers MUST replace files atomically (write temp + rename, or an atomic object PUT). Readers must never observe a partial file.
  2. Publishers SHOULD skip the write entirely when content is unchanged (compare a content hash against the previous publish), so that:
  3. A file's modification time moves if and only if its data changed. Over HTTP/S3 the same rule applies to Last-Modified and ETag.

A client may then treat mtime / Last-Modified as the freshness signal — cheap to poll (one stat or HEAD per file), impossible to cry wolf.

6 · Transport notes

transportdiscoveryfreshnessfetch
file: / UNCdirectory listingfile mtimedirect read (UNC SHOULD be cached locally, copy-if-newer)
https://_INDEX.json (else probe)HEADLast-Modified/ETagconditional GET, cached per source
s3://same as httpssame as httpspublic or presigned URLs; SigV4 signing is a client option, not part of this spec

Whole files are transferred (then cached); this format trades query pushdown for zero infrastructure. Clients wanting server-side slicing or computation should graduate to an Arrow Flight endpoint — the formulas don't change.

7 · Compatibility & versioning

8 · Reference implementations

A minimal valid dataset is one Parquet file with three columns and a conforming name. Everything else is optional. That's the point.