Skip to main content

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

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

asanable-1.0.0.tar.gz (4.6 MB view details)

Uploaded Source

Built Distribution

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

asanable-1.0.0-py3-none-any.whl (24.0 kB view details)

Uploaded Python 3

File details

Details for the file asanable-1.0.0.tar.gz.

File metadata

  • Download URL: asanable-1.0.0.tar.gz
  • Upload date:
  • Size: 4.6 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for asanable-1.0.0.tar.gz
Algorithm Hash digest
SHA256 9779b24001ecfde332baa77ec6a350c182d71ed491e309d014f71bc7f3b60c21
MD5 7ef633f42b193be1c0e121851ca6dec2
BLAKE2b-256 c9bea2bbb9647168d56b6497c9dd20d87fbfc1cd67dc1bc7765a79fb895b54b2

See more details on using hashes here.

File details

Details for the file asanable-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: asanable-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 24.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for asanable-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5db3ff1b5053d7c0d62d1a687c148c91a82543748689767effaf10bf54504fcf
MD5 84ec165d2f5598004eff56f24416423e
BLAKE2b-256 ce7f181168607b72fb726f5e0e8a2aaf438fb980bb885f49f72f77b425bf0dcf

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page