Skip to content

Releases: balwierz/vv

v1.15.0

Choose a tag to compare

@github-actions github-actions released this 02 Jul 18:21
c703a48

Fixed

  • TUI zebra stripe readable on light terminals. The default theme's
    alternating-row background is a near-black grey that only reads as a subtle
    stripe on a dark terminal; on a light-background terminal (e.g. JupyterLab's
    web terminal) it became a hard black band that swallowed the default-foreground
    text. vv now detects the terminal background (OSC 11 query, then COLORFGBG,
    overridable with VV_BACKGROUND=light|dark) and, on a light terminal, uses a
    subtle light-grey stripe instead. Dark terminals are unchanged; detection
    failure falls back to the previous behaviour.

Added

  • --arrow / --feather output — write an Arrow IPC file (Feather v2), the
    zero-copy interchange format for pandas / polars / R arrow. Same column
    projection / --filter / - (stdout) handling as --parquet; streams
    chunk-by-chunk. --compression accepts zstd (default), lz4, or none
    (Arrow IPC body compression). Round-trips through vv and is read by pyarrow.
  • --count — print the row count and exit. Instant on formats that carry a
    count in metadata (Parquet, LociSSD); reflects a -r region and, with
    --filter, counts only matching rows. A wc -l for any supported format.
  • --describe --json / --describe --ndjson — machine-readable per-column
    statistics (the same count/nulls/min/max/mean/distinct as the text table) as a
    JSON array or one object per line, for reproducible QC in pipelines. Integers
    are exact (not %.6g-rounded), floats round-trippable, strings JSON-escaped;
    numeric columns omit distinct, all-null columns report null min/max/mean.
  • Reference-aware pileup — vv x.bam --pileup -f ref.fa. With a reference
    FASTA (needs a .fai), the --pileup output fills the ref column from the
    reference and renders read bases matching it as . (forward) / , (reverse),
    byte-for-byte like samtools mpileup -f (vv applies no BAQ, i.e. -B); deleted
    bases are filled from the reference too. Without -f the previous behaviour is
    unchanged (ref N, literal bases). The current contig is fetched once and
    cached. Verified byte-identical against samtools mpileup -B -f (matches,
    mismatches, deletions, ref-column case). -f without --pileup is a clean
    usage error.

Changed

  • LociSSD v4 reads faster. The colblock read_chunk decoded the Start
    column twice whenever End was also present (once for the LENGTH/mask input,
    once as an output column) — the universal case for these interval files. Start
    is now decoded once and the array reused. ~40% less time on both a full
    --tsv scan and a -r region query over a 1 M-row file; output byte-identical.

Fixed

  • LociSSD v4 reader hardening (memory safety). The colblock decoders trusted
    on-disk offsets from the (untrusted) file: the DICT and ARENA string codecs did
    assign(blob + o0, o1 - o0) with no o0 ≤ o1 ≤ blob_len check (a non-monotone
    offset underflowed the length to ~4 GiB → out-of-bounds read), n_dict + 1 was
    computed in 32-bit (wrap at UINT32_MAX), a -r region query on a file lacking
    Start/End indexed columns out of range, and zstd_inflate had no output ceiling
    (a tiny chunk could inflate to gigabytes). All now validate and reject with a
    clean error (non-zero exit), never an OOB read or OOM. Crafted-input fixtures
    (tiny.v4.baddict/badarena/nocoord/zbomb.lociss) guard each path.

v1.13.0

Choose a tag to compare

@github-actions github-actions released this 22 Jun 18:40
8f47eb0

A focused follow-up that makes AnnData obs / var actually dumpable as text.

Added

  • Full obs/var text dump. vv file.h5ad --tab obs --tsv (and --tab var)
    now exports the complete DataFrame instead of the 1000-row interactive
    preview — previously the dump was silently truncated at 1000 rows. -n N
    limits it; the TUI and plain table view keep the bounded preview. The sparse /
    dense X matrix stays capped (a full text dump of X is intentionally not
    enabled).

