QIIME 2 2026.4 has been released!
Please see the official changelog for more details.
Original content of post
Important 
The following is an early developer preview of the changes expected in 2026.4
This post is a live-document which will be updated throughout our development cycle. Any links will in this topic will be broken until the release is officially published. When we are ready for release, we’ll copy this changelog and create a new post in the Announcements category.
Developer Project Board:
QIIME 2 2026.4 Project on Github
Important Announcements 
- Timed with this release, we are announcing a first draft policy on the use of generative AI technologies in development within the
rachisecosystem. Learn more here.
Interface Changes coming in QIIME 2 2026.7 
- q2-types
FeatureTablewill no longer acceptNormalizedas a variant, andNormalizedwill be removed. We do not believe anyone is currently using this type (FeatureTable[Normalized]), but let us know if you are.
- We are considering adding new output logs in various actions across different plugins, such as q2-feature-classifier's
extract-readsaction. Our goal is to make this backward compatible through the addition of new support for optional outputs from Actions, but if we do not get that aspect completed some actions may have new outputs associated with them.
Here are the Highlights of the Release! 
- All environment files now contain the
rachis-prefix (formerlyqiime2-). Note that this applies only to >=2026.4 releases, along with our development environment files (i.e.latest/passedwithin the distributions repository).
- The
amplicondistribution has been renamed toqiime2. All of the 2026.4 environment files (and development environment files) reflect this change, but this does not apply to historical environment files. - Many supporting dependency updates were made to accommodate the following version bumps across all distributions:
- python 3.12

- scikit-bio 0.7.2

- scikit-learn 1.7.1

- unifrac 1.5.1

- python 3.12
- We now have ARM64 builds for the tiny distribution.
Our hope was to also have builds for the qiime2 distribution as well, but a few transitive downstream dependencies don't yet have arm builds on conda. We are monitoring progress and hope to have these available later in the year. 
- We are no longer providing osx builds for the moshpit or pathogenome distributions. This was initially prompted due to some environment conflicts caused by missing dependencies no longer being supported on osx. However, we anticipate the bulk of use cases for these distributions will be on linux, due to the high processing power required for many actions within q2-assembly and q2-annotate.

Framework (i.e., rachis) Updates ![]()
-
@Oddant1 added the CaptureHolder object, allowing for the capture of auto-generated parameters (such as random number generator seeds) in data provenance. You can find the developer documentation on this new feature here. Actions that have been modified to use this new API are detailed in their respective plugin sections below.

-
@Oddant1 added optional view_types for
Pipelines. It is necessary to use view type annotations onPipelinesthat use theCaptureHolderAPI. Docs on adding view types toPipelinesare here.
-
@Oddant1 fixed a bug causing provenance replay to fail on importing Artifacts of types not known to your current environment

-
@ebolyen extended support for Python versions 3.10 through 3.14 on PyPI. Please note that this is only via
pipinstallations of the framework. Distributions are fixed to Python 3.12 for stability. -
@ebolyen has updated Rachis to support using the modern return type annotations on registered functions (
tuple[ViewTypeA, ViewTypeB]instead of(ViewTypeA, ViewTypeB)). The original mechanism is preserved for backwards compatibility. This means that you can finally fix the annoying squiggly lines in modern IDEs which need the modern annotation form.
-
@ebolyen has removed the need the
decoratorpackage, simplifying the internal operation of rachis.
-
@ebolyen added support for viewing visualizations in JupyterLab 4.x+. This is achieved via a new front-end Jupyter plugin which safely sandboxes visualizations via q2view. Visualizations may be used inline in notebooks or as their own file-view in the JupyterLab interface. Additionally notebooks now save the visualizations as output when they are written, this can result in rather large notebook files, so clear those outputs if this is not desired.
To use this functionality, install jupyterlab-rachis (a PyPI release will be available shortly) into your Jupyter Lab environment or server.
Plugin Updates ![]()
-
- @SoilRotifer migrated the
trim-alignmentaction from the RESCRIPt plugin into this q2-alignment plugin.
- @cherman2 updated some MAFFT tests to accommodate updated behavior from scikit-bio>=0.7.1.

- @SoilRotifer migrated the
-
- @misialq fixed a bug in
simulate-masonwhich would cause sample IDs produced by the action to be non-unique
- @misialq added a new, simpler action for contig quality control evaluation (
evaluate-contigs)
- @lizgehret patched up a bunch of tests to make them Python3.12-compatible

