veni, vidi — it sees your screen and talks back.
Vidi is a Jarvis-style AI companion that lives in the macOS menu bar. Hold Ctrl + Option anywhere, ask a question out loud, release — Vidi looks at your screen(s), answers in a natural voice, and can fly a blue cursor across the screen to point at the exact UI element it's talking about.
Forked from farzaa/clicky (MIT), then rebranded, hardened, and rewired for the karoslabs stack.
Ctrl+Option (hold) release
│ │
▼ ▼
mic capture ──► Apple on-device speech-to-text (free, local)
│ transcript
▼
screenshots of all displays + transcript
│
▼
vidi-proxy (Cloudflare Worker, auth'd)
/chat ──► GPT-5.2 / gpt-4.1-mini (OpenAI) — Grok brain
selectable server-side via CHAT_PROVIDER
/tts ──► Grok TTS (voice: ara) — ElevenLabs optional
│ SSE stream + audio
▼
spoken answer + [POINT:x,y] cursor fly-to on any monitor
(falls back to on-device Mac voice if TTS is unreachable)
Start with "vidi, …" ("hey vidi" / "ok vidi" work too) and the turn skips
the screen pipeline — no screenshots; the command goes to the local vidi-chat
agent (localhost:4183/api/voice-command), which does the work and streams
back a result that Vidi speaks.
All API keys live on the Worker as Cloudflare secrets — nothing sensitive in
the app. Every Worker route (except GET / health) requires the x-vidi-key
shared secret, so strangers can't burn API credits.
- Renamed everything to Vidi (target
vidi, bundlecom.example.vidi). - Worker auth —
x-vidi-keyshared secret + model allowlist + max_tokens cap. - Grok TTS ($4.20/M chars) as the default voice; ElevenLabs path kept but dormant.
- On-device fallback voice — if TTS fails you still hear the actual answer (upstream's fallback played a promo clip instead of the answer).
- Telemetry stripped — upstream shipped full transcripts + AI responses to the author's PostHog, emails to his FormSpark, and could auto-update itself from his GitHub via Sparkle. All removed (analytics is a no-op stub).
- Apple on-device speech-to-text by default — zero keys; AssemblyAI
streaming still wired if you ever want it (
VoiceTranscriptionProviderin Info.plist). - Models — GPT-5.2 default, gpt-4.1-mini as the cheap/fast option; the
Worker's
/chatis OpenAI-compatible, so Grok (grok-4.1 / grok-4.1-fast) is selectable server-side via theCHAT_PROVIDERvar. - Onboarding flow bypassed; dead code (
OpenAIAPI,ElementLocationDetector) deleted.
Three pieces; the only thing you run beyond the Mac app is a Cloudflare Worker:
- macOS menu-bar app (
vidi/, SwiftUI + AppKit) — status-bar only (LSUIElement, no dock icon). Push-to-talk (Ctrl+Option) and an optional hands-free wake word capture voice; Apple Speech transcribes on-device; ScreenCaptureKit grabs all displays; a transparent overlay flies the blue cursor to[POINT:x,y]targets. TTS plays through a warm audio-engine queue with an on-deviceAVSpeechSynthesizerfallback so answers are never lost. Concurrency is@MainActorthroughout. - vidi-proxy Worker (
worker/, Cloudflare) — the only place API keys live. Every route exceptGET /health requires thex-vidi-keyshared secret and enforces a model allowlist +max_tokenscap. Routes:/chat(OpenAI-compatible vision + streaming, OpenAI or Grok viaCHAT_PROVIDER),/tts(Grok TTS or ElevenLabs), plus the STT / feedback / release helpers. - Local vidi-chat agent (
127.0.0.1:4183) — avidi, …command skips the screen pipeline and POSTs to/api/voice-command; the agent does the work and streams back a result Vidi speaks. Optional; only wake-word commands use it.
There is no telemetry and no auto-update — both were stripped from upstream.
Three steps: stand up the Worker, point the app at it, then build in Xcode.
# 1. Worker (needs Cloudflare login once)
cd worker && npm install
npx wrangler login
npx wrangler secret put OPENAI_API_KEY # platform.openai.com (chat brain)
npx wrangler secret put XAI_API_KEY # console.x.ai (Grok TTS + Grok brain)
npx wrangler secret put VIDI_PROXY_KEY # any long random string you generate; the app must send the same value (see worker/.dev.vars.example)
npx wrangler deploy # note the workers.dev URL
# 2. Point the app at your Worker
# edit vidi/VidiConfig.swift → workerBaseURL (replace REPLACE-SUBDOMAIN)
# 3. Build
open vidi.xcodeproj # set your signing team, Cmd+RFirst launch asks for Microphone, Accessibility, Screen Recording, and Screen Content permissions — grant all four. The app registers itself as a login item (it's an always-on assistant; remove in System Settings → Login Items if unwanted).
- Worker health:
GET /on the vidi-proxy URL returnsvidi-proxy ok(registered with Deploy Guard, slugvidi-proxy). - Repo: github.com/karoslab/vidi