Fixed

  • High-cardinality categorical obs/var columns now decode to their string
    labels instead of integer codes. The category-dictionary cap was 65536, which
    wrongly showed real columns like CRISPR perturbation guides / targets
    (hundreds of thousands of categories) as raw codes; the default is now
    1,000,000, overridable with VV_CATEGORY_DICT_CAP.
  • Boolean obs/var columns (stored as HDF5 enums — e.g. highly_variable,
    mt) render their values (FALSE / TRUE) instead of ?.

v1.12.0

Choose a tag to compare

@github-actions github-actions released this 22 Jun 13:54
dd3b62d

AnnData depth (CSC sparse, uns, labelled X), data-correctness fixes across
the CSV / display / numeric paths, security hardening, and broad RAM/throughput
work on the streaming and TUI paths.

Added

  • AnnData uns decoding — a new key/value tab surfaces the unstructured
    annotations: scalars, strings and short arrays show their values, nested dicts
    flatten with dotted keys (pca.variance_ratio), and an encoded sub-object
    (dataframe / categorical) shows its encoding-type. Previously skipped.
  • AnnData CSC sparse X previewcsc_matrix matrices now densify to a
    rows × columns preview just like CSR (the compressed axis is columns, not
    rows); they previously showed only a "not implemented" note.
  • Labelled AnnData X preview — the sparse / dense X preview names its
    value columns by the var index (gene names) and prepends the obs index
    (cell barcodes) as a row-label column, instead of generic col0 / row numbers.

Fixed

  • Leading-zero IDs in CSV/TSV (and spreadsheet / markdown / HTML tables) are
    preserved — a column of values like 007 is read as text instead of being
    inferred as the integer 7. Scientific notation stays numeric.
  • Wide and combining characters align. display_width now measures terminal
    columns (CJK / fullwidth / emoji = 2, combining / zero-width = 0) instead of
    counting codepoints, so tables with such data no longer skew; truncation cuts
    on a column boundary.
  • Hostile / malformed files are handled gracefully — AnnData sparse shape
    and DataFrame column lengths are validated against the real dataset extents
    (no out-of-bounds read).
  • Date / timestamp / decimal columns are read as numeric values, so
    --describe min/max/mean and --heatmap work on them; --describe now
    summarises the whole table rather than the first chunk.
  • Genomic / format correctness — Parquet region pruning indexes column
    statistics by Parquet leaf (not Arrow field); pileup honours reference skips
    (CIGAR N) like samtools; mid-stream htslib read errors in pileup / BCF
    region mode are surfaced instead of silently truncating; region mode reports
    exact post-filter row counts; CSV headers of nan / inf / hex are no longer
    mistaken for headerless numeric data.
  • TUI / terminal robustness — the terminal is restored on
    SIGINT/SIGTERM/SIGHUP via an async-signal-safe handler; markdown rendering
    strips terminal control bytes; truncate never splits a multibyte codepoint;
    a missing flag argument reports the specific flag instead of "Unknown option".

Performance

  • Bounded RAM on streaming sources — DelimitedSource and the other streaming
    readers evict old chunks behind a retention window instead of retaining every
    decoded batch; SQLite computes COUNT(*) lazily (not at open); generic HDF5
    1-D datasets and wide NPZ arrays preview a capped head; delimited preamble
    stripping is buffered. TUI redraws format each visible cell once and reuse the
    LRU chunk cache during sorted search.

Security

  • SQLite identifier quoting escapes embedded double quotes, so a table named
    a"b no longer produces malformed / injectable SQL.
  • NPZ allocation hint — the zip central-directory uncompressed_size (which
    is attacker-controllable) is no longer passed straight to reserve(), so a
    tiny crafted entry can't force a multi-GB allocation.

Build / CI

  • KDE plugins stop including KDEInstallDirs, silencing the ECM directory
    warning in the GUI build.

v1.11.0

Choose a tag to compare

@github-actions github-actions released this 15 Jun 20:50
fcb8516

Large-AnnData usability, a Debian package, and build/CI maintenance.

