stapel-tasks
Generic tasks and kanban boards: Board/Column/Task/ChecklistItem/TaskComment, a REST surface, a full outbox event surface, and custom fields via stapel-attributes. Usable standalone (a team runs a board by hand) or as the substrate an external orchestrator projects onto through opaque origin_* handles, a MOVE_POLICY authorization seam, and comm Functions (tasks.get/list_board/create/move/comment).
Part of the Stapel framework — composable Django apps that deploy as a monolith or as microservices without changing module code.
Install
pip install stapel-tasks
At a glance
| Fact | Value |
|---|---|
| Version | 0.3.2 |
| Python | >=3.11 (3.11, 3.12, 3.13, 3.14) |
| Django | djangorestframework>=3.14 |
| HTTP operations | 22 |
| Config axes | 3 |
| Usage surface | 28 |
| Extension points | 5 |
| Error codes | 57 |
| Documented flows | 3 |
| Fleet dependencies | stapel-attributes (optional) · stapel-core |
Documentation
OpenAPI · capabilities.json · llms.txt (for agents)
What this is
A generic task domain — Board / Column / Task / ChecklistItem /
TaskComment, a REST surface, a full outbox event surface, and custom fields
via stapel-attributes. It is useful to any project by itself (a team runs a
board by hand), and it is the substrate an orchestrator projects onto: an
external state machine drives cards through opaque origin_* handles and the
MOVE_POLICY seam — the module knows nothing about the machine.
Quick start
pip install stapel-tasks # core
pip install "stapel-tasks[attributes]" # + typed custom-field validation
INSTALLED_APPS = [
# ...
"stapel_tasks",
]
# urls.py
path("tasks/", include("stapel_tasks.urls"))
Requires a stapel-core whose background
taskstoreapp uses the labelstapel_taskstore— this module owns the Django labelstapel_tasks. See MODULE.md.
Concepts
- Board — an ordered set of columns and the cards on them. Owns the
custom-field schema (
feature_defs) and optional workflowsettings. - Column — a status. Its
keyis the card's status; itscategory(backlog/active/review/waiting/done) is the fixed machine semantic. - Task (card) — status = its column; order within the column is a
fractional
position(drag-and-drop moves write one row). Custom-field values live infeatures; a projecting system writesorigin_meta. - Move — drag-and-drop is a
movevalidated byMOVE_POLICY:allow/deny(reason_key)/defer(the managed-card path).
Two reads of the same cards, deliberately: GET boards/{id}/tasks is a keyset
feed (-created_at), GET boards/{id}/cards is the board shape —
columns in order, cards grouped by column key and sorted by position. A
kanban view wants the second. GET boards/presets serves the vocabularies a
board-creation form needs (presets, categories, checklist states, priority
scale) instead of making the client hard-code them.
from stapel_tasks import services
board = services.create_board(name="Team", preset="simple")
card = services.create_task(board=board, title="Ship it")
services.move_task(card, to_column=board.columns.get(key="done")) # emits task.completed
comm surface
| Kind | Name | Purpose |
|---|---|---|
| Emit | task.created / task.updated / task.moved / task.assigned / task.completed / task.comment_added / task.checklist_item_changed / task.archived |
Card lifecycle facts (via the outbox) |
| Consume | user.deleted |
GDPR anonymization |
| Function | tasks.get / tasks.list_board / tasks.create / tasks.move / tasks.comment |
Machine interface / MCP-tool candidates |
Settings (STAPEL_TASKS)
| Key | Default | What it customizes |
|---|---|---|
SCOPE_PROVIDER |
single global scope, allow-all | Tenancy resolution/filtering + permissions |
MOVE_POLICY |
allow any move (honours transitions) |
Drag-and-drop authorization |
BOARD_PRESETS |
{} (merged over built-in simple) |
Board-shape presets |
STORE_UNKNOWN_FEATURES |
True |
Keep raw custom fields when attributes is absent |
DEFAULT_PAGE_SIZE |
100 |
Card-list page size |
BOARD_CARDS_MAX |
2000 |
Cap on the whole-board read (truncated beyond it) |
PRIORITY_SCALE |
low/normal/high/urgent | Priority steps served to clients |
See MODULE.md for the full seam map (providers, registries, serializer seams, comm tables, anti-patterns, override-vs-upstream).
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_tasks-0.3.2.tar.gz.
File metadata
- Download URL: stapel_tasks-0.3.2.tar.gz
- Upload date:
- Size: 85.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1212d906bbcaa1021bf8feba9ecb9f52f7faa0bf658b051eac3bdb0bc7d2ed25
|
|
| MD5 |
5ebacc68aa04daea74a54d1b4862780c
|
|
| BLAKE2b-256 |
b58938d66a1e120e83aa055c1259071e171ffe2191a5ac7a4ed6e965db8cf045
|
Provenance
The following attestation bundles were made for stapel_tasks-0.3.2.tar.gz:
Publisher:
publish.yml on usestapel/stapel-tasks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stapel_tasks-0.3.2.tar.gz -
Subject digest:
1212d906bbcaa1021bf8feba9ecb9f52f7faa0bf658b051eac3bdb0bc7d2ed25 - Sigstore transparency entry: 2603577649
- Sigstore integration time:
-
Permalink:
usestapel/stapel-tasks@8b69fc5dd7c04412ff32e07bc709e6ef28a4f61c -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/usestapel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8b69fc5dd7c04412ff32e07bc709e6ef28a4f61c -
Trigger Event:
push
-
Statement type:
File details
Details for the file stapel_tasks-0.3.2-py3-none-any.whl.
File metadata
- Download URL: stapel_tasks-0.3.2-py3-none-any.whl
- Upload date:
- Size: 86.5 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 |
4d2f0ba9e33aac7869255ddad3a04854479c03517500cdf1e916ac9d101a2500
|
|
| MD5 |
a5acd0dfec932a5d05eb30542043e0c8
|
|
| BLAKE2b-256 |
e6a786b8ff17cb55194f3dff76c3b554f2e817c528ba2d3f19cb019a32cb91e0
|
Provenance
The following attestation bundles were made for stapel_tasks-0.3.2-py3-none-any.whl:
Publisher:
publish.yml on usestapel/stapel-tasks
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
stapel_tasks-0.3.2-py3-none-any.whl -
Subject digest:
4d2f0ba9e33aac7869255ddad3a04854479c03517500cdf1e916ac9d101a2500 - Sigstore transparency entry: 2603577673
- Sigstore integration time:
-
Permalink:
usestapel/stapel-tasks@8b69fc5dd7c04412ff32e07bc709e6ef28a4f61c -
Branch / Tag:
refs/tags/v0.3.2 - Owner: https://github.com/usestapel
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@8b69fc5dd7c04412ff32e07bc709e6ef28a4f61c -
Trigger Event:
push
-
Statement type: