Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Courier

Tests Coverage Mypy Ruff Install CSpell

Courier is a plugin-based, event-driven orchestration framework for building data processing pipelines. It watches for incoming data, groups it into jobs, and dispatches those jobs to processing workflows. It scales from a single laptop to a distributed cluster without changing your pipeline code.

While general-purpose, Courier ships with extra tooling for geolocation data — satellite instrument configs, metadata extraction, and integration with GeoIPS.

Design Philosophy

Plugin-based. Data monitors, job builders, and dispatchers are all plugins that conform to a simple protocol. Swap a filesystem watcher for a RabbitMQ consumer, or a serial dispatcher for a SLURM submitter, without touching the rest of your pipeline.

Event-driven. Plugins communicate through message queues and do not share state1. When a monitor detects a file, it emits an event. A job builder consumes that event, groups files, and emits a job. A dispatcher picks up the job and runs it. Each stage is decoupled and independently scalable and duplicatable.

Distributable. The broker backend (AMQP, Redis, in-memory or many others) determines your deployment topology. Run everything in one process for development, or spread plugins across machines or even networks for production.

Observable by default. Every plugin exposes health checks and Prometheus metrics. Structured logs carry correlation IDs from file arrival to final product. Optional Loki and Grafana integration for centralized monitoring.

How It Works

Courier runs a central Service that coordinates three stages of plugins through a message broker:

[Data Monitor] → detects new files, emits events
       ↓ (broker queue)
[Job Builder]  → groups files into complete jobs
       ↓ (broker queue)
[Dispatcher]   → executes the processing workflow

Each plugin runs in its own thread with independent health monitoring and automatic restart on failure. Configuration is validated at startup with Pydantic — not halfway through a run.

Quick Start

pip install courier

Running the service

Point Courier at a YAML config and start it:

courier run --config my_config.yaml

Validate your config before running:

courier validate --config my_config.yaml

Writing a data monitor

Subclass DataMonitorBasePlugin and implement find_file as a generator that yields File objects. The base class handles threading, metadata enrichment, and queue emission for you.

from collections.abc import Generator
from pathlib import Path

from courier.interfaces.module_based.data_monitors import DataMonitorBasePlugin
from courier.service import Service
from courier.types.file import File

interface = "data_monitors"
family = "standard"
name = "my_monitor"


class MyMonitor(DataMonitorBasePlugin):
    name = "my-monitor"
    version = "1.0.0"

    def __init__(self, service: Service, config: dict) -> None:
        super().__init__(service, config)
        self.watch_dir = Path(config["path"])

    def find_file(self) -> Generator[File, None, None]:
        # Yield File objects as they appear — the base class
        # handles metadata, emission, and metrics automatically.
        for path in self.watch_dir.iterdir():
            if path.is_file():
                yield File(file=path, hostname="localhost")

Satellite Data Support

Courier ships with YAML configs for common satellite instruments including GOES-16/18/19 ABI, Himawari-9 AHI, GK-2A AMI, and Meteosat SEVIRI. These configs define file-matching patterns, expected file counts per scan, and metadata extraction rules — so Courier knows when a complete observation has arrived and how to label it.

Development

pip install -e .[doc,lint,test]
pre-commit install
pre-commit run --all-files

Python 3.11–3.14. Strict mypy.

License

See LICENSE for details.

  1. Except for rare edge cases for high availability deployments on clusters.

Download files

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

Source Distribution

runcourier-1.0.0a12.tar.gz (179.6 kB view details)

Uploaded Source

Built Distribution

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

runcourier-1.0.0a12-py3-none-any.whl (237.5 kB view details)

Uploaded Python 3

File details

Details for the file runcourier-1.0.0a12.tar.gz.

File metadata

  • Download URL: runcourier-1.0.0a12.tar.gz
  • Upload date:
  • Size: 179.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for runcourier-1.0.0a12.tar.gz
Algorithm Hash digest
SHA256 5c0d168d12a38b52592a20313e209b0cc7ebd634001d9aa55cc5adaf4df4ae0e
MD5 dd5453194382c68442808ae798e55882
BLAKE2b-256 6d3e575439127e443d7d2aff2405449c467336ece7a82d122a579731afc6dfd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for runcourier-1.0.0a12.tar.gz:

Publisher: package-and-publish.yaml on CIRA-GEOIPS/courier

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

File details

Details for the file runcourier-1.0.0a12-py3-none-any.whl.

File metadata

  • Download URL: runcourier-1.0.0a12-py3-none-any.whl
  • Upload date:
  • Size: 237.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for runcourier-1.0.0a12-py3-none-any.whl
Algorithm Hash digest
SHA256 1bdf58a5671ebd32ce19a657a9b9425794a05b5075dcbb11c3bd8dd1daae8b7c
MD5 126c5b4ffa65b9deabb44c7df1e9584a
BLAKE2b-256 e0bdb01ef075b22afb12c10275ecf99a66391625533ebe559448942a8d42ee01

See more details on using hashes here.

Provenance

The following attestation bundles were made for runcourier-1.0.0a12-py3-none-any.whl:

Publisher: package-and-publish.yaml on CIRA-GEOIPS/courier

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

Release history Release notifications | RSS feed

This release

1.0.0a12 This release

2 files

0.7.0

2 files

0.6.0

2 files

0.4.0

2 files

0.3.0

2 files

0.2.0

2 files

0.1.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