Saar: mijn eigen spraakassistent, volledig op eigen hardware

De levende orb van Saar — je praat er gewoon tegen

De levende orb van Saar — hierboven echt, geen screenshot. Hij ademt en wisselt van kleur per gesprekstoestand.

Het begon met een simpele vraag: "kunnen we een Google Home-achtig apparaat bouwen?" Een paar uur later had ik geen apparaat, maar Saar — een spraakassistent die volledig op mijn eigen hardware draait, Nederlands spreekt, een geheugen heeft, mijn desktop en browser bedient, door de webcam kijkt én mijn smart home aanstuurt.

Geen Google, geen cloud, geen abonnement. Alles lokaal of op mijn eigen homelab.

Van apparaat naar app

Het idee schoof al snel op. In plaats van een ESP32-prul werd het een Linux desktop-app voor mijn Fedora + Hyprland-machine, met de look-and-feel van de Gemini-app: een "levende", ademende orb waar je gewoon tegen praat. Geknutseld in Tauri v2 (Rust-kern) met een WebGL2-shader voor de orb.

Hoe een gesprek verloopt

Alles draait om één pijplijn, volledig handsfree:

  1. Luisteren — de microfoon loopt continu; een eenvoudige voice-activity-detector merkt wanneer ik begin en stop met praten.
  2. Verstaan — lokale spraakherkenning met whisper.cpp (Nederlands, op de CPU).
  3. Denken — de tekst gaat naar een Qwen-model dat op mijn eigen GPU draait, dat kan redeneren én tools aanroepen.
  4. Praten — het antwoord wordt lokaal uitgesproken met Piper (een natuurlijke Nederlandse stem), terwijl de orb meebeweegt op haar stem.

De orb ademt in rust, kleurt warm als ze luistert, wervelt als ze nadenkt en pulseert mee als ze praat. De orb hierboven is precies diezelfde shader — live in je browser, geen plaatje.

Wat Saar kan

Saar is geen chatbot — ze is een agent die dingen dóet:

  • 🗣️ Praten in het Nederlands, met een eigen persoonlijkheid en droge humor.
  • 🧠 Langetermijngeheugen — ze onthoudt dingen over mij (opgeslagen als vectoren in een pgvector-database) en haalt ze vanzelf weer op.
  • 🖥️ De desktop bedienen — programma's starten, vensters beheren, klembord lezen/schrijven, typen, shell-commando's uitvoeren.
  • 🌐 De browser besturen — via het Chrome DevTools Protocol opent ze pagina's, leest ze, klikt ze, en kan ze zelfs zelfgemaakte output (een lijstje, een tabel, een mini-spelletje) in het venster tonen.
  • 👁️ Zien — door de webcam kijken én mijn scherm analyseren met een vision-model.
  • 🏠 Het smart home aansturen — lampen, schakelaars, sensoren en scenes via Home Assistant. "Saar, doe de lamp in de chill room uit."

De hardware

  • "grace" — een NVIDIA DGX Spark (GB10) draait de taalmodellen via vLLM. Het brein.
  • Een LiteLLM-proxy als nette voordeur ervoor (één endpoint, één sleutel).
  • pgvector voor het geheugen en een vision-model (Qwen2.5-VL) voor de ogen.
  • Alles aan elkaar geknoopt met Tailscale, zodat Saar ook werkt als ik niet thuis ben.

De hobbels (de leukste)

Geen project zonder gevecht:

  • Spraakherkenning die op stilte soms onzin verzon en daar dan op reageerde — een berucht artefact van op ondertitels getrainde modellen.
  • Een blank scherm door een subtiele Tauri + Vite timing-quirk (een module die ná DOMContentLoaded laadt).
  • Geheugen-tetris op de DGX om naast het grote taalmodel ook nog een vision-model te proppen.

Elk daarvan was uiteindelijk één regel inzicht — en precies waarom dit soort projecten zo leuk zijn.

De stack

Tauri v2 (Rust) · WebGL2 · whisper.cpp · Piper · vLLM met Qwen3.6 + Qwen2.5-VL · pgvector · Chrome DevTools Protocol · Home Assistant · Tailscale.

Tot slot

Het mooiste eraan: het is van mij. Het luistert lokaal, het brein draait op mijn eigen GPU, en er kijkt niemand mee. Van "kunnen we een Google Home bouwen" naar iets dat veel persoonlijker — en een stuk leuker — is geworden.

En ja, ze heet Saar. Want een Nederlandse naam praat nu eenmaal makkelijker.