riko is a free, open source data engineering & integration project written in Python and released under MIT. It has 1,607 GitHub stars, 75 forks and 25 open issues, and was last pushed 4 hours ago. On this registry it ranks #28 of 39 tracked projects in Data Engineering & Integration, with 5 head-to-head comparisons available.

What is riko?

riko is a pure-Python, MIT-licensed stream processing library and command-line tool for building composable data-processing pipelines out of configuration-driven pipes, aimed at developers and data engineers who need to process RSS and Atom feeds, web content, text, and structured files without deploying a scheduler, cluster, or message queue.

What it is

riko is a Python library for building data-processing streams, modeled after Yahoo! Pipes. It combines reusable, modular, configuration-driven pipes with synchronous, asynchronous, and parallel execution APIs, and it also ships a command-line interface for running flows, meaning stream processors or pipelines. Records are dictionary-like objects that flow through configurable pipes, and pipelines can be defined in plain Python or JSON and then inspected, executed, or compiled.

The concrete problem it solves is lightweight stream processing without infrastructure. Instead of standing up a scheduler, cluster, or message queue just to fetch a feed, extract text, and aggregate records, a developer installs a single PyPI package and runs an embedded pipeline in-process. It is explicitly not a distributed stream-processing engine, a durable workflow scheduler, or a dataframe query engine; it is designed to run inside a worker or task that such a system already manages. Its first-class targets are RSS and Atom feeds, web content, text, and structured files.

Key capabilities

  • A library of configuration-driven pipes for filtering, sorting, parsing, transforming, aggregating, and composing streams.
  • Three execution models in one API: synchronous pipes, asynchronous execution via async/await, and parallel execution across thread or process pools.
  • Source and transform pipes demonstrated in the quick start: Sources.FETCHPAGE with a detag option that strips HTML tags, get_path, .strreplace(), .tokenizer(), and .count().
  • First-class RSS and Atom and web-content processing, reflecting the project's Yahoo! Pipes lineage.
  • Lazy, iterator-oriented processing over dictionary-like records, so results are pulled one at a time.
  • Pipeline definition in either Python or JSON, plus tools to inspect, execute, and compile pipelines.
  • A command-line interface for executing flows, alongside the library API.

Who uses it and how

  • Developers processing RSS and Atom feeds, who need to fetch, normalize, and aggregate feed records without a feed-processing service.
  • Data engineers running small ETL jobs on a single machine or inside a worker, where the pipeline is the unit of work rather than a cluster job.
  • Teams that already operate a scheduler, queue, or task system and want riko to run inside that worker rather than replace it.
  • Scripting users who compose flows from the CLI instead of embedding the library in an application.

Getting started

Install the published release from PyPI with python -m pip install riko; the default install is a slim core, with advanced options covered in the installation documentation. riko is tested and known to work on Python 3.12, 3.13, and 3.14.

How it compares

No list of paid products replaced by this project is provided in the facts. Several Python projects overlap with riko, among them dlt, which is named as optimizing for a different part of the data-processing problem; riko's distinctive position is an embedded, pure-Python execution model that requires no external services.

When to use it — and when not to

Choose riko when the work fits in a single process or a local thread or process pool, and when no external services should be required. Do not choose it for cluster execution, durable keyed state and recovery after worker failure, persistent scheduling, retries or task dependency management, a workflow service or UI, event-triggered infrastructure automation, or dataframe-scale columnar analytics and query optimization. The repository carries 25 open issues, so prospective users should check that the pipes they need are covered and that any scheduling or retry semantics they require come from an external system.

project readme (upstream, from github) — read inline

riko: composable stream processing for Python

|ci| |pypi| |versions| |license|

.. contents:: :local: :depth: 2

Introduction

riko is a pure Python library_ for building data-processing streams. riko combines reusable, configuration-driven modular pipes_ with synchronous, asynchronous, and parallel execution_ APIs. It is particularly useful for processing RSS feeds, web content, text, and structured files.

riko also supplies a command-line interface_ for executing flows, i.e., stream processors aka pipelines.

Requirements & Installation

riko has been tested and is known to work on Python 3.12, 3.13, and 3.14.

Install the latest published release from PyPI:

.. code-block:: bash

python -m pip install riko

riko installs a slim core by default. View the installation doc_ for advanced installation options.

Quick start

The following example fetches a webpage, splits its text into words, and counts the number of times each word appears.

.. code-block:: python

>>> from riko import get_path, Sources, SyncPipe
>>>
>>> ### Set the pipe configurations ###
>>> #
>>> # Notes:
>>> #   1. look up cached html file in the `data` directory
>>> #   2. fetch text in the 'body' tag and strip html tags
>>> #   3. replace newlines with spaces and assign the result to 'content'
>>> #   4. split text in words using whitespace as the delimiter
>>> #   5. count the number of times each word appears
>>>
>>> url = get_path('users.jyu.fi.html')                   # 1
>>> fetch_conf = {'url': url, 'start': '', 'end': '', 'detag': True}
>>> replace_conf = {
...     'rule': [{'find': '\r\n', 'replace': ' '}, {'find': '\n', 'replace': ' '}]
... }
>>>
>>> flow = (
...     SyncPipe(Sources.FETCHPAGE, conf=fetch_conf)      # 2
...     .strreplace(conf=replace_conf, assign='content')  # 3
...     .tokenizer(conf={'delimiter': ' '}, emit=True)    # 4
...     .count(conf={'count_key': 'content'})             # 5
... )
>>>
>>> next(flow)
{'Tidy': 1}
>>> next(flow)
{'your': 1}

