bruno
Calm, minimal macOS desktop companion
A floating orb with local voice, multi-provider LLM, and screen-aware nudging.
Demo
Problem
ADHD attention doesn't follow timers — it fluctuates. Productivity tools that ping on a schedule create alarm fatigue and break focus. Most AI assistants are either voice-only chatbots or rigid schedulers.
Neither understands what's on your screen or whether you're actually focused.
What it is
bruno is a macOS desktop companion — a floating orb rendered on the GPU that:
- captures your screen and classifies what you're doing (on-device vision)
- nudges you when you drift — with shame-free, adaptive voice
- talks to you via local STT/TTS (whisper + Apple/Piper)
- responds through a tool-using agent with web browsing and RAG memory
- respects hyperfocus, quiet hours, and snooze windows
All behavioral data stays on your Mac. No audio, no screenshots, nothing leaves the device.
Features
Local Voice
Whisper STT + Apple/Piper TTS, all on-device. No audio leaves your Mac.
Multi-Provider LLM
Azure, OpenAI, Claude, Ollama, LM Studio — streaming chat with vision.
Screen-Aware Nudging
On-device vision detects when you drift off-task. Shame-free, adaptive.
Agent + Memory
Tool-using agent with web browsing and Veclite-backed RAG memory.
Neurodivergence-Aware
ADHD/autistic profiles, hyperfocus protection, quiet hours, snooze.
GPU Orb
winit/wgpu floating orb with mood-reactive shaders.
Architecture
Workspace
bruno is a Rust workspace with six crates:
- bruno-app — desktop app: GPU orb, HUD, global hotkey, event wiring
- bruno-ai — multi-provider LLM layer (streaming chat + vision)
- bruno-voice — STT (whisper.cpp, Apple fallback) + TTS (Apple, optional Piper)
- bruno-daemon — screen capture + relevance classification
- bruno-orb — orb renderer (shaders, moods)
- bruno-core — shared event bus, intents, startup gating
Config
~/.config/bruno/config.toml
[ai] provider = "azure" [ai.azure] endpoint = "https://<resource>.cognitiveservices.azure.com" api_key = "..." deployment = "gpt-5-mini" [stt] backend = "auto" # whisper, Apple fallback [tts] backend = "apple" # apple | piper [neuro] profile = "adhd" nudge_cooldown_secs = 600 quiet_hours = "22:00-08:00"
Nudge policy behaviour
- cooldown between nudges: 10 minutes
- max nudges per hour: 4
- snooze window: 30 minutes
- hyperfocus protection: on
- quiet hours: 10pm – 8am
- tone: gentle, shame-free
Build
cargo build --workspace && cargo run -p bruno-appWhy I Built This
I wanted a desktop companion that actually understands what I'm doing — not just a chatbot that waits for me to type, and not a rigid Pomodoro timer that interrupts flow.
bruno watches my screen, notices when I drift, and nudges me gently. It talks, remembers, and adapts — all locally.