Instant feedback from
real human(ish) users

Personas drive your app in a real browser on a hosted sandbox desktop. Runs land in your repo under .humanish/: screenshots, action traces, lifecycle events, estimated cost at dated rates. humanish verify grades the bundle fail-closed.

$npx humanish
First run, in order
npm i -D humanishnpx humanish init --yesnpx humanish watch
npx humanish prints the commands · MIT licensed

For coding agents: npx skills add danielgwilson/humanish

Lane 01 · diagram-login-flowPassed
Lane 01 screenshot: Excalidraw canvas with two rectangles labeled Login and Dashboard connected by an arrow
Final report"Done"

User testing for the users you can’t recruit

Four missions drove Excalidraw

This is run cua-2026-08-07T17-44-48-760Z-87389419: four computer-use lanes on hosted 1920×1080 desktops, driving a commit-pinned clone of Excalidraw, an open-source virtual whiteboard. 3/4 lanes passed; one gave up; verify ran 16/16 checks. Every number and quote below is read from that run’s bundle.

Source
.humanish/runs/cua-2026-08-07T17-44-48-760Z-87389419
gitignored · the same directory your own runs write to
Date
2026-08-07
Subject
excalidraw/excalidraw · commit-pinned
Lanes
3/4 passed
Verify
16/16 checks
Status
local_only
Wall-clock
6m 06s
Est. cost
~$1.54 · estimated (rates as of 2026-08-05)

Scroll — the run advances in steps

00brief · the lablab.yaml
Subject
Excalidraw
Desktop
hosted · 1920×1080
Lanes
4 · parallel
Date
2026-08-07
run: cua-2026-08-07T17-44-48-760Z-87389419
date: 2026-08-07
subject:
  # open-source virtual whiteboard
  app: Excalidraw
  clone: excalidraw/excalidraw · commit-pinned
desktop: hosted sandbox · 1920×1080
lanes:
  - 01 diagram-login-flow
  - 02 sticky-notes
  - 03 sketch-shapes
  - 04 export-drawing

The labOne YAML lab declares the persona, its four missions, and a commit-pinned Excalidraw clone. Each lane gets its own hosted 1920×1080 desktop.

01diagram-login-flowobserver · replay
Keyframe from lane diagram-login-flow: the Excalidraw canvas on the sandbox desktop with two rectangles labeled Login and Dashboard connected by an arrow

Final report — verbatimDone

Passed
02sticky-notesobserver · replay
Keyframe from lane sticky-notes: the Excalidraw canvas on the sandbox desktop with three colored to-do notes — Draft plan, Call team, Buy supplies

Final report — verbatimDone.

Passed
03sketch-shapesobserver · replay
Keyframe from lane sketch-shapes: the Excalidraw canvas on the sandbox desktop with an ellipse, a rectangle, stray line strokes, and the freehand tool panel open — the lane gave up here

Recorded reason — verbatimgave up: 8 consecutive turns with no change to the UI state

Gave up
04export-drawingobserver · replay
Keyframe from lane export-drawing: the Excalidraw canvas on the sandbox desktop with a single large rectangle, deselected after the export flow

Final report — verbatimDone

Passed
05bundle · evidence.humanish/ · gitignored
.humanish/runs/cua-2026-08-07T17-44-48-760Z-873894194 lanes
screenshotsevery screenshot each lane saw · 28 frames
action tracesordered, end to end
lifecycle eventslaunch to landing
estimated cost~$1.54 · estimated (rates as of 2026-08-05)
wall-clock6m 06s · run created → last lane landed

Where it landsThe run lands in gitignored .humanish/: every screenshot each lane saw, ordered action traces, lifecycle events, and estimated cost at dated rates.

06verify · share-safetyfail-closed

$ humanish verify

ok redaction passed

ok actor engagement: live actor traces that claim goal_satisfied carry at least one action or message

ok actor verdict consistency: live pass verdicts do not hide failed, blocked, or timed-out actor traces

… 13 more checks

16/16 passed → status: local_only (RAW_SCREENSHOTS)

The gatehumanish verify grades the bundle fail-closed. This run: 16/16 checks passed — and the bundle still grades local_only, because it holds full-fidelity screenshots. Publishing these crops was a reviewed, deliberate act.

Verify passed 16/16, and the bundle still grades local_only: it holds full-fidelity screenshots, which the share-safety gate never marks share-ready as-is. Publishing these crops was a reviewed, deliberate act.

In lane sketch-shapes, freehand strokes produced no change to the UI state for 8 consecutive turns, and the persona gave up.

Excalidraw is the application studied; it is not a Humanish adopter or endorser.

Subagents critique your code.
Personas use your app.

You already run subagents against your code. These four commands do the same for the app you ship: personas and missions declared in a YAML lab, an evidence bundle per run.

humanish init

Scaffold a lab in YAML: personas, missions, and the app under test, either a repo to clone or a URL you own. --yes takes the defaults.

humanish watch

Run every lane on hosted sandbox desktops. Your app does not need to be deployed or already running: the sandbox clones your repo, builds it, and serves it. Watch live in Observer; replay any lane after.

humanish verify

Grade the bundle against public-safety gates, fail-closed: share_ready, local_only, or blocked.

humanish feedback issue

Render a public-safe GitHub issue draft from the bundle.

All four commands need Node 20 or newer. Hosted desktops also read OPENAI_API_KEY and E2B_API_KEY from your environment.

humanish watch with no lab argument renders a synthetic evidence bundle and Observer locally, without keys or provider spend.

Four things humanish cannot do

01

Keys never enter the sandbox

The actor’s API key stays on your machine; the sandbox desktop never holds it.

02

Bundles stay local

Evidence lands in gitignored .humanish/; no command publishes it.

03

Feedback can’t touch GitHub

feedback issue renders a draft; no GitHub API call exists on that path.

04

Verify fails closed

A bundle that can’t pass every gate grades local_only or blocked, never share_ready.

Started on a patient intake

humanish started on a chat-based patient intake. Testing one long flow meant recruiting five ADHD patients: pay a panel and wait days for thin feedback on one slice of a build. A later product’s users are AI agents; there’s no panel for that. When you can recruit real users, do that. humanish covers the runs that otherwise never happen.

Test the build you have open.

npm i -D humanish · npx humanish init --yes · npx humanish watch — then open .humanish/ and read what your personas saw.