Skip to main content

Papyra

Papyra

Durable persistence, retention and compaction for actor systems

Test Suite Package version Supported Python versions


Documentation: https://papyra.dymmond.com 📚

Source Code: https://github.com/dymmond/papyra

The official supported version is always the latest released.


Durable persistence, retention, recovery, and observability for actor systems.

Papyra is a production-grade persistence layer designed specifically for actor-based runtimes. It provides durable system history, audits, dead-letter tracking, retention + compaction, startup health checks, recovery orchestration, and operational tooling.

Papyra is not an actor framework. It's the persistence and observability backbone that makes an actor system operationally safe.


Why Papyra?

Actor systems are excellent at concurrency and fault isolation, but production operators eventually need:

  • A durable history of lifecycle events (start/stop/crash/restart)
  • Audit snapshots for “what's running and what's broken?”
  • Dead letters for undeliverable messages
  • Retention to prevent unbounded growth
  • Compaction to physically reclaim disk space
  • Startup checks and deterministic recovery
  • Metrics for observability
  • CLI tools for real-world operations

Papyra solves this explicitly and safely.


Features

🧱 Persistence backends

  • JSON NDJSON file backend (simple, readable, portable)
  • Rotating files backend (bounded disk usage)
  • Redis Streams backend (production, distributed, consumer-groups)
  • In-memory backend (tests, ephemeral)

♻️ Retention & compaction

  • Record-count, age, and size-based retention
  • Explicit physical compaction / vacuum
  • Crash-safe atomic rewrite semantics where applicable

🩺 Health, startup checks & recovery

  • Scan for corruption / anomalies
  • Recovery modes: IGNORE / REPAIR / QUARANTINE
  • Startup orchestration to guarantee a clean persistence layer before actors start

📊 Metrics & integration

  • Backend metrics (writes, errors, scans, recoveries, compactions)
  • CLI metrics output
  • Optional OpenTelemetry integration

🛠️ CLI

  • persistence scan | recover | compact | inspect | startup-check
  • doctor run
  • inspect events | audits | dead-letters | summary
  • metrics …

Installation

pip install papyra

Optional extras:

pip install papyra[redis]

ActorSystem + Papyra: the mental model

An ActorSystem emits observable facts while it runs:

  • Events: lifecycle transitions (started, stopped, crashed, restarted)
  • Audits: point-in-time health snapshots (counts, registry status, dead letters)
  • Dead letters: messages that couldn't be delivered

Papyra persists these facts using the configured backend.

A key guarantee: startup checks happen before any actor is allowed to run. If the persistence layer is corrupted and startup mode is strict, ActorSystem.start() fails.


Quickstart (with ActorSystem)

1) Pick a persistence backend

JSON file backend

from papyra.persistence.json import JsonFilePersistence

persistence = JsonFilePersistence("./papyra.ndjson")

Redis Streams backend

from papyra.persistence.backends.redis import RedisStreamsConfig, RedisStreamsPersistence

persistence = RedisStreamsPersistence(
    RedisStreamsConfig(url="redis://localhost:6379/0", prefix="papyra", system_id="local")
)

2) Start the ActorSystem with startup checks

from papyra.system import ActorSystem
from papyra.persistence.startup import PersistenceStartupConfig, PersistenceStartupMode
from papyra.persistence.models import PersistenceRecoveryConfig, PersistenceRecoveryMode

system = ActorSystem(
    persistence=persistence,
    # Ensure the persistence layer is clean *before* any actor starts
    persistence_startup=PersistenceStartupConfig(
        mode=PersistenceStartupMode.RECOVER,
        recovery=PersistenceRecoveryConfig(mode=PersistenceRecoveryMode.REPAIR),
    ),
)

await system.start()
  • fail_on_anomaly → start fails if corruption is detected
  • recover → attempt recovery, then require a clean post-scan
  • ignore / scan_only → don't fail startup

3) Spawn actors after the system starts

from papyra.actor import Actor

class Echo(Actor):
    async def receive(self, message):
        return message

ref = system.spawn(Echo, name="echo")

4) Shut down cleanly

await system.aclose()

Operational CLI

Health check (Doctor)

papyra doctor run

Fail hard if there are anomalies:

papyra doctor run --mode fail_on_anomaly

Attempt recovery:

papyra doctor run --mode recover --recovery-mode repair

Persistence maintenance

Scan:

papyra persistence scan --path ./papyra.ndjson

Recover:

papyra persistence recover --mode repair --path ./papyra.ndjson

Compact:

papyra persistence compact --path ./papyra.ndjson

Inspect summary:

papyra persistence inspect --path ./papyra.ndjson --show-metrics

Documentation

The full documentation covers:

  • Core concepts and actor lifecycle observability
  • All persistence backends (JSON, rotation, Redis, memory)
  • Retention and compaction strategies
  • Failure scenarios and recovery playbooks
  • Startup guarantees
  • Metrics + OpenTelemetry integration
  • Extending Papyra with custom backends

Metadata

Release files for papyra 0.3.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 papyra 0.3.0
File Size Uploaded
papyra-0.3.0.tar.gz 90.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for papyra 0.3.0
File Interpreter ABI Platform
papyra-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 210.9 kB

Release files / papyra-0.3.0.tar.gz

Download URL papyra-0.3.0.tar.gz
Size 90.8 kB
Tags Source
SHA-256 checksum
How to use checksums
662af17ebb4d4554af4df8a53d95116a19450d656f2b3fe8426dfd28cfcbc858
BLAKE2b-256 checksum
How to use checksums
0ec168987bcd8c764b41792fe77aace869f77c52cd415e37e573e3c3dc55e21f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via Hatch/1.18.0 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.10.21"},"installer":{"name":"hatch","version":"1.18.0"},"openssl_version":"OpenSSL 3.0.13 30 Jan 2024","python":"3.10.21","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.12.0

Release files / papyra-0.3.0-py3-none-any.whl

Download URL papyra-0.3.0-py3-none-any.whl
Size 120.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
4f1449c59f483c47514e22acd4e092dbc8e4ea4b51cf41a38ffa41dfc7d5eeea
BLAKE2b-256 checksum
How to use checksums
3ff75c7ba955a6395c0d5231dd3116bf396568e3dc63b90f105b2858d3601335
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via Hatch/1.18.0 {"ci":true,"cpu":"x86_64","distro":{"id":"noble","libc":{"lib":"glibc","version":"2.39"},"name":"Ubuntu","version":"24.04"},"implementation":{"name":"CPython","version":"3.10.21"},"installer":{"name":"hatch","version":"1.18.0"},"openssl_version":"OpenSSL 3.0.13 30 Jan 2024","python":"3.10.21","system":{"name":"Linux","release":"6.17.0-1022-azure"}} HTTPX2/2.12.0

Release history Release notifications | RSS feed

This release

0.3.0 This release

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