interactive-study concern, not a media or chatbot
one.
When you need it
Aninteractive study sends simulated people through a real cloud browser pointed
at the iteration’s URL. If that browser cannot load the page, the simulation has
nothing to react to. Site access closes that gap for the three common ways a URL is
gated:
- A staging site behind HTTP basic auth (the browser dialog that wants a username and password before any page loads).
- A preview link gated on a session cookie: a Vercel preview, a Lovable preview, anything that checks for a token cookie and otherwise shows a wall.
- A site behind a login form: a real sign-in page the participant fills in and submits to reach the part of the product under test.
Public versus gated
ish does not require you to declare that a public site is public. The default is that no credentials are attached and the browser loads the URL as any anonymous visitor would. The one thing the public method adds is an explicit affirmation: you are telling ish, on the record, that this site needs nothing. Tools and UI read that flag to stop nudging you about credentials on a site you have already confirmed is open. That makes “public” a real, separate state, not the absence of configuration:
The two are mutually exclusive by design: a site you just handed a password to is
not one you are also calling open. Saving any credential (basic auth, cookie, or
login) withdraws the site’s public affirmation, and affirming a site public is
refused while it still holds a credential.
The four methods
Each method matches how the gate actually works. Pick the one that describes the wall in front of your URL. Every method belongs to one site.Basic auth
Basic auth
HTTP basic auth: the credentials the browser sends before any page renders,
the username and password behind the native browser prompt. Configured as a
username plus a password. ish presents them to the origin the run opens, so
the page loads.
Login form
Login form
Username and password for a real sign-in form. Unlike basic auth and cookie,
these are not handed to the browser up front: the participant types them into
the site’s own login page if it meets one during the task, the way a real
person signs in. The login belongs to its site, so only runs on that site see
it. It is the only method a native app site takes.
Public
Public
Not a credential. An affirmation that the site needs no access at all, which
silences the prompt asking whether it does.
Sites and hosts
A site is a place your studies go: a web site, identified by its host, or a native app, identified by its app artifact (the bundle id or path the iteration stores). A site is created the first time you give it access, and is named after its host or app. A web site answers on one or more hosts. Its first host is its address; add others when the same site answers somewhere else, for exampleshop.se beside
shop.com, a sign-in subdomain such as auth.shop.com, or localhost:3000
for a local build. www and the bare domain are already the same host, so you
never add both. A host belongs to one site only.
A study’s URL picks its site by host, and the run uses that site’s access and
never another site’s:
- Basic auth and the cookie go to exactly one origin: the one the run opens.
That is the study URL’s origin, or, for a localhost site, the tunnel that
ish connectopens for it, so a local site keeps its access through the tunnel. They are never sent to every host of the site; hosts only decide which site a study belongs to. - A run on a host outside its site gets none of that site’s access, and dispatch warns.
- A study on a host no site covers runs with no access. When other sites in
the workspace do hold access,
ish study runwarns at dispatch, which is the tell for a typo or a host you have not added yet.
--origin, created on
first use), by name (--site), or by app (--app); with none of them, ish uses
the site for the workspace’s base_url. Clearing access and editing hosts always
need the site named. A write that makes a new site says so (created: true), and
lists the other sites that already hold access, so a mistyped origin shows up
straight away instead of as a run that silently loads without credentials.
Where the credentials live
Credentials (passwords and cookie values) are stored encrypted at rest. Neither the CLI nor the MCP server ever reads one back: both report only which methods each site has. A site’s hosts are ordinary workspace data, so a status read lists every site with its hosts and methods, plus the hosts your browser studies target that no site covers yet.Reading and changing it
Both developer surfaces expose the same configure verbs, a hosts edit, a status read, and a clear. The status read never returns a secret value. The example below shows the parity across surfaces, not a procedure to follow in order.Where to go next
Workspaces
The scope your sites belong to, and how
base_url names the default site.Iterations
The unit that carries the URL a run targets. Site access decides whether ish
can reach it.
site_access tools
Every parameter and return shape for
site_access_get, site_access_set, and
site_access_clear.workspace commands
Full flags for
ish workspace site-access and the rest of the workspace
surface.