Back to projects

bruno

Calm, minimal macOS desktop companion

A floating orb with local voice, multi-provider LLM, and screen-aware nudging.

View on GitHub↗

Demo

terminal
$ cargo run -p bruno-app
> loading orb shaders...
> initializing whisper STT...
> connecting to Azure LLM...
> starting screen daemon...
✓ bruno is listening (⌘⇧B to toggle)

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

Screen Capture
Vision Classification
Nudge Policy
Voice / LLM Agent
Floating Orb

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-app

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

Repository

View on GitHub

Links