Motivation

Why I built riko ^^^^^^^^^^^^^^^^

I wanted a small-footprint, pure-Python library for processing data streams. In particular, I wanted to fetch RSS feeds and web pages and process records without needing to deploy a scheduler, cluster, or message queue.

The basic idea is deliberately simple: dictionary-like records flow through configurable pipes. Pipelines can run synchronously, asynchronous via async/await, or parallelized across threads or processes.

Why you should use riko ^^^^^^^^^^^^^^^^^^^^^^^

riko is a good fit when you want a batteries included, reusable, data-processing abstraction.

In particular, riko provides:

  • a pure-Python, embedded execution model with no required external services
  • a library of configuration-driven pipes for filtering, sorting, parsing, transforming, aggregating, and composing streams
  • first-class RSS/Atom and web-content processing
  • synchronous and asynchronous APIs
  • local thread and process-pool execution
  • lazy iterator-oriented processing
  • simple Python or JSON pipeline configuration and definition
  • tools to inspect, execute, and compile pipelines

Why you shouldn't use riko ^^^^^^^^^^^^^^^^^^^^^^^^^^

riko does not try to be a distributed stream-processing engine, durable workflow scheduler, or dataframe query engine.

It is usually not the right tool when you need:

  • execution across a cluster
  • durable keyed state and recovery after worker failure
  • persistent scheduling, retries, or task dependency management
  • a workflow service/UI
  • event-triggered infrastructure automation
  • dataframe-scale columnar analytics or query optimization

riko can instead run inside a worker or task managed by such systems.

Choosing riko ^^^^^^^^^^^^^

Several Python projects overlap with riko, but they optimize for different parts of the data-processing problem.

+------------------------------------------+------------------------------------------------------------------+ | Project | Distinctive strength | Prefer it for... | +==========+===============================+==================================================================+ | dlt_ | Declarative, schema-aware | moving data from REST APIs into warehouses/lakes/databases | | | ingestion | | +------------------------------------------+------------------------------------------------------------------+ | Singer_ | Standardized taps and targets | replicating data from various sources into many destinations | +------------------------------------------+------------------------------------------------------------------+ | Bytewax_ | Stateful streaming runtime | keyed state, recovery, workers, or distributed stream processing | +------------------------------------------+------------------------------------------------------------------+ | Bonobo_ | Injectable services and I/O | traditional ETL graphs and runtime-injected infrastructure | +------------------------------------------+------------------------------------------------------------------+ | Streamz_ | Continuous stream graphs | push-oriented streams, branching, backpressure, or live windows | +------------------------------------------+------------------------------------------------------------------+ | petl_ | Rich lazy table algebra | joins, reshaping, and data-quality operations | +------------------------------------------+------------------------------------------------------------------+ | riko | Config-driven pipelines | broad library of reusable, JSON serializable pipes | +------------------------------------------+------------------------------------------------------------------+

The closest comparison depends on what part of riko you care about.

dlt_ is a Python ingestion framework/library with similarities to riko in REST ingestion, incremental extraction, schema-aware loading, and Python-native data handling. dlt primarily allows you to "get data out a source reliably and into a well-structured destination." It provides primitives for pagination, auth, and schema normalization. This contrasts with riko's main use-case of processing and composing streams of records.

Singer_ is a connector protocol that standardizes how sources (taps) and destinations (targets) exchange records, schemas, and replication state. It overlaps with riko at the extraction and data-movement boundaries. Singer is a better fit when the primary goal is source-to-destination replication. riko instead places more emphasis on transforming and composing records.

Bytewax_ is the natural direction when a workload grows beyond riko's intended scope and requires durable keyed state, recovery, or distributed stream processing.

petl_ and Bonobo_, like riko, are both lightweight ETL libraries. Compared to riko, petl is more table-oriented and provides a deeper relational/data-wrangling vocabulary. Bonobo centers execution around an ETL graph of transformation nodes.

Streamz_ overlaps most with riko's stream-composition and fan-out model, but places more emphasis on continuous push-based streams, windowing, and reactive dataflow.

riko provides more "batteries included" data-processing vocabulary. It exposes common operations (filtering, truncating, searching, etc.) as configurable, reusable pipes rather than requiring a Python callable. riko also provides first-class support for web-content (RSS/Atom feeds, HTML/XML, and JSON) and a simple JSON-based pipeline definition format.

Design Principles

Overview ^^^^^^^^

Here's the riko vocabulary at a glance:

+---------------------+---------------------------------------+--------------------------------------------------+ | Term | Meaning | Example | +=====================+=======================================+==================================================+ | item | one dictionary-like record | {'title': 'Example'} | +---------------------+---------------------------------------+--------------------------------------------------+ | stream | an iterator of item | iter([{'title': 'Example'}]) or SyncPipe | +---------------------+---------------------------------------+--------------------------------------------------+ | pipe | a configured stream operation | join, ``slugify

readme truncated — read the full docs on github

Frequently asked questions

Is riko free to use?

riko is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does riko do?

A Python stream processing engine modeled after Yahoo! Pipes

What is riko written in?

riko is primarily written in Python. Its source is publicly available at https://github.com/nerevu/riko, and it has 1,607 GitHub stars.