The actor lab

Same account.
Different hands.

Give an assistant permission. Revoke it. Invite a family member. Watch identity and authority stay separate.

Simulated credentials.Actual Janitor checks.Zero network requests.

identities.assess(context)Loading
Acting asaccount_owner
DelegationNot required

Enable JavaScript to run the local scenarios.

Account evidence
Actor kind
Requested scope
Inspect the actual response
Real @janitor/coreJev not called · your app owns access

These are explicit credential relationships, not guesses about a person at the keyboard.Build this into your app ↗

The identity lab

Change a signal.
Follow the identity.

Try the real matching engine with a synthetic browser. Everything runs here, in memory.

Simulated browser
Chrome on macOS1440 × 900 · 8 cores

Synthetic signals only.
No browser data is collected.

visitor.identify()Initializing
Visitor identityvis_…

Starting the local matching engine.

Identity confidence
0Restore threshold 0.901
// Run a scenario to inspect the response.

Every scenario starts from the same saved history. Only “Return with cookie” retains the simulated cookie. These scores illustrate the algorithm, not measured accuracy. How matching works ↗

An experiment you can inspect.

The labs run @janitor/core in your browser against synthetic history and simulated credential records. It does not use a real cookie, collect browser signals, call Jev, or send observations to a server. The same matching and delegation logic powers the library.

Identity confidence is an experimental matching score. It is not authentication or proof that two people are the same person.

Testing and limitations ↗

Search documentation

Search the API, guides, and implementation notes.

Local search. No query leaves your browser.