Skip to content
System One

typesafe-computer-use

macOS computer-use loop that OCRs the screen, classifies the next action with Jev, then clicks. Author reports roughly $0.0002 per step.

awlevin/typesafe-computer-use on GitHub

Stars
935
Forks
75
Language
Python
License
MIT
Last push
23 Sep 2026

Read from GitHub on . Counts change daily.

Reported by the author

Cost/decision
$0.0002, 155xcost per decision $0.0002 $0.032 155x cheapergithub.com
Latency
0.13-0.38smodel latency 0.13 to 0.38 s 5.2 s 14x to 40x fastergithub.com
Per 12-step task
$0.003cost per 12-step task $0.003 $0.40 to $0.90 130x to 300x cheapergithub.com

typesafe-computer-use drives a Mac toward a goal typed in plain English, such as finding the checkout page for the cheapest tickets to an upcoming event. It reads the screen with OCR, which turns on-screen text into machine-readable labels, then asks Jev which action to take next from that reading. A writing model such as Claude only gets called when a text field needs free text, or when Jev’s classifier has stopped and the screen needs a fresh read.

Aaron Levin built the project around Jev’s role as a choice model: given up to 255 options, it returns a full probability distribution and a calibrated confidence score in a few hundred milliseconds, with no output tokens to pay for. Most steps in a desktop task do not need open-ended reasoning, just one choice from a short list, made quickly.

Levin measured Jev against Claude Opus 5 on the same screenshot and goal, one decision each. Jev came in at $0.0002 per decision versus $0.032 for Opus, about 155 times cheaper, and 0.13 to 0.38 seconds of model latency versus 5.2 seconds, 14 to 40 times faster. Across a full 12-step task, Jev cost about $0.003 versus $0.40 to $0.90 for the frontier model. Levin notes a real limit here: Opus could read event dates off the screen and compare them unaided, while the classifier needed that date parsing built in as separate, deterministic code. The project is in beta and drives the real mouse and keyboard, so Levin recommends starting with a dry run.

How it uses Jev

    def system_one(self, **request):
        with self._calls.record(CLASSIFIER):
            return self._client.system_one(**request)


class MeteredWriter:
    """The Anthropic client, counting each request. `messages.create` is the only call the package makes."""

    def __init__(self, client, calls: Calls):
        self._client = client
        self._calls = calls
        self.messages = SimpleNamespace(create=self._create)

    def _create(self, **request):
        with self._calls.record(WRITER):

View in typesafe_computer_use/calls.py

Open on GitHub

More like this

Use cases this is tagged with