← Back to all sparks
L

lstar

ANALYTICS
Velocity5.0

R package lstar by kharchenkolab — release notes from GitHub.

A single-cell data store commits to Zarr v3 and range-readable hosting across four language surfaces

single-cell-genomicszarrwasmdata-formatsmulti-language
Current state
lstar stores single-cell data behind one C++ core with Python, R and JS/WASM bindings, and ships a browser viewer that reads the store directly. Zarr v3 is now the default on-disk format across all four surfaces, with zstd compression and sharding that packs many chunks into fewer objects. Viewer stores are compressed per field and resolved at chunk granularity, so a hosted viewer fetches only what it displays. The tag stream carries both lstar and lstar-sc releases.
Where it's heading
The through-line is making a hosted store cheap to read. Sharding addresses the file-per-chunk explosion that makes many-chunk arrays awkward to host; per-field compression with chunk-granular resolution means colouring an embedding by one gene fetches one column rather than an array. The 0.2.x patches are the cost of maintaining four surfaces at once — a WASM heap crash that only browsers exercise, and a count-basis orientation defect where all three surfaces normalized in memory and none owned the on-disk layout.
Prediction
The orientation bug's root cause — no surface owning the on-disk representation while all three normalized in memory — is the kind of gap that usually produces a validation or ownership change rather than another point fix.

Recent moves

  1. 21d ago

    Viewer count-basis orientation fixed; existing stores need re-prep

    A patch across all four surfaces fixing viewer stores prepped with the count basis in the wrong orientation. Existing [email protected] stores need extend_for_viewer() re-run to repair them; validate() now reports the problem instead of passing silently, and the JS reader raises rather than returning wrong numbers. The on-disk format and public signatures are unchanged.

    View source ↗
  2. 26d ago

    WASM viewer crash on resizable heaps fixed

    A JS/WASM-only fix for a viewer crash on store open in browsers that back a growable WebAssembly heap with a resizable ArrayBuffer, which TextDecoder rejects. Bytes are now copied off the heap before decoding, with a CI check asserting the guard survives toolchain changes. R and Python are unaffected.

    View source ↗
  3. 1mo ago

    lstar 0.2.0

    ⚡ SPARK

    Zarr v3 becomes the default on-disk format across the C++ core and the Python, R and JS surfaces, with v2 still writable and both readable transparently. Zstd joins gzip, a shard_elems option packs many inner chunks into fewer store objects while keeping them byte-range-readable, and viewer stores are compressed per field with the reader resolving compressed arrays at chunk granularity.

    View source ↗
  4. 1mo ago

    Measure state inferred from content, not slot name

    The measure state — raw, lognorm or scaled — is inferred from data content rather than from the source slot's name, fixing cases where a scaled .X read as None and a log-normalized .raw was mislabeled raw. extend_for_viewer() selects its count basis by state, with a clear error listing available measures when no raw basis exists. Note this tag carries the lstar-sc package name rather than lstar.

    View source ↗