Jarvis
A local-first assistant on my desktop. Wake word, local model, and a memory file I can edit by hand.

Why I built it
I wanted an assistant that lives on my desktop instead of in someone else's cloud — a HUD that's there when I glance at it, answers to a wake word when my hands are busy, and doesn't need an account or a subscription to check the weather. Layer one is the always-on core: weather, news, reminders, timers, Spotify control, a daily briefing. Layer two adds the voice — “Hey Jarvis”, local speech-to-text, and an LLM that picks its own tools rather than me hardcoding every command.
Local first, cloud second
The model runs locally through Ollama by default; cloud models are a fallback, not the default path. That was a deliberate constraint — I wanted the core loop to keep working with no network and no API key, and only reach out when I explicitly want more capability than my machine can give it.
Memory as a file, not a database
Conversation history is an append-only log. Durable facts about me live in a separate, hand-editable profile.md — filled in through a guided interview, but always something I can open in a text editor and correct myself. I didn't want a memory system I couldn't audit.
Voice as an added layer, not the interface
Everything voice can do, typing can do too — the wake word is a convenience, not a requirement. That decision made the whole project easier to debug: I could build and test layer one completely before layer two's speech pipeline had to work at all.
What I'd tell someone building this
Build the typed interface first, even if voice is the whole point. Every skill I added — timers, Spotify, the briefing — got tested through text before I ever spoke to it, and that caught more bugs than testing the wake word ever did.