Added

  • --tab <name> — view a named component tab (AnnData obs / var / X,
    a workbook sheet, …) straight from the CLI, e.g.
    vv cells.h5ad --tab obs -n 20. Case-insensitive; an unknown name lists the
    available tabs. The data components were previously only reachable in the
    interactive TUI.
  • Debian packagepackaging/debian/build-deb.sh wraps the static
    AlmaLinux 8 binary into a self-contained .deb (Depends: libc6 only), and
    the release workflow now publishes a vv_<version>_<arch>.deb for x86_64 and
    aarch64 alongside the tarballs.

Fixed

  • Large AnnData components no longer stall. Opening a multi-GB .h5ad
    (e.g. a 100M-cell atlas plate with a 4.7M-row obs) used to hang for minutes:
    the TUI eagerly materialised every component and read obs/var in full.
    Now each component tab is built lazily (only when viewed), and obs/var/X
    are read as a bounded first-rows preview (footer notes the true size). A
    high-cardinality categorical (e.g. a per-cell barcode with millions of
    categories) is shown as integer codes instead of reading its whole dictionary.
  • Arrow deprecation warnings in the Parquet read paths silenced by moving to
    the arrow::Result overloads of ReadRowGroups / GetRecordBatchReader
    (version-guarded so the Arrow 23.0.1 static build still compiles).

Build / CI

  • ncurses is fetched from the GNU mirror (ftp.gnu.org) instead of
    invisible-mirror.net, which intermittently WAF-blocked CI runners and broke
    a release.
  • GitHub Actions bumped to their Node 24 runtimes ahead of the forced migration.

v1.10.0

Choose a tag to compare

@github-actions github-actions released this 15 Jun 15:14
c27db8c

A feature and robustness release: a new terminal heatmap view, a major
upgrade to the Qt6 desktop GUI (vvg), and the remaining high-severity
correctness/OOM fixes from the code audit.

Added

  • --heatmap — render the numeric columns as a colour heatmap in the
    terminal (rows × numeric-columns, globally normalised, viridis palette).
    --image-mode selects the backend: auto (kitty graphics if supported, else
    half-block), kitty, sixel, halfblock, or ascii. When stdout is not a
    terminal a plain ASCII intensity grid is written instead of raw escape
    sequences.
  • Qt6 GUI (vvg) — a real desktop application: menu bar, File▸Open
    (multi-file → tabs), drag-and-drop, recent files, and error dialogs; a
    genomic region/tabix query bar with a pileup toggle (re-opens BAM/VCF/BED
    over a region); a View menu (column show/hide, go-to-row, shortcuts help).
    Filtering, sorting and find now run off the UI thread with a progress bar
    and a Cancel button, so the window stays responsive on large files.

Fixed

  • HDF5 / AnnData — a dense X matrix tab is previewed (first 1000 rows ×
    200 columns) instead of densifying the entire matrix into RAM, which could
    OOM/abort the reader on a real dataset.
  • Workbooks (XLSX & ODS) — a row wider than the header no longer makes
    Arrow reject the whole sheet; every row is padded to the widest and the
    overflow header columns are named colN.
  • ODStable:number-rows-repeated on a non-empty row now expands to N
    rows (capped) instead of silently dropping the duplicates.
  • TUI — sort / filter / stats / search drain a streaming source to EOF
    first, so they cover the whole file instead of only the chunks scrolled
    through so far.
  • --heatmapInf/NaN cells no longer poison normalization (they're
    treated as gaps); the scan buffer is bounded; non-TTY output is guarded.
  • KDE plugins — the Dolphin thumbnailer and KFileMetaData extractor handle
    malformed input gracefully (empty result, no worker abort).

Performance

  • GUI — row→chunk mapping is O(log chunks) via a cumulative-offset binary
    search (was O(chunks) per cell); find navigates a precomputed match list in
    O(log matches) and uses an Arrow match_substring prefilter for literals.

Docs

  • Documented --heatmap / --image-mode, NumPy .npz / .npy, and .fods
    across --help, the man page, the README, and the bash/fish/zsh completions;
    clarified that the KF6 GUI plugins are optional.

