Releases
June 4, 2025

Quix Streams Release 3.15.0

QuixStreams 3.15.0 just shipped! This huge release features our new join_asof() method. Now, you can join StreamingDataFrames!

Steve Rosam
Steve Rosam
Head of Content
QuixStreams 3.15, Time-Aware Joins

Python stream processing, simplified

Pure Python. No JVM. No wrappers. No cross-language debugging. Use streaming DataFrames and the whole Python ecosystem to build stream processing applications.

Python stream processing, simplified

Pure Python. No JVM. No wrappers. No cross-language debugging. Use streaming DataFrames and the whole Python ecosystem to build stream processing applications.

Data integration, simplified

Ingest, pre-process and load high volumes of data into any database, lake or warehouse, without overloading your systems or budgets.

The 4 Pillars of a Successful AI Strategy

Foundational strategies that leading companies use to overcome common obstacles and achieve sustained AI success.
Get the guide

Guide to the Event-Driven, Event Streaming Stack

Practical insights into event-driven technologies for developers and software architects.
Get the guide
Quix is a performant, general-purpose processing framework for streaming data. Build real-time AI applications and analytics systems in fewer lines of code using DataFrames with stateful operators and run it anywhere Python is installed.

QuixStreams 3.15.0: Time-Aware Joins for Industrial Data at Scale

We're super excited to announce the release of QuixStreams 3.15.0, introducing powerful new features designed for resilient industrial data processing at scale. This release focuses on making your data pipelines more robust and maintainable, even with the most demanding workloads.

New Feature: Time-Aware Joins with `join_asof()`

The highlight of this release is the new `StreamingDataFrame.join_asof()` method, engineered for industrial data enrichment scenarios when you need to associate an event with the most recent related event from another stream, as of the event's timestamp.

Ideal for industrial use cases:

- Correlating sensor readings with equipment maintenance events

- Joining production data with quality control metrics

- Reprocessing of the historical data with different configs

Here's a quick example of how it works:

from datetime import timedelta
from quixstreams import Application

app = Application(...)

sdf_measurements = app.dataframe(app.topic("measurements"))
sdf_metadata = app.dataframe(app.topic("metadata"))

sdf_joined = sdf_measurements.join_asof(
    right=sdf_metadata,
    how="inner",                 # Only emit updates when matches are found
    on_merge="keep-left",        # Prefer left dataframe columns on conflicts
    grace_ms=timedelta(days=14), # Keep state for 14 days in event time
)

For more detailed examples and documentation, check out our Joins documentation.

And for the full release notes and to see all of the contributors, check out the full release notes.

New Tutorial: Industrial Data Enrichment with `join_asof`

To demonstrate these capabilities in a real-world industrial context, we've created a Solar Farm Enrichment tutorial that shows you how to:

- Process high-volume sensor data from solar panels

- Enrich measurements with equipment metadata using time-based joins

- Implement fault-tolerant data processing pipelines

This practical example provides a blueprint for applying `join_asof` to your industrial data challenges, complete with sample datasets and detailed implementation guidance.

Explore the Industrial Data Enrichment tutorial to see these patterns in action.

Industrial Applications of Time-Aware Joins

The new `join_asof` functionality opens up many possibilities across multiple industrial sectors. Here are some real-world applications where this feature can deliver significant value:

Manufacturing & Industry 4.0

- Predictive Maintenance - Correlate equipment sensor data with maintenance logs to identify patterns preceding failures

- Quality Control - Join production line metrics with quality inspection results to detect process deviations

- Asset Tracking - Align RFID or GPS data with production schedules for better asset utilization

Energy & Utilities

- Smart Grid Management - Match power generation data with consumption patterns for optimal grid balancing

- Renewable Energy - Correlate weather station data with solar/wind farm output for accurate forecasting

- Oil & Gas - Align drilling sensor data with maintenance activities to optimize extraction processes

Transportation & Logistics

- Fleet Management - Join vehicle telemetry with maintenance schedules for proactive servicing

- Supply Chain Optimization - Correlate shipment tracking with warehouse processing times

- Rail & Transit - Align train sensor data with track maintenance records

Smart Buildings & Facilities

- HVAC Optimization - Match temperature sensor data with energy consumption patterns

- Equipment Monitoring - Correlate vibration sensors with equipment runtimes for predictive maintenance

- Space Utilization - Join occupancy sensor data with cleaning/maintenance schedules

These patterns demonstrate how time-aware joins can transform raw industrial data into actionable insights, helping organizations improve operational efficiency, reduce downtime, and make data-driven decisions.

Enhanced Reliability for Industrial Workloads

We've strengthened the foundation for mission-critical data processing:

1. Guaranteed Data Durability - Enabled fsync in RocksDB by default to prevent data loss

2. Improved Monitoring - Added detailed RocksDB write metrics for better operational visibility

3. Optimized Performance - Reduced overhead in state management operations

4. Self-Healing Capabilities - Automatic recovery from corrupted state stores

from quixstreams import Application
from quixstreams.state.rocksdb

import RocksDBOptions‍app = Application(..., rocksdb_options=RocksDBOptions(on_corrupted_recreate=True))

Dependencies Update

- Updated types-protobuf to version 6.30.2.20250516

Getting Started

Upgrade to QuixStreams 3.15.0 today to take advantage of these new features:

pip install --upgrade quixstreams

For detailed migration guides and documentation, visit our documentation.

We're excited to see what you'll build with these new capabilities!

If you have any questions or run into any issues, don't hesitate to reach out on our GitHub repository or community Slack.

For the full release notes and to see all of the contributors, check out the full release notes.

What’s a Rich Text element?

The rich text element allows you to create and format headings, paragraphs, blockquotes, images, and video all in one place instead of having to add and format them individually. Just double-click and easily create content.

Static and dynamic content editing

A rich text element can be used with static or dynamic content. For static content, just drop it into any page and begin editing. For dynamic content, add a rich text field to any collection and then connect a rich text element to that field in the settings panel. Voila!

How to customize formatting for each rich text

Headings, paragraphs, blockquotes, figures, images, and figure captions can all be styled after a class is added to the rich text element using the "When inside of" nested selector system.