Skip to content
MrJev

Jev Voice

Local whisper.cpp for the transcript, then one Jev request picks the action and its typed arguments; code owns execution.

View on GitHub →

Hands-on review

Talk to your Mac and one request turns the transcript into an action. Follow the install instructions and every sentence in the room is sent, named or not.

Good for

  • A readable example of fanning eighteen questions out in one request
  • Picking the text to type out of the transcript instead of generating it

Watch out for

  • The documented `.env` turns both wake-word gates off; the code's own defaults are 0.7
  • The transcript is sent before anything decides whether it was addressed to the computer
  • `empty trash` runs with no confirmation, and there is no policy layer at all

Tested Sep 20, 2026 at cc69795 · Python in Docker against a local stand-in; macOS-only, so execution paths were read rather than run

How we reviewed this: we drove its real modules in Docker against a local stand-in and captured the outbound payload. It is macOS-only, so the execution paths — osascript, Quartz, whisper.cpp on Metal — were read, not run, and none of the README’s latency figures could be checked. We made no Jev calls.

What it does

The microphone stays open, whisper.cpp transcribes locally, and one request asks Jev eighteen questions at once: which of fourteen actions this is, which app, which site, which shortcut from a list of 43, and — nicely — which span of the transcript is the text to type, rather than asking a model to write it. Code executes the answer.

The fan-out is the idea worth taking. One round trip produces a whole plan.

The wake word is documented but not enforced

The README says:

the mic stays open and whisper transcribes every utterance locally (~100 ms, nothing leaves the machine). Only utterances that name the assistant (WAKE_WORDS in .env, default Alfred / Jarvis) go to Jev.

Two things are wrong with that sentence.

First, the ordering. When an utterance has no wake word, the code does this:

# No name: let Jev judge whether this is a command for the computer at all.
gate = s.brain.evaluate(text)
ok_cmd = (gate.args.get("addressed", 0) >= UNNAMED_MIN_ADDRESSED
          and gate.confidence >= UNNAMED_MIN_CONFIDENCE)

evaluate() is the request. The transcript has already left the machine before anything judges whether it was meant for the computer.

Second, the thresholds. The code’s own defaults are 0.7 and 0.7. The .env.example that the README and the setup script tell you to copy contains:

UNNAMED_COMMANDS=1
UNNAMED_MIN_ADDRESSED=0
UNNAMED_MIN_CONFIDENCE=0

Both comparisons become >= 0, so the gate always passes. Install it as documented and every sentence spoken near the microphone is sent, and any of them that Jev classifies as an action with confidence above 0.35 is executed — no name, no confirmation. Reported. The addressed probability is computed, printed, and then ignored.

There is no policy layer

Not a reduced one. None. There is no allow-list, no blocked-command list, no confirmation step, and no word matching “confirm” anywhere in the action module. The only gate on execution is a single confidence threshold of 0.35, and behind it sits:

if op == "empty_trash":
    _osascript('tell application "Finder" to empty trash')

Compare macbrow, reviewed in the same batch, which puts empty trash on a blocked list and ships a deliberately blocked seed tool to prove the policy fires.

What does leave the machine is narrower than its peers, at least: the transcript, the frontmost app, and the list of installed apps. It never reads the screen, so no window titles or field values. Nothing is redacted or truncated. If you have ElevenLabs configured, the spoken replies — which contain your search terms and note titles — go to a second vendor and are cached as MP3s.

Verdict

The eighteen-question fan-out is a good pattern and the span-picking is the right instinct. Everything around it is a weekend’s work: one commit, no tests at all, no CI, created and pushed within five seconds.

If you run it, set UNNAMED_MIN_ADDRESSED and UNNAMED_MIN_CONFIDENCE back to the 0.7 the code intended, and know that the trash can be emptied by a sentence you did not address to anything.

For the same idea with a policy layer, see macbrow; for screen reading instead of transcripts, jev-use.

See how it compares with other tools in Best Jev tools, tested hands-on.

Review updated Sep 20, 2026. Numbers quoted from the project are its author's own; we don't publish our own measurements of Jev.

More in Browser & Computer Use

jev-ultrafast

★ 24k▲ 400

browser-use/jev-ultrafast

Fast browser agent from Browser Use. Jev decides each step and which element to act on; a small model is called only when text needs to be typed. The authors report a full Google Flights search in about 7.1 seconds.

PythonReviewed

agent-desktop

★ 8.5k▲ 6.6k

vercel-labs/agent-desktop

macOS desktop automation over accessibility trees. Since v0.9.2, its jev-desktop scripts let Jev choose which control to operate and which action to take.

RustReviewed

typesafe-computer-use

★ 1.3k▲ 16

awlevin/typesafe-computer-use

macOS computer use without sending screenshots to a large model. The screen is read deterministically and Jev picks the next action.

PythonReviewed

Get new Jev projects every week

New Jev releases, pricing changes, and the best new projects, once a week. No spam; unsubscribe anytime.

Powered by Buttondown. See our privacy policy.