<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>GenomeSpy Blog</title>
<link>https://genomespy.app/blog/</link>
<atom:link href="https://genomespy.app/blog/index.xml" rel="self" type="application/rss+xml"/>
<description>Notes on GenomeSpy, genomic visualization, and the craft of making data explorable.</description>
<image>
<url>https://genomespy.app/blog/assets/genomespy-card.png</url>
<title>GenomeSpy Blog</title>
<link>https://genomespy.app/blog/</link>
<height>72</height>
<width>144</width>
</image>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Thu, 01 Oct 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>GenomeSpy 1.0 is out!</title>
  <dc:creator>Kari Lavikka</dc:creator>
  <link>https://genomespy.app/blog/posts/2026-10-01-genomespy-1-0.html</link>
  <description><![CDATA[ 




<p>I made the first Git commit nearly eight years ago. The initial version was largely a proof of concept for WebGL-powered visualization of genomic segments. One might think it was a technology-driven experiment, which is partially true, but there was nevertheless a real use case I was trying to solve: the exploration of copy-number segments in an ovarian high-grade serous carcinoma cohort. First in the <a href="https://herculesovca.blog/">HERCULES project</a>, and later in its successor, the <a href="https://www.deciderproject.eu/">DECIDER project</a>. What made these cohorts particularly interesting from a visualization perspective was the extensive sampling. Individual patients had tumor samples from multiple anatomical sites and different stages of their treatment.</p>
<p>Copy-number variation is one manifestation of genomic and chromosomal instability, with features spanning from broad arm-level events to dense clusters of focal aberrations. Exploring such multi-scale data involves constant navigation around the genome: zooming, panning, moving between different levels of detail, and stratifying and comparing samples.</p>
<p>When I was building the initial prototypes, I was also attending a course on interactive data visualization and happened to stumble upon <a href="https://doi.org/10.1177/1473871611413180"><em>Fluid interaction for information visualization</em> by Elmqvist et al.</a>. While I have always been interested in the user experience in software development and design, I found that paper really exciting: perhaps genome browsers and similar tools could better support insight generation by allowing users to stay in the “flow” of exploration, something I found most existing tools lacking. Elmqvist et al. compiled a list of design guidelines for fluidity, many of which—like smooth transitions, direct manipulation, and rewarding interaction—have heavily influenced GenomeSpy’s design.</p>
<div id="fig-early-transitions" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-early-transitions-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<div class="quarto-video"><video id="video_shortcode_videojs_video1" class="video-js vjs-default-skin vjs-big-play-centered vjs-fluid" controls="" preload="auto" data-setup="{}" title="" aria-label="Early GenomeSpy sample collection view animating between states"><source src="2026-09-29-genomespy-1-0/early-transitions.webm"></video></div>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-early-transitions-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Early GenomeSpy used animated transitions inspired by fluid interaction to make changes in a sample collection easier to follow. Maintaining this effect, however, added too much code complexity, and to be honest, it was probably a bit too flashy.
</figcaption>
</figure>
</div>
<section id="visualization-grammar" class="level2">
<h2 class="anchored" data-anchor-id="visualization-grammar">Visualization Grammar</h2>
<p>The original GenomeSpy was what is now called the <a href="https://genomespy.app/docs/sample-collections/">GenomeSpy App</a>: an interactive analytics application for exploring genomic data across sample collections, particularly cancer cohorts. Underneath it is GenomeSpy Core, a lower-level visualization package that provides a rendering engine, graphical marks, scales, data loaders and transformations, and other building blocks. Core and App were initially a single, bloated package, but nowadays they have clearly separated roles. Over the years, Core has grown into a general-purpose visualization toolkit that is useful for all sorts of genomic visualization tasks—and even some non-genomic ones.</p>
<p>Unlike a traditional genome browser, GenomeSpy does not provide a fixed collection of track types. Visualizations are instead composed using a declarative visualization grammar from lower-level building blocks. This enables much greater flexibility for highly customized visualizations and allows GenomeSpy to adapt easily to different datasets and applications. However, the cost is a somewhat steeper learning curve.</p>
<p>Most bioinformaticians are likely familiar with <a href="https://ggplot2.tidyverse.org/">ggplot2</a>, a grammar of graphics for R. GenomeSpy owes much of its grammar design to another, slightly less well-known one: <a href="https://vega.github.io/vega-lite/">Vega-Lite</a>. While not everything in Vega-Lite fits genomic data cleanly, it got many things right. However, GenomeSpy’s internal architecture is quite different. I designed it for interaction with large amounts of non-aggregated data, which is particularly important in genomic exploration but less commonly needed in ordinary statistical plots.</p>
</section>
<section id="lingering-in-version-0.x" class="level2">
<h2 class="anchored" data-anchor-id="lingering-in-version-0.x">Lingering in version 0.x</h2>
<p>GenomeSpy has remained in v0.x for years. In semantic versioning, version zero means that basically anything can still change in a breaking manner. Still, GenomeSpy’s grammar and API have stayed remarkably stable, mostly because numerous existing visualizations depend on them.</p>
<p>I’ve nevertheless hesitated to release v1.0. There have always been annoying corner cases, essential features to be implemented, and documentation that has been insufficient. In addition, much of GenomeSpy’s feature set was defined by the needs of the research projects aimed at overcoming drug resistance in ovarian cancer rather than building polished software products. But the main reason, when I think about it now, has been my perfectionism, which isn’t always a useful trait.</p>
<p>I graduated some time ago and finally got an opportunity to focus on this unfinished business. During the last several months, I’ve fixed quite a lot of these issues. While I am proficient at writing code, coding agents, especially OpenAI Codex, have provided an immense productivity boost. Some annoying corner cases remain, but there always will be. I’m also not nearly done with all the ideas I’ve come up with over the years. But importantly, keeping the project at version zero because of them makes no sense.</p>
<p>I have now taken a bold step: GenomeSpy 1.0 is out.</p>
</section>
<section id="whats-new-in-1.0" class="level2">
<h2 class="anchored" data-anchor-id="whats-new-in-1.0">What’s new in 1.0</h2>
<p>There isn’t one single feature that defines this release. In fact, there’s nothing new in v1.0, as it is solely a version bump from the earlier v0.90.0. But not long ago, I wouldn’t have been comfortable with the bump.</p>
<p>Much of the recent work has been about making existing pieces more complete and predictable, something that a user would expect from a relatively mature visualization package. Some of that work is described briefly below.</p>
<p>Data support has expanded to formats including Parquet, BED, BEDPE, BAM, and compressed files, and several new transforms have been added for tasks such as coordinate lookup, window operations, set intersections, and label displacement. These building blocks enabled many new non-trivial examples shown in the <a href="https://genomespy.app/docs/examples/">documentation</a>.</p>
<p>There has also been a lot of work on not-so-exciting features that are still important when creating plots and visualizations for others to view. Legends, for example. Axes and view titles now allocate their required space automatically, and clipping and layout behave better in dense compositions with scrollable viewports. Previously, users had to adjust these manually.</p>
<p>GenomeSpy uses a GPU-first design. While nearly all PCs, Macs, tablets, and phones have a GPU, that is not always the case in virtualized environments. The new canvas renderer, while much slower, now allows GenomeSpy to be used in these environments and may even be the preferred renderer for visualizations that show only a moderate amount of data on the screen.</p>
<p>For a long time, the official way to export figures was to take a screenshot, which was a bit embarrassing for a visualization toolkit. PNG export provided some relief, but now there is SVG export that produces publication-quality vector graphics with automatic rasterization of dense layers like heatmaps and large scatter plots. In addition, the visualization’s hierarchical structure is replicated in the resulting SVG groups, enabling easy editing in vector art apps.</p>
<div id="fig-svg-export" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-svg-export-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<!-- prettier-ignore -->
<p><img src="https://genomespy.app/blog/posts/2026-09-29-genomespy-1-0/pik3ca-mutation-lollipop.svg" class="img-fluid figure-img" alt="Lollipop plot of recurrent PIK3CA mutations in TCGA-BRCA, with displaced mutation marks above colored protein domains"></p>
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-svg-export-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;2: A PIK3CA mutation lollipop plot based on TCGA-BRCA data, exported as SVG. The new <a href="https://genomespy.app/docs/grammar/transform/displace1d/"><code>displace1d</code> transform</a> spreads crowded mutation marks while connectors lead back to their original protein positions. <a href="https://genomespy.app/docs/examples/genomic-data/pik3ca-tcga-brca-lollipop/">Explore the interactive example</a>.
</figcaption>
</figure>
</div>
</section>
<section id="whats-next" class="level2">
<h2 class="anchored" data-anchor-id="whats-next">What’s next</h2>
<p>There are already several small but breaking changes waiting in the backlog, aimed at cleaning up a few design decisions. Now that v1.0 is out, it is clear that those changes will go into v2.0, which I expect to release in the relatively near future. v2.0 will come with a migration guide for the grammar and API changes. It will also include new long-awaited features enabled—or at least significantly simplified—by a WebGPU renderer, which is already feature-complete for the current grammar but needs further testing.</p>
<p>GenomeSpy 1.0 also brings something important on the Python side. I’ve been collaborating with <a href="https://www.linkedin.com/in/oskari-lehtonen/">Oskari Lehtonen</a>, who recently created an <a href="https://altair-viz.github.io/">Altair</a>-like <a href="https://genomespy.app/genome-spy-python/">Python package for GenomeSpy</a>, and it is reaching v1.0 at roughly the same time. A package like that has been on my TODO list for years, as JSON isn’t a typical bioinformatician’s mother tongue, while Python could actually be. It provides a much more convenient way to construct GenomeSpy visualizations in Python notebooks and analysis workflows.</p>
<p>The Python package removes one important barrier to using GenomeSpy, but it may not be a drop-in solution for many common workflows: the user still has to specify a visualization. Many tasks do not need that level of customization, and a predefined template—or a “track type”—would be perfectly adequate.</p>
<p>Figuring out which of these higher-level building blocks would actually be useful is one of the next steps. If you use GenomeSpy, or have looked at it and decided that it takes too much work to get started, I’d be interested to hear what you were trying to do. Perhaps some of those workflows should simply work out of the box.</p>
<p>— Kari Lavikka (<a href="https://www.linkedin.com/in/karilavikka/">linkedin</a>)</p>


</section>

 ]]></description>
  <category>release</category>
  <category>visualization</category>
  <guid>https://genomespy.app/blog/posts/2026-10-01-genomespy-1-0.html</guid>
  <pubDate>Thu, 01 Oct 2026 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
