human(ish)

Use a local coding agent

Run a synthetic participant through your signed-in Codex or Claude Code, with explicit usage and credential boundaries.

Finish the installation first, including the @e2b/desktop peer.

A live study normally needs a model provider API key. If you already have a coding agent signed in (Codex on a ChatGPT plan, Claude Code on a Max plan), humanish can use it as the participant's brain instead, and then the only credential it needs is E2B_API_KEY.

npx humanish doctor

Replace the actors block in your own-app lab with this fragment. Keep a finite execution.timeoutMs; API-model dollar caps do not bound your subscription usage. Review those caps when changing providers.

actors:
  - type: local-agent   # instead of openai-computer-use
    localAgent: codex    # use claude for Claude Code
    persona: synthetic-new-user
    mission: >-
      Try the app as a newcomer. Complete its primary task, then report what happened.

localAgent chooses the installed CLI (codex is the default); model is a separate optional model selection passed to that CLI. Before launching a desktop, Humanish checks that the chosen CLI is installed and its expected credential file is present; that is not a fresh authentication test.

Where execution happens

Humanish's local-agent discovery checks credential-file existence without reading its contents. The authenticated coding CLI still runs on your host and uses its own sign-in state.

Humanish starts it in a scratch directory with read-only restrictions for Codex or --allowedTools Read for Claude Code, and supplies a screenshot for each turn. The returned desktop actions execute in E2B. The local CLI remains a host process under those configured restrictions; they are not a separate sandbox for everything the CLI can access.

Usage and limitations

  • It is not free. Subscription usage consumes your own plan. Runs driven this way can have estimatedCostUsd: null because token usage or a matching model rate is unavailable. Claude Code sessions can report token counts; those counts are not a subscription invoice. Inspect the recorded model and missing-cost reason instead of treating an unpriced run as $0. Rate limits on those plans are built for interactive coding; humanish fails closed with the CLI's own message and does not retry into them.
  • It is slower. Launching and communicating with a local CLI adds latency. Give the lane enough execution.timeoutMs for the task and inspect elapsed time in its evidence.
  • The evidence says which brain ran it. The trace records ids.model: "codex app-server (local, operator-authenticated)" or "claude (local, operator-authenticated, one session per run)", so a local-agent run is never silently compared against an API one.
  • Both agents keep one conversation for the whole run. Codex through an app-server thread, Claude Code through one claude -p stream-json session. A participant that starts every turn cold cannot remember trying the menu and tries it again; measured on one lab, that was 188 actions over 90 turns and no finish against 21 actions over 8 turns. HUMANISH_LOCAL_AGENT_ONE_SHOT=1 keeps the cold-start path for the Claude agent as a measurement switch, so "remembers" can be compared against "does not" on your own lab; the trace's ids.model says which ran.

Use the budget guide to distinguish model estimates, plan usage, and desktop costs.

Edit this page on GitHub