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.
| Implementation | CI on main | Last run |
|---|---|---|
Rust spdfReference implementation; also provides the C ABI. · first tier | 44207da | |
TypeScript spdf-formatNode (node:sqlite), Bun and the browser (sqlite-wasm). Powers the validator on this site. · first tier | 66e338b | |
Python spdf-formatStandard library sqlite3 only; imported as spdf. · first tier | 44207da | |
Swift SPDFSwift Package Manager, from the repository. Apple platforms and Linux. · first tier | 44207da | |
Kotlin / JVM io.github.joseluissaorin:spdfKotlin and Java on the JVM and Android. · first tier | 44207da | |
Go github.com/joseluissaorin/spdf/goGo module in the monorepo. · first tier | 44207da | |
C# / .NET Spdf.Format.NET with Microsoft.Data.Sqlite. · first tier | CI failing | 44207da |
PHP joseluissaorin/spdfPDO SQLite. · second tier | 44207da | |
Ruby spdf-formatOn the sqlite3 gem. · second tier | 44207da | |
R spdfOn RSQLite; fragments as data frames. · second tier | 44207da | |
Julia SPDF.jlOn SQLite.jl. · second tier | 44207da | |
C libspdfC ABI over the Rust core, for C, C++ and any FFI. · second tier | 44207da | |
Reference producer (spdf build) producer/ | CI passing · 16/16 cases | 44207da |
SPDF Reader reader/ | 707d167 | |
Conformance suite conformance/ | 44207da | |
Integrations integrations/ | 66e338b | |
This site site/ | 66e338b |
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.
| Implementation | Folder | Reader | Semantic reader | Writer | Validator | ALTO / TEI / IIIF | Suite 0.3.0 | Suite 0.4.0 |
|---|---|---|---|---|---|---|---|---|
| Rust (reference) | rust | yes | yes | yes | yes | untested | 229/229 | pending |
| TypeScript | js | yes | yes | yes | yes | untested | 229/229 | 309/309 |
| Python | python | yes | yes | yes | yes | untested | 229/229 | pending |
| Swift | swift | yes | yes | yes | yes | untested | 229/229 | pending |
| Kotlin / JVM | kotlin | yes | yes | yes | yes | untested | 229/229 | pending |
| Go | go | yes | yes | yes | yes | untested | 229/229 | pending |
| C# | dotnet | yes | yes | yes | yes | untested | 229/229 | pending |
| PHP | php | yes | yes | yes | yes | untested | 229/229 | 309/309 |
| Ruby | ruby | yes | yes | yes | yes | untested | 229/229 | 309/309 |
| R | r | yes | yes | yes | yes | untested | 229/229 | 309/309 |
| Julia | julia | yes | yes | yes | yes | untested | 229/229 | 309/309 |
| C (Rust C ABI) | c | yes | yes | yes | yes | untested | 229/229 | 309/309 |
Producer spdf build | producer | n/a | n/a | outputs validate | n/a | n/a | own checks 16/16 | pending |
What every implementation does
Every implementation, in every language, does the same eight things, and the conformance suite checks all of them:
- 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. - Validates a file and reports the error and warning codes of the specification (§ Validation).
- Reads SPDF 5.0 and the legacy 4.0 and 4.1 files from Scholaris, which are usually gzip-wrapped and use Spanish identifiers.
- Dumps a file to canonical JSON (RFC 8785), the oracle every other implementation is compared against.
- Searches: lexical (FTS5), vector (brute force, f32, f16 or i8) and hybrid (reciprocal rank fusion with k = 10).
- Formats and parses anchor URIs, byte for byte, in both directions.
- Cites: short author-date citations in English and Spanish, and bibliography as CSL-JSON and BibTeX.
- 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.