v1.9.1

Choose a tag to compare

@github-actions github-actions released this 14 Jun 08:17

A correctness- and robustness-focused patch release: it fixes a class of
silently-wrong results, several crash/hang/OOM paths on malformed input found
in a code audit, and the release/CI pipeline. No user-facing feature changes.

Fixed

  • Region coordinates — every htslib-backed range query (tabix BED/VCF/GFF,
    BAM --pileup -r, BCF) fed vv's canonical UCSC 0-based half-open coordinates
    to htslib's 1-based-inclusive region parsers, shifting every query one base
    and disagreeing with the Parquet path for the same -r. Coordinates are now
    converted at the htslib boundary so all formats agree.
  • Parquet region queries now handle every integer coordinate width
    (UInt32/Int16/…, and dictionary-encoded ints), not just Int32/Int64 — a
    UInt32 Start/End column previously made region queries return nothing.
  • SQLite NUMERIC/DATE/DATETIME/BOOLEAN columns are preserved
    verbatim instead of being coerced through double (which turned dates into
    their year and rounded 64-bit integers beyond 2^53).
  • BCF keeps the FORMAT field (e.g. GT:AD:DP) in the FORMAT_SAMPLES
    column instead of dropping it.
  • Delimited streaming surfaces a mid-file parse error (a malformed row
    beyond the first 16 MiB block) as a non-zero exit instead of silently
    truncating output with status 0.
  • Streaming sources (Arrow IPC, FASTA/FASTQ, SQLite) no longer spin or
    silently truncate when a read error occurs past the first batch.
  • Empty tabix region (a window overlapping no records) returns an empty
    result with exit 0, matching the Parquet/BCF/BAM paths, instead of erroring.

Security

Memory-safety fixes for malformed/untrusted input (reachable in-process via
the KDE thumbnailer / KFileMetaData extractor):

  • HDF5 — array-valued attributes no longer overflow fixed-size buffers in
    H5Aread (a crafted shape/string attribute could smash the stack — verified
    segfault, now rejected).
  • NumPy .npz — the declared array shape is validated against the stored
    data (rejecting negative dimensions, overflowing products, and shapes larger
    than the buffer) instead of driving an out-of-bounds read.
  • 2bit — the header seqCount is bounded against the file size before
    reserving (a crafted value requested ~170 GB and aborted the process); the
    N-block table skip is computed in 64-bit.

Build / CI

  • The KF6 Dolphin/KFileMetaData GUI plugins are now optional in CI so the
    Ubuntu 24.04 job (which lacks the KF6 dev packages) builds the Qt GUI without
    them rather than failing.
  • The static-binary release fetch step retries on transfer timeouts
    (--retry-all-errors, connect timeout), fixing the flaky-download failure
    that blocked the 1.9.0 release.

v1.8.2

Choose a tag to compare

@github-actions github-actions released this 22 May 23:27

Fixed

  • Static-binary build: the vendored libhdf5 was configured with
    --disable-deprecated-symbols, but main.cpp uses
    H5Dvlen_reclaim to free variable-length strings (its 1.12+
    replacement H5Treclaim doesn't exist on Ubuntu 22.04's libhdf5
    1.10, so the deprecated name is the portable choice). Dropped
    the flag from the AlmaLinux 8 build so the static binary
    compiles. Packaging-only release; no source changes.

v1.7.0

Choose a tag to compare

@github-actions github-actions released this 16 May 16:30

Interactive-viewer focus on top of 1.6.0. Major additions to the
ncurses TUI: mouse clicks, an in-place theme picker with XDG-spec
persistence, a vim-style : command line, and multi-file tabs.

