Daily Digest
The Daily Digest feature provides a consolidated view of your emails, organized by category with AI-generated summaries.
Overview
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β DIGEST GENERATION FLOW β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β β β βββββββββββββββ βββββββββββββββ βββββββββββββββββββ β β β Fetch βββββΆβ Categorize βββββΆβ Group by β β β β Emails β β Each β β Category β β β βββββββββββββββ βββββββββββββββ ββββββββββ¬βββββββββ β β β β β βΌ β β βββββββββββββββ βββββββββββββββββββ β β β Render ββββββ Generate β β β β Digest β β Summaries β β β βββββββββββββββ βββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Digest Structure
Categories Section
Emails grouped by type:
π Need-Action (3) βββ Meeting invite from John βββ Urgent: Project deadline βββ Please review PR #42 π FYI (5) βββ Monthly report published βββ System maintenance notice βββ ... π° Newsletter (4) βββ TechCrunch Daily βββ Morning Brew βββ ...
Newsletter Summaries
Each newsletter gets an AI-generated summary:
π° TechCrunch Daily Summary: Today's top stories include Apple's new AI features, startup funding rounds, and regulatory updates in the EU. Key topics: AI, Startups, Regulation π° Morning Brew Summary: Market updates show tech stocks rising, with focus on Q4 earnings reports and holiday shopping trends. Key topics: Markets, Retail, Tech
Generation Process
1. Fetch Emails
def fetch_emails(max_count: int = 10) -> list[dict]:
"""Fetch recent unread emails from Gmail."""
query = "is:unread newer_than:1d"
results = gmail_service.users().messages().list(
userId='me',
q=query,
maxResults=max_count,
).execute()
messages = results.get('messages', [])
return [get_message_details(msg['id']) for msg in messages]2. Categorize Each Email
def process_emails(emails: list[dict]) -> dict[str, list]:
"""Categorize emails and group by category."""
categorized = {
'Need-Action': [],
'FYI': [],
'Newsletter': [],
'Promotional': [],
'Social': [],
}
for email in emails:
category = categorize_email(email)
categorized[category].append(email)
return categorized3. Generate Summaries
def generate_category_summary(category: str, emails: list[dict]) -> str:
"""Generate AI summary for a category."""
if not emails:
return "No emails in this category."
email_list = "\n".join([
f"- {email['subject']} (from {email['from']})"
for email in emails[:5] # Limit for prompt size
])
prompt = f"""
Summarize these {category} emails in 2-3 sentences:
{email_list}
Focus on key action items or themes.
"""
response = gemini_client.generate_content(prompt)
return response.text4. Newsletter Highlights
def extract_newsletter_highlights(email: dict) -> dict:
"""Extract key points from newsletter."""
prompt = f"""
Extract key highlights from this newsletter:
Subject: {email['subject']}
Content: {email['body'][:1000]}
Return:
- 2-3 sentence summary
- Top 3 topics covered
"""
response = gemini_client.generate_content(prompt)
return parse_highlights(response.text)Web Interface
Digest View
βββββββββββββββββββββββββββββββββββββββββββββββββββ β π§ Email Digest [Refresh] β β Generated: Dec 22, 2024 at 9:30 AM β βββββββββββββββββββββββββββββββββββββββββββββββββββ€ β β β π Need-Action (3) β β βββββββββββββββββββββββββββββββββββββββββββ β β β π Meeting: Q4 Review β β β β From: manager@company.com β β β β Action: Accept/Decline by EOD β β β βββββββββββββββββββββββββββββββββββββββββββ β β β β π FYI (5) β β βββββββββββββββββββββββββββββββββββββββββββ β β β Summary: 5 informational emails about β β β β project updates and system notices. β β β βββββββββββββββββββββββββββββββββββββββββββ β β β β π° Newsletter (4) β β βββββββββββββββββββββββββββββββββββββββββββ β β β ποΈ TechCrunch Daily β β β β AI advances, startup news, EU tech laws β β β β β β β β ποΈ Morning Brew β β β β Market rally continues, retail outlook β β β βββββββββββββββββββββββββββββββββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββββββ
Refresh Functionality
// script.js
async function refreshDigest() {
const button = document.getElementById('refresh-btn');
button.disabled = true;
button.textContent = 'Refreshing...';
try {
const response = await fetch('/api/refresh', { method: 'POST' });
if (response.ok) {
location.reload();
}
} finally {
button.disabled = false;
button.textContent = 'Refresh';
}
}Data Persistence
Digest Storage
def save_digest(digest_data: dict) -> None:
"""Save digest to JSON file."""
path = Path('data/digest/latest.json')
with open(path, 'w') as f:
json.dump({
'generated_at': datetime.now().isoformat(),
'data': digest_data,
}, f, indent=2)Cache Integration
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β CACHE INTEGRATION β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β β β βββββββββββββββ βββββββββββββββββββ β β β New Request βββββββββββΆβ Digest Fresh? β β β βββββββββββββββ ββββββββββ¬βββββββββ β β β β β Yes β No β β ββββββββββ΄βββββββββ β β β β β β βΌ βΌ β β βββββββββββββ βββββββββββββ β β β Return β β Regenerateβ β β β Cached β β β β β βββββββββββββ βββββββ¬ββββββ β β β² β β β β βΌ β β β βββββββββββββ β β βββββββββββ Save β β β β to Cache β β β βββββββββββββ β β β βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Performance
| Metric | Value |
|---|---|
| First run (10 emails) | 13-20 seconds |
| Cached run | 5-8 seconds |
| Page load | < 1 second |
Optimization Tips
Reduce Email Count
Fetch only what you need to process
Enable Caching
Avoid redundant API calls
Batch Processing
Process emails in parallel
Limit Summaries
Only summarize newsletters
Configuration
{
"gmail_settings": {
"max_emails_to_fetch": 10,
"search_query": "is:unread newer_than:1d"
},
"digest_settings": {
"include_promotional": false,
"include_social": false,
"newsletter_summary_length": 100
}
}