asanable
Prioritized daily digest for your Asana tasks — overdue, today, this week — straight in your terminal.
Features
- Fetch incomplete Asana tasks assigned to you, sorted by due date
- Score and prioritize: overdue > today > this week > later
- Rich CLI output with colored sections and summary
- Optional: daily scheduler, Slack and Telegram notifications
Setup
git clone https://github.com/navfa/asanable.git && cd asanable
cp .env.example .env
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
Edit .env with your Asana personal access token and workspace GID.
Usage
# First time setup (interactive wizard)
asanable --init
# Run the full digest
asanable
# Summary only (quiet mode)
asanable --quiet
# Filter by project (case-insensitive substring match)
asanable --project "Mobile App"
asanable -p admin
# Use cached data (no API call, instant)
asanable --cache
# Force refresh from API
asanable --refresh
# Show only overdue tasks
asanable --overdue
# Show only tasks due today
asanable --today
# Export as HTML
asanable --output html > digest.html
# Combine flags
asanable -p mobile -q
asanable --cache --overdue
asanable --cache -o html > mobile.html
# Run as a daily scheduler
asanable --schedule
# Show version
asanable --version
Development
All common commands are available via make:
make install # Install project with dev dependencies
make lint # Run linter (with auto-fix)
make format # Format code
make check # Lint + format check (CI mode, no fix)
make test # Run all tests
make cov # Run tests with coverage report (80% threshold)
make run # Run the digest
make quiet # Run digest in quiet mode
make project P="Mobile App" # Filter by project
make html # Export digest as HTML to stdout
make init # Run interactive setup wizard
make schedule # Start the daily scheduler
make clean # Remove build artifacts and caches
Or run commands directly:
# Run a specific test file
pytest tests/unit/test_priority_service.py -v
# Run a single test
pytest tests/unit/test_priority_service.py::TestScoring::test_overdue_gets_highest_score -v
Architecture
CLI (main.py) → Services (business logic) → Clients (external APIs)
↑
Domain (pure entities)
↓
Renderers (CLI, HTML, Slack, Telegram)
| Layer | Responsibility |
|---|---|
domain/ |
Pure dataclasses: AsanaTask, DigestItem, Digest |
clients/ |
API wrappers returning domain entities (Asana SDK) |
services/ |
Business logic: scoring, digest building |
renderers/ |
Output formatting: rich CLI, HTML, Slack blocks, Telegram markdown |
scheduler/ |
Daily cron via schedule lib |
Configuration
All settings via environment variables (.env file). See .env.example for the full list.
| Variable | Required | Default | Description |
|---|---|---|---|
ASANA_ACCESS_TOKEN |
yes | — | Asana personal access token |
ASANA_WORKSPACE_GID |
yes | — | Asana workspace GID |
DIGEST_SCHEDULE_TIME |
no | 08:00 |
Daily digest time (for --schedule mode) |
SLACK_WEBHOOK_URL |
no | — | Slack incoming webhook URL |
TELEGRAM_BOT_TOKEN |
no | — | Telegram bot token |
TELEGRAM_CHAT_ID |
no | — | Telegram chat ID |
License
MIT
Metadata
Release files for asanable 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| asanable-1.0.0.tar.gz | 4.6 MB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| asanable-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 4.6 MB
Release files / asanable-1.0.0.tar.gz
| Download URL | asanable-1.0.0.tar.gz |
|---|---|
| Size | 4.6 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9779b24001ecfde332baa77ec6a350c182d71ed491e309d014f71bc7f3b60c21
|
|
BLAKE2b-256 checksum How to use checksums |
c9bea2bbb9647168d56b6497c9dd20d87fbfc1cd67dc1bc7765a79fb895b54b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / asanable-1.0.0-py3-none-any.whl
| Download URL | asanable-1.0.0-py3-none-any.whl |
|---|---|
| Size | 24.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5db3ff1b5053d7c0d62d1a687c148c91a82543748689767effaf10bf54504fcf
|
|
BLAKE2b-256 checksum How to use checksums |
ce7f181168607b72fb726f5e0e8a2aaf438fb980bb885f49f72f77b425bf0dcf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Security for asanable 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.