stapel-recordings
Recording lifecycle: audio/video upload (presigned single-PUT and multipart), storage, a configurable processing pipeline (convert, transcribe, diarize, merge) producing a unified speaker-attributed transcript, optional automatic summaries, and a watchdog that recovers stuck or abandoned recordings.
Part of the Stapel framework — composable Django apps that deploy as a monolith or as microservices without changing module code.
Install
pip install stapel-recordings
At a glance
| Fact | Value |
|---|---|
| Version | 0.15.0 |
| Python | >=3.11 (3.11, 3.12, 3.13, 3.14) |
| HTTP operations | 9 |
| Config axes | 1 |
| Usage surface | 29 |
| Extension points | 7 |
| Error codes | 55 |
| Fleet dependencies | stapel-agent (optional) · stapel-auth (optional) · stapel-core |
Documentation
OpenAPI · capabilities.json · llms.txt (for agents)
What this is
Owns the lifecycle capture/upload → storage → transcribe → summarize:
Recording + Speaker + Segment (the unified transcript), presigned /
multipart upload sessions, and a data-driven, outbox-backed processing
pipeline with retry, DLQ and reconcile.
Speech-to-text and summarization are delegated to
stapel-agent via the
llm.transcribe / llm.summarize comm Functions — this module does not
implement STT or LLM calls. Object storage goes through a swappable seam.
Quick start
The base install uses the Django-storage backend; add the s3 extra for the
boto3 S3/MinIO backend:
pip install "stapel-recordings[s3]"
INSTALLED_APPS = [
# ...
"stapel_core.django.outbox", # transactional outbox (pipeline reliability)
"stapel_recordings",
]
# urls.py
path("recordings/", include("stapel_recordings.urls"))
The transcribe / merge stages call stapel-agent by comm name — install
and configure stapel-agent (or provide llm.transcribe / llm.summarize
providers) for the pipeline to complete. The default convert stage needs
ffmpeg/ffprobe on PATH (or set NORMALIZER to passthrough_normalize).
The pipeline is data you can edit
STAPEL_RECORDINGS = {
# Reorder / subset / insert stages — no fork:
"PIPELINE": ["convert", "transcribe", "redact_pii", "merge"],
# Replace or add stage handlers (merge-over-builtins; None removes):
"STAGES": {"diarize": "myproject.stages.PyannoteDiarizer"},
# Or source the list at runtime (DB / per-workspace / per-recording):
"PIPELINE_RESOLVER": "myproject.pipelines.resolve",
# Swap the object store:
"STORAGE": "stapel_recordings.storage.S3Backend",
}
A generic driver runs the resolved stage list, advancing the status machine and emitting the next stage through the outbox. See MODULE.md for the stage contract and worked examples.
Settings
All configuration lives in the STAPEL_RECORDINGS namespace (dict setting,
flat setting, or env var — resolved lazily). See the full table in
MODULE.md.
Highlights: PIPELINE, STAGES, PIPELINE_RESOLVER, STORAGE,
NORMALIZER, SUMMARIZE_ENABLED, MAX_STAGE_RETRIES.
comm surface
| Kind | Name | Contract |
|---|---|---|
| Action (emit) | recording.uploaded, recording.stage_completed, recording.completed, recording.failed |
pipeline lifecycle (public) |
| Action (consume) | recording.uploaded, recording.stage, user.deleted |
driver + GDPR erase |
| Function (call) | llm.transcribe, llm.summarize |
provided by stapel-agent |
Operations
python manage.py recordings_reconcile --once # re-drive stuck recordings
Development
pip install -e . && pip install pytest pytest-django ruff jsonschema djangorestframework
./setup-hooks.sh
pytest tests/
License
MIT — see LICENSE.
This page is assembled by stapel-readme from docs/readme.md plus the contract artifacts in docs/. Edit the prose in docs/readme.md; the badges, facts and links above and below it are generated — do not hand-edit README.md.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file stapel_recordings-0.15.0.tar.gz.
File metadata
- Download URL: stapel_recordings-0.15.0.tar.gz
- Upload date:
- Size: 204.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
87b254acc6c54a46d8dfc3f8d9a9e4251828dd657d1ef0689aaf788088813078
|
|
| MD5 |
f013e629dc6652ae9b5b1065274e9f4d
|
|
| BLAKE2b-256 |
b8efbd01216e09749a1559d9678bd29818d1efbb8ec6584e8d6256b0739625ec
|
Provenance
The following attestation bundles were made for stapel_recordings-0.15.0.tar.gz:
Publisher:
publish.yml on usestapel/stapel-recordings
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stapel_recordings-0.15.0.tar.gz -
Subject digest:
87b254acc6c54a46d8dfc3f8d9a9e4251828dd657d1ef0689aaf788088813078 - Sigstore transparency entry: 2547065423
- Sigstore integration time:
-
Permalink:
usestapel/stapel-recordings@b167fed9eef7338adf88296f41d2a47a648e57ac -
Branch / Tag:
refs/tags/v0.15.0 - Owner: https://github.com/usestapel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b167fed9eef7338adf88296f41d2a47a648e57ac -
Trigger Event:
push
-
Statement type:
File details
Details for the file stapel_recordings-0.15.0-py3-none-any.whl.
File metadata
- Download URL: stapel_recordings-0.15.0-py3-none-any.whl
- Upload date:
- Size: 163.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8b4df2f368f586fc5c863899c9f24d14fb5bf87e14355dfbb7131d21c625aec2
|
|
| MD5 |
b357eef82d5e9c6b355daee5f6bf79c1
|
|
| BLAKE2b-256 |
d499c6c9ce62d63bebfcfbf6058b1e61f750682bd3179b372b97d67cab1d3846
|
Provenance
The following attestation bundles were made for stapel_recordings-0.15.0-py3-none-any.whl:
Publisher:
publish.yml on usestapel/stapel-recordings
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stapel_recordings-0.15.0-py3-none-any.whl -
Subject digest:
8b4df2f368f586fc5c863899c9f24d14fb5bf87e14355dfbb7131d21c625aec2 - Sigstore transparency entry: 2547066136
- Sigstore integration time:
-
Permalink:
usestapel/stapel-recordings@b167fed9eef7338adf88296f41d2a47a648e57ac -
Branch / Tag:
refs/tags/v0.15.0 - Owner: https://github.com/usestapel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@b167fed9eef7338adf88296f41d2a47a648e57ac -
Trigger Event:
push
-
Statement type: