{"id":40639844,"url":"https://github.com/verygoodplugins/voice-to-todoist","last_synced_at":"2026-01-21T08:02:04.608Z","repository":{"id":312808955,"uuid":"1048806502","full_name":"verygoodplugins/voice-to-todoist","owner":"verygoodplugins","description":"Capture a voice note with SuperWhisper, parse it with Claude, and file a smart task into Todoist — with labels, due date, project, and section when applicable.","archived":false,"fork":false,"pushed_at":"2025-09-02T04:46:38.000Z","size":45,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-02T06:21:24.796Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/verygoodplugins.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-02T04:00:45.000Z","updated_at":"2025-09-02T04:46:42.000Z","dependencies_parsed_at":"2025-09-02T06:21:26.755Z","dependency_job_id":"de5d7169-9790-4ded-b706-b65cef0237b1","html_url":"https://github.com/verygoodplugins/voice-to-todoist","commit_stats":null,"previous_names":["verygoodplugins/voice-to-todoist"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/verygoodplugins/voice-to-todoist","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verygoodplugins%2Fvoice-to-todoist","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verygoodplugins%2Fvoice-to-todoist/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verygoodplugins%2Fvoice-to-todoist/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verygoodplugins%2Fvoice-to-todoist/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/verygoodplugins","download_url":"https://codeload.github.com/verygoodplugins/voice-to-todoist/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/verygoodplugins%2Fvoice-to-todoist/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28629922,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-21T04:47:28.174Z","status":"ssl_error","status_checked_at":"2026-01-21T04:47:22.943Z","response_time":86,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-21T08:02:02.302Z","updated_at":"2026-01-21T08:02:04.595Z","avatar_url":"https://github.com/verygoodplugins.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🎙️ Voice to Todoist · Raycast Extension\n\n\u003e **Speak your tasks, get them organized** — Record with SuperWhisper, let Claude understand context, and watch your Todoist magically organize itself. No typing, no manual filing, just natural speech that becomes perfectly structured tasks.\n\n[![Raycast Extension](https://img.shields.io/badge/Raycast-Extension-FF6363)](https://raycast.com/?via=verygoodplugins)\n[![SuperWhisper](https://img.shields.io/badge/SuperWhisper-Required-blue)](https://superwhisper.com)\n[![Claude AI](https://img.shields.io/badge/Claude-Powered-orange)](https://claude.ai)\n[![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](LICENSE)\n\nhttps://github.com/user-attachments/assets/2d91ccc4-f018-494f-8e1c-f4358041362d\n\n## ✨ What Makes This Special\n\n🎯 **Natural Language Intelligence**: Say \"remind me to review the quarterly report next Tuesday, it's high priority\" and get a properly filed task with due date, priority, and labels.\n\n🚀 **Zero-Friction Capture**: Hit your hotkey, speak, press ESC. Task is created, filed, and you're back to work in seconds.\n\n🧠 **Smart Context Understanding**: Claude parses intent, not just words. It knows \"EOD\" means today at 5pm and \"the usual project\" means your default.\n\n🎯 **Intelligent Routing**: Automatically caches your Todoist projects, labels, and sections (6h TTL) and passes them to the LLM for perfect task placement. No more manual filing!\n\n⚡ **Two Powerful Modes**:\n- **Script Command**: Lightweight, single-file, instant deployment\n- **Full Extension**: TypeScript, preferences UI, project finder, rules editor\n\n🏷️ **Auto-Label Creation**: Mention a label that doesn't exist? It's created automatically. Your taxonomy grows organically.\n\n📁 **Voice Archive**: Every recording saved to `~/Documents/Voice Notes/` categorized by type for future reference.\n\n## 🔧 Works With Any Automation Tool\n\nWhile we love Raycast, the script (`tools/voice-note-raycast.js`) is just standalone Node.js that works with ANY automation tool:\n\n### Alfred Workflow\n```bash\n# In Alfred Workflow, add Run Script action:\n/usr/local/bin/node /path/to/voice-to-todoist/tools/voice-note-raycast.js\n```\n\n### Hammerspoon\n```lua\n-- In ~/.hammerspoon/init.lua\nhs.hotkey.bind({\"cmd\", \"shift\"}, \"T\", function()\n  hs.task.new(\"/usr/local/bin/node\", nil, {\"/path/to/voice-to-todoist/tools/voice-note-raycast.js\"}):start()\nend)\n```\n\n### Apple Shortcuts\n1. Create new Shortcut\n2. Add \"Run Shell Script\" action\n3. Enter: `node /path/to/voice-to-todoist/tools/voice-note-raycast.js`\n4. Assign keyboard shortcut in Settings\n\n### Keyboard Maestro\nCreate macro with \"Execute Shell Script\" action using the same node command.\n\n### Terminal/CLI\n```bash\n# Run directly anytime\nnode tools/voice-note-raycast.js\n\n# Or make it executable\nchmod +x tools/voice-note-raycast.js\n./tools/voice-note-raycast.js\n```\n\nThe script handles everything: triggers SuperWhisper, captures transcription, calls Claude, creates task. No Raycast required!\n\n## 🏃 Quick Start\n\n### Option 1: Script Command (5 minutes)\n\n```bash\n# Clone the repo\ngit clone https://github.com/verygoodplugins/voice-to-todoist.git\ncd voice-to-todoist\n\n# Link to Raycast Scripts\nnpm run install:raycast\n\n# Create your config\ncp .env.example .env\n# Add your API keys to .env\n\n# Reload in Raycast\n# Search: \"Reload Script Directories\"\n```\n\n### Option 2: Full Extension (Production Ready)\n\n```bash\n# Install the extension\ncd extension\nnpm install\n\n# Configure in Raycast preferences:\n# - Anthropic API Key\n# - Todoist API Token\n# - (Optional) Default Project\n\n# Run in development\nnpm run dev\n\n# Or build for production\nnpm run build\n```\n\n## ⚙️ Configuration\n\n### Getting Your Anthropic API Key (2 minutes)\n1. Visit [console.anthropic.com](https://console.anthropic.com)\n2. Sign up or log in (new users get $5 free credits)\n3. Go to **API Keys** → **Create Key**\n4. Copy your key starting with `sk-ant-api03-...`\n\n**🎉 Free Credits**: New users get $5 in credits — enough for ~15,000 voice tasks with Haiku!\n\n### Script Command (.env)\n```env\nANTHROPIC_API_KEY=sk-ant-...\nTODOIST_API_TOKEN=...\n\n# Optional\nTODOIST_VOICE_PROJECT_ID=2359262770\nVOICE_NOTE_MODEL=claude-3-5-haiku-latest  # or claude-3-7-sonnet-latest\nTODOIST_CACHE_TTL_MS=21600000  # 6 hours\n```\n\n### Extension (Raycast Preferences)\nConfigure directly in Raycast → Extensions → Voice to Todoist:\n- 🔑 **API Keys**: Anthropic \u0026 Todoist (stored securely)\n- 📁 **Default Project**: ID or name for quick filing\n- 🤖 **Model**: Choose based on your needs (see comparison below)\n- 📑 **Sections Prefetch**: How many projects to include section data for\n- 📋 **Rules**: Enable JSON-based routing rules\n\n### 🤖 Model Comparison\n\n| Model | Speed | Cost per 1K tasks | Best For |\n|-------|-------|-------------------|----------|\n| **claude-3-5-haiku-latest** | ~0.8s | ~$0.30 | Straightforward tasks (\"Buy milk tomorrow at 2pm\") |\n| **claude-3-7-sonnet-latest** | ~1.5s | ~$1.25 | Complex parsing (\"that thing we discussed with John\") |\n\n**💡 Cost Reality Check**: Even if you create 100 voice tasks per day, you'd spend less than $1/month with Haiku. That's 3,000 tasks for the price of a coffee!\n\n**Recommendation**: Start with Haiku — it's excellent at structured data extraction and handles 95% of voice tasks perfectly. Only upgrade to Sonnet if you need:\n- Complex natural language understanding\n- Smart date/time/priority inference from context\n- Handling of ambiguous or multi-step requests\n\n## 🎯 Usage\n\n### Basic Flow\n1. **Trigger**: Hit `Cmd+Shift+T` (or your custom hotkey)\n2. **Speak**: \"Schedule a call with Sarah about the Q4 roadmap next Friday at 2pm, tag it as high priority\"\n3. **Stop**: Press `ESC` when done\n4. **Done**: See notification → `✅ Task Added: Call with Sarah → Work › Meetings`\n\n### What Claude Understands\n\n✅ **Natural Dates**: \"tomorrow\", \"next Monday\", \"end of month\", \"in 2 weeks\"  \n✅ **Times**: \"at 3pm\", \"morning\", \"EOD\" (5pm), \"by noon\"  \n✅ **Priority**: \"urgent\", \"high priority\", \"ASAP\" → p1, p2, p3  \n✅ **Projects**: Fuzzy matches your existing projects  \n✅ **Sections**: Finds the right section within projects  \n✅ **Labels**: Creates them if they don't exist  \n✅ **Context**: \"the usual place\" uses your default project  \n\n## 🛠️ Advanced Features\n\n### Custom Routing Rules\nCreate `tools/voice-note-rules.json`:\n```json\n{\n  \"rules\": [\n    {\n      \"test\": \"(?i)(meeting|call|standup)\",\n      \"projectName\": \"Work\",\n      \"sectionName\": \"Meetings\",\n      \"labels\": [\"meeting\"],\n      \"priority\": 2\n    },\n    {\n      \"test\": \"(?i)(bug|fix|broken)\",\n      \"projectName\": \"Development\",\n      \"labels\": [\"bug\", \"urgent\"],\n      \"priority\": 1\n    }\n  ]\n}\n```\n\n### Voice Archive\nAll recordings are saved to:\n```\n~/Documents/Voice Notes/\n├── Work/           # Category from Claude\n│   └── 2024-01-15-09-30-45.txt\n├── Personal/\n├── Shopping/\n└── Misc/\n```\n\n## 🏗️ Architecture\n\n### Two Implementations, One Goal\n\n**Script Command** (`tools/voice-note-raycast.js`)\n- Single Node.js file, zero dependencies\n- Clipboard sentinel technique for reliable capture\n- Direct API calls, no framework overhead\n- Perfect for personal use\n\n**Extension** (`extension/`)\n- Full TypeScript with @raycast/api\n- Preference UI for easy configuration\n- Built-in project finder and rules editor\n- Store-ready for distribution\n\n### How It Works\n1. **Trigger**: Opens SuperWhisper via `raycast://` URL scheme\n2. **Capture**: Polls for recording completion, grabs clipboard\n3. **Context**: Loads cached Todoist structure (projects, labels, sections)\n4. **Parse**: Claude analyzes speech with full context for intelligent routing\n5. **Create**: Todoist API creates perfectly filed task with all metadata\n6. **Archive**: Raw transcript saved for reference\n\n## 🐛 Troubleshooting\n\n**No transcription detected?**\n- Ensure SuperWhisper copies to clipboard on stop\n- Check `~/Documents/Voice Notes/process.log`\n\n**Wrong project/section?**\n- Increase `sectionsPrefetch` in preferences\n- Add specific rules to `voice-note-rules.json`\n- Use project name in your speech\n\n**Labels not created?**\n- We use `labels` (names) not `label_ids`\n- Check Todoist API token has write permissions\n\n## 🔐 Privacy \u0026 Security\n\n- 🔒 API keys stored in Raycast's secure preferences (never in code)\n- 📝 Only transcription and extracted fields sent to APIs\n- 💾 Local voice archive stays on your machine\n- 🚫 No telemetry, no external logging\n\n## 📚 Requirements\n\n- macOS 12+ (Raycast requirement)\n- [Raycast](https://raycast.com/?via=verygoodplugins) (free)\n- [SuperWhisper](https://superwhisper.com) extension\n- Node.js 18+ (for script command)\n- API Keys:\n  - [Anthropic](https://console.anthropic.com) (Claude)\n  - [Todoist](https://todoist.com/app/settings/integrations/developer)\n\n## 🤝 Contributing\n\nFound a bug? Have an idea? PRs welcome!\n\n```bash\n# Fork and clone\ngit clone https://github.com/YOUR_USERNAME/voice-to-todoist.git\n\n# Create your feature branch\ngit checkout -b feature/amazing-feature\n\n# Commit your changes\ngit commit -m 'Add amazing feature'\n\n# Push and create PR\ngit push origin feature/amazing-feature\n```\n\n## 📄 License\n\nMIT License - see [LICENSE](LICENSE) for details.\n\n---\n\nBuilt with 🧡 by [Jack Arturo](https://github.com/verygoodplugins) at [Very Good Plugins](https://verygoodplugins.com?utm_source=github\u0026utm_medium=readme\u0026utm_campaign=voice-to-todoist) for the open-source community.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverygoodplugins%2Fvoice-to-todoist","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fverygoodplugins%2Fvoice-to-todoist","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fverygoodplugins%2Fvoice-to-todoist/lists"}