Voice and typed computer use for macOS. You say what you want. Jev picks the next on-screen action. macOS performs it. No screenshots: the app reads the screen through the Accessibility tree.
Requires macOS 14.2+ and Xcode. No dependencies.
bash build.sh
open "$HOME/Applications/Desktop Voice.app"In setup: save your TypeSafe API key (stored in the Keychain), then allow Accessibility, microphone and speech.
Hold Control–Option–Space, speak, release. Change this combination in Settings → Choose your voice shortcut → Change shortcut; press the key and any modifiers you want. Your choice is saved across launches. Escape cancels recording, and a conflicting shortcut leaves the previous choice in place. macOS-reserved combinations and modifier-only shortcuts are not supported. Escape cancels. Or type a command in the widget, or from a shell: scripts/say.sh "Open Finder".
Click Start hands-free in the widget. Speak a command and pause for about 1.5 seconds to submit it. The app waits for Apple's final transcript before acting, pauses its microphone while executing, then listens for your next command. Idle listening sessions renew automatically. Ordinary hands-free mode is off at launch. If wake-word activation is enabled, background wake-word listening starts after setup is ready.
Click Hands-free on · Stop, press Escape, or open Settings to stop the active hands-free session. With wake-word activation enabled, closing the widget or opening Settings returns to background wake-word listening. A microphone, recognition, or command error also stops it and shows the problem. Apple Speech may process audio online, as with hold-to-talk.
Enable Invoke the widget by saying “Hey Jev” in Settings. This immediately starts listening in the background while the app is running; no widget click is required. The saved option also starts wake-word listening after app launch once setup is ready.
Say “Hey Jev” on its own or followed by a command, such as “Hey Jev, open Finder”. The widget appears when the phrase is recognized, and hands-free stays active until you stop it. Closing the widget or opening Settings returns to background wake-word listening. Stop or Escape pauses all listening; use Resume wake-word listening in the menu bar to resume. Turn the setting off to disable automatic wake-word activation.
The phrase must begin the recognized utterance. Unrelated speech is discarded while waiting, without sending commands or screen context to Jev. Wake-word listening uses Apple Speech and may process audio online; it is not a dedicated offline wake-word engine.
- "Open Obsidian, create a new note and type hello"
- "Go to youtube.com, search Rick Astley and play the first video"
- "Open 3 new tabs"
- "Scroll down three times"
- "Tile all the Brave windows so none are stacked"
- "In every Brave window, go to wikipedia.org and search for accessibility" — Jev works out the steps once, code repeats them in each window
- "Close the window", "Save", "New tab" — any item in the app's menu bar
One loop, about 0.3–1.5 s per step:
- Read. Walk the front app's Accessibility tree (~120 ms). Every element describes itself: what it is, its name, its value, where it sits, what it can do. No per-app code.
- Choose. One request to Jev (
jev-latest): the goal, the numbered targets, the last ten actions and their effects. Jev selects an operation and a target. It never generates free text; typed text is a span of your sentence. - Act. Press, select, type, menu, key, scroll, open, arrange windows.
- Check. Read the screen again. Report the real effect. Repeat until DONE, BLOCKED or WAIT.
Low-confidence and destructive picks stop and ask instead of acting.
To https://api.typesafe.ai/v1/systemone: your command, the app and window names, the on-screen targets with their labels and values, and recent actions. Secure text fields are excluded. No screenshots. Speech uses Apple Speech.
Everything is logged locally: log show --predicate 'subsystem == "local.jev-use"' --last 10m --info
swift test # requires XCTest from full Xcode
bash scripts/check-desktop.sh # focused checks; Command Line Tools are sufficient
bash build.sh # quit the app first