- @misialq fixed a bug in
-
- @colinvwood fixed a bug in the MAG Kraken 2 classification
where an exception would be thrown if all the lowest common ancestor classifications for all MAGs are unclassified - @misialq added support for sparse matrix multiplication in
multiply-tables
- @fethalen fixed an issue with the download of some EggNOG databases

- @misialq updated domain parsing in Kraken 2 reports to improve domain name inference

- @lizgehret patched up a bunch of tests to make them Python3.12-compatible

- @colinvwood fixed a bug in the MAG Kraken 2 classification
-
- @Oddant1 added random seed parameters to the following Actions:
alpha_collection,alpha,beta_collection,beta,core_metrics,kmer_diversity, andresample. This seed is used to seed random number generation in the underlyingrarefystep. These parameters all use theCaptureHolderAPI so the values generated for the random seeds will be stored in provenance.
- @Oddant1 added random seed parameters to the following Actions:
-
- @Macabe222 added a an option to filter by absolute value of log-fold change in the
ancombc2-visualizerso that the most enriched and most depleted features can be simultaneously seen in the bar plot.


- @colinvwood updated ancombc2 to support changes in the latest version.
- @Macabe222 added a an option to filter by absolute value of log-fold change in the
-
- @Macabe222 added a
nextseq_trimparameter to thetrim-singleandtrim-pairedactions to accommodate proper processing of erroneous polyG tails that can occur on newer two color Illumina sequencers.
︎
- @Macabe222 added a
-
- @Oddant1 added random seed parameters to the
core_metricsandcore_metrics_phylogeneticpipelines. This seed is used to seed random number generation in the underlyingrarefystep. These parameters all use theCaptureHolderAPI so the values generated for the random seeds will be stored in provenance.
- @lizgehret updated several tests and functionality here and here to accommodate the following changes:
- API changes from numpy >=2.
- Updates within scikit-bio>=0.7.0.
- Replaced calls to adonis with adonis2. Note that this has been modified at the subprocess call level to the R vegan package; the wrapper method name remains the same.
- @Oddant1 added random seed parameters to the
-
- @lizgehret removed the
sokalmichenermethod to accommodate SciPy 1.17.0 (as a part of the distribution-wide dependency updates), which has been deprecated in SciPy >=1.15.0. Details from SciPy on this deprecation can be found here.
- @lizgehret removed the
-
- @Macabe222 fixed a bug in the
tabulate-seqsvisualizer that was causing numeric metadata columns to sort alphabetically instead of numerically.
- @Oddant1 made the
random_seedparameter torarefyaCaptureHolder, meaning the randomly generated value of the seed will now be stored in provenance.
- @Macabe222 fixed a bug in the
-
- @gregcaporaso made several updates to the
extract-readsalgorithm. Users should see decreases in runtime, and results may differ slightly from earlier versions (including some new reads being extracted, and some previously extracted reads no longer being extracted). Specifically, the changes are:- use of the new semi-global pairwise alignment functionality in scikit-bio > 0.7.0;
- improved handling and scoring of degenerate nucleotide characters in primers and target sequences using an asymmetric substitution matrix such that degenerate characters in the primer, which typically indicate a pool of primers, match their intended targets (e.g.,
Yin a primer is scored as a match toCorTin the target), but degenerate characters in the target (e.g.,N), which typically indicating missing information, are scored as a mismatch to any primer character; - a modification to the match scoring such that the forward and reverse primer match scores are now compared to the identity threshold independently (i.e., the forward and reverse primer must each be greater than or equal to the identity threshold to extract a read from a sequence) rather than as a weighted average of the forward and reverse primer matches;
- the default identity threshold was decreased from 0.80 to 0.70 - based on manual review, this made sense as compensation for the stricter match scoring approach described above.
- @gregcaporaso made several updates to the
-
-
A bug was found and fixed in
midpoint-rootwhich caused incorrect root placement under specific and unusual circumstances. Based on our analysis of the bug, and validation of hundreds ofPhylogent[Rooted]artifacts generated over the last ~10 years, we think this is very unlikely to impact phylogenetic trees rooted withmidpoint-rootin practice.
Where we do observe this is in very small test trees where the longest tip-to-tip distance (which the midpoint root would be centered on) passes through the pseudoroot (i.e., the arbitrarily placed trifurcation in an unrooted tree): in this case, the branch lengths from the pseudoroot to the next internal nodes were not considered. If those internal branch lengths tipped the balance of which tip-to-tip distance was the longest, the midpoint could have been incorrectly placed.
As always, just a reminder that we don't recommend midpoint rooting for real phylogenetics though it does seem to work fine for use in computation of phylogenetic diversity metrics. Those phylogenetic diversity metrics are extremely unlikely to be impacted in any meaningful way by an incorrectly placed root as described here, so even if your root was incorrectly place it likely doesn't impact downstream conclusions drawn from metrics like Faith's Phylogenetic Diversity or UniFrac.
We are providing a script that we used for testing our trees that you can apply to see if trees you generated were impacted by this bug. You can find this, along with instructions for using it, here.
-
@ebolyen added additional tests of midpoint root to avoid regressions on the above subject.
-
-
- @lizgehret updated a few tests to accommodate API changes from numpy >=2. These updates included handling a differing level of decimal place accuracy (at values very close to zero) and differing sort orders for identical values (primarily lists of zeros). Tests have been adjusted with a tolerance and importances are now doubly sorted - first on importance values, then by the index.
-
- @colinvwood added a new action,
feature-ids-to-taxonomy, that parses a taxonomy from feature table feature IDs that encode a taxonomy. This is useful for example in cases wheretaxa collapsehas been run and a downstream action or visualizer still needs aFeatureData[Taxonomy]artifact.
- @colinvwood added a new action,
-
- @Vinzent_Risch added a new type
FeatureTable[Unconstrained]for feature tables containing real-valued feature measurements represented in Euclidean space without constant-sum (compositional) constraints.
- @Vinzent_Risch added a new type
-
- @lizgehret updated one of the uchime tests and its accompanying test data to account for differing outputs that occurred in vsearch versions between 2.22 and 2.30 - the dataset has been modified to match the recommended toy dataset provided by Torbjørn Rognes.

