Community-driven voice tools for CAAL - the voice assistant that actually does things. Part of the CAAL Tool API.
🚧 Under Active Development This registry is under active development. Core functionality works, but not all bugs have been worked out. Expect rough edges. Contributions and bug reports welcome!
This registry contains voice-first n8n workflows that extend CAAL's capabilities. Unlike generic n8n templates, these are optimized for:
- Voice triggers (how you'd actually say it)
- Low latency (< 5 second responses)
- Conversational responses (not raw JSON)
- One-click installation
Have CAAL installed? Browse and install tools directly in your CAAL web interface.
Exploring before installing CAAL? Browse by category below:
| Category | Tools |
|---|---|
| Smart Home | Home Assistant, lights, climate, security |
| Media | Plex, Jellyfin, Jellyseerr, Sonarr, Radarr |
| Homelab | TrueNAS, Docker, Proxmox, Unraid, PiHole |
| Productivity | Calendar, tasks, email, notes |
| Developer | GitHub, GitLab, CI/CD, code tools |
| Utilities | Weather, timers, reminders |
| Sports | ESPN, fantasy sports, scores, standings |
| Social | Discord, Slack, Reddit, Telegram |
| Other | Everything else |
curl -s https://raw.githubusercontent.com/CoreWorxLab/caal-tools/main/scripts/install.sh | bash -s <tool-name>Example:
curl -s https://raw.githubusercontent.com/CoreWorxLab/caal-tools/main/scripts/install.sh | bash -s truenas-get-status- Download the
workflow.jsonfrom the tool's folder - Import into n8n (Settings > Import from File)
- Create required credentials (listed in the tool's README)
- Update any service URLs
- Activate the workflow
- Tell CAAL to refresh:
curl -X POST http://localhost:8889/reload-tools
Single-purpose tools that do one thing well.
- Named:
service_action_object(e.g.,truenas_get_status) - One workflow, one action
Multi-action tools that group related functionality.
- Named:
service(e.g.,google_tasks,truenas) - One workflow, multiple actions via Switch node
- Actions like: get, add, complete, delete, control
Example: google_tasks suite handles:
- "What's on my task list?" →
action: get - "Add task buy groceries" →
action: add - "Mark done the groceries task" →
action: complete
Each tool has a manifest.json:
{
"id": "unique-registry-id",
"name": "google_tasks",
"friendlyName": "Google Tasks",
"version": "1.0.0",
"description": "Manage Google Tasks - get, add, complete, and delete tasks.",
"category": "productivity",
"toolSuite": true,
"actions": ["get", "add", "complete", "delete"],
"icon": "google_tasks.svg",
"voice_triggers": [
"What's on my task list?",
"Add task buy groceries"
],
"required_services": ["google tasks"],
"required_credentials": [...],
"required_variables": [...],
"author": { "github": "username" },
"tier": "community",
"tags": ["productivity", "google"]
}Suite-specific fields:
toolSuite:truefor suites,falsefor individual toolsactions: Array of available actions (suites only)friendlyName: Human-readable display nameicon: Optional icon filename (see/icons/)
We need tools! See CONTRIBUTING.md for how to submit your own.
Want a tool that doesn't exist? Request it!
| Tier | Badge | Meaning |
|---|---|---|
| Verified | Gold | Reviewed + tested + proven |
| Community | Silver | Passed automated review |
| Experimental | Warning | New submission |
CAAL can query this registry directly:
import httpx
REGISTRY_INDEX = "https://registry.caal.io/index.json"
async def search_registry(query: str) -> list[dict]:
async with httpx.AsyncClient() as client:
resp = await client.get(REGISTRY_INDEX)
tools = resp.json()
query_lower = query.lower()
return [t for t in tools if query_lower in t['name'] or query_lower in t['description'].lower()]MIT - Build what you want, share what you can.