A voice assistant for my KDE Plasma desktop, living as an animated cartoon clock. Say “Hey Minutes” and she listens, works out what you meant through three tiers of brains (instant rules, a local GPU model, then a cloud model), does it, and answers out loud. Wake word, speech-to-text and voice all run locally.
- 0
- technologies
- 0
- shipped features
- 0
- screens
- 0
- decisions logged
Repository is private — source kept secured
7 sections below
Pick a request and watch it take the same path it takes on the desktop: wake word, transcription, one of three brains, the skill, the spoken answer. The replies here are scripted from her real routes and skills. The character is a straight port of her QML, so this is her, not a lookalike.
Miss Minutes
Your desktop companion
Ready when you are
Miss Minutes
Pick something to ask me, sugar.
Say “Hey Minutes” · Meta + M
Tap her · she has opinions
Ask her something
What happens on the desktop
- 1
Wake wordVosk · tiny grammar, always listening
- 2
TranscribedSilero VAD → faster-whisper on CUDA
- 3
Routedrules → local brain → cloud brain
- 4
Did itPython skills · KDE · D-Bus · Spotify
- 5
AnsweredKokoro neural voice + WebSocket → QML
- 1
You
“Hey Minutes”
Vosk, always listening, tiny grammar
Meta + M / tap
KWin script → D-Bus
minutes ask …
CLI over D-Bus
- 2
Hear
Silero VAD
records until you stop, keeps audio said during model load
faster-whisper
speech → text on the GPU (CUDA)
- 3
Think
Rules
regex router · router.py
Local brain
Qwen3-1.7B on Ollama · GPU
Cloud brain
Gemini via Antigravity CLI
- 4
Do
~50 skills
apps, Spotify, focus, dev tools, reminders
Approval gate
shell commands wait for a clear yes
- 5
Answer
Kokoro TTS
local neural voice, streamed by sentence
Widget + overlay
QML character over a loopback WebSocket
1. Rules
regex router · router.py
Time, date, timers, volume, apps — anything with a fixed shape
≈ 0.01 s measured
2. Local brain
Qwen3-1.7B on Ollama · GPU
Loose phrasing that still maps to a skill, and small talk
under a second when warm
3. Cloud brain
Gemini via Antigravity CLI
Anything that needs knowledge, writing, or memory of you
≈ 4 s warm · 16 s cold, measured
Each tier handles what it can and hands off the rest. The local model's prompt is generated from the same skill list the cloud brain uses, so the two never disagree about what she can do. It is tested against an evaluation set worded differently from the prompt's own examples, so it can't pass by memorising them.
- 281
- passing tests
- ~50
- skills
- 8
- moods
- 3
- brains
- 0.01 s
- rule answers
- ≈ 4 s
- warm cloud answers
Voice
- Wake word
- Vosk with a restricted grammar: “hey minutes”, “hey minute”, “miss minutes”
- Speech end
- Silero VAD; recording starts at the wake word's acoustic end
- Speech to text
- faster-whisper (small, CUDA), loaded on demand
- Voice
- Kokoro-82M: Heart, Nova, Bella, Emma… and blends of them
- Interruptions
- talk over her and she stops (barge-in)
Brains
- Rules
- about 700 lines of ordered regex, speech clean-up, “and then” planning
- Local
- Qwen3-1.7B on Ollama, JSON schema, GPU memory guard
- Cloud
- Gemini through a warm Antigravity session, web snippets when needed
- Modes
- Auto · Local only (no cloud at all) · Cloud
- Deep
- “think harder about …” switches to the stronger model
Memory & care
- Remembers
- people, birthdays, plans, likes, habits (local JSON)
- Follows up
- how the interview went, birthdays, a check-in after a rough day
- Nudges
- a break after ~90 min of non-stop work; once a night after 1 AM
- Respects
- mute, focus sessions and quiet hours
Safety
- Shell
- proposed commands are shown and need a clear yes; “okay, don't” is a no
- Cancel
- every turn has its own token; late cloud replies can't act
- Local only
- blocks every cloud path, including clipboard AI and commit messages
- Honesty
- if the budget runs out she says so out loud, never hangs
Runs as
- Service
- systemd user unit, restarts on failure, survives sleep
- APIs
- D-Bus org.minutes.Assistant · WebSocket on 127.0.0.1
- Surfaces
- Plasma widget · Meta+M floating overlay · CLI
- Resources
- speech models in a child process that unloads when idle
Everything she can do
Desktop
Music & web
Developer
Productivity
Companion
Stays on the computer
The microphone, wake word, transcription and voice. Rule answers and the local brain. Memory, reminders, history and logs are files in the home folder.
Leaves only when needed
Cloud answers send the question with relevant memory and recent context. Clipboard AI and commit messages send what you asked about. Local-only mode turns all of it off.
Miss Minutes is a personal assistant that lives on my Linux desktop as a widget and a floating Meta+M overlay. She is a hand-built QML character, a flat orange clock with lashed eyes, rubber-hose arms and white gloves, rendered as a glowing hologram. She has eight moods (idle, listening, thinking, speaking, acting, confirming, sad and sleeping), each with its own pose. Her mouth follows her voice level, her hour ticks light up as a mic meter while she listens and chase around while she thinks, she hops through a ripple of “time-door” rings when she does something, and she does a little hop at the top of every hour.
How a request flows: Vosk listens continuously for “Hey Minutes” with a tiny grammar. Silero VAD records the command, picking up audio spoken while the models were still loading, and faster-whisper transcribes it on the GPU. The text then goes through three routing tiers. First is a 700-line regex router with speech clean-up and compound-command planning, which handles time, timers, volume and apps instantly. Unmatched requests go to “minutes-brain”, Qwen3-1.7B on Ollama with a generated prompt and a strict JSON schema, which either picks skills, makes small talk, or hands off. Anything that needs knowledge goes to Gemini through the Antigravity CLI in a warm session, with web snippets when needed. The reply is spoken by Kokoro TTS while the UI updates over a local WebSocket.
She can do around fifty things: open and close apps, play songs, artists and playlists on Spotify, set reminders that survive restarts, run focus sessions with Do Not Disturb, check battery and system load, toggle Wi-Fi and Bluetooth, take screenshots, and keep the screen awake. As a developer assistant she can open projects in VS Code, start dev servers, run tests, builds and lint, show git status, write a stand-up summary, draft commit messages, and report pull requests, CI and Vercel deploys. She can also explain, review or translate the clipboard.
She remembers. Personal facts, people, important dates, likes and plans you mention are kept in a local JSON memory, and she follows up on them: how did the interview go, a birthday reminder, a break nudge after 90 minutes of non-stop work, a check-in the day after a rough one. All of this respects mute, focus and quiet hours.
Safety is built in, not bolted on. Shell commands proposed by the cloud model are shown and need explicit approval; a conservative parser lets negative or ambiguous wording win (“okay, don't run it” never runs it). Every turn carries its own cancellation token, so a late cloud reply can't fire actions after you've interrupted. Local-only mode blocks every cloud path, including clipboard AI and commit-message drafting.
Engineering: a Python daemon (PySide6) runs as a systemd user service, exposes a D-Bus API (org.minutes.Assistant) and a CLI (minutes ask / say / listen), and keeps speech models in a child process that unloads after inactivity. A KWin script binds Meta+M. Ollama starts on demand and is stopped when idle, and the GPU guard skips the local model when memory is tight. 281 tests cover routing, the local brain, memory, safety, wake timing and latency budgets. Measured on my machine, deterministic answers take about 0.01 s and warm cloud answers about 4 s.
- Hand-built animated QML character with 8 moods, lip-sync to voice level, blinking, glances and hologram effects
- Fully local speech: Vosk wake word, Silero VAD, faster-whisper on CUDA, Kokoro neural voice
- Three-tier brain: instant regex router → Qwen3-1.7B on Ollama (JSON schema) → Gemini via Antigravity
- About 50 skills: apps, Spotify, reminders, focus mode, Wi-Fi/Bluetooth, screenshots, weather, screen time
- Developer skills: open projects, dev servers, tests/builds, git status, stand-ups, commit messages, PRs, CI and deploys
- Personal memory with caring follow-ups: birthdays, plans, break nudges, quiet hours
- Safety: approval for shell commands, per-turn cancellation, a local-only mode that blocks every cloud path
- systemd service + D-Bus API + CLI + KWin Meta+M hotkey + Plasma widget; 281 passing tests
The section above says what this does. This one says why it is built the way it is — including the parts that did not come free.
- Three tiers: deterministic rules → a 1.7B local model on the GPU → a cloud model, each handing off only what it can't dooverSend everything to one cloud modelRun one large local model for everythingBecause
The rules answer in about 10 ms with zero hallucination risk. The small model handles loose phrasing (“crank the tunes up a bit”) in well under a second, and the cloud is used only when it adds value. Both brains read their skill list from one source, so they always agree on what she can do.
What it costThree places a request can be misrouted, so an evaluation set (model/cases.jsonl), separate from the prompt's own examples, is needed to keep the local model honest.
- Trust Vosk's acoustic word-end timing, start recording immediately, and give Whisper the whole command insteadoverAdd more spelling aliasesRaise the Vosk confidence barBecause
Whisper is good at sentences and bad at spelling a made-up name from half a second of audio. Keeping the audio spoken while models load means nothing is lost.
What it costThe lightweight recogniser now gets continuous idle audio, about 3% of one CPU core.
- A conservative confirmation parser where any negative or ambiguous wording rejectsoverMatch YES before NOAuto-run “safe-looking” commandsBecause
Executing is the irreversible side, so only an explicit, unambiguous yes approves, and the WebSocket API requires a JSON boolean true.
What it costShe sometimes asks twice when you meant yes.
- A faster model for ordinary questions, a 30-minute warm session, and a 25-second budget shared across retries, fallbacks and web lookupsoverAlways use the strongest modelKeep every model loaded all the timeBecause
Measured on my machine: 16 s from a cold start, about 4 s once warm. When the budget runs out she says so out loud instead of hanging, and “think harder about …” still reaches the deep model.
What it costThe warm session holds memory between questions, and very long answers need an explicit request.

01 / 11Speaking, listening and acting
open full size ↗Seen enough?
There are more where this came from — or skip the browsing and just say hello.

