Local voice assistant that learns new abilities via auto-discovered n8n workflows exposed as tools via MCP
Find a file
cmac86 33f5b51616
Merge pull request #91 from CoreWorxLab/fix/session-greeting
fix(agent): canned greeting at session start to prevent tool calls
2026-03-10 22:14:33 -07:00
.github docs: add GitHub community standards and restructure README (#10) 2026-01-04 14:42:36 -08:00
docs refactor(hass): unify hass_control and hass_get_state into single hass tool 2026-02-15 20:18:02 -08:00
frontend feat(memory): add Create button to memory panel with "ui" source type 2026-03-10 21:21:36 -07:00
integrations/openwebui feat(chat): add session reuse, headless prompt, and open-webui filter 2026-02-19 19:10:39 +11:00
mobile fix(mobile,agent): stored API key fallback for test endpoints and UI fixes 2026-02-12 08:33:30 -08:00
models Add wake word models to repository 2026-01-03 19:21:34 -08:00
prompt feat(chat): add session reuse, headless prompt, and open-webui filter 2026-02-19 19:10:39 +11:00
src/caal fix(agent): use canned greeting at session start to prevent tool calls 2026-03-10 21:54:13 -07:00
.dockerignore Fix server-side wake word detection with StreamAdapter 2026-01-02 01:28:49 -08:00
.env.example feat(turn): make TURN TLS port configurable via TURN_TLS_PORT env var 2026-03-08 14:13:46 -07:00
.gitattributes Add .gitattributes to fix Windows line ending issues 2025-12-31 10:50:41 -08:00
.gitignore fix: address PR review feedback 2026-02-07 13:10:57 +01:00
CODE_OF_CONDUCT.md docs: add GitHub community standards and restructure README (#10) 2026-01-04 14:42:36 -08:00
CONTRIBUTING.md docs: add GitHub community standards and restructure README (#10) 2026-01-04 14:42:36 -08:00
docker-compose.apple.yaml fix(memory): write to /app/data volume for Docker persistence 2026-02-10 18:15:06 -08:00
docker-compose.cpu.yaml fix(memory): write to /app/data volume for Docker persistence 2026-02-10 18:15:06 -08:00
docker-compose.dev.yml Initial commit - CAAL Voice Framework 2025-12-24 00:22:19 -08:00
docker-compose.distributed.yml fix: Docker service dependencies and mlx-audio port 2026-01-18 17:24:05 -08:00
docker-compose.yaml feat(turn): make TURN TLS port configurable via TURN_TLS_PORT env var 2026-03-08 14:13:46 -07:00
Dockerfile Fix docker compose startup with missing config files 2026-01-02 20:52:02 -08:00
entrypoint.sh fix(memory): write to /app/data volume for Docker persistence 2026-02-10 18:15:06 -08:00
LICENSE Initial commit - CAAL Voice Framework 2025-12-24 00:22:19 -08:00
livekit-tailscale.yaml fix: make HTTPS the default for all deployment modes 2026-02-07 22:05:24 -08:00
livekit-tailscale.yaml.template feat(turn): make TURN TLS port configurable via TURN_TLS_PORT env var 2026-03-08 14:13:46 -07:00
livekit.yaml fix(apple): add Speaches/Piper support, fix TTS routing and port ranges 2026-02-06 18:44:51 +01:00
mcp_servers.default.json Fix docker compose startup with missing config files 2026-01-02 20:52:02 -08:00
mcp_servers.json.example Add multi-MCP server support via JSON config (#3) 2025-12-31 13:51:31 -08:00
nginx-distributed.conf feat: add CPU-only compose file for GPU-free deployments 2026-01-10 21:34:16 -08:00
nginx.conf feat: auto-generate self-signed HTTPS certs and use port 3443 2026-01-10 16:02:20 -08:00
pyproject.toml feat: add Groq STT provider and fix tool call formatting 2026-01-06 20:00:13 -08:00
README.md refactor(hass): unify hass_control and hass_get_state into single hass tool 2026-02-15 20:18:02 -08:00
SECURITY.md docs: add GitHub community standards and restructure README (#10) 2026-01-04 14:42:36 -08:00
settings.default.json Change default temperature from 0.7 to 0.15 2026-02-05 21:29:46 -08:00
start-apple.sh feat: add trust-cert.sh and fix SAN in self-signed certificates 2026-02-08 08:35:00 +01:00
trust-cert.sh fix: delete old cert before re-adding in trust-cert.sh 2026-02-08 09:43:32 -08:00
uv.lock feat: add Groq STT provider and fix tool call formatting 2026-01-06 20:00:13 -08:00
voice_agent.py fix(agent): use canned greeting at session start to prevent tool calls 2026-03-10 21:54:13 -07:00

CAAL

License: MIT Python 3.10+ LiveKit

Self-hosted voice assistant you actually own. Secure by design - the LLM never sees your API keys.

CAAL is an open-source voice assistant built on LiveKit Agents that runs entirely on your hardware. Your voice, your data, your credentials — all on your network.

CAAL Voice Assistant


Why CAAL?

Secure by architecture. The model never sees your API keys. Ever. Credentials live in n8n's encrypted credential store. The LLM sends parameters to a webhook, the workflow handles auth. Even if a prompt injection succeeds, the model can only call pre-built workflows — no shell access, no curl, no ability to transmit data. It's an air gap for the LLM. Every tool in the registry goes through automated security review and human approval before it's available to install.

Purpose-built model. CAAL ships with caal-ministral — a fine-tuned 8B model trained specifically for voice tool calling. It knows how to control your smart home, chain tools together, and respond naturally. The LLM is one piece of the architecture, not the architecture. It handles decisions that code can't — which tool to call, what parameters to use, when to chain steps. Everything else is code. That's why an 8B model works.

ollama pull coreworxlab/caal-ministral:latest

Infinitely extensible. Any n8n workflow becomes a voice-activated tool. Control Home Assistant devices, query APIs, automate your life — then share your tools with the community via the CAAL Tool Registry. Tools follow a suite convention — fewer tools, better accuracy, more reliable routing.

Local by default. Runs fully on your network with Ollama. No accounts, no telemetry, no cloud dependency. Want to use Groq, OpenRouter, or any OpenAI-compatible API? Your choice. Your credentials and tool executions never leave your network regardless.


Features

  • Tool Registry — Browse and install community tools with one click. Every submission goes through automated security review and human approval
  • Tool Chaining — Sequential multi-tool calls in one prompt. The model uses real data from each step to inform the next
  • Home Assistant — Voice control across lights, covers, locks, climate, media, and more via hass
  • n8n Workflows — Any workflow becomes a tool. Visual, inspectable, shareable, auditable through n8n's execution history
  • Flexible Providers — Ollama, Groq, OpenRouter, or any OpenAI-compatible API. Speaches or Groq for STT. Kokoro or Piper for TTS
  • Short-Term Memory — Store and recall information across sessions
  • Internationalization — English, French, Italian, with more coming
  • Wake Word — "Hey Cal" via OpenWakeWord
  • Web Search — DuckDuckGo integration for real-time information
  • Mobile App — Android client available from Releases
  • Webhook API — REST API for announcements, settings, and external triggers

Quick Start

git clone https://github.com/CoreWorxLab/caal.git
cd caal
cp .env.example .env
nano .env  # Set CAAL_HOST_IP to your server's LAN IP

# If using Ollama (recommended)
ollama pull coreworxlab/caal-ministral:latest

docker compose up -d

Open https://YOUR_SERVER_IP:3443 and complete the setup wizard.

Requires Docker with NVIDIA Container Toolkit and 8GB+ VRAM. For CPU-only or Apple Silicon setups, see Deployment Options.

Deployment Options

Mode Hardware Command Guide
GPU Linux + NVIDIA GPU docker compose up -d Quick Start above
CPU-only Any Docker host docker compose -f docker-compose.cpu.yaml up -d Wiki: CPU Mode
Apple Silicon M1/M2/M3/M4 Mac ./start-apple.sh Apple Silicon Guide
Distributed GPU server + frontend See guide Distributed Guide

HTTPS & Network

HTTPS is enabled by default with auto-generated self-signed certificates. This is required because browsers block microphone access on non-localhost HTTP.

To avoid the browser certificate warning, trust the auto-generated cert:

./trust-cert.sh

This works on macOS and Linux (Debian/Ubuntu, RHEL/Fedora, Arch, Chrome, Firefox). Pass --yes to skip the confirmation prompt. On Apple Silicon, start-apple.sh runs it automatically.

Alternatively, for browser-trusted certs use mkcert:

mkcert -install && mkcert 192.168.1.100
mkdir -p certs && mv 192.168.1.100.pem certs/server.crt && mv 192.168.1.100-key.pem certs/server.key

For remote access via Tailscale, set HTTPS_DOMAIN in .env to your Tailscale domain. See the wiki for details.

The mobile app connects via LiveKit directly and doesn't require HTTPS.


Documentation

Resource Description
Wiki Full documentation — architecture, configuration, deployment
Home Assistant Smart home integration setup and usage
n8n Workflows Creating and connecting workflow tools
Apple Silicon Running on M1/M2/M3/M4 Macs
Distributed Deployment Split GPU backend and frontend
Internationalization Adding language support
Tool Registry Browse and submit community tools
CONTRIBUTING.md Development setup and contribution guidelines

Architecture

                          https://<IP>:3443    https://<IP>:7443
                                │                     │
                          ┌─────┴─────────────────────┴─────┐
                          │           nginx (TLS)           │
                          │         :3443  :7443            │
                          └─────┬─────────────────┬─────────┘
                                │                 │
┌───────────────────────────────┼─────────────────┼───────────────────┐
│  Docker Compose Stack         │                 │                   │
│                               │                 │                   │
│  ┌────────────┐         ┌─────┴──────┐  ┌───────┴────┐  ┌────────┐  │
│  │  Speaches  │         │  Frontend  │  │  LiveKit   │  │ Kokoro │  │
│  │(STT, GPU)  │         │  (Next.js) │  │   Server   │  │ (TTS)  │  │
│  │   :8000    │         │   :3000    │  │   :7880    │  │ :8880  │  │
│  └─────┬──────┘         └─────┬──────┘  └─────┬──────┘  └───┬────┘  │
│        │                      │               │             │       │
│        └──────────────────────┼───────────────┼─────────────┘       │
│                               │               │                     │
│                         ┌─────┴───────────────┴─────┐               │
│                         │         Agent             │               │
│                         │    (Voice Pipeline)       │               │
│                         │    :8889 (webhooks)       │               │
│                         └─────────┬─────────────────┘               │
│                                   │                                 │
└───────────────────────────────────┼─────────────────────────────────┘
                                    │
           ┌────────────────────────┼────────────────────────┐
           │                        │                        │
     ┌─────┴─────┐           ┌──────┴──────┐          ┌──────┴──────┐
     │   Ollama  │           │     n8n     │          │    Home     │
     │Groq / OR  │           │  Workflows  │          │  Assistant  │
     └───────────┘           └─────────────┘          └─────────────┘
                      External Services (via MCP)

Community

CAAL is built in the open. If you build a tool, we see the PR. If you find a bug, we see the issue.


Contributing

We welcome contributions! See CONTRIBUTING.md for guidelines.

License

MIT License — see LICENSE for details.