The email suggestions feature integrates directly with Apple Mail via AppleScript to automatically surface actionable tasks from your inbox.
- Background polling: Automatically checks for new unread emails every 60 seconds
- AI filtering: Uses LLM to identify actionable emails and filter out noise (sales, marketing, etc.)
- Suggestions tab: View suggested tasks in the app (press
0to access) - Archive detection: Automatically removes suggestions and tasks when you archive emails in Mail.app
- CLI commands: Sync emails and create tasks from the command line
Press 0 to open the Suggestions tab, then press e to toggle email suggestions on.
Or via CLI:
aipm settings --email-suggestions truemacOS will prompt you to allow aipm to control Mail.app the first time. Grant the permission.
Press 0 to open the Suggestions tab (rightmost tab).
| Key | Action |
|---|---|
e |
Toggle email suggestions on/off |
↑/k |
Navigate up |
↓/j |
Navigate down |
Enter |
Create task from suggestion (moves to Backlog) |
d/x/Backspace/Delete |
Dismiss suggestion |
i |
Switch to input tab |
Esc |
Focus tab bar |
- Background thread polls Apple Mail every 60 seconds for unread emails
- AI analyzes each email to determine if it's actionable
- Marketing/sales emails are automatically filtered out
- Actionable emails appear as suggestions in the tab
- Accept suggestions to create tasks, or dismiss them
- When you archive an email in Mail.app, the suggestion and any created task are automatically removed
Preview unread emails and see which ones are actionable:
aipm suggestions listOutput shows:
- Email ID, sender, subject, date
- ✓ Actionable emails with extracted task details
- ✗ Non-actionable emails that were filtered out
Automatically create tasks from actionable emails:
aipm suggestions syncOptions:
--limit N— Process only the first N emails (default: 10)
Example:
aipm suggestions sync --limit 5The command:
- Fetches recent unread emails from Apple Mail
- Runs AI filtering on each email
- Creates tasks in the first bucket (Backlog) for actionable emails
- Returns JSON with count of created tasks
Created tasks include:
- Title and description extracted from email
- Priority determined by AI
- Email sender and ID in description (for reference)
The AI filter analyzes emails based on:
- Subject line — Looking for action items, requests, deadlines
- Sender — Context about who sent it
- Content — Body of the email
Filtered out automatically:
- Sales and marketing emails
- Newsletters
- Promotional content
- Automated notifications without action items
Identified as actionable:
- Meeting requests requiring preparation
- Project updates needing action
- Questions requiring response
- Deadlines and reminders
- Task assignments
When you archive or mark an email as read in Mail.app:
- The background poller detects the change (within 60 seconds)
- Corresponding suggestions are removed from the Suggestions tab
- Any tasks created from that email are deleted
- Changes are persisted automatically
This keeps your task list synchronized with your inbox state.
Mail.app
↓ (AppleScript / osascript)
Background Thread
↓ (AI Filter)
Suggestions Channel
↓ (EmailEvent::NewSuggestion)
App State → Suggestions Tab (0)
↓ (User accepts)
Tasks
- Check email suggestions are enabled in the Suggestions tab (
0, presse) - Ensure Mail.app has unread emails
- Check that aipm has Automation permission for Mail.app (System Settings → Privacy & Security → Automation)
- Background polling runs every 60 seconds
- Check AI API key is configured for filtering
- Verify network connectivity
- Archive detection runs on the same 60-second polling cycle
- Ensure the email ID was properly tracked when the task was created
- Check that the email was actually archived (not just marked as read)
- Email content is sent to your configured LLM provider for filtering
- No email data is stored permanently by aipm
- Email IDs are stored in a runtime map to track task-email associations
- Map is cleared when the app exits
If privacy is a concern, you can disable email suggestions and use the CLI commands manually instead of background polling.