⏸️ Status: paused (April 2026). The core pipeline (Granola → Claude → SQLite → Slack/Web UI) is working end-to-end and has been in daily personal use. Development is on hold while I cut scope — the project grew into too many half-used surfaces (menubar app, monitor daemon, multi-view calendar), and the next commit will be a trim, not a feature. Re-opening once the "one-page today view + morning DM" core is the only thing left.
A personal productivity system that extracts action items from Granola meetings and Slack, pipes them through Claude for classification, and presents them in a unified todo view with flexible timelines.
Why it's public: build-in-public signal + a working reference implementation of an agentic ingest → LLM extract → persist → notify loop with Claude API.
- Granola Integration: Automatically extracts action items from meeting notes
- Slack Integration: Captures @mentions and unread threads as potential todos
- AI Extraction: Uses Claude API to intelligently identify actionable tasks
- Flexible Timelines: Assign todos to today, this week, this month, or backlog
- Morning Briefing: Daily Slack DM with your priorities
- Local Web UI: Simple, fast interface at http://localhost:5000
# 1. Create virtual environment and install dependencies
cd ~/Projects/digiman
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 2. Configure environment
cp .env.example .env
# Edit .env with your API keys
# 3. Initialize database
python scripts/setup_db.py
# 4. Start the web UI
python run.py
# Open http://localhost:5000Create a .env file with:
# Claude API (for action extraction)
ANTHROPIC_API_KEY=sk-ant-...
# Slack (for ingestion + push)
SLACK_BOT_TOKEN=xoxb-...
SLACK_USER_ID=U...
# Paths (optional - defaults shown)
GRANOLA_CACHE_PATH=~/Library/Application Support/Granola/cache-v3.json
DATABASE_PATH=./data/todos.dbCreate a Slack app with these scopes:
channels:history- Read channel messageschannels:read- List channelschat:write- Send DM to selfusers:read- Get user infoim:write- Open DM channelsearch:read- Search messages
- Today View (
/): See overdue, today's, and this week's todos - Calendar View (
/calendar): Browse by date, week, month, or backlog - Add Todos: Manually add todos from the Today view
- Reassign: Click the "..." button to move todos between timelines
# Run the sync manually
python scripts/nightly_sync.py
# Send morning briefing manually
python scripts/morning_push.py# Install launchd jobs
chmod +x scripts/install_cron.sh
./scripts/install_cron.shThis schedules:
- Nightly sync: 11:00 PM daily
- Morning push: 8:00 AM daily
┌─────────────────────────────────────────┐
│ NIGHTLY CRON (11 PM) │
├─────────────────────────────────────────┤
│ Granola Ingester ──┐ │
│ ├─→ AI Extractor │
│ Slack Ingester ────┘ │ │
│ ▼ │
│ SQLite Database │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ MORNING CRON (8 AM) │
├─────────────────────────────────────────┤
│ Slack DM Sender │
│ (Daily Briefing) │
└─────────────────────────────────────────┘
┌─────────────────────────────────────────┐
│ LOCAL WEB UI (:5000) │
├─────────────────────────────────────────┤
│ Flask + Jinja + HTMX + Tailwind │
│ - Today view │
│ - Calendar view │
│ - Interactive todo management │
└─────────────────────────────────────────┘
digiman/
├── digiman/
│ ├── app.py # Flask application
│ ├── config.py # Configuration
│ ├── models/ # Database models
│ ├── ingesters/ # Data sources
│ ├── extractors/ # AI extraction
│ ├── notifiers/ # Slack push
│ └── templates/ # HTML templates
├── scripts/
│ ├── setup_db.py # Database init
│ ├── nightly_sync.py # Cron: 11 PM
│ ├── morning_push.py # Cron: 8 AM
│ └── install_cron.sh # Setup launchd
├── data/
│ └── todos.db # SQLite database
└── tests/
Personal use only.