Releases
June 23, 2025

Quix Streams Release 3.17.0

Quix Streams 3.17.0 introduces interval joins for temporal event correlation, enhanced debugging with intuitive output collection, and a new InfluxDB 1.x sink.

Steve Rosam
Steve Rosam
Head of Content
QuixStreams 3.17.0, Interval 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.

Quix Streams 3.17.0: Interval Joins and Enhanced Debugging

New Feature: Interval Joins

Quix Streams 3.17.0 introduces `StreamingDataFrame.join_interval()`, enabling you to join records from two topics within a specified time window. This powerful feature is particularly useful for correlating events that occur within a defined temporal relationship.

from datetime import timedelta
from quixstreams import Application

app = Application(...)
sdf_measurements = app.dataframe(app.topic("measurements"))
sdf_events = app.dataframe(app.topic("events"))

# Join measurements with events occurring within ±5 minutes
sdf_joined = sdf_measurements.join_interval(
    right=sdf_events,
    how="inner",
    on_merge="keep-left",
    grace_ms=timedelta(days=7),
    backward_ms=timedelta(minutes=5),
    forward_ms=timedelta(minutes=5)
)

Key Benefits:

- Temporal Correlation: Match records based on time proximity rather than just key-based joins

- Flexible Windows: Define asymmetric time windows before and after each event

- Efficient Processing: Built-in state management with configurable grace periods

Enhanced Application Debugging

1. Improved `Application.run()` Behavior

The `count` parameter in `Application.run()` now refers to the number of output messages rather than input messages, making it more intuitive for testing and debugging:

# Process exactly one output message
result = app.run(count=1, collect=True)

# Process messages for up to 10 seconds
result = app.run(timeout=10, collect=True)

2. Output Collection

Easily capture and inspect processing results during development:

# Collect values only
values = app.run(count=5, collect=True)

# Collect values with metadata (offsets, timestamps, etc.)
messages = app.run(count=5, collect=True, metadata=True)

New Connector: InfluxDB 1.x Sink

Version 3.17.0 adds support for InfluxDB 1.x as a sink destination, expanding the range of time-series databases you can integrate with Quix Streams.

Other Improvements

- Better Recovery Logging: Progress updates during state store recovery

- PostgreSQL Sink: Fixed JSONB value handling

- BigQuery Sink: Added user agent identification for better request tracking

Upgrading

Update to the latest version using pip:

pip install --upgrade quixstreams

For detailed migration guidance, refer to the Quix Streams documentation and the full release notes.

Next Steps

- Explore the Interval Join documentation

- Check out the debugging guide for tips on testing your streaming applications

- Join our community Slack to discuss your use cases with other Quix users

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.