Skip to main content

Baldur

CI Python 3.11+ License: Apache 2.0 PyPI Docs OpenSSF Best Practices

Baldur is a self-healing reliability layer for Python applications. It puts circuit breaker, retry, and fallback behind a single decorator, so a flaky downstream stops cascading into your service — and it ships the operational surface you need to actually run that in production: health checks, Prometheus and OpenTelemetry metrics, graceful shutdown, and a built-in web console. The core is framework-agnostic, with first-class adapters for Django, FastAPI, Flask, and Celery.

Terminal demo: the payment gateway dies mid-traffic — five failed charges are captured, the breaker trips, and on recovery Baldur replays all five. Zero lost.

Real run of the shipped demo: the gateway dies mid-traffic — five charges fail and are captured with their arguments, the circuit breaker opens and shields the dying dependency, and the moment it closes again Baldur replays all five for real. Zero lost. Reproduce it yourself:

pip install "baldur-framework[celery]"
python -m baldur.scripts.demo_self_healing

(The breaker states and DLQ tallies in the recording are read live from the running framework. In your own service the same story surfaces as Baldur's structured log events, live breaker state in the built-in web console, and the Prometheus/OpenTelemetry metrics.)

Why Baldur?

  • One decorator, whole pipeline. @baldur.protected("name") composes circuit breaker, retry with backoff, timeout, fallback, and idempotency into one ordered pipeline — instead of hand-wiring three separate libraries and hoping they interact correctly under failure.
  • Zero-config start, production path built in. Out of the box everything runs on an in-memory backend — no Redis, no env vars, no Docker. When you move to multiple workers, add Redis and the same code shares state across the fleet. Call sites never change.
  • Operate it, don't just import it. A built-in web console shows every breaker's live state and gives you runtime on/off controls; health checks tell your load balancer the truth; metrics come standard.
  • Framework-native. Django, FastAPI, Flask, and Celery adapters wire the cache, metrics, and lifecycle hooks at startup, so protection works with your framework's idioms rather than around them.

Install

The Python package is baldur (you import baldur); the PyPI distribution is baldur-framework.

pip install baldur-framework                 # framework-agnostic core
pip install baldur-framework[django]         # Django integration
pip install baldur-framework[fastapi]        # FastAPI integration
pip install baldur-framework[flask]          # Flask integration
pip install baldur-framework[celery]         # Celery task protection
pip install baldur-framework[redis]          # Redis-backed shared state
pip install baldur-framework[prometheus]     # Prometheus metrics

Quick example

import baldur


@baldur.protected("charge-customer")
def charge(order_id: str) -> dict:
    # Wrapped in a circuit breaker by default. With zero configuration this
    # runs on an in-memory fallback — no Redis, no env vars, no Docker.
    return payment_gateway.charge(order_id)

When the payment gateway starts failing, the breaker opens and your service answers fast instead of stacking up timeouts. Need more than the default? Compose the pipeline declaratively:

@baldur.protected(
    "charge-customer",
    retry=True,                              # retry with exponential backoff
    timeout=5.0,                             # per-call time budget
    fallback=lambda: {"status": "queued"},   # graceful answer while OPEN
    idempotency_key="order_id",              # dedupe concurrent duplicates
)
def charge(order_id: str) -> dict:
    return payment_gateway.charge(order_id)

Sync and async callables are both supported — the decorator auto-detects coroutine functions.

What's in the box (OSS, Apache-2.0)

Capability What it gives you
Circuit breaker Stops cascading failure; bounded half-open probes on recovery
Retry with backoff Exponential backoff with jitter and bounded attempts
Fallback & composition One ordered pipeline for all resilience patterns
Idempotency Concurrent duplicate calls execute the side effect exactly once
Bulkhead isolation Each dependency gets a fixed slice of concurrency, so one slow dependency can't drain every worker
Dead-letter queue + replay A call that fails for good is captured with its context and replayed once the dependency recovers
Health checks Liveness/readiness that reflect real dependency state
Graceful shutdown Drain in-flight work cleanly on restart and deploy
Metrics Prometheus and OpenTelemetry, emitted by default
System control Instant kill switch and dry-run mode for Baldur's automation — no redeploy
Web console Built-in operations console: live breaker state, controls, recovery
Precomputed cache Health/status endpoints answer from a warm cache, so constant probing stays cheap

The read path heals the same way. Here a Django app under live HTTP traffic (recorded from a demo harness driving it) loses its network path to Redis for 21 seconds — every request keeps returning 200 off the in-memory cache tier, and the Redis tier resyncs itself on recovery:

Terminal demo: a Django app keeps serving 200s through a 21-second Redis outage

Baldur PRO

PRO adds the durable, fleet-level machinery on top of the same API — nothing in the core gets relicensed or replaced. Highlights: DLQ at scale (batch replay from the console, success-rate-driven pacing, a disk-durable outbox, and archive/purge retention), hash-chained audit trail, unified notifications, emergency mode, bulkhead thread-pool isolation, adaptive throttling, canary recovery, governance gates, and a meta-watchdog that watches Baldur itself.

See the full OSS vs PRO capability matrix and pricing.

Documentation

Full documentation lives at https://baldur.sh.

Using Baldur with AI assistants

Building with an AI coding assistant (Claude Code, Cursor, Copilot, Codex)? Run baldur init-ai in your repo to drop an AGENTS.md (read by Cursor, Copilot, and Codex) plus a CLAUDE.md that imports it for Claude Code — together they teach the assistant to reach for @baldur.protected("name") instead of hand-rolling a circuit breaker. See Using Baldur with AI assistants.

Compatibility

Component Minimum Tested in CI
Python 3.11 3.11 · 3.12 · 3.13
Django 4.2 4.2 LTS · 5.2 LTS · 6.0
FastAPI 0.100 latest ≥ floor (smoke)
Flask 2.3 latest ≥ floor (smoke)
Celery 5.3 5.4
Redis server 7.x

See Compatibility for the full matrix, the Python × Django test grid, and the version support policy.

Early access

Baldur is early, and it is looking for a small number of teams already running a Python service in production to work with directly. If that is you, the details and how to reach me are in Discussions.

License

Baldur is released under the Apache License 2.0 — see LICENSE and NOTICE.

Contributing

Contributions are welcome under the Apache License 2.0. Pull requests are accepted through a sign-off-based DCO flow — see CONTRIBUTING.md for the full model.

  • Ideas, or showing what you builtDiscussions.
  • Bugs / feature requests / docs → open an issue or a pull request.
  • Security → see SECURITY.md (no public issues for vulnerabilities).
  • Usage questions / commercialsupport@baldur.sh.

Download files

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

Source Distribution

baldur_framework-1.7.0.tar.gz (2.5 MB view details)

Uploaded Source

Built Distribution

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

baldur_framework-1.7.0-py3-none-any.whl (3.2 MB view details)

Uploaded Python 3

File details

Details for the file baldur_framework-1.7.0.tar.gz.

File metadata

  • Download URL: baldur_framework-1.7.0.tar.gz
  • Upload date:
  • Size: 2.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for baldur_framework-1.7.0.tar.gz
Algorithm Hash digest
SHA256 35ebb784a68faeff86adbbf566723bcbd1d37eb4e05d11a19c14a5c9d9d2c130
MD5 1dff78b0357fff9c0f33810a16cb160a
BLAKE2b-256 ec45b091bc51b3fd1a0ba8ffc4b1305b27e3d61336597f71692094cdd6d81359

See more details on using hashes here.

Provenance

The following attestation bundles were made for baldur_framework-1.7.0.tar.gz:

Publisher: build-oss.yml on baldurhq/baldur

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

File details

Details for the file baldur_framework-1.7.0-py3-none-any.whl.

File metadata

File hashes

Hashes for baldur_framework-1.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1a3e12fbbb1264d385839528d4f3817065ca76488e2dba15c0624f1f634f3ae2
MD5 b7c55ccd5451ca43b97a0f14f20aa2cd
BLAKE2b-256 2cf04489ae34d176bdda814e11a50409d37c5257d16f33ad17895824750c1bf5

See more details on using hashes here.

Provenance

The following attestation bundles were made for baldur_framework-1.7.0-py3-none-any.whl:

Publisher: build-oss.yml on baldurhq/baldur

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

Release history Release notifications | RSS feed

1.9.0

2 files

1.8.0

2 files

This release

1.7.0 This release

2 files

1.6.0

2 files

1.5.0

2 files

1.4.0

2 files

1.3.2

2 files

1.3.1

2 files

1.3.0

2 files

1.2.0

2 files

1.1.0

2 files

1.0.0

2 files

0.0.0

2 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