Home Assistant voice web search with Firecrawl

My Home Assistant voice assistant answers real-time questions in Galician now: a small integration contributes a web_search tool to the Assist LLM API, backed by my self-hosted Firecrawl. How it works, the loading gate that silently swallowed the first version, and what voice search changes.

Last month I wrote about running a local Firecrawl for my Hermes agent. It always felt unfair that my Home Assistant voice assistant answered questions about news or prices from a model’s frozen memory while a perfectly good search engine sat on my LAN. So I wired the two together: my voice assistant in Galician can now answer questions about today’s news and name the newspaper it read them on.

The tool is a small Home Assistant integration, free to use: github.com/albertoruibal/ha-firecrawl-search.

Adding tools to the LLM

Home Assistant’s Assist pipeline already speaks to LLMs through a generic mechanism. Conversation agents (in my case the Ollama integration, talking to a cloud model on ollama.com) can be configured with an LLM API: a bundle of tools with a prompt explaining their use. The built-in one is the Assist API (device control). The nice part is that integrations can contribute tools to that same API: ship an llm.py platform registering a tool, and every conversation agent that has the Assist API enabled picks it up. One registration, every agent benefits.

So the integration is small: an llm.py platform registering two tools, firecrawl_search__web_search and firecrawl_search__read_page, plus a config flow so the Firecrawl URL, an optional API key and every search default can be set from the UI. When the model decides it needs current information, it emits a tool call; the integration posts the query to POST {url}/v2/search on my self-hosted Firecrawl; the model gets back the top results (title, url, snippet) and composes the spoken answer. It also works with the hosted Firecrawl API if you don’t run your own: same tool, an API key field, and the setup dialog probes your key before saving.

From the wyoming satellite to Firecrawl search and scrape wyoming satellite whisper.cpp voice pipeline (wyoming-voice-gl) Ollama cloud LLM Firecrawl · POST /v2/search top results: title · url · snippet Firecrawl · POST /v2/scrape page as clean markdown (truncated) tool call snippets not enough

Snippets first, by design. A voice answer shouldn’t recite a web page; it should say what the sources say and name them. The tool caps the snippets at a configurable 300 characters and tags each search with a language (its own pick, default set in the UI): ask in Galician, get results Galician speakers would find. When snippets are not enough, read_page scrapes the result’s full page and hands the model clean markdown, so a follow-up can get an answer no snippet could hold.

What voice search is like

The search itself looks the same in the Settings → Voice assistants → ⋯ → Debug trace either way; the difference is the tempo. The wyoming-voice-gl pipeline transcribes with whisper.cpp and speaks with a Proxecto Nós voice: the model thinks, calls the tool once or twice, and about twenty seconds after the wake word the Galician TTS voice reads a composed answer. The model picks its own queries (for a news question it searched in Galician, then in Spanish for wider coverage) and cites what it read, naming its sources (Faro de Vigo, Cadena Ser). For “que tempo vai facer mañá en Ourense?” it searched, said rain, twelve to sixteen degrees, and moved on before the answer grew stale.

That last bit is the part I like most: the assistant stopped being a book and became a window. The tool description even tells it “never say you lack real-time information, you have this”. The answers are now at the level of the Google Assistant ones. The only weak points continue to be the microphones and wake word detection.

Try it

The repo has the HACS steps, a manual install, and the configuration walkthrough: github.com/albertoruibal/ha-firecrawl-search. Requirements are modest: Home Assistant 2026.8+, a conversation agent with the Assist API enabled, and a Firecrawl instance, either self-hosted (see my earlier post) or the hosted API with a free-tier key. Every search default is a setting in the UI.