Skip to main content

Rakaia

Rakaia is a Python implementation of the Durable Streams protocol — an HTTP-based protocol for append-only, ordered, durable byte streams.

It ships two installable packages:

  • rakaia — A zero-dependency ASGI app implementing the protocol. Run it standalone (uvicorn/daphne/granian) or mount it inside Django/FastAPI/Starlette.
  • django_rakaia — A Django app with normalized stream models, a @stream_model decorator, Channels-based SSE broadcasting, and an admin interface.

Install

pip install rakaia-streams                 # core protocol server
pip install "rakaia-streams[django]"       # + Django integration
pip install "rakaia-streams[django,prod]"  # + channels-redis + hypercorn for prod

The distribution is named rakaia-streams on PyPI (plain rakaia was already taken); the import names are unchanged — import rakaia, import django_rakaia.

Already using rakaia from a pinned git revision? See UPGRADING.md before bumping the pin — the distribution rename above is itself a breaking change for a [tool.uv.sources] entry spelled rakaia.

Quick start (standalone)

pip install rakaia-streams uvicorn
uvicorn rakaia:app --port 4437
from rakaia import create_app, StreamStore

app = create_app()  # in-memory store
app = create_app(store=StreamStore())

Quick start (Django)

# models.py
from dataclasses import dataclass
from django.db import models
from django_rakaia.decorators import stream_model


@dataclass
class RoomData:
    id: int
    name: str


@stream_model(
    stream_paths=lambda obj: f"room:{obj.id}:messages",
    to_dataclass=lambda obj: RoomData(id=obj.id, name=obj.name),
)
class ChatRoom(models.Model):
    name = models.CharField(max_length=100)

Every save/delete now emits a stream event you can subscribe to over SSE.

Documentation

The documentation site is built with Zensical.

uv sync --extra docs
uv run zensical serve   # live preview at http://localhost:8000
uv run zensical build   # static build into ./site

Pages live in docs/ and the site config is in zensical.toml:

Versioned handlers (event replay with history)

Rakaia ships a subsystem for replaying a stream through handlers whose current and historical versions are both kept in source. Handlers are pure — they return Effect descriptions that an executor applies via idempotent update_or_create, so replay can be re-run safely.

from rakaia import Upsert, register_handler, register_upcaster


@register_handler(
    name="mogrify", event_match="room:*:messages", effective_from=0, effective_to=10_000
)
def mogrify_v1(event):
    return Upsert(
        model_label="myapp.Room",
        lookup={"id": event["room_id"]},
        defaults={"name": event["name"]},
    )


@register_handler(name="mogrify", event_match="room:*:messages", effective_from=10_000)
def mogrify_v2(event):  # bugfix only for events from seq 10_000 onward
    ...


@register_upcaster(event_match="room:*:messages", from_version=1)
def upcast_v1_to_v2(event):  # schema-shape change handled separately
    return {**event, "currency": "USD"}

python manage.py replay room:5:messages --from 0 then runs every event through its time-correct handler version, with drift detection (--strict-drift) and dry-run (--dry-run) modes.

See docs/versioned-handlers.md for the full story, including a worked example based on Partisipa's submissions pipeline.

Sample applications

Each example demonstrates one feature area end-to-end. Most are standalone Django projects; two are zero-dependency scripts (no Django). Run them all with just demo, or individually:

Example Demonstrates Run
examples/orders/ Versioned handlers, upcasters, replay, dry-run just orders-demo
examples/formkit_submissions/ Projections/fan-out, reconcile_children, migration parity just formkit-demo
examples/protocol_streams/ Protocol layer (no Django): producer fencing, close, poll cursors just protocol-demo
examples/multi_owner/ Effect primitives (no Django): Ref, reconcile_aggregate(owns=) just multi-owner-demo
examples/chat/ @stream_model, multi-stream events, live SSE just dev
examples/polyglot/ Language-scoped streams, live-editable translations just polyglot-dev

For the full catalog with a concept-coverage matrix, see docs/examples.md (human) or the machine-readable Open Knowledge Format bundle in okf/ (agents/tools). For a narrated walkthrough, see docs/whats-new.md.

Running it

If you have just and podman:

just install
just dev      # single-worker dev server
just serve    # production-style: 4 hypercorn workers + Redis (podman)

just --list shows everything. The full guide is in docs/deployment.md.

Development

just install
just check   # lint + format + types + tests + docs build

Or by hand:

uv sync --extra dev --extra django
uv run pytest
uv run ruff check src/
uv run pyright src/

Protocol conformance

Beyond the pytest suite, rakaia is checked against the upstream, language-agnostic @durable-streams/server-conformance-tests compliance suite:

just conformance   # starts rakaia, runs the suite against it, tears it down (needs node/npm)

This runs in CI as a non-blocking check (.github/workflows/conformance.yml). rakaia passes the full protocol surface today except the stream forking family, which is not yet implemented. See conformance/README.md.

License

MIT.

Metadata

Release files for rakaia-streams 0.9.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rakaia-streams 0.9.0
File Size Uploaded
rakaia_streams-0.9.0.tar.gz 642.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rakaia-streams 0.9.0
File Interpreter ABI Platform
rakaia_streams-0.9.0-py3-none-any.whl Python 3 none any Details

Total release size: 957.4 kB

Release files / rakaia_streams-0.9.0.tar.gz

Download URL rakaia_streams-0.9.0.tar.gz
Size 642.7 kB
Tags Source
SHA-256 checksum
How to use checksums
b9de8543e6abb8752b443367c2e198fd8efdf5804daf325af0bfd79b30b190db
BLAKE2b-256 checksum
How to use checksums
b4eeeb45ab31e187743e97bd44b41728b52f1377edccedc341aabc17815ec16f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release files / rakaia_streams-0.9.0-py3-none-any.whl

Download URL rakaia_streams-0.9.0-py3-none-any.whl
Size 314.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
51d7c1e3e60e5ae1a6f74cb90513039dc35d3dd638be844cf5874b352d2d9889
BLAKE2b-256 checksum
How to use checksums
5962912ae9670859cfb5958a78a0691753a1a40e49c41c9a9caee1f186b72c6c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 14, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.9.0 This release

2 release files

0.8.1

2 release files

0.8.0

2 release files

0.7.0

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.0

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page