Skip to content
System One

savka777/jev-use

A computer-use harness for macOS that reads the screen through the Accessibility API and lets Jev pick the action, with no vision model in the loop.

jev-use
Image from github.com

savka777/jev-use on GitHub

Stars
93
Forks
16
Language
Swift
License
MIT
Last push
21 Sep 2026

Read from GitHub on . Counts change daily.

jev-use is a voice- and typed-command harness that lets Jev drive macOS directly. You speak or type a command, Jev picks the next on-screen action, and macOS performs it. Instead of taking screenshots and running them through a vision model, the app reads the screen through the Accessibility tree, so there’s no image to interpret and no vision model in the loop.

A hold-to-talk shortcut (Control-Option-Space by default, reconfigurable) starts and stops recording. A hands-free widget instead listens continuously, waiting about 1.5 seconds of silence after you finish speaking before submitting the command, pausing its own microphone while the action runs, then listening again. An optional wake phrase, “Hey Jev,” can start listening in the background without touching the widget at all, either on its own or immediately followed by a command.

Setup requires macOS 14.2 or newer and Xcode, with a TypeSafe API key stored in the system Keychain and separate permission grants for Accessibility, microphone and speech recognition. Apple’s speech recognition may process audio online, the same as with the hold-to-talk shortcut.

How it uses Jev

private static func evaluate(context: CommandContext, candidates: [Candidate], apiKey: String) async throws -> Decision {
    var request = URLRequest(url: URL(string: "https://api.typesafe.ai/v1/systemone")!)
    request.httpMethod = "POST"
    request.setValue("Bearer \(apiKey)", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    request.httpBody = try requestBody(context: context, candidates: candidates)
    let (data, response) = try await URLSession.shared.data(for: request)
    try Task.checkCancellation()
    guard let response = response as? HTTPURLResponse else { throw DecisionError.invalidResponse }
    guard (200...299).contains(response.statusCode) else {
        let object = (try? JSONSerialization.jsonObject(with: data)) as? [String: Any]
        let error = object?["error"] as? [String: Any]
        let validation = (object?["detail"] as? [[String: Any]])?.compactMap { $0["msg"] as? String }.joined(separator: "; ")
        let raw = String(decoding: data.prefix(400), as: UTF8.self)
        let message = error?["message"] as? String ?? object?["message"] as? String ?? object?["detail"] as? String ?? object?["error"] as? String ?? validation ?? raw

View in Sources/JevCore/Decision.swift

Open on GitHub

More like this

Use cases this is tagged with