- @lizgehret updated one of the uchime tests and its accompanying test data to account for differing outputs that occurred in vsearch versions between 2.22 and 2.30 - the dataset has been modified to match the recommended toy dataset provided by Torbjørn Rognes.
-
- @SoilRotifer migrated RESCRIPT's
trim-alignmentaction to the q2-alignment plugin. - @lizgehret removed the
evaluate_cross_validateandevaluate_fit_classifieractions, which may be added to q2-feature-classifier (or another new plugin) in the future.
- @SoilRotifer migrated RESCRIPT's
Documentation Updates ![]()
Artifact? Method? Distribution? We know there's a lot of jargon used in the rachis ecosystem of tools. You can now find the canonical user-oriented glossary here and the canonical developer-oriented glossary here.
-
Microbiome Marker Gene Analysis with QIIME 2
- @cherman2 and @gregcaporaso added classifier training as a step in the gut-to-soil and Moving Pictures tutorials.
- @colinvwood and @jordenrabasco added a new how-to guide illustrating how to use
decontamthrough QIIME 2!
- Going forward, we expect to integrate our most recent new functionality in the gut-to-soil tutorial, and plan to leave the Moving Pictures tutorial mostly as-is except for maintenance updates. Moving Pictures has served us well as the primary starting point for new users to learn QIIME and QIIME 2 over the past ~15 years, but it's time for newer data. You can expect gut-to-soil to be updated regularly with the latest and greatest QIIME 2 functionality (and new educational content on integrated microbiome multi-omics bioinformatics in the context of our follow-up studies is on the horizon!).
→:seedling:
-
- @Oddant added new content on storing random seed values and other algorithmically set parameters in provenance and view type annotations on
Pipelines| - @colinvwood added new content on integrating R code in plugins.
- @Macabe222 added new content on raising warnings from plugins that your users will always see.
- @Oddant added new content on storing random seed values and other algorithmically set parameters in provenance and view type annotations on
-
Using QIIME 2: Your guide to becoming a rachis (QIIME 2 Framework) power user.
- @lizgehret added a new document on how to cryptographically sign Artifacts and how to verify those signatures.
Thanks, as always, for your interest in QIIME 2 and our growing ecosystem of tools! If you'd like to get more involved in the QIIME 2 community, learn about some ways to do that here.
See you on the
Forum!