Skip to main content

stapel-docs

CI coverage pypi downloads python license llms.txt

Google-Drive-style workspace documents: a folder tree, one-entity-per-type documents over an open type registry, content-addressed snapshot storage with an update journal and revision history, optimistic-lock editing (v1), trash with irreversible purge, a swappable object-storage seam, comm ingest (docs.create_document) and registry-driven export (PDF built in).

Part of the Stapel framework — composable Django apps that deploy as a monolith or as microservices without changing module code.

Install

pip install stapel-docs

At a glance

Fact Value
Version 0.2.4
Python >=3.11 (3.11, 3.12, 3.13)
HTTP operations 27
Config axes 1
Usage surface 54
Extension points 7
Error codes 74
Fleet dependencies stapel-auth (optional) · stapel-core · stapel-workspaces (optional)

Documentation

OpenAPI · capabilities.json · llms.txt (for agents)

What this is

Google-Drive-style workspace documents: a folder tree, documents that are each ONE entity with a type from an open registry (txt / md / csv / opaque file built in), a journal + revision versioning substrate, trash with irreversible purge, and registry-driven export (PDF built in).

The versioning substrate is decided for both collaboration disciplines: snapshot types save whole states under optimistic lock (If-Match carries the client's head_seq — v1's editing model), crdt types accumulate an append-only update journal between snapshots with chat-pattern replay/resync. Which discipline applies is a property of the type, not the request.

Object storage is content-addressed and goes through a swappable seam (STORAGE); the library is body-blind — the storage substrate never parses a document body, only a type's own text_extractor may.

Quick start

The base install rides Django's default_storage; add extras for the boto3 S3/MinIO backend and the PDF exporter:

pip install "stapel-docs[s3,pdf]"
INSTALLED_APPS = [
    # ...
    "stapel_docs",
]

# urls.py
path("docs/", include("stapel_docs.urls"))   # -> /docs/api/v1/...

Authorization asks the workspaces.check_capability comm Function (fail-closed, deny-by-default) — install stapel-workspaces or provide that Function for any HTTP request to be allowed.

An open type registry, not an enum

STAPEL_DOCS = {
    # Add or replace document types ({slug: dotted-path | None removes}):
    "DOC_TYPES": {"sheet": "myproject.docs.SHEET_SPEC"},
    # Add export formats over the built-in pdf:
    "EXPORTERS": {"docx": "myproject.docs.DocxExporter"},
    # Event-driven ingest without writing a subscriber:
    "INGEST": {"meeting.summarized": "myproject.docs.map_summary"},
    # Swap the object store:
    "STORAGE": "stapel_docs.storage.S3Backend",
}

A type whose spec vanishes from the registry degrades to file behavior — read-only, never unreadable: revisions still list, snapshots still download, trash/purge/export still work.

Ingest

Product glue dumps content in with one comm call — no HTTP, no import:

call("docs.create_document", {
    "workspace_id": ws_id, "type": "md", "title": "Weekly sync",
    "body": summary_text, "folder_path": "/Meetings/2026-08",
})

folder_path materializes folders idempotently; an unknown type refuses loudly so content never silently lands under a mistyped slug.

Sharing (v1: closed by default)

The sharing axis (SHARING: whitelist / link modes) ships its config surface with closed defaults — v1 implements exactly the immutable workspace baseline, and opening any sharing knob before the mechanism exists is a loud system-check error (stapel_docs.E010-E013), never a silent no-op.

Settings

All configuration lives in the STAPEL_DOCS namespace (dict setting, flat setting, or env var — resolved lazily). Full table in CONFIG.MD; seam semantics in MODULE.md. Highlights: STORAGE, DOC_TYPES, EXPORTERS, INGEST, REPLAY_WINDOW, AUTO_REVISION_INTERVAL_SECONDS, TRASH_RETENTION_DAYS, SHARING.

comm surface

Kind Name Contract
Function (provides) docs.create_document schemas/functions/docs.create_document.json
Action (emit) document.created, document.updated, document.deleted, document.storage_changed schemas/emits/*.json
Action (consume) user.deleted GDPR anonymize (authorship nulled, content survives)
Function (call) workspaces.check_capability provided by stapel-workspaces

Operations

python manage.py docs_purge_expired   # purge trash older than TRASH_RETENTION_DAYS

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

stapel_docs-0.2.4.tar.gz (858.3 kB view details)

Uploaded Source

Built Distribution

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

stapel_docs-0.2.4-py3-none-any.whl (835.9 kB view details)

Uploaded Python 3

File details

Details for the file stapel_docs-0.2.4.tar.gz.

File metadata

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

File hashes

Hashes for stapel_docs-0.2.4.tar.gz
Algorithm Hash digest
SHA256 0bb56f0cd26fe7b3575216f9df69acf28fc8951231462f98dcd4f0977ea46c41
MD5 34caff27a54d6dc828ab3c95db7704d0
BLAKE2b-256 6648c48275c6f9cf339116f34161d4eb4dcabd7756d03c37bf0afe39763eaafe

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_docs-0.2.4.tar.gz:

Publisher: publish.yml on usestapel/stapel-docs

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

File details

Details for the file stapel_docs-0.2.4-py3-none-any.whl.

File metadata

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

File hashes

Hashes for stapel_docs-0.2.4-py3-none-any.whl
Algorithm Hash digest
SHA256 46ddb3f043b7569b8b8f14ad00d3471ee625fa84aef2538ff7ec0b6884efce97
MD5 e48e5f3c9720b19b9cf20f6cfb823f75
BLAKE2b-256 903ad6b37998bf6f7a6a3d047a2d6135fac303fece529171aeb9071976ef9512

See more details on using hashes here.

Provenance

The following attestation bundles were made for stapel_docs-0.2.4-py3-none-any.whl:

Publisher: publish.yml on usestapel/stapel-docs

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

0.2.4 This release

2 files

0.2.3

2 files

0.2.2

2 files

0.2.1

2 files

0.2.0

2 files

0.1.1

2 files

0.1.0

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