v1.0.0-rc.39
Release candidate 39.
Publish-pipeline fixes carried from rc.38:
- NuGet: thin meta csproj (fixes HTTP 413 on publish)
- Docker: gha cache-export ignore-error (image already pushed by digest)
- Go module tag job runs after the Swift tag-move (fixes ref-mismatch race)
- Dart: freezed lock refreshed to stable 3.2.5 for frb 2.12
Regenerated with alef 0.47.1.
v1.0.0-rc.38
Release candidate 38. Republishes rc.37's content on a rebuilt Go native-distribution model plus additional publish-pipeline and extraction fixes.
- The
packages/gomodule no longer ships native binaries in the module zip. Acmd/setuptool downloads the platform FFI library from the release assets into the user cache and writes a machine-local cgo link shim. A per-versionRequireNativeSetup_<version>sentinel turns a module/native version mismatch into a compile error.
- Ship SHA-256 sidecars for the Go FFI release assets.
- Forward the app token to the
publish-zigaction (fixes the 403 upload). - Slim the C# NuGet meta package (fixes the 413 on publish).
- Pin Maven 3.9.16 in the release workflow.
- Link libbz2 on macOS/iOS for the Swift package (resolves BZ2 symbols).
- Add a job cancellation endpoint (
DELETE /jobs/{job_id}) (#1313). - Emit structured table elements for CSV.
- Validate OpenDocument ZIP metadata during MIME detection.
- PaddleOCR honors
rec_batch_numand aligned CTC dictionaries; angle-rollback recognition is batched.
- Registry-mode smoke suite runs against pre-releases; PHP smoke installs the native extension first.
- Python integration
uv.lockfiles refreshed.
v1.0.0-rc.37
Republish of rc.36 under a fresh version: rc.36 again partially published (the core PyPI linux wheels, the npm/PyPI/Maven integrations, the Homebrew sequoia bottle, and the -core Docker image all failed on release-pipeline bugs while the immutable registries had already shipped, burning the rc.36 number). The library code is unchanged from rc.36; this release fixes the pipeline so every channel publishes.
- Python linux wheels. The glibc-floor verifier matches auditwheel's hashed ONNX Runtime soname (
libonnxruntime*.so*), so the linux wheels no longer fail verification after correctly bundling the runtime. - Go module resolution. The
packages/gomodule tag is created on release again, sogo get .../packages/go@v1.0.0-rc.37resolves. - Swift C++ runtime linkage. The Swift package links the C++ standard library (libc++ on Apple platforms, libstdc++ on Linux), fixing undefined C++ ABI symbols at link time.
- Zig package upload. The Zig package tarball is uploaded via
gh release upload, fixing the silent upload failure that left releases without a Zig artifact. - WASM OCR. The WebAssembly Tesseract backend applies an explicit page-segmentation mode and a recognition deadline instead of PSM_AUTO, which could trap or hang under WASI.
- npm integrations publish. The n8n / LangChain / LlamaIndex node packages install with
npm install: the exact@xberg-io/xbergrc pin only exists once the core node package publishes in the same run, so a committed lockfile can never pre-match it. - PyPI integrations publish. Uploads skip files already on the index (
uv publish --check-url), so a re-run over a partially-published set of integration packages no longer fails. - spring-ai Maven publish. The integration deploy waits for the core
io.xberg:xbergartifact to become resolvable on Maven Central (indexing lag) before building. - Homebrew bottle upload. The bottle upload uses a token minted after the slow from-source build so it can't 401 on an expired App-token TTL, and a single failed platform no longer drops the bottle DSL for the others.
- Docker
-coreimage (#1299). The manifest-merge is decoupled from the full build matrix, so a timed-out sibling build leg no longer suppresses the-coreimage publish.
- Local integration packaging dry-run.
task integrations:buildbuilds the publishable Python distributions locally to catch packaging breaks before tagging a release.
v1.0.0-rc.36
Republish of rc.35 under a fresh version. rc.35 only partially published — the immutable registries (crates.io, Hex, Maven Central, RubyGems, WASM) shipped while the linux Node/Python, NuGet, and Docker channels failed on pre-existing packaging bugs, burning the rc.35 number.
rc.36 carries the same library code as rc.35 (#1296 chunk-to-node linkage, #1303 base64 embeddings) plus publish-infra fixes:
- ONNX Runtime bundling for linux Node + Python artifacts (
*.so*sonames + wheel vendor step) - NuGet meta-package size (413) — thin managed package +
runtime.jsonRID graph to per-RID packages - Docker/GPU CI now pull the
test_documentssubmodule's git-LFS objects
See CHANGELOG.md for details.
v1.0.0-rc.35
- Chunk-to-node linkage (#1296).
ChunkMetadata.node_idsis now populated with theidvalues of thedocument.nodes[]whose text a chunk covers, so consumers can join a chunk back to the structural nodes it came from. Populated on the PDF/structure path via best-effort verbatim text containment (deduplicated, in node-traversal order); empty for structure-less documents.
- Base64 embedding transport (#1303). Hosted embedding vectors are now requested in base64, which liter-llm decodes ~3× faster and bit-exact than a JSON float array. Providers that ignore the hint and still return a float array continue to work unchanged.
v1.0.0-rc.34
Release candidate 34.
Bindings
- Regenerated all language bindings with alef 0.43.0. Node/PHP embedding plugins now return native
number[][]shapes instead of a Rust debug string (#1304).
Publish pipeline
- glibc native builds, Node NAPI Docker (manylinux+Alpine), Python wheels (Windows/Linux), and NuGet per-RID split all unblocked from the rc.33 failures.
Extraction (rc.29 legal-PDF audit wave)
- Table double-emit / fragmentation, intra-word spacing, markdown escaping consistency, chunk page-ref coverage, list-vs-table classification, and MCP
allowed_hostsfixes (#1288–#1294, #1298, #1301, #1302, #1306).
v1.0.0-rc.33
- Stable node ids on the document tree.
DocumentNode.idis now populated with a deterministic, content-derived id (stable across extractions), and each chunk carriesmetadata.nodeIdslinking it back to the nodes it was derived from. Both are exposed as plain strings across all language bindings. (#1296) - Per-page chunk coordinates (
pageSpans). Each chunk now carriesmetadata.pageSpans, a list of{page, bbox}entries — one per page the chunk overlaps, in page order — for viewer highlighting. The bounding box is the union of that page's body-layer node boxes within the chunk (omitted when unavailable). Empty (and omitted from the wire format) when page provenance is unavailable. (#1295) - Stable table ids, headers, and opt-in anchors.
TablegainstableId(a deterministic, reproducible id assigned in document order across the final emitted table set) andcolumns(the header row, so a fragment is interpretable on its own). A newtable_anchorsextraction option (default off) emits a[TABLE:{tableId}]marker before each rendered table so consumers can reconcile the markdown incontentwith the structuredtables[]entries. (#1297) - Configurable multi-label chunk classification. New
ChunkClassificationConfig(labeldefinitions, anLlmConfig,batch_size,max_concurrency), set viaExtractionConfig.chunk_classification, classifies each chunk with zero, one, or many labels via bounded-concurrency LLM batches and writes them tometadata.classifications([{label, confidence?}]). Opt-in — absent config performs no classification and makes no LLM calls. The chunk-level analogue of page classification; requires theclassificationfeature. (#1255) - Automatic OCR of undecodable text layers. Pages whose embedded text decodes mostly into the Unicode Private Use Area, replacement, or control-character garbage (e.g. Identity-H fonts with no
ToUnicode) are now routed to OCR like scanned pages, controlled byOcrQualityThresholds.min_undecodable_ratio(default 0.5) and gated by a 64-character floor so occasional symbols never trip it. (#1254)
- Concatenated-PDF extraction audit. A cluster of structure/reading-order defects surfaced by an audit of concatenated legal PDFs: duplicate
tables[]entries and double-counted table counts are deduplicated (#1288); fragmented per-row tables are stitched back into one table with a propagated header (#1290); bullet lists are no longer flattened into paragraphs or shredded into word-per-cell tables (#1301); spurious intra-word spaces in native text ("T ower") are removed via geometry-aware span joining (#1291); markdown escaping is consistent with anescape_markdownopt-out (#1292); OCR'd pages no longer report contradictoryisBlank(#1293); chunkfirstPage/lastPageprovenance is restored on long PDFs (#1294); and heading context no longer leaks across document boundaries (#1289). - Container users can enable page classification via a
classificationCLI feature carried into theall/container builds. (#1298) - CLI batch resource limits and benchmark isolation.
extractandbatchnow support--no-config-discovery, and their Tokio runtime honors--max-threads. The benchmark harness uses both controls, records batch subprocess overhead from the reported batch total, and keeps user configuration and verbose PDF logs from contaminating measurements. - Linux glibc artifacts no longer require a newer glibc than they advertise. The prebuilt ONNX Runtime that was statically linked into the Python wheel and the Go/C FFI, Java, and Elixir artifacts is compiled against glibc ≥ 2.38 and pulled unversioned
__isoc23_*and__libc_single_threadedsymbols into the binary. Because the manylinux tag only reflects versioned glibc requirements, these installed everywhere but crashed at import/load on glibc 2.28–2.37 (undefined symbol: __isoc23_strtoll). They now link Microsoft's ONNX Runtime (glibc-clean, floors at 2.27) — the same runtime the C#, Node, and Docker builds already use — and ship it beside the binary, so the symbols are gone and the floor is honest. A CI check now fails any glibc artifact that references too-new symbols or omits the bundled runtime. musl, macOS, and Windows are unaffected.
- Dependencies refreshed across all languages. Rust, Python, Node, Ruby, Java, and Dart dependency versions were bumped to their latest compatible releases.
Benchmark Results 2026-07-22 (0181189)
Comparative benchmark results from workflow run 29903353182.
Commit: 01811898d6311cfad1113be6f16ea1ad2ba440e9 Date: 2026-07-22
v1.0.0-rc.32
- feat(inference): pure-Rust tract ONNX backend for WASM, Android, iOS (#1275, #1276) by @Goldziher in https://github.com/xberg-io/xberg/pull/1282
Full Changelog: https://github.com/xberg-io/xberg/compare/v1.0.0-rc.30...v1.0.0-rc.32