OmniFocus Task & Project Manager
Overview
Manage OmniFocus tasks and projects programmatically with intelligent automation that works across all OmniFocus versions. The skill automatically detects and uses the best available method:
- •Omni Automation (OmniFocus 3+) - Modern JavaScript API
- •AppleScript (All versions) - Compatible fallback
- •SQLite Read-Only (Last resort) - For analytics when automation unavailable
When to Use This Skill
Use this skill when users request to:
- •Create tasks: "Add task 'Review PR' to project 'Development'"
- •Read tasks: "Show me tasks in the 'Work' project"
- •Update tasks: "Mark task 'Call client' as complete"
- •List projects: "What projects do I have in OmniFocus?"
- •Query tasks: "Show me all tasks tagged with '@urgent'"
- •Manage workflows: "Create project tasks for new feature development"
Core Capabilities
1. Create Tasks
Add new tasks to OmniFocus with full metadata support.
Usage:
scripts/omnifocus_manager.rb --create \ --name "Review pull request #42" \ --project "Development" \ --notes "Check for security issues and code quality"
Claude Integration:
# When user says: "Add task to OmniFocus to review the API documentation" ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \ --create \ --name "Review API documentation" \ --project "Documentation"
Supported Parameters:
- •
--name(required): Task title - •
--project(optional): Project name (creates if doesn't exist) - •
--notes(optional): Task notes/description - •
--tag(optional): Tag to assign (repeatable for multiple tags) - •
--due(optional): Due date (ISO 8601 format)
2. Read Tasks
Query tasks with powerful filtering options.
Usage:
# All incomplete tasks scripts/omnifocus_manager.rb --read # Tasks in specific project scripts/omnifocus_manager.rb --read --project "Development" # Tasks with specific tag scripts/omnifocus_manager.rb --read --tag "@urgent" # Include completed tasks scripts/omnifocus_manager.rb --read --completed # Limit results scripts/omnifocus_manager.rb --read --limit 50
Claude Integration:
# When user says: "What tasks do I have in my Work project?" ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \ --read \ --project "Work"
Output Format (JSON):
[
{
"id": "abc123xyz",
"name": "Review pull request #42",
"completed": false,
"note": "Check for security issues",
"project": "Development",
"dueDate": "2025-11-25T17:00:00Z",
"tags": ["@code-review", "@high-priority"]
}
]
3. Update Tasks
Modify existing tasks programmatically.
Usage:
# Mark task complete scripts/omnifocus_manager.rb --update TASK_ID --completed # Update task name scripts/omnifocus_manager.rb --update TASK_ID --name "New task title" # Update notes scripts/omnifocus_manager.rb --update TASK_ID --notes "Updated description"
Claude Integration:
# When user says: "Mark the task 'Call client' as done" # First, find the task ID TASK_ID=$(ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \ --read | jq -r '.[] | select(.name == "Call client") | .id') # Then mark it complete ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \ --update "$TASK_ID" \ --completed
4. List Projects
View all OmniFocus projects.
Usage:
scripts/omnifocus_manager.rb --list-projects
Output Format (JSON):
[
{
"id": "proj123",
"name": "Development",
"status": "active",
"note": "Software development tasks",
"taskCount": 15
},
{
"id": "proj456",
"name": "Marketing",
"status": "active",
"note": "",
"taskCount": 8
}
]
Automation Method Detection
The skill automatically detects and uses the best available automation method:
Priority Order
- •
Omni Automation (Preferred)
- •Modern JavaScript API
- •OmniFocus 3+ required
- •Cross-platform (Mac, iOS, iPad)
- •Full read/write capabilities
- •Fastest performance
- •
AppleScript (Compatible)
- •Works with all OmniFocus versions
- •macOS only
- •Full read/write capabilities
- •Requires OmniFocus Pro for automation
- •
SQLite Read-Only (Fallback)
- •Last resort when automation unavailable
- •Read operations only
- •No permissions required
- •Useful for analytics and reporting
Detection is automatic - no configuration needed. The manager checks availability in order and uses the first working method.
Permission Requirements
Omni Automation
- •Minimal: Enable Automation in OmniFocus Preferences → Automation
- •No system-level permissions required
AppleScript
- •System Permission: System Preferences → Security & Privacy → Privacy → Automation
- •User prompted on first use
- •Must grant permission for controlling application to control OmniFocus
SQLite Read-Only
- •File System Access: Read access to
~/Library/Caches/ - •No automation permissions needed
- •Read-only operations only
Setup Guidance
When encountering permission errors, guide users to:
- •Open System Preferences (or System Settings on macOS 13+)
- •Navigate to Security & Privacy → Privacy → Automation
- •Find the controlling application (e.g., Terminal, Ruby, Claude Code)
- •Enable checkbox for OmniFocus
- •Restart the application if needed
Common Workflows
Workflow 1: Create Project with Tasks
# Create project by adding first task ruby scripts/omnifocus_manager.rb --create \ --name "Set up database schema" \ --project "New Feature Development" # Add more tasks to the project ruby scripts/omnifocus_manager.rb --create \ --name "Implement API endpoints" \ --project "New Feature Development" ruby scripts/omnifocus_manager.rb --create \ --name "Write unit tests" \ --project "New Feature Development"
Workflow 2: Daily Task Review
# Get all incomplete tasks
ruby scripts/omnifocus_manager.rb --read > /tmp/tasks.json
# Process with jq for specific queries
cat /tmp/tasks.json | jq '.[] | select(.dueDate != null) | {name, dueDate}'
Workflow 3: Bulk Task Completion
# Find all tasks matching criteria ruby scripts/omnifocus_manager.rb --read --project "Sprint 23" > /tmp/sprint_tasks.json # Mark each as complete cat /tmp/sprint_tasks.json | jq -r '.[].id' | while read task_id; do ruby scripts/omnifocus_manager.rb --update "$task_id" --completed done
Workflow 4: Task Analytics
# Count tasks by project (using read-only SQLite)
ruby scripts/omnifocus_manager.rb --read | \
jq 'group_by(.project) | map({project: .[0].project, count: length})'
Claude Usage Patterns
Pattern 1: Natural Language Task Creation
User Request: "Add a task to call the client about Q4 planning to my Work project"
Claude Response:
ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \ --create \ --name "Call client about Q4 planning" \ --project "Work"
Pattern 2: Task Query with Formatting
User Request: "Show me my urgent tasks"
Claude Response:
# Query urgent tasks ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \ --read \ --tag "@urgent" | \ jq -r '.[] | "- \(.name) [\(.project // "Inbox")]"'
Pattern 3: Task Status Updates
User Request: "I finished the code review task"
Claude Response:
# Find task ID
TASK_ID=$(ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \
--read | \
jq -r '.[] | select(.name | contains("code review")) | .id' | head -1)
# Mark complete
if [ -n "$TASK_ID" ]; then
ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \
--update "$TASK_ID" \
--completed
echo "✅ Task marked as complete"
else
echo "❌ Task not found"
fi
Pattern 4: Project Overview
User Request: "What's in my Development project?"
Claude Response:
ruby ~/.claude/skills/omnifocus/scripts/omnifocus_manager.rb \
--read \
--project "Development" | \
jq -r '
"Development Project Tasks:\n" +
"Total: \(length)\n" +
"Incomplete: \([.[] | select(.completed == false)] | length)\n\n" +
"Tasks:\n" +
(.[] | "- [\(if .completed then "x" else " " end)] \(.name)")
'
Troubleshooting
Issue: "Omni Automation Error: Application isn't running"
Solution: Start OmniFocus application
open -a OmniFocus sleep 2 # Wait for app to launch # Retry operation
Issue: "AppleScript Error: Not authorized"
Solution: Grant automation permissions
- •System Preferences → Security & Privacy → Privacy → Automation
- •Enable checkbox for controlling app → OmniFocus
- •Restart controlling application
Issue: "Task not found" when updating
Solution: Verify task ID exists
# List all task IDs
ruby scripts/omnifocus_manager.rb --read | jq -r '.[].id'
# Or search for task by name
ruby scripts/omnifocus_manager.rb --read | jq '.[] | select(.name | contains("search term"))'
Issue: "OmniFocus database not found"
Solution: Verify OmniFocus is installed and has been run at least once
ls -la ~/Library/Caches/com.omnigroup.OmniFocus*
Issue: "Write operations not available"
Explanation: Only read-only SQLite access is available Solution: Enable Omni Automation or grant AppleScript permissions for write operations
Advanced Usage
Programmatic Integration
Use the Ruby API directly for custom integrations:
require_relative 'scripts/omnifocus_manager'
manager = OmniFocusManager.new
puts "Using automation: #{manager.automation_type}"
# Create task
result = manager.create_task(
name: "Process expense report",
project: "Finance",
notes: "Q4 2025 expenses",
tags: ["@admin", "@urgent"]
)
# Read tasks
tasks = manager.read_tasks(project: "Finance", completed: false)
tasks.each do |task|
puts "#{task['name']} - #{task['completed'] ? '✓' : '○'}"
end
JSON Output Processing
All commands output JSON for easy processing with jq:
# Tasks due this week
ruby scripts/omnifocus_manager.rb --read | \
jq '.[] | select(.dueDate != null and (.dueDate | fromdateiso8601) < (now + 604800))'
# Group by project
ruby scripts/omnifocus_manager.rb --read | \
jq 'group_by(.project) | map({project: .[0].project, tasks: map(.name)})'
# Export to CSV
ruby scripts/omnifocus_manager.rb --read | \
jq -r '["Name","Project","Completed","Due Date"], (.[] | [.name, .project, .completed, .dueDate]) | @csv'
Performance Considerations
- •Omni Automation: Fastest, direct API access (~100-200ms per operation)
- •AppleScript: Moderate speed (~200-500ms per operation)
- •SQLite: Very fast for reads (~10-50ms), but read-only
For bulk operations (>100 tasks), consider:
- •Using SQLite read-only for queries
- •Batching write operations
- •Caching project IDs to avoid repeated lookups
Resources
See references/api_reference.md for detailed API documentation including:
- •Complete Omni Automation JavaScript API reference
- •AppleScript object model and properties
- •SQLite database schema details
- •Advanced query examples
Version Compatibility
- •OmniFocus 3+: Full Omni Automation support
- •OmniFocus 2: AppleScript only
- •OmniFocus 1: AppleScript only
- •All versions: SQLite read-only fallback
Security & Privacy
- •No data transmission: All operations are local
- •Read-only by default: SQLite fallback is read-only to prevent corruption
- •Permission-gated: Requires explicit user authorization for automation
- •Temporary database copies: SQLite operations use copies, never modify live database