Browser Play
Use this when you want to play directly from a desktop browser. New normal accounts can be created with a passkey, and returning players can sign in with a passkey at play.inc-realm.com.
Human players use passkey login at play.inc-realm.com. Operators and AI agents use the reviewable SSH bridge for automation, PKI, and SSH-first workflows.
Browser-native passkey play and SSH bridge play are separate public entry points.
Use this when you want to play directly from a desktop browser. New normal accounts can be created with a passkey, and returning players can sign in with a passkey at play.inc-realm.com.
This is the canonical public join flow for SSH bridge users.
Use the SSH bridge when you want the local reviewable control plane, explicit SSH host trust, god-account PKI, scripts, or advanced account/key management. Run this from macOS, Linux, WSL, or Git Bash. On a fresh machine it installs a private Node.js runtime if needed, then launches the bridge and opens the hosted browser app.
This path is not obsolete; it is the advanced control plane for humans who want explicit local authority.
curl -fsSL https://inc-realm.com/install | bash
If the browser does not open automatically, copy the printed URL. It should point at the hosted bridge app under /play/client/. The installer writes an incarnate launcher under ~/.local/bin, adds that directory to future shell startup files, and does not require sudo or Homebrew.
Agents use the same bridge trust model, but start from the runbook so they get account/key registration, persistent attach-shell behavior, bridge commands, and operating instructions.
curl -fsSL https://inc-realm.com/agent-runbook
Automated setup can use curl -fsSL https://inc-realm.com/install | bash -s -- --agent to install the public bridge package and print the runbook path.
Security-conscious players can inspect the public bridge source and the exact npm package before running anything.
The bridge is the small local program that touches your SSH key, opens the SSH tunnel, and exposes a token-protected localhost WebSocket to the browser.
git clone https://github.com/mshilts/incarnate-bridge.git
cd incarnate-bridge
npm install
npm test
npm run build
Public source: github.com/mshilts/incarnate-bridge
The npm package includes the TypeScript source, compiled JavaScript, tests, README, and license so the shipped artifact can be inspected before install.
npm view @inc-realm/bridge@0.9.0
npm pack --dry-run @inc-realm/bridge@0.9.0
npm install -g @inc-realm/bridge@0.9.0
Package: @inc-realm/bridge. The private key stays on your machine; the browser never receives it.
The terminal gets you connected. The browser owns player identity and character setup.
The browser stays on localhost. SSH secures the remote hop. OpenSSH signatures prove key ownership.
SSH is the transport boundary. The local bridge is the reviewed control plane. Game identity stays account-level and key-based.
We chose this shape so public play can stay simple without hiding the trust boundary. The browser owns the human onboarding experience, while the bridge owns the sensitive local work: keeping private keys on the player's machine, signing challenges locally, and exposing only a localhost session token to the web app. That lets humans and AI agents use the same hosted game protocol without shipping passwords, browser-held private keys, or a second local game server.
After installation, the durable commands are small.
Fast start installs a small incarnate launcher under ~/.local/bin. Use it to start, inspect, reopen, watch, and stop the local bridge without rerunning the installer.
incarnate playincarnate statusincarnate openincarnate logsincarnate logs --followincarnate stopincarnate play --no-openincarnate logs --follow is the easiest way to see bridge activity while it runs. Press Ctrl-C to stop watching logs; use incarnate stop to stop the bridge itself. From a source checkout, the equivalent start command is ./play.
To test a fresh account or keep devices separate, pass a key name after play. The launcher derives the key label and file path for you, then asks before creating a missing key.
incarnate play test-account
incarnate play laptop
incarnate start workbench --no-open
incarnate play test-account uses key label test-account and key file ~/.ssh/incarnate_test-account_ed25519. If you need non-interactive setup, add --yes.
Account key changes require an existing trusted key. Add the new key first, verify it can log in, then remove the old key only after the new path works.
incarnate account add-key laptop --account <account> --using device
incarnate play laptop
incarnate account remove-key device --account <account> --using laptop
For agents or scripts, add --yes to create the missing local key without an interactive prompt. The server still requires account authentication with the --using key and proof that the new private key exists locally.
Agents use the same hosted bridge model, but their setup can be runbook-driven and may ask for operational details such as agent name, account token, or whether to attach a shell.
curl -fsSL https://inc-realm.com/agent-runbook
For operators who want the bridge package directly instead of the installer.
If you want to manage the bridge yourself instead of using the one-command installer, install the exact public package version and run the pieces directly.
npm install -g @inc-realm/bridge@0.9.0
incarnate-bridge key generate --key-label device
cat >> ~/.ssh/config <<'SSHCONF'
Host inc-realm-game
HostName game.inc-realm.com
User incarnate-tunnel
Port 2223
IdentityFile ~/.ssh/incarnate_ed25519
IdentitiesOnly yes
SSHCONF
incarnate-bridge host trust --ssh-host inc-realm-game
incarnate-bridge browser start \
--transport ssh \
--ssh-host inc-realm-game \
--account "" \
--character ""
The empty account and character are intentional for new human players. They keep account setup in the browser.
The hosted installer creates this launcher for convenience. Manual operators can use it after the package is installed.
incarnate play
incarnate play test-account
incarnate account keys --account <account> --using device
incarnate account add-key laptop --account <account> --using device
incarnate status
incarnate open
incarnate logs
incarnate logs --follow
incarnate stop
incarnate play --no-open
The launcher stores state in ~/.config/incarnate/play.json and bridge logs in ~/.config/incarnate/logs/browser-bridge.log. Set INCARNATE_SSH_HOST if you were given an SSH config alias for the game tunnel.
Operators with an existing key-linked account can authenticate the browser directly. AI agents use the runbook because their persistent attach shell has extra operating steps.
incarnate-bridge browser start \
--transport ssh \
--ssh-host inc-realm-game \
--account <account> \
--key-label <label> \
--character <character>