Skip to content
SPDF 5.0

Implementations

Twelve native, independent implementations of SPDF 5.0, all checked by the same conformance suite on every commit, and what each one's CI says today.

Reviewed Markdown

SPDF is not one library with bindings. It is a specification with several native, independent implementations, each written in the idiom of its language and each checked against the same conformance cases. The Rust implementation is the reference and also exposes a C ABI for anyone who would rather not deal with SQLite directly.

The table is rebuilt from the continuous integration of the repository every time this site is published. Nothing here is typed by hand: if a run is red, it says red.

ImplementationCI on mainLast run
Rust spdfReference implementation; also provides the C ABI. · first tierCI runningCI Rust44207da
TypeScript spdf-formatNode (node:sqlite), Bun and the browser (sqlite-wasm). Powers the validator on this site. · first tierCI runningCI TypeScript66e338b
Python spdf-formatStandard library sqlite3 only; imported as spdf. · first tierCI runningCI Python44207da
Swift SPDFSwift Package Manager, from the repository. Apple platforms and Linux. · first tierCI runningCI Swift44207da
Kotlin / JVM io.github.joseluissaorin:spdfKotlin and Java on the JVM and Android. · first tierCI runningCI Kotlin / JVM44207da
Go github.com/joseluissaorin/spdf/goGo module in the monorepo. · first tierCI runningCI Go44207da
C# / .NET Spdf.Format.NET with Microsoft.Data.Sqlite. · first tierCI failingCI C# / .NET44207da
PHP joseluissaorin/spdfPDO SQLite. · second tierCI runningCI PHP44207da
Ruby spdf-formatOn the sqlite3 gem. · second tierCI runningCI Ruby44207da
R spdfOn RSQLite; fragments as data frames. · second tierCI runningCI R44207da
Julia SPDF.jlOn SQLite.jl. · second tierCI runningCI Julia44207da
C libspdfC ABI over the Rust core, for C, C++ and any FFI. · second tierCI runningCI C44207da
Reference producer (spdf build) producer/CI passing · 16/16 casesCI Reference producer (spdf build)44207da
SPDF Reader reader/CI runningCI SPDF Reader707d167
Conformance suite conformance/CI runningCI Conformance suite44207da
Integrations integrations/CI runningCI Integrations66e338b
This site site/CI runningCI This site66e338b

Checked when this site was built, on 7 October 2026. Also as /status.json.

Product classes

What each implementation claims, by the product classes of the specification (reader, semantic reader, writer, validator), as recorded in the repository README by the specification's editor. The CI column above is what the machines check today; this table is what is declared.

ImplementationFolderReaderSemantic readerWriterValidatorALTO / TEI / IIIFSuite 0.3.0Suite 0.4.0
Rust (reference)rustyesyesyesyesuntested229/229pending
TypeScriptjsyesyesyesyesuntested229/229309/309
Pythonpythonyesyesyesyesuntested229/229pending
Swiftswiftyesyesyesyesuntested229/229pending
Kotlin / JVMkotlinyesyesyesyesuntested229/229pending
Gogoyesyesyesyesuntested229/229pending
C#dotnetyesyesyesyesuntested229/229pending
PHPphpyesyesyesyesuntested229/229309/309
Rubyrubyyesyesyesyesuntested229/229309/309
Rryesyesyesyesuntested229/229309/309
Juliajuliayesyesyesyesuntested229/229309/309
C (Rust C ABI)cyesyesyesyesuntested229/229309/309
Producer spdf buildproducern/an/aoutputs validaten/an/aown checks 16/16pending

What every implementation does

Every implementation, in every language, does the same eight things, and the conformance suite checks all of them:

  1. Opens safely: read-only, query_only, trusted_schema=OFF, defensive mode where the binding allows it, never loading extensions, rejecting files with triggers or views, and with bounded blob and decompression sizes.
  2. Validates a file and reports the error and warning codes of the specification (§ Validation).
  3. Reads SPDF 5.0 and the legacy 4.0 and 4.1 files from Scholaris, which are usually gzip-wrapped and use Spanish identifiers.
  4. Dumps a file to canonical JSON (RFC 8785), the oracle every other implementation is compared against.
  5. Searches: lexical (FTS5), vector (brute force, f32, f16 or i8) and hybrid (reciprocal rank fusion with k = 10).
  6. Formats and parses anchor URIs, byte for byte, in both directions.
  7. Cites: short author-date citations in English and Spanish, and bibliography as CSL-JSON and BibTeX.
  8. Writes: builds a valid SPDF from scratch, and round-trips a dump.

How conformance is checked

The suite lives in conformance/: source dumps, generated files, legacy files, deliberately broken files and one JSON case per check. A case has an id, a kind (dump, validate, search_lexical, search_vector, search_hybrid, anchor_uri, cite, legacy_dump, roundtrip), an input and the expected result.

Each implementation ships a runner that executes every case and prints one line of JSON:

{"impl": "rust", "version": "5.0.0", "passed": ["dump-001", "…"], "failed": [], "skipped": []}

The CI of each implementation fails on any failed case and uploads that JSON as the artifact conformance-<folder>, which is what the table above counts.

Tiers

  • First tier: Rust, TypeScript, Python, Swift, Kotlin/JVM, Go and C#. Released together with every version of the specification.
  • Second tier: PHP, Ruby, R, Julia and C. The same suite, released when they are ready.

Producers

Reading a document is the producer's job, not the library's. There are two independent producers, and their interoperability is a condition for declaring the format stable:

  • spdf build, the reference producer, in Python, with local models (EmbeddingGemma 2, Gemma 4, Whisper) or your own API key.
  • Scholaris, in TypeScript, where the format was born.