Canvas early warning engine — track assignments, compute academic risk.
Project description
DueCheck
DueCheck tells you what changed in Canvas since your last check.
- See new deadlines, missing work, and escalations without re-reading every course page.
- Keep a local assignment ledger and compare today against the last good snapshot.
- Generate a static report you can open in a browser with no hosted service and no runtime dependencies.
Quick Start
After v0.2.0 is published
pip install duecheck
duecheck demo --out-dir ./demo --open
From source / development
git clone https://github.com/cjchanh/duecheck.git
cd duecheck
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
duecheck demo --out-dir ./demo --open
Demo Flow
No Canvas account needed:
duecheck demo --out-dir ./demo --open
duecheck verify --out-dir ./demo --json
duecheck report --html --out-dir ./demo --open
What It Produces
report.html— self-contained local report with a Today board, change feed, and ledger tableledger.json— persistent assignment ledger with typed artifact metadatadelta.json— structured diff between the current run and the previous ledger statechanges.md— markdown changelog generated from the deltarisk.json— rule-based academic risk summaryruns/— immutable per-run snapshots used for history and repair
Example Output
# Assignment Changes
_Pulled: 2026-03-05T12:00:00Z_
## Summary
- new: 1
- became_missing: 1
- escalated: 1
- deadline_moved_later: 1
Canvas Quickstart
Get a Canvas API token from: Canvas > Settings > Approved Integrations > New Access Token.
export CANVAS_TOKEN="your-token-here"
duecheck --canvas-url https://canvas.yourschool.edu --out-dir ./my-classes
First-Time Setup
If you want to run DueCheck more than once without retyping your Canvas URL and output directory, initialize local CLI defaults:
duecheck init
duecheck doctor
duecheck
Config precedence is:
CLI flags > environment variables > config file > hard default
If you choose to save a Canvas token with duecheck init, it is stored as plaintext on disk in your local config file. DueCheck does not claim to encrypt it.
Safe Bug Reports
If you hit a real issue, generate a redacted bundle before opening an issue:
duecheck redact --out-dir ./my-classes --dest ./duecheck-bugreport
duecheck verify --out-dir ./duecheck-bugreport --json
duecheck report --html --out-dir ./duecheck-bugreport
The redacted bundle keeps artifact structure, statuses, dates, counts, and change types, but replaces course names, assignment names, source keys, and derived item identities.
CLI Reference
duecheck --canvas-url URL --out-dir DIR [options]
Core options:
--canvas-token TOKEN Canvas token to use directly for this run
--token-env VAR Env var with Canvas token (default: CANVAS_TOKEN)
--course-filter COURSE Filter to specific courses
--grade-threshold N Risk threshold (default: 80.0)
--repair Rebuild delta from existing ledger
--fail-on TOKEN Exit 2 on HIGH|MEDIUM|escalated|missing
--json Output summary as JSON
Extra commands:
duecheck init [--yes] [--print-path]
duecheck demo --out-dir DIR [--json] [--open]
duecheck doctor [--out-dir DIR] [--check-auth] [--json]
duecheck redact --out-dir DIR --dest DIR [--json]
duecheck verify --out-dir DIR [--json]
duecheck report --html --out-dir DIR [--output PATH] [--json] [--open]
Technical Notes
DueCheck is a stdlib-only Python engine for Canvas assignment tracking. It:
- Pulls courses, assignments, and missing submissions from Canvas.
- Builds a typed ledger of assignment state with
schema_version,engine_version, andsource_adapter. - Computes a structured delta with change types like
new,became_missing,escalated,cleared, and additive deadline movement annotations. - Scores academic risk with deterministic rules instead of heuristics or AI.
- Validates artifacts before writing them, then writes through temp files plus atomic replace.
The CLI UX layer adds:
duecheck initfor local config bootstrap at~/.config/duecheck/config.jsonduecheck doctorfor local diagnostics before you file an issueduecheck redactfor safe, reproducible bug-report bundles- runtime precedence of
CLI > env > config > hard default
Backward compatibility is preserved for older artifacts through migration shims:
- legacy
confidencestill loads - produced artifacts write only
severity_label - import paths from
duecheck.__init__stay stable
Schemas
Machine-readable schemas ship inside the package at duecheck/schemas/:
duecheck/schemas/ledger.schema.jsonduecheck/schemas/delta.schema.jsonduecheck/schemas/risk.schema.json
duecheck verify uses a matching stdlib-only structural validator against the same artifact contract.
Architecture
duecheck/
adapter.py Canvas adapter
cli.py CLI entrypoint
delta.py Delta computation
ledger.py Ledger build and migration
renderers/ Markdown and HTML rendering
risk.py Rule-based risk scoring
schemas/ Packaged JSON Schemas
types.py Shared types and artifact models
validate.py Stdlib artifact validation
Development
pytest -q
ruff check .
python3 -m build
twine check dist/*
Community
License
MIT. See LICENSE.
Project details
Release history Release notifications | RSS feed
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 duecheck-0.2.0.tar.gz.
File metadata
- Download URL: duecheck-0.2.0.tar.gz
- Upload date:
- Size: 46.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb39d5fa18144f6d4b128aa33d9642738977d1ebc82ca0fa3b17cc8b67d4e219
|
|
| MD5 |
e4f0157393ecb84f01e582c1941acdeb
|
|
| BLAKE2b-256 |
e9c3d73319bff4e457f83dae6f7d63a3fb7df264104c746266652a6aa4d7bddb
|
Provenance
The following attestation bundles were made for duecheck-0.2.0.tar.gz:
Publisher:
release.yml on cjchanh/duecheck
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duecheck-0.2.0.tar.gz -
Subject digest:
bb39d5fa18144f6d4b128aa33d9642738977d1ebc82ca0fa3b17cc8b67d4e219 - Sigstore transparency entry: 1049529198
- Sigstore integration time:
-
Permalink:
cjchanh/duecheck@e90bc37853f7f866c06c3c9760c89e3a2ffcca7c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/cjchanh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e90bc37853f7f866c06c3c9760c89e3a2ffcca7c -
Trigger Event:
push
-
Statement type:
File details
Details for the file duecheck-0.2.0-py3-none-any.whl.
File metadata
- Download URL: duecheck-0.2.0-py3-none-any.whl
- Upload date:
- Size: 40.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25aae971117891a420d4638755bf67349d67f0400432bfb7a2d5030b04c384a9
|
|
| MD5 |
bb6ec96e96b2c3031c67917240b259b3
|
|
| BLAKE2b-256 |
96876ecb92c3930c18fca0c79a30a6fd19d4557705f4058570b1e8bdd088192a
|
Provenance
The following attestation bundles were made for duecheck-0.2.0-py3-none-any.whl:
Publisher:
release.yml on cjchanh/duecheck
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
duecheck-0.2.0-py3-none-any.whl -
Subject digest:
25aae971117891a420d4638755bf67349d67f0400432bfb7a2d5030b04c384a9 - Sigstore transparency entry: 1049529237
- Sigstore integration time:
-
Permalink:
cjchanh/duecheck@e90bc37853f7f866c06c3c9760c89e3a2ffcca7c -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/cjchanh
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@e90bc37853f7f866c06c3c9760c89e3a2ffcca7c -
Trigger Event:
push
-
Statement type: