by liampetti
Fulloch - The Fully Local Home Voice Assistant
# Add to your Claude Code skills
git clone https://github.com/liampetti/fullochLast scanned: 6/18/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-06-18T08:48:56.471Z",
"npmAuditRan": true,
"pipAuditRan": false,
"promptInjectionRan": true
}fulloch is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by liampetti. Fulloch - The Fully Local Home Voice Assistant. It has 104 GitHub stars.
Yes. fulloch passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/liampetti/fulloch" and add it to your Claude Code skills directory (see the Installation section above).
fulloch is primarily written in Python. It is open-source under liampetti on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh fulloch against similar tools.
No comments yet. Be the first to share your thoughts!
[![GitHub Release][releases-shield]][releases] ![License][license-shield] [![hacs][hacs-shield]][hacs]
The Fully Local Home Voice Assistant — private, conversational, 100% on-device.
A voice assistant with agentic memory, web research, and smart-home control running entirely on your own GPU. Speech recognition, the language model, and the spoken voice never leave your machine.
Fulloch sits on top of your existing setup as the conversational brain — it drives Home Assistant for smart-home control and reads and writes plain Markdown notes, so it plugs straight into an Obsidian vault or any Markdown workflow.
.md files by voice; point it at your Obsidian vault| Model | Role |
|---|---|
| Qwen3.5-9B GGUF Q5_K_M (llama.cpp) | Language model |
| Qwen3-ASR-1.7B | Speech recognition |
| Qwen3-TTS-12Hz-1.7B-Base | Text-to-speech |
| bge-small-en-v1.5 | Semantic note search |
Minimum hardware: 16GB VRAM GPU (e.g. RTX 5060 Ti). The full pipeline is GPU-resident; there is no CPU fallback.
This integration will set up the following platforms.
| Platform | Description |
|---|---|
sensor |
Status, last utterance, last response |
switch |
Microphone mute / unmute |
text |
Speak and chat text input entities |
| Integration | Purpose |
|---|---|
| SpotifyPlus | Required for "play the Beatles" style music queries. Basic Spotify playback control (pause, skip, volume) works without it. |
Use the following link to open (and add) the Fulloch repository in HACS:
If the above does not work, add it manually:
https://github.com/liampetti/fulloch, select Integration, click Addcustom_components/fulloch/ into your HA config/custom_components/ directory| Entity | Type | Description |
|---|---|---|
sensor.fulloch_status |
Sensor | idle / thinking / speaking |
sensor.fulloch_last_utterance |
Sensor | Last thing the user said |
sensor.fulloch_last_response |
Sensor | Last thing Fulloch said (full_text attribute has the full string) |
switch.fulloch_mic |
Switch | Mute / unmute the microphone |
text.fulloch_speak |
Text | Submit text → Fulloch speaks it |
text.fulloch_chat |
Text | Submit a query → full agent loop, speaks the result |
| Action | Field | Description |
|---|---|---|
fulloch.speak |
text |
Speak a message through the cloned voice |
fulloch.chat |
text |
Run a full agent-loop query and speak the result |
fulloch.mic |
enabled |
Turn the mic on or off |
| Event | When |
|---|---|
fulloch_wakeword_detected |
Wakeword heard or voice turn starts |
fulloch_turn_ended |
Fulloch finishes speaking a response |
Use these in automations — e.g. dim lights on fulloch_wakeword_detected, restore on fulloch_turn_ended.
action: fulloch.speak
data:
text: "The front door just opened."
action: fulloch.chat
data:
text: "Tell me today's calendar and weather."
Some entities you may be happy to control from the secure dashboard but not by voice — door locks and alarms being the obvious cases. The dashboard's Entities tab lists every Home Assistant entity Fulloch knows about with a toggle each; switch one off and Fulloch will refuse to control it by voice (it speaks a short "that isn't available for voice control" instead of acting), while it stays fully usable from the dashboard and in your own HA automations.
Changes take effect immediately — no restart. The choices are stored in
data/voice_denylist.json so they persist across restarts.
This is separate from Home Assistant's "Expose to Assist" setting, which only governs HA's built-in Assist and isn't readable by Fulloch. Use the Entities tab instead.
git clone https://github.com/liampetti/fulloch.git
cd fulloch
./launch.sh
On first run, creates data/config.yml and .env from templates, pauses for editing, downloads models, loads PulseAudio echo cancellation, and starts via Docker Compose.
git clone https://github.com/liampetti/fulloch.git
cd fulloch
pip install -r requirements.txt
launch.bat
SearXNG runs in Docker; the assistant runs natively in Python — no audio-passthrough complexity. Requires Python 3.10+, Docker Desktop, and an NVIDIA GPU with CUDA.
requirements.txt pins every direct dependency to an exact version for reproducible installs. The GPU stack (CUDA torch, plus the git-installed qwen-tts / flash-attn) can't be PyPI-locked cleanly, so there's no transitive lockfile — snapshot a known-good environment by freezing the built image:
docker compose run --rm app pip freeze > requirements.lock
Everything lives in data/config.yml. Key settings:
general:
wakeword: "hey atticus" # activation phrase
barge_in: "wakeword" # "off" | "wakeword" (needs AEC)
follow_up_time: "5s" # wakeword-free reply window after TTS ends
voice_clone: "atticus" # data/voices/<name>.{wav,txt}
dashboard_port: 8765 # web chat UI; remove to disable
dashboard_host: "127.0.0.1" # local-only; "0.0.0.0" to reach it from other devices
# dashboard_ssl_certfile: "./data/certs/fulloch.pem" # optional HTTPS (both keys required)
# dashboard_ssl_keyfile: "./data/certs/fulloch-key.pem"
use_vad: true # drop non-speech buffers (coughs, taps) before ASR
asr_context_hint: true # bias ASR decoder toward wakeword spelling
asr_context_terms: # optional extra terms to bias (max 10)
- "phoebe bridgers"
home_assistant:
url: "http://192.168.1.50:8123"
token: "your_long_lived_access_token" # or set FULLOCH_HA_TOKEN in .env (preferred)
calendar: "Fulloch" # HA calendar for voice reminders (optional)
notes:
path: "/path/to/obsidian/vault" # defaults to data/notes/
daily_subdir: "daily" # optional daily journal subfolder
search:
searxng_url: "http://localhost:8080/search"
Full reference: data/config.example.yml
Secrets and tokens live in .env (not config.yml): SEARXNG_SECRET,
FULLOCH_DASHBOARD_TOKEN (dashboard auth), and FULLOCH_HA_TOKEN (Home Assistant,
overrides home_assistant.token). See .env.example.
The dashboard can read and write your notes, toggle the microphone, speak through
your speakers, and drive Home Assistant — so it is unauthenticated and bound to
127.0.0.1 (local-only) by default.
To reach it from your phone or another device on your network:
general.dashboard_host: "0.0.0.0" in data/config.yml.FULLOCH_DASHBOARD_TOKEN in .env (generate one with
openssl rand -hex 32). This is mandatory: without it, anyone on your LAN gets
full notes/mic/speech/Home-Assistant control, and Fulloch logs a warning at startup.http://<this-host-ip>:<port>/?token=<your-token> (find the IP
with hostname -I). The browser stores the token and strips it from the address
bar, so you can bookmark the bare http://<host>:<port>/ afterwards. If the token
is missing or wrong, the page prompts you for it.Over plain HTTP the token travels in clear text — fine o