All projects
DesktopOct 2026 — ongoing· Solo developer

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

01Talk to her

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

Auto

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. 1

    Wake wordVosk · tiny grammar, always listening

  2. 2

    TranscribedSilero VAD → faster-whisper on CUDA

  3. 3

    Routedrules → local brain → cloud brain

  4. 4

    Did itPython skills · KDE · D-Bus · Spotify

  5. 5

    AnsweredKokoro neural voice + WebSocket → QML

02How she works
  1. 1

    You

    “Hey Minutes”

    Vosk, always listening, tiny grammar

    Meta + M / tap

    KWin script → D-Bus

    minutes ask …

    CLI over D-Bus

  2. 2

    Hear

    Silero VAD

    records until you stop, keeps audio said during model load

    faster-whisper

    speech → text on the GPU (CUDA)

  3. 3

    Think

    Rules

    regex router · router.py

    Local brain

    Qwen3-1.7B on Ollama · GPU

    Cloud brain

    Gemini via Antigravity CLI

  4. 4

    Do

    ~50 skills

    apps, Spotify, focus, dev tools, reminders

    Approval gate

    shell commands wait for a clear yes

  5. 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.

03The assistant
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

open / close appsvolumebrightnessWi-FiBluetoothlockscreenshotkeep awakeopen folderssearch files

Music & web

play a songplay an artistplaylistspause / nextnow playingYouTubeGoogleweatherDiscord channels

Developer

open a projectdev serverstest / build / lintlast loggit statusstand-up summarycommit messagesPRsCI statusVercel deploysGitHub streak

Productivity

reminders that survive rebootsfocus + Do Not Disturbto-dosscreen timebatterysystem loadclipboard: explain / review / translate

Companion

jokesfun factsgreetingsbirthday reminders“how did it go?” follow-upsbreak nudgeslate-night check-ins

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.

04Overview

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.

05What it does
  • 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
06Calls I made

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.

  1. 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 everything
    Because

    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 cost

    Three 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.

  2. Trust Vosk's acoustic word-end timing, start recording immediately, and give Whisper the whole command insteadoverAdd more spelling aliasesRaise the Vosk confidence bar
  3. A conservative confirmation parser where any negative or ambiguous wording rejectsoverMatch YES before NOAuto-run “safe-looking” commands
  4. 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 time
07Screens
Miss Minutes - Desktop Voice Assistant — Speaking, listening and acting

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.