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.

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 Effect, register_handler, register_upcaster

@register_handler(name="mogrify", event_match="room:*:messages",
                  effective_from=0, effective_to=10_000)
def mogrify_v1(event):
    return Effect(op="update_or_create", 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.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rakaia_streams-0.1.0.tar.gz (213.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

rakaia_streams-0.1.0-py3-none-any.whl (145.3 kB view details)

Uploaded Python 3

File details

Details for the file rakaia_streams-0.1.0.tar.gz.

File metadata

  • Download URL: rakaia_streams-0.1.0.tar.gz
  • Upload date:
  • Size: 213.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for rakaia_streams-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a483e25a1c40b793a811caa1057c472c650d74f9db750cf33d2b126eda0b0fef
MD5 a2288a45d38a84d971c20f90e14b3ef9
BLAKE2b-256 d380de4c4628a778d2f7c14dd9f59fa2c8e783f7421e02f48127c03dc6c48685

See more details on using hashes here.

Provenance

The following attestation bundles were made for rakaia_streams-0.1.0.tar.gz:

Publisher: publish.yml on joshbrooks/rakaia

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rakaia_streams-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: rakaia_streams-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 145.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for rakaia_streams-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e13853520c69b4e718c551dd1273a40e14c27a34fc253e8d8221c9b10846f8ff
MD5 7041188b7b09ffc250d0d3cb678e8c97
BLAKE2b-256 11afe943027c7439bf91e4b0bcb0a441afb3f2e147d89d7b7742149518707d46

See more details on using hashes here.

Provenance

The following attestation bundles were made for rakaia_streams-0.1.0-py3-none-any.whl:

Publisher: publish.yml on joshbrooks/rakaia

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page