Added

  • TUI multi-file tabsvv a.vcf b.bed c.parquet opens each
    file as a tab. Tab / Shift+Tab cycle. Each tab keeps its own
    scroll position, sort, filter, column-visibility set, search
    anchor, and chunk cache; switching back is instant. Status bar
    shows tab N/M: basename when more than one file is open.
    Non-interactive output modes (--tsv, --parquet, …) still
    process only the first positional — multi-file is TUI-only.
  • TUI command line (: key) — vim/less-style typed-command
    prompt at the bottom of the screen. First verbs:
    • :<N> — jump to row N (matches the row-index column;
      out-of-range clamps to the last page). Closes the "scroll
      through millions of rows by hand" pain point.
    • :q / :quit — quit (vim muscle memory).
    • :theme NAME — text-driven theme switch (alt to the T
      overlay), with the same name set as --theme. Persisted to
      ~/.config/vv/config via the standard XDG path.
      Errors stay in the input bar so the line can be edited; Esc
      cancels. Extensible — future verbs (:reload, :w FILE, …)
      slot in without new key bindings.
  • TUI theme picker (T key) — overlay listing every built-in
    theme; [*] marks the currently-active one, j/k move the
    cursor, Enter applies the choice. The new theme takes effect
    immediately (ncurses color pairs re-initialised in place) and
    the choice is persisted to ~/.config/vv/config
    ($XDG_CONFIG_HOME/vv/config if set) so future runs start with
    the same theme. Esc closes the overlay without changing.
  • XDG-spec user configvv now reads
    $XDG_CONFIG_HOME/vv/config (default ~/.config/vv/config)
    at startup. Format is plain INI-style key = value; lines
    starting with # are comments. Today only theme is read;
    the format is extensible — future preferences (default
    --threads, --decode-threads, etc.) slot in without breaking
    existing files. Writes are atomic (.tmp + rename) and preserve
    any comments / other keys in place. CLI flags always win over
    the config file.
  • TUI mouse clicks — three additive bindings on top of the
    existing wheel-scroll: click a column header to sort by that
    column (toggle asc/desc on repeat; updates the active column
    for S / y); click a data row to scroll it to the top;
    double-click a data row to open the detail pane (same as
    Enter). Shift+drag continues to work as the universal escape
    hatch for native terminal text selection.

v1.6.0

Choose a tag to compare

@github-actions github-actions released this 13 May 23:02

A broad feature release on top of 1.5.0. Highlights: bigBed / bigWig
and 2bit support via a vendored libBigWig and a hand-rolled 2bit
reader; full TUI exploration suite (column stats, sort, show/hide,
live filter, copy cell); generic Parquet range queries with column
auto-detection; markdown output and LociSSD validation; coordinate-
convention selector with UCSC and NCBI labels; color themes; LTO +
ccache static builds; and ARM64 release artifacts.

Changed

  • Smarter inline truncation for list / map cells. The
    truncator now walks every top-level comma and picks the largest
    leading-element prefix that fits the column. Previous behavior
    always dropped to [first, …] after the first comma, even when
    [first, second] would have fit. Most visible on VCF INFO
    expansions, BAM tags, and other multi-element list cells common
    in real data. Falls back to char-truncation only when even one
    element + ellipsis doesn't fit.

Added

  • TUI copy cell (y key) — copies the top-left visible cell to
    the system clipboard via OSC52. Works through SSH and tmux 3.3+
    with no xclip / pbcopy helper required (modern terminal
    emulators intercept the escape directly). Status bar flashes
    copied: <preview> until the next key; auto-clears.

  • UCSC 2bit (.2bit) — sequence container used for genome
    references (hg38.2bit, mm10.2bit). vv exposes the sequence index
    rather than decoded bases (chromosome-scale strings are too large
    to materialise): name, length, n_blocks (unknown-base runs),
    mask_blocks (soft-masked-region runs). Endianness is detected
    from the signature; long-offset 64-bit 2bit is rejected with a
    clear message (use twoBitToFa for that variant).

  • --theme <name> — color palette selector. Built-in themes:
    default, dark, light, solarized-dark, solarized-light
    (solarized accepted as a synonym for solarized-dark). Affects
    both the non-interactive ASCII table (ANSI escapes) and the
    ncurses TUI. Each theme provides a 256-color palette and a
    16-color fallback for older terminals; the light theme also
    suppresses zebra stripes so the table reads cleanly on a bright
    background. Unknown theme names produce a clear error listing the
    available choices.

  • TUI live filter (& key) — long-requested. Opens a
    &<expression> input bar; expression grammar matches the
    --filter CLI flag. Rows not matching the predicate are hidden
    from the display; status bar shows filter:<expr> N/M (rows
    kept / total). Composes with sort (s): one full-file pass
    rebuilds the combined view via the existing source_row(display)
    indirection. Empty input or Esc (in normal mode) clears.

    Internals: a new rebuild_display_order() orchestrates both
    sort and filter into the single sort_order_ permutation. When
    both are active, rows that pass the filter are collected with
    their sort keys in one pass and sorted at the end.

  • --decode-threads N — separately size Arrow's CPU thread pool
    (Parquet column decode and CSV / TSV parallel parsing) without
    touching htslib's thread count. Defaults to --threads; useful
    when cold reads bottleneck on column decompression. Bounded at
    2 × hardware_concurrency().

Changed

  • Release pipeline: now builds both x86_64 and aarch64
    (ARM64) static Linux binaries on every tag. The release workflow
    matrices over ubuntu-latest and the new GitHub-hosted
    ubuntu-22.04-arm runner — native builds on each architecture,
    no QEMU emulation. Tarballs are named
    vv-<ver>-linux-<arch>.tar.gz; a merged SHA256SUMS covers both.
  • AlmaLinux 8 Docker build: dropped the -march=x86-64
    baseline flag from the build-app CMake invocation so the same
    Dockerfile builds on aarch64. (-march=x86-64 is the default
    target on x86_64 gcc anyway, so the change is a no-op there.)
  • AlmaLinux 8 Docker build: rebuild every static dep + vv itself
    with -flto=auto. gcc-ar / gcc-ranlib preserve LTO IR in archives
    so the final link can drop unused code across library boundaries
    (not just within each .a). Significant text-segment shrink vs
    the previous non-LTO 15 MB static binary.
  • AlmaLinux 8 Docker build: install ccache (via EPEL) and put
    its compiler-symlink dir ahead of gcc-toolset-12 on PATH. A
    BuildKit cache mount (id=vv-ccache) persists the compile cache
    across docker builds. Requires Docker BuildKit + buildx.

Added

  • TUI interactive-exploration batch — three new keybindings turn
    the ncurses viewer into a real exploration tool:
    • S opens a per-column stats popup (count, nulls, min, max,
      mean, distinct count) for the leftmost visible column. Full-file
      scan with progress in the status line.
    • s sorts by the leftmost visible column. Repeated s on the
      same column toggles ascending / descending; s on a different
      column re-sorts ascending; u clears the sort. Numeric types
      sort by raw value, others lexicographically; nulls last. Search
      and the detail pane follow the sorted display order via a single
      source_row(display) indirection that routes all cache lookups
      through the sort permutation when active.
    • c opens a column show/hide picker overlay; Space toggles
      the column under the cursor, hidden columns drop from the
      layout, and the status bar shows a hidden:N indicator.
  • --tail N — show the last N rows instead of the first N.
    Mirrors -n but operates on the tail. Reuses the
    MemoryTableSource adapter: every chunk is read (through any
    active --filter) and the last N rows are sliced off, so the
    result renders identically through every view / export mode
    (table, TUI, TSV, CSV, JSON, Markdown, Parquet).
  • --coords UCSC|NCBI — pick the coordinate convention for
    -r. UCSC (default; aliases 0-based, bed) means 0-based
    half-open as in BED, bigBed, bigWig, BAM and LociSSD — the
    convention introduced by Jim Kent's UCSC Genome Browser source
    tree in 2000. NCBI (aliases GenBank, 1-based, tabix)
    means 1-based inclusive as in GenBank (1982), VCF, GFF, and the
    samtools / bcftools / tabix command lines. vv -r chr1:101-200 --coords NCBI file matches the same rows as the UCSC default
    vv -r chr1:100-200 file. Conversion happens once in
    apply_region_modifiers; downstream sources see normalized
    UCSC. --regions-file is always BED (UCSC) per the spec.
  • --parquet - — write Parquet to stdout. Parquet's
    footer-at-end requires seekable writes, so the data is spooled
    to an mkstemps temp file under /tmp, then streamed to stdout
    and unlinked. Bit-identical to writing to a file path. Enables
    vv ... --parquet - | tool pipelines.
  • Generic Parquet range queries-r chr1:1000-2000 file.parquet
    now works on any Parquet file with chrom/start/end columns, not just
    LociSSD. Chromosome / Start / End column names are auto-detected
    (common variants: Chromosome/Chrom/Chr, Start/POS/
    chromStart, End/Stop/chromEnd). When auto-detection isn't
    clear (or your columns have unusual names) use
    --region-cols Chr,Start,End. Row-group pruning uses Parquet
    ByteArray statistics on chrom plus Int statistics on Start/End;
    per-row filtering inside surviving row groups is correct for
    unsorted files too, just less efficient. Dictionary-encoded chrom
    columns are handled transparently.
  • --validate — LociSSD invariants checker. Verifies the
    lociSSD_manifest footer parses, the required columns
    (Chromosome / Start / End / MaxEndSoFar) have the right types,
    the manifest's per-chromosome row ranges cover every row
    contiguously, rows are sorted by (Start, End) within each
    chromosome, MaxEndSoFar[i] matches max(End[chrom_first..i]),
    and every row's Chromosome label agrees with the manifest's
    window. Prints PASS / FAIL per check, caps repeat violations
    at 5 lines per category, exits non-zero on any failure.
  • --md / --markdown — write a GitHub-flavored markdown table
    to stdout. Useful for pasting query results into issues, READMEs,
    and reports. Cells escape | as \| and turn embedded newlines
    into <br>. Honours --select, --filter, -n, --no-header,
    -r, --sample. Numbers keep their _ thousands separators
    so the rendered table stays readable.
  • bigBed / bigWig support via a vendored copy of
    libBigWig (0.4.8, MIT-licensed,
    compiled with -DNOCURL so only zlib is required). Source lives
    under vendored/libBigWig/; CMake compiles it as a private static
    library (libbigwig.a) and links it into vv. The static AlmaLinux 8
    Docker build picks it up automatically — no new external dependency
    for any distribution channel.
  • bigBed: the embedded autoSql definition is parsed into typed
    Arrow columns (signalValue, pValue, qValue, …). A small
    ~150-LOC hand-rolled parser handles primitives, char[N] fixed-
    width strings, enum{…} / set{…} (as strings), and arrays
    (int[N] / int[fieldName] → Arrow list<int>).
  • bigWig: rendered as four columns (chrom, start, end, value).
  • Range queries (-r chr1:78-99) use libBigWig's overlap APIs
    (bbGetOverlappingEntries / bwGetOverlappingIntervals); no
    external index needed.
  • User manual at docs/USAGE.md, with worked examples for every
    flag, every output mode, the LociSSD / tabix / BCF range-query
    flows, and a "by-workflow" cookbook section. docs/build_docs.sh
    renders it to self-contained HTML and PDF via pandoc (with a
    texlive → chromium-via-HTML fallback).
  • BCF range queries-r chr1:100-200 file.bcf now works, using
    bcf_itr_querys over an existing .csi / .tbi index. Missing
    index produces a clear hint pointing at bcftools index.
  • --regions-file <BED> — read additional windows from a BED file's
    first three columns. Combines with explicit -r; both a...
Read more

v1.1.0

Choose a tag to compare

@balwierz balwierz released this 24 Mar 17:26

What's new

  • --tsv / --csv / --delimiter <sep> — convert Parquet to delimited text, streamed row-group by row-group for memory efficiency
  • --no-header — omit the header row in delimited output
  • --color=auto/always/never — rich ANSI colors in the terminal, plain text when piped
  • RFC 4180 compliant CSV quoting
  • Dictionary-encoded columns now show decoded values