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 114 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, a private voice layer for your notes, your home, and the web.
Fulloch is your fully private, local voice assistant running on your own PC or Mac. Ask questions, capture thoughts, and search your Obsidian vault by voice. Control your home via Home Assistant. Pull live answers from the web with SearXNG. All fully private and running on your home PC.
The default stack runs on CPU (mac/linux/windows). Audio runs through the browser dashboard. The LLM is either regex-only (simple commands) or off-box via an OpenAI-compatible endpoint you configure in the wizard (e.g. Ollama / LM Studio / another machine on your LAN). The dashboard avatar swaps to Parloch, the Partially-local home voice assistant, when the LLM is running off-device.
docker run -d \
--name fulloch-ai \
--restart unless-stopped \
-p 8765:8765 \
-e DASHBOARD_HOST=0.0.0.0 \
-v ./data:/app/data:rw \
# -v /path/to/your/ObsidianVault:/vault:rw \
ghcr.io/liampetti/fulloch:cpu
Swap :cpu for :latest (the CUDA image with Qwen3-TTS voice cloning and the on-GPU 9B SLM) and add --gpus all:
docker run -d \
--name fulloch-ai \
--restart unless-stopped \
--gpus all \
-p 8765:8765 \
-e DASHBOARD_HOST=0.0.0.0 \
-v ./data:/app/data:rw \
# -v /path/to/your/ObsidianVault:/vault:rw \
ghcr.io/liampetti/fulloch:latest
The commented-out
-vline exposes your Obsidian vault to Fulloch so voice notes can read/write it. Uncomment it, edit the host path, and add a matchingobsidian.path_translationentry indata/config.yml, see the Obsidian section below.
Create a shared network, then run SearXNG on it and point Fulloch at it via search.searxng_url:
docker network create fulloch
docker run -d \
--name searxng \
--network fulloch \
--restart unless-stopped \
-p 8080:8080 \
-e SEARXNG_SECRET=change-me \
searxng/searxng
Then in the Fulloch setup wizard, set Web search URL to http://searxng:8080/search. (Skip the -p 8080:8080 if you don't need to reach SearXNG from the host, the Fulloch container only needs the in-network name.)
http://localhost:8765 and follow the wizard.The setup wizard configures Fulloch on first boot, and the settings console (gear icon, the same web UI) edits every option afterwards. Everything is reachable from the UI: wakeword, barge-in, voice, the Home Assistant connection, notes path, and web search. But if you'd rather hand-edit, the full annotated reference is data/config.example.yml.
Secrets (HA token, LLM API key, dashboard password) are stored in data/credentials.json, written by the setup wizard. Copying data/ to a new machine transfers everything. To configure headlessly, copy data/credentials.example.json to data/credentials.json and fill in the values, or set the equivalent env vars (HA_TOKEN, LLM_API_KEY, DASHBOARD_PASSWORD, OBSIDIAN_TOKEN) in .env.
The web dashboard is unauthenticated and bound to 127.0.0.1 by default. To reach it from another device, set dashboard_host: "0.0.0.0" in config and set a password in the setup wizard's finish step.
The moment you point the language model at an OpenAI-compatible endpoint, the avatar and favicon swap to a travelling version of the character (Let's call him Parloch: The Partially local home voice assistant), and the tagline reads "language model is off-device." Pick a local model again (None or the GPU 9B) and Fulloch comes home. It triggers as soon as a remote endpoint is configured, even if it is on your home network.
Important: If you are using an OpenAI endpoint you will lose the GBNF enforced JSON formatting that comes with the built-in LLM. This means there is a higher risk of tool call errors when running the LLM remotely.
A HACS-installable integration for status sensors, mic control, proactive speech, and automation triggers.
Or manually: HACS → Custom repositories → paste https://github.com/liampetti/fulloch, category Integration → Download → restart HA → Settings → Integrations → Add → Fulloch.
| Entity | Description |
|---|---|
sensor.fulloch_status |
idle / thinking / speaking |
sensor.fulloch_last_utterance |
Last thing the user said |
sensor.fulloch_last_response |
Last thing Fulloch said (full_text attribute has the full string) |
switch.fulloch_mic |
Mute / unmute the microphone |
text.fulloch_speak |
Submit text → Fulloch speaks it |
text.fulloch_chat |
Submit a query → full agent loop |
| Action | Field | Description |
|---|---|---|
fulloch.speak |
text |
Speak a message |
fulloch.chat |
text |
Run a full agent query and speak the result |
fulloch.mic |
enabled |
Turn the mic on or off |
| Event | When |
|---|---|
fulloch_wakeword_detected |
Voice turn starts |
fulloch_turn_ended |
Fulloch finishes speaking |
Use events in automations, e.g. dim lights on fulloch_wakeword_detected, restore on fulloch_turn_ended. Use fulloch.speak for proactive notifications from your home.
The dashboard's Entities tab blocks specific entities (locks, alarms) from voice control without affecting dashboard or automation access. Changes apply immediately.
Search-by-name music queries ("play the Beatles", "play jazz in the kitchen", "play music everywhere") need a
spotify:block inconfig.yml, Fulloch searches Spotify directly via the Web API, then hands the resolved track/playlist off to a Home Assistantmedia_playerentity to actually play. Requires a one-time manual OAuth step to get a refresh token. See thespotify:section indata/config.example.ymlfor the config keys anddata/credentials.jsonfields. Without aspotify:block, there's no music search, pause/resume/skip still work through Home Assistant regardless (so they keep working for AVR/TV too).
Connect your Obsidian vault so Fulloch reads, writes, appends, and searches your notes by voice, and knows which note you have open. The first time you connect, Fulloch offers to copy your existing notes into the vault as Inbox/fulloch-import/. Cloud sync (Remotely Save, etc.) is unchanged, Fulloch only sees the local vault.
Setup (about 2 minutes):
plugin.zip into <your-vault>/.obsidian/plugins/fulloch/, then enable the Fulloch plugin in Settings → Community plugins and paste the token.That's it. Once the plugin connects, the dashboard flips to Connected and voice notes go straight to your vault. Closing Obsidian doesn't break anything, Fulloch remembers the vault and voice keeps working.
To point Fulloch at a different vault later, use the Switch vault section on the Obsidian tab.
Running Fulloch in Docker? The plugin runs on the host, so it reports host paths (e.g. /Users/you/Documents/MyVault). Fulloch inside the container can't see those. Two edits to wire it up:
Add your vault's directory as a volume when launching Docker container -v /Users/you/Documents/MyVault:/vault:rw
Add the same mapping under obsidian.path_translation in data/config.yml:
obsidian:
path_translation:
"/Users/you/Documents/MyVault": "/vault"
Restart Fulloch. The Obsidian wizard's "Auto-detect" scans the container filesys