Changelog
Version History
0.7.5
2026-09-03
- Coexpression panel in the expression table: correlate a searched gene (or rank the whole result) against the atlas metacells of the currently visible/filtered samples
- Computed on the coexpression service as an asynchronous celery task (the browser polls it), so the panel stays responsive on large results
- Per-gene Pearson correlation against the searched gene or a sequence-query's per-sample intensities; multi-artifact searches fall back to marker-specificity scores (enterprise accounts)
0.7.0
2026-08-31
- Browse the whole database before any search: the empty page now shows the full sample × metadata table (cell types, organs, diseases, …) with real per-sample cell counts, powered by the cached sparse per-(sample, cell type) count table — one lightweight transfer per session
- Sample-level significance for the enrichment engine: instead of cell-level fold enrichment, each active column is tested with a per-column Kruskal-Wallis omnibus and then each value against the complement within its own column (Mann-Whitney U + study-by-sample-blocked permutation, BH-FDR), automatically rolled up across every ontology level — a term is found at 'lineage'/'cancer-specific' depth even when its subtype is not significant
- Significance shown directly in the table: per-column badges (↑/↓ + n.s./*/**/*** star notation) inside each metadata cell, green/red fold tinting, and the significance is always computed over the unfiltered population so filtering never changes the p/q values
- Reworked enrichment panel: per-column scrolling subpanels, significance-star items (no clutter), metric selector (% positive cells / mean expression / cell count), and a publication-ready export (PNG / SVG / plot-data JSON plus a full significance CSV) with an off-screen renderer so exports work straight from the panel
- Compare groups panel: compare already-searched genes across saved groups in the browser — searchable multi-select group dropdown (10 most recent), per-sample metric vectors (mean expression / % positive / cell count, or the coexpression score), pairwise Mann-Whitney U with study-by-sample-blocked permutation and BH-FDR shown as significance stars, per-group violin with significant pairs annotated, and publication export (high-res PNG / SVG / raw-data CSV / plot-spec JSON)
- Both side panels are resizable in-flow panels with pressed toolbar toggles; the enrichment panel auto-opens on wide screens; significance computation runs in the background (with a busy indicator) using shared-rank statistics so the table stays instant even at database scale
- Filter-bar suggestions are relevance-ranked (exact > prefix > word-prefix > substring) across more columns, and the pre-search/metadata table is fully filterable and searchable on every sample column
- Under-the-hood performance: the pre-search table renders instantly from cached counts, the metadata joins are dictionary-encoded, and the significance engine was reworked several times (shared global ranking, value-centric omnibus) to make p-values effectively instant
0.6.8
2026-08-18
- Search results now carry per-sample cell counts in the table response itself, so the Cells column and the min-cells-per-sample filter work without re-aggregating expression data in the browser
- The table now loads from a filter-independent per-sample intermediate: the metadata server ships per-(key, sample) cell counts and per-group statistics once, and the browser re-derives every statistic and applies filters locally with the same semantics — filtering no longer re-aggregates server-side, cutting the metadata service's CPU load on keystroke-driven filter changes
- The per-sample intermediate is ~3x smaller: per-key min/max/cells replace per-sample extrema, sample metadata is dictionary-encoded per field, and sample ids travel as integers
- The full sample-metadata blob is no longer fetched eagerly after every search — metadata loads lazily (detail drawer, browse view, column/date interactions) and can be restricted to specific fields, cutting the largest per-search transfer (~32MB) from the hot path
- Fix: the browse view refreshes in place when the field-limited sample metadata arrives after it opens, so cards and their publication enrichment appear without leaving and re-entering the view
- Fix: ExpressionTable, CoverageViewer and EnrichmentPanel are now exposed as window globals, restoring the mobile FASTA-drop/presets/save-group/clear-filters shortcuts and the Send-to-enrichment buttons (previously the guards never matched, silently disabling them)
- Fix: the per_sample table decoder sized the row loop from the keyCols spec (the active-column name list) instead of the metadata row count, so only a handful of rows rendered — the full result set renders again
- Fix: the filter-bar suggestions now respect the filters already applied to the table — the server resolves filter columns to real sample-index attributes (and drops per-cell columns like cell_type) before querying the search index, and resolves the fallback polars path to actual sample columns, so typing e.g. “female” with a cell_type filter applied returns suggestions again
- The per-sample intermediate is now cached client-side per view (search artifacts + active columns + display mode + ontology levels): filter and search keystrokes apply locally from the cached payload, so the full table response is no longer re-downloaded on every keystroke
- Fix: the per-sample detail drawer fetches its metadata itself, for every row and field-limited to what the drawer shows — the “unknown study” placeholder no longer appears until the browse view loads the sample metadata, and opening a drawer no longer downloads the full per-sample record for all its samples at once
- The browse view opens with a single compact, dictionary-encoded sample-metadata request (unique values per field instead of per-sample records) covering exactly the fields the browse groupings display, so it no longer downloads the full field slice in row-ordered batches (the progressive batch loader remains as a fallback for older metadata servers); the per-cell expression-matrix export modal fetches only sample_uuid/uuid plus the metadata columns it displays
- The column picker now lists every metadata column the metadata server knows (via /api/metadata/columns) — previously it showed only the small filterable subset plus whatever columns the browser had derived from fully-loaded sample metadata, so once sample metadata became lazy the picker collapsed to a few preselected columns
- Fix: opening the sample drawer from a browse card lazily fetches the missing per-sample metadata (field-limited, same as the table drawer) instead of showing unknown values for samples that had not been scrolled into view yet
- Search now commits only on Enter in every search bar: while typing, only suggestions load (server-side); Enter applies the highlighted suggestion or, when none is selected, runs the typed text as a free-text “anywhere” query
- Fix: the column picker retries loading the full metadata-column list after a search if the initial page-load fetch was empty, and the browse metadata load sources its sample ids from the table rows (available as soon as results render) instead of requiring the raw expression data to have been fetched in-session
- Fix: the compact browse metadata load no longer marks the whole sample-metadata store as loaded — it is a partial (browse-fields-only) slice, and other on-demand paths (per-column sample fetches when toggling a column, date counts, detail aggregation) depend on that flag being false until a real fetch happens; the coverage page's column picker also unions the full metadata-column list
- Fix: the sample drawer no longer treats partial per-sample records (e.g. a single field merged when toggling a column in the picker) as fully loaded — a drawer-completeness check makes it fetch the complete field-limited record, so the '+ details' panel shows all sample metadata again after column changes
- Fix: the browse publication view no longer shows the same paper as several cards or filters on the wrong one — cards whose titles normalize to the same text are merged; title variants that share a DOI are merged when the titles are highly similar; and title variants that share no DOI are merged when they belong to the same study and their titles are near-identical (a shared DOI alone never merges distinct papers, and similarity alone never merges distinct papers either, so several studies can no longer collapse into a single card) — the union carries every title variant so the card title always matches what its filter applies and the Filter button selects all of its samples
0.6.7
2026-08-18
- Fix: the columnar table response is decoded from the nested rows payload, so search results render again after the columnar layout change
0.6.6
2026-08-18
- The composite row key is no longer sent in the columnar table response — it is rebuilt browser-side from the metadata columns, further reducing transfer (~49% smaller than the original JSON)
0.6.5
2026-08-18
- Table responses are leaner: the search-context columnar format now dictionary-encodes sample ids, stores per-artifact stats sparsely, drops duplicated per-artifact metadata and reduces numeric precision to 6 significant digits — roughly 45% less data transferred with identical displayed results
0.6.4
2026-08-17
- Ontology filtering is now synonym- and label-aware: typing e.g. 'colorectal cancer' finds the node 'Colorectal carcinoma' (and its synonyms), raw metadata values resolve to their ontology node, and selected terms are expanded to their id/label/synonyms when sent to the server so filtered rows are no longer dropped
- Selecting a term in the ontology filter panel or its search box still selects the whole descendant subtree ('clear filters' and deselecting removes them)
0.6.3
2026-08-17
- Selecting a term in the ontology filter panel (or in its search box) now also selects all of its downstream descendant terms, and selecting again removes them
- Refreshing the page no longer keeps the previous session's loaded results: the explorer starts from a blank state, and past searches can be reloaded from the search-history panel
0.6.2
2026-08-17
- Removing an individual search result (the X button) now removes it from the table immediately instead of waiting for a separate table refresh
- Each search in the artifact panel gains a show/hide-all button that toggles the visibility of all of that search's sub-results at once
0.6.1
2026-08-17
- Refreshing the page no longer re-fetches any persisted job results: the job/artifact list is restored, and results load individually on demand when you click an artifact in the panel (reduces load on the Explorer/backend from repeated page loads)
0.6
2026-08-17
- Forced refresh of stale frontends: the running build is fingerprinted (FE_VERSION) and users on an older build are prompted to reload when they next load a page, and are blocked at search submission (with a fail-safe 'Continue with current version' option) until they do
- Search jobs that return no genes now surface a clear 'no results' state instead of an empty table: a zero-cell placeholder artifact engages the amber no-results banner, which now also carries actionable suggestions (search unstranded / relax k-mer limits / remove filters)
- The no-results banner is spaced from the table and restyled to match the suggestions banner language
- dbSNP (rsID) queries now resolve to the variant alleles (named e.g. A>C_rs113488022) instead of the reference sequence
- Samples in the detail drawer and the expression/coverage tables can be filtered by a minimum number of cells per sample
- Per-sample cell counts shown in the sample drawer, and the sample drawer offers direct h5ad download via the live catalog-resolved data files
0.5.6
Latest
2026-08-06
- Redesigned the sample detail panel in the Expression and Coverage explorers: facet filter chips, per-study sample cards with expandable metadata, keyboard navigation and a sample detail drawer with facet tiles, external links and the full metadata record
- DOI, PubMed and source database are now prominent and clickable in sample details and the sample tables, and stringified-array metadata values (DOIs, PMIDs, accessions) are parsed properly
- Fold enrichment is now statistically sound: one-sided Fisher's exact test with Benjamini-Hochberg FDR correction (q < 0.05), multi-valued cells split into separate values and missing values counted as their own category
- Fixed a critical bug that prevented the detail panel module from loading and blocking the explorers from rendering, and added a self-healing reload for shared UI modules
- Added cache-busting for static assets so deployments are picked up reliably without stale browser caches
- Added a smart filter bar to the Expression and Coverage result tables with value suggestions, column context, active-filter chips and a row counter
0.5.5
2026-08-05
- Fixed fold-enrichment calculation in Expression and Coverage explorers so rows without expression/coverage data (e.g. empty values) can no longer skew enrichment, and results no longer depend on the table sort order
0.5.4
2026-08-05
- Added live under-maintenance mode with per-user allowlist, toggleable via CLI or Redis without a server restart
- Maintenance state enforced on the web UI (503 page) and the API (503 JSON), with a public /api/maintenance status endpoint
- Added help to the Coverage explorer
- Fixed coverage parsing edge cases
- Fixed coverage rendering performance for large jobs
0.5.3
2026-06-05
- Added selected-sample Download all cells action in Expression Explorer for denominator tables
- Kept web per-cell downloads bounded to 50 samples and directed larger workflows to the Python API
- Separated all-cell metadata retrieval from search result retrieval so search jobs remain positive-cell focused
- Clarified positive-cell matrix exports and independent all-cell denominator downloads in the UI
- Proxied Python API all-cell export jobs through the portal while keeping the web UI sample limit
- Aligned Python API coverage submission/results with the optimized Coverage Explorer aggregation path
- Proxied direct msgpack cell-expression value exports for Python API clients
0.5.2
2026-05-22
- Redesigned Analysis page layout to match application aesthetic
- Fixed tab bar background coloring — tabs now integrate with frame header
- Removed card-like chrome from analysis panels for seamless fill
- Styled composition, marker, and DE tables to match expression table aesthetic
- Fixed sidebar cell groups list with collapse toggle and refresh button
0.5.1
2026-05-22
- Added version badge and changelog page
- Fixed light mode accent colors — purple replaced with dark charcoal
- Fixed sidebar coloring consistency across all pages
- Improved filter panel and search panel icon styling
- Fixed table frame header background to match color identity
0.5.0
2026-05-18
- Added Analysis page with coexpression, differential expression, and composition tools
- New sidebar-based navigation replacing top navbar
- Updated color palette and logo styling
- Enhanced dark mode with yellow/gold accent theme
0.4.3
2026-05-10
- Fixed coverage browser zoom-in behavior
- Improved enrichment panel explanation and UI
- Added system status indicator in preferences menu
- General dark mode enhancements across all panels
0.4.2
2026-05-05
- Fixed AI query handling and added LLM disclaimer
- Added support for new types of LLM natural language queries
- Reorganized search drawer layout for better usability
- Fixed UI spacing issues in analysis and coverage views
0.4.1
2026-04-28
- Added interactive help guidance and tutorial overlay
- Fixed sluggish animations and added tutorial button
- Improved search history logging and tracking
- Adjusted dark mode brightness for better readability
0.4.0
2026-04-20
- Added filter presets with save/load functionality
- Added coverage analysis heatmap and text export
- Improved mobile layout with global pill navigation bar
- Added stats page with aggregate metadata counts
0.3.4
2026-04-12
- Fixed expression table compact view performance
- Improved navbar text clarity and branding
- Added filter text button and legend to expression tables
- Enhanced mobile view with responsive controls
0.3.3
2026-04-05
- Fixed genome browser rendering issues
- Added initial mobile responsive view support
- Improved brand name styling and logo colors
- Fixed theme color for browser tinting
0.3.2
2026-03-28
- Redesigned navigation bar layout
- Fixed search wizard panel positioning
- Improved overall visual style and spacing
- Removed unnecessary motion animations for performance
0.3.1
2026-03-20
- Added floating search wizard panel
- Fixed card padding and corrected source names
- Enhanced landing page with improved layout
- Added level aggregation for ontology browser
0.3.0
2026-03-12
- Added ontology-based hierarchical filtering (cell type, organ, disease)
- Fixed gene table and enrichment table in coexpression view
- Reorganized coverage viewer with genome browser integration
- Improved download features with barcode support
0.2.3
2026-03-05
- Fixed download behavior for barcodes and per-cell matrices
- Added UUID display and filter support for barcode downloads
- Limited number of downloadable samples for performance
- Fixed ontology term matching and cell counts
0.2.2
2026-02-25
- Added dark mode support across the entire application
- Improved font rendering and positioning
- Redesigned navigation bar with better spacing
- Fixed Malva branding text and logo styling
0.2.1
2025-08-18
- Added search drawer with direct input and AI modes
- Added sample count display and logo animation
- Fixed ontology filter integration in coverage browser
- Improved coverage browser with custom tracks
0.2.0
2025-08-12
- Added coverage browser with genome visualization
- Added ORCID-based authentication system
- Added user profile and job history pages
- Added search logging and session management
0.1.0
2025-08-01
- Initial release of Malva Explorer
- Expression Explorer with search and filtering
- Per-cell expression matrix export
- Basic metadata column support
You're running the latest version of Malva Explorer
v0.7.5