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.5.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.5.0
File Size Uploaded
rakaia_streams-0.5.0.tar.gz 596.5 kB Details

Built distribution (wheel)

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

Total release size: 891.0 kB

Release files / rakaia_streams-0.5.0.tar.gz

Download URL rakaia_streams-0.5.0.tar.gz
Size 596.5 kB
Tags Source
SHA-256 checksum
How to use checksums
f90f724c9f50386f08c8cee78b74401ee4fb3063a0a21fbde506dcb897173222
BLAKE2b-256 checksum
How to use checksums
99b4e00ff128519f55556d396920f6cccd424f17c433c70c56964eba52cc4960
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 Sep 10, 2026.

Transparency log

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

Download URL rakaia_streams-0.5.0-py3-none-any.whl
Size 294.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2e00393ac03f25e6fd75b6e63887a075682b29bfa4e99c4c389eeab6b7c81bf3
BLAKE2b-256 checksum
How to use checksums
9f87cae293c12f4107a32888c18402ab26e2ee3395a3cfed31def1133d41223c
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 Sep 10, 2026.

Transparency log

Release history Release notifications | RSS feed

0.9.0

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

This release

0.5.0 This release

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