Skip to main content

asanable

Prioritized daily digest for your Asana tasks — overdue, today, this week — straight in your terminal.

asanable screenshot

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)

Source distribution for asanable 1.0.0
File Size Uploaded Provenance
asanable-1.0.0.tar.gz 4.6 MB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for asanable 1.0.0
File Interpreter ABI Platform
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.

Release history Release notifications | RSS feed

This release

1.0.0 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page