Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.
The desktop can install vibex-server on another machine, drive it over SSH, and connect through Remote v2. Code, Agents, Git, and terminals run on the remote host; the desktop, phone, and TUI remain clients.You do not need Docker, a public port, an HTTPS certificate, or a manually copied pairing code. You need SSH access to the host. If a Linux host has no sshd, Vibex can generate a one-time bootstrap command. A WSL2 distro on Windows works as a local Linux environment without sshd.
Beta, off by default. Turn it on in Settings → Developer → SSH remote runtime, or set VIBEX_SSH_REMOTE_RUNTIME=1 for one launch. Turning it off only hides entry points; it never deletes connections, credentials, or the remote runtime.
A host entry in ~/.ssh/config (or the file you point Vibex at) that logs in non-interactively. Vibex runs every command with BatchMode=yes; it never answers a password or keyboard-interactive prompt.
The host key already in known_hosts. Vibex never accepts an unknown key on your behalf; connect once from a terminal and compare the fingerprint.
The remote host needs:
Linux x86_64 / aarch64 with glibc 2.35+ (Ubuntu 22.04+, Debian 12+, RHEL 9+), or a supported macOS.
tar, sha256sum (or shasum), a writable home, and at least 512 MiB free.
Open Settings → Connections → Add SSH connection. Vibex lists hosts it finds in your SSH config.
Pick a host and choose Probe and add. The probe checks OS, architecture, glibc, disk, tools, and the runtime port, then saves the connection and starts provisioning.
Provisioning walks through resolve → check environment → upload → install → start → open tunnel → pair → connect → ready. A failure shows a diagnostics card and the next step.
When ready, the runtime appears in the Runtime Manager and becomes active. Switch back to the local runtime from the same menu at any time.
The remote runtime keeps running when SSH disconnects. After a dropped tunnel or an app restart, the desktop starts the runtime again if needed, reopens the tunnel, and connects with the stored pinned credential. If launch fails, the workbench falls back to the local runtime; choose Connect or Fix on the connection to provision and pair again.
macOS hosts are supported as remote development machines (beta), on Apple silicon and Intel.
On the Mac, turn on System Settings → General → Sharing → Remote Login, or run:
sudo systemsetup -setremotelogin on
Add the Mac as in the Linux quick start.
The server artifact is ad-hoc signed and uploaded over SSH, so it carries no quarantine attribute and Gatekeeper does not block it. It is not notarized.In the Runtime Manager, choose a lifecycle:
nohup (default): started on demand; survives SSH disconnects, not a reboot. The desktop starts it again on the next connect.
At login: a per-user LaunchAgent starts the runtime when that user logs in. LaunchAgents need a graphical login session; enable automatic login if the Mac must come back unattended.
Sleep pauses the runtime and drops the tunnel; the desktop reconnects after the Mac wakes.
A WSL2 distro on the same Windows machine is treated as a local Linux environment, with no sshd or SSH keys.
Install WSL2 and at least one distro (wsl --install).
Open Settings → Connections → Add WSL runtime, pick the distro, and choose Connect WSL.
Vibex runs the Linux x86_64 artifact inside the distro through wsl.exe, installs it under the distro user’s ~/.local/share/vibex/server, and reaches it through WSL2 localhost forwarding. The Runtime Manager shows WSL · <distro>.The desktop holds the runtime as the foreground process of a wsl.exe child, because WSL stops a distro when its last Windows client exits. After wsl --shutdown or a crash, the desktop notices the child exit, starts the distro and runtime again, and reconnects.If localhostForwarding is disabled in %UserProfile%\.wslconfig, the connection fails at the forwarding check; turn it back on and run wsl --shutdown.Native Windows hosts are not supported as remote runtimes.
A fresh VM may have no SSH server. If you can reach a root shell through a cloud console, serial console, or cloud-init, Vibex can generate a one-time command that sets SSH up.
Open Settings → Connections → Bootstrap SSH.
Enter the existing Linux account Vibex will connect as (for example ubuntu, debian, ec2-user) and choose Generate command. The desktop reads ~/.ssh/id_ed25519.pub (or id_rsa.pub / id_ecdsa.pub).
Copy the command and run it in the console within 15 minutes.
Add a matching entry to ~/.ssh/config, compare and accept the printed host-key fingerprint, then choose Recheck SSH. Provisioning continues over SSH as usual.
The command verifies the embedded payload’s SHA-256 and uses a one-time v1.<expires-ms>.<nonce> token. It installs OpenSSH, starts sshd, appends your desktop public key to that user’s authorized_keys, prints the host-key fingerprints, and refuses an expired or replayed token. It never changes PasswordAuthentication, never enables root login, and never touches the firewall. If a cloud firewall or security group blocks port 22, open it yourself.
Switch the desktop to the remote runtime, or back to local.
Update runtime when the remote is behind: download and verify the matching server artifact, install it into a new version directory, stop the old runtime, snapshot the database, start the new version, and wait for health. On failure it rolls back to previous and restores the database snapshot.
Compatibility: compatible, update available, runtime update required, update Vibex, or incompatible. Protocol range, channel, and major version are hard gates.
Edit the display name, SSH client and config path, workspace roots, and the local tunnel port while the runtime is not bound.
Remove only the local connection profile and credential; the remote runtime and its data stay.
Uninstall runtime: stop the remote process and delete installed versions; delete the runtime home only if you tick it. It refuses an install root outside the remote home and never deletes workspace files.
An upgrade restarts the runtime and interrupts running turns and terminals; the desktop asks first. The runtime home (identity, TLS certificate, device grants, data) is kept, so no re-pairing is needed.
The trust chain is SSH host key → your SSH authentication → pinned TLS certificate → device grant.
Host keys: every ssh call uses StrictHostKeyChecking=yes. Unknown and changed keys are hard failures; a change shows the old and new fingerprints.
Loopback only: the remote runtime binds 127.0.0.1:<port>, and the tunnel binds 127.0.0.1:<local-port> on the desktop with ExitOnForwardFailure=yes. Nothing listens publicly.
TLS pinning: the runtime’s self-signed certificate reaches the desktop over SSH and is pinned on first use; a different certificate is rejected.
Pairing code: fetched with pairing-code --json and claimed directly. It is never shown in the UI, written to the server log, or included in diagnostics.
Artifacts: only from a signed release manifest; size and SHA-256 are checked on the desktop and again on the host.
Remote commands: scripts go to sh -s on stdin, and every argument is shell-quoted and validated.
Phones: an SSH/WSL runtime is reachable only through the desktop’s tunnel; phones cannot pair with it directly.
Each failure shows a classified cause, next steps, and Copy diagnostics. Once the runtime is installed, View log (last 200 lines) and Copy log command are also available.
Symptom
Error codes
What to do
No SSH client
ssh_client_missing / ssh_spawn_failed
Install OpenSSH: sudo apt install openssh-client on Debian/Ubuntu, brew install openssh on macOS. On Windows, use WSL.
No SSH server
ssh_connection_refused
Install/start sshd on Linux, or bootstrap. On macOS, turn on Remote Login.
Authentication failed
ssh_auth_failed
Confirm ssh <alias> logs in without a prompt; check IdentityFile and ssh-agent.
Host key unknown
ssh_host_key_unknown
Connect once in a terminal, compare and accept the fingerprint, then retry.
Host key changed
ssh_host_key_changed
Compare with the host owner. Only after confirming a legitimate change, run ssh-keygen -R <host> and reconnect.
Artifact is built and published (glibc 2.35 baseline); no end-to-end run on aarch64 hardware
macOS 14 arm64
Beta
Real M1: provision, SSH disconnect, At login, sleep/wake, upgrade + rollback, uninstall
macOS x86_64
Experimental
x86_64 artifact only under Rosetta on Apple silicon; no Intel Mac run
Windows 11 + WSL2
Beta
Real Windows 11 (Arch distro): connect without sshd, recover after wsl --shutdown
Bootstrap: Ubuntu / Debian
Beta
Docker Ubuntu 24.04, WSL2 Ubuntu without sshd
Bootstrap: RHEL 9, Alpine 3.20
Experimental
Containers / WSL2 only; Alpine bootstraps, but the runtime needs glibc
Native Windows host
Unsupported
—
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Vibex","colors":{"primary":"#166534","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/vibex-ai/H4h_RuiJ0RXtS5QI/logo/light.svg?fit=max\u0026auto=format\u0026n=H4h_RuiJ0RXtS5QI\u0026q=85\u0026s=3c71b0f6d676401b96fc5de20ed1f954","dark":"https://mintcdn.com/vibex-ai/H4h_RuiJ0RXtS5QI/logo/dark.svg?fit=max\u0026auto=format\u0026n=H4h_RuiJ0RXtS5QI\u0026q=85\u0026s=00a1dbf1a05499f3ac75391875775d83"},"favicon":"https://mintcdn.com/vibex-ai/hIrcDvOVfSbdzAJb/favicon.svg?fit=max\u0026auto=format\u0026n=hIrcDvOVfSbdzAJb\u0026q=85\u0026s=94736f2b0c18ac4441283056327014ba","navbar":{"links":[{"href":"https://github.com/vibex-ai/vibex","label":"GitHub"},{"href":"https://github.com/vibex-ai/vibex/blob/main/LICENSE","label":"许可证"}],"primary":{"type":"button","label":"报告问题","href":"https://github.com/vibex-ai/vibex/issues/new"}},"footer":{"socials":{"github":"https://github.com/vibex-ai/vibex"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"GitHub","icon":"https://mintlify.s3.us-west-1.amazonaws.com/vibex-ai/logo/github-mark.svg","href":"https://github.com/vibex-ai/vibex"},{"anchor":"Issues","icon":"https://mintlify.s3.us-west-1.amazonaws.com/vibex-ai/logo/github-mark.svg","href":"https://github.com/vibex-ai/vibex/issues"}]},"languages":[{"language":"zh-CN","default":true,"navbar":{"links":[{"href":"https://github.com/vibex-ai/vibex","label":"GitHub"},{"href":"https://github.com/vibex-ai/vibex/blob/main/LICENSE","label":"许可证"}],"primary":{"type":"button","label":"报告问题","href":"https://github.com/vibex-ai/vibex/issues/new"}},"href":""},{"language":"zh-TW","navbar":{"links":[{"href":"https://github.com/vibex-ai/vibex","label":"GitHub"},{"href":"https://github.com/vibex-ai/vibex/blob/main/LICENSE","label":"授權"}],"primary":{"type":"button","label":"回報問題","href":"https://github.com/vibex-ai/vibex/issues/new"}},"href":"zh-TW"},{"language":"en","navbar":{"links":[{"href":"https://github.com/vibex-ai/vibex","label":"GitHub"},{"href":"https://github.com/vibex-ai/vibex/blob/main/LICENSE","label":"License"}],"primary":{"type":"button","label":"Report an issue","href":"https://github.com/vibex-ai/vibex/issues/new"}},"href":"en"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"vibex-ai","hasAudioNarration":false,"actualSubdomain":"vibex-ai","customDomains":["vibex.peatboy.com"],"gitSource":{"type":"github","owner":"vibex-ai","repo":"vibex-docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"latestBuiltDeploymentHistoryId":"6ae8c1a0305194f113017102","collectionId":"59664d3d-d26d-4406-8161-0974b9178801","liveDeploymentHistoryId":"6ae8c1a0305194f113017102","schemaVersion":"v3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae8c1a0305194f113017102","clientVersion":"0.0.4067","searchFilterCounts":[{"language":"zh-CN","tag":"使用者指南","count":28},{"language":"en","tag":"User guide","count":28},{"language":"zh-TW","tag":"使用者指南","count":28},{"language":"zh-CN","tag":"日常工作","count":8},{"language":"zh-CN","tag":"版本记录","count":8},{"language":"zh-CN","tag":"更新日志","count":8},{"language":"en","tag":"Daily work","count":8},{"language":"en","tag":"Releases","count":8},{"language":"en","tag":"Changelog","count":8},{"language":"zh-TW","tag":"日常工作","count":8},{"language":"zh-TW","tag":"版本記錄","count":8},{"language":"zh-TW","tag":"更新日誌","count":8},{"language":"zh-CN","tag":"开发者指南","count":7},{"language":"zh-CN","tag":"参与开发","count":7},{"language":"en","tag":"Developer guide","count":7},{"language":"en","tag":"Contribute","count":7},{"language":"zh-TW","tag":"開發者指南","count":7},{"language":"zh-TW","tag":"參與開發","count":7},{"language":"zh-CN","tag":"开始使用","count":6},{"language":"en","tag":"Get started","count":6},{"language":"zh-TW","tag":"開始使用","count":6},{"language":"zh-CN","tag":"扩展与配置","count":5},{"language":"zh-CN","tag":"远程开发与自托管服务","count":5},{"language":"en","tag":"Extensions and configuration","count":5},{"language":"en","tag":"Remote development and self-hosting","count":5},{"language":"zh-TW","tag":"擴充與設定","count":5},{"language":"zh-TW","tag":"遠端開發與自託管服務","count":5},{"language":"zh-CN","tag":"参考","count":3},{"language":"en","tag":"Reference","count":3},{"language":"zh-TW","tag":"參考","count":3}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/ssh-runtime","slug":"/en/ssh-runtime","pageMetadata":{"title":"SSH and WSL remote runtimes","description":"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.","href":"/en/ssh-runtime"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`The desktop can install `,_jsx(_components.code,{children:`vibex-server`}),` on another machine, drive it over SSH, and connect through Remote v2. Code, Agents, Git, and terminals run on the remote host; the desktop, phone, and TUI remain clients.`]}),`\n`,_jsx(_components.p,{children:`You do not need Docker, a public port, an HTTPS certificate, or a manually copied pairing code. You need SSH access to the host. If a Linux host has no sshd, Vibex can generate a one-time bootstrap command. A WSL2 distro on Windows works as a local Linux environment without sshd.`}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Beta, off by default.`}),` Turn it on in `,_jsx(_components.strong,{children:`Settings → Developer → SSH remote runtime`}),`, or set `,_jsx(_components.code,{children:`VIBEX_SSH_REMOTE_RUNTIME=1`}),` for one launch. Turning it off only hides entry points; it never deletes connections, credentials, or the remote runtime.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`before-you-start`,children:`Before you start`}),`\n`,_jsx(_components.p,{children:`The desktop needs:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`ssh`}),` and `,_jsx(_components.code,{children:`ssh-keygen`}),` on `,_jsx(_components.code,{children:`PATH`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`A host entry in `,_jsx(_components.code,{children:`~/.ssh/config`}),` (or the file you point Vibex at) that logs in `,_jsx(_components.strong,{children:`non-interactively`}),`. Vibex runs every command with `,_jsx(_components.code,{children:`BatchMode=yes`}),`; it never answers a password or keyboard-interactive prompt.`]}),`\n`,_jsxs(_components.li,{children:[`The host key already in `,_jsx(_components.code,{children:`known_hosts`}),`. Vibex never accepts an unknown key on your behalf; connect once from a terminal and compare the fingerprint.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The remote host needs:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Linux x86_64 / aarch64 with glibc 2.35+ (Ubuntu 22.04+, Debian 12+, RHEL 9+), or a supported macOS.`}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.code,{children:`tar`}),`, `,_jsx(_components.code,{children:`sha256sum`}),` (or `,_jsx(_components.code,{children:`shasum`}),`), a writable home, and at least 512 MiB free.`]}),`\n`,_jsx(_components.li,{children:`No root; everything lives in your home directory.`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`quick-start-linux-over-ssh`,children:`Quick start (Linux over SSH)`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Settings → Connections → Add SSH connection`}),`. Vibex lists hosts it finds in your SSH config.`]}),`\n`,_jsxs(_components.li,{children:[`Pick a host and choose `,_jsx(_components.strong,{children:`Probe and add`}),`. The probe checks OS, architecture, glibc, disk, tools, and the runtime port, then saves the connection and starts provisioning.`]}),`\n`,_jsx(_components.li,{children:`Provisioning walks through resolve → check environment → upload → install → start → open tunnel → pair → connect → ready. A failure shows a diagnostics card and the next step.`}),`\n`,_jsx(_components.li,{children:`When ready, the runtime appears in the Runtime Manager and becomes active. Switch back to the local runtime from the same menu at any time.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The remote runtime keeps running when SSH disconnects. After a dropped tunnel or an app restart, the desktop starts the runtime again if needed, reopens the tunnel, and connects with the stored pinned credential. If launch fails, the workbench falls back to the local runtime; choose `,_jsx(_components.strong,{children:`Connect`}),` or `,_jsx(_components.strong,{children:`Fix`}),` on the connection to provision and pair again.`]}),`\n`,_jsx(Heading,{level:`2`,id:`macos-remote`,children:`macOS remote`}),`\n`,_jsx(_components.p,{children:`macOS hosts are supported as remote development machines (beta), on Apple silicon and Intel.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[`On the Mac, turn on `,_jsx(_components.strong,{children:`System Settings → General → Sharing → Remote Login`}),`, or run:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`sudo`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` systemsetup`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` -setremotelogin`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` on`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsx(_components.p,{children:`Add the Mac as in the Linux quick start.`}),`\n`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`The server artifact is ad-hoc signed and uploaded over SSH, so it carries no quarantine attribute and Gatekeeper does not block it. It is not notarized.`}),`\n`,_jsx(_components.p,{children:`In the Runtime Manager, choose a lifecycle:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`nohup`}),` (default): started on demand; survives SSH disconnects, not a reboot. The desktop starts it again on the next connect.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`At login`}),`: a per-user LaunchAgent starts the runtime when that user logs in. LaunchAgents need a graphical login session; enable automatic login if the Mac must come back unattended.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Sleep pauses the runtime and drops the tunnel; the desktop reconnects after the Mac wakes.`}),`\n`,_jsx(Heading,{level:`2`,id:`windows-11-+-wsl2`,children:`Windows 11 + WSL2`}),`\n`,_jsx(_components.p,{children:`A WSL2 distro on the same Windows machine is treated as a local Linux environment, with no sshd or SSH keys.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Install WSL2 and at least one distro (`,_jsx(_components.code,{children:`wsl --install`}),`).`]}),`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Settings → Connections → Add WSL runtime`}),`, pick the distro, and choose `,_jsx(_components.strong,{children:`Connect WSL`}),`.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Vibex runs the Linux x86_64 artifact inside the distro through `,_jsx(_components.code,{children:`wsl.exe`}),`, installs it under the distro user’s `,_jsx(_components.code,{children:`~/.local/share/vibex/server`}),`, and reaches it through WSL2 localhost forwarding. The Runtime Manager shows `,_jsx(_components.code,{children:`WSL · \u003cdistro>`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`The desktop holds the runtime as the foreground process of a `,_jsx(_components.code,{children:`wsl.exe`}),` child, because WSL stops a distro when its last Windows client exits. After `,_jsx(_components.code,{children:`wsl --shutdown`}),` or a crash, the desktop notices the child exit, starts the distro and runtime again, and reconnects.`]}),`\n`,_jsxs(_components.p,{children:[`If `,_jsx(_components.code,{children:`localhostForwarding`}),` is disabled in `,_jsx(_components.code,{children:`%UserProfile%\\\\.wslconfig`}),`, the connection fails at the forwarding check; turn it back on and run `,_jsx(_components.code,{children:`wsl --shutdown`}),`.`]}),`\n`,_jsx(_components.p,{children:`Native Windows hosts are not supported as remote runtimes.`}),`\n`,_jsx(Heading,{level:`2`,id:`linux-without-sshd-bootstrap`,children:`Linux without sshd (bootstrap)`}),`\n`,_jsx(_components.p,{children:`A fresh VM may have no SSH server. If you can reach a root shell through a cloud console, serial console, or cloud-init, Vibex can generate a one-time command that sets SSH up.`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Open `,_jsx(_components.strong,{children:`Settings → Connections → Bootstrap SSH`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`Enter the `,_jsx(_components.strong,{children:`existing`}),` Linux account Vibex will connect as (for example `,_jsx(_components.code,{children:`ubuntu`}),`, `,_jsx(_components.code,{children:`debian`}),`, `,_jsx(_components.code,{children:`ec2-user`}),`) and choose `,_jsx(_components.strong,{children:`Generate command`}),`. The desktop reads `,_jsx(_components.code,{children:`~/.ssh/id_ed25519.pub`}),` (or `,_jsx(_components.code,{children:`id_rsa.pub`}),` / `,_jsx(_components.code,{children:`id_ecdsa.pub`}),`).`]}),`\n`,_jsx(_components.li,{children:`Copy the command and run it in the console within 15 minutes.`}),`\n`,_jsxs(_components.li,{children:[`Add a matching entry to `,_jsx(_components.code,{children:`~/.ssh/config`}),`, compare and accept the printed host-key fingerprint, then choose `,_jsx(_components.strong,{children:`Recheck SSH`}),`. Provisioning continues over SSH as usual.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The command verifies the embedded payload’s SHA-256 and uses a one-time `,_jsx(_components.code,{children:`v1.\u003cexpires-ms>.\u003cnonce>`}),` token. It installs OpenSSH, starts sshd, appends your desktop public key to that user’s `,_jsx(_components.code,{children:`authorized_keys`}),`, prints the host-key fingerprints, and refuses an expired or replayed token. It never changes `,_jsx(_components.code,{children:`PasswordAuthentication`}),`, never enables root login, and never touches the firewall. If a cloud firewall or security group blocks port 22, open it yourself.`]}),`\n`,_jsx(Heading,{level:`2`,id:`runtime-manager`,children:`Runtime Manager`}),`\n`,_jsx(_components.p,{children:`Once a connection is ready, you can:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Switch`}),` the desktop to the remote runtime, or back to local.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Update runtime`}),` when the remote is behind: download and verify the matching server artifact, install it into a new version directory, stop the old runtime, snapshot the database, start the new version, and wait for health. On failure it rolls back to `,_jsx(_components.code,{children:`previous`}),` and restores the database snapshot.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Compatibility`}),`: compatible, update available, runtime update required, update Vibex, or incompatible. Protocol range, channel, and major version are hard gates.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Edit`}),` the display name, SSH client and config path, workspace roots, and the local tunnel port while the runtime is not bound.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Remove`}),` only the local connection profile and credential; the remote runtime and its data stay.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Uninstall runtime`}),`: stop the remote process and delete installed versions; delete the runtime home only if you tick it. It refuses an install root outside the remote home and never deletes workspace files.`]}),`\n`]}),`\n`,_jsx(_components.p,{children:`An upgrade restarts the runtime and interrupts running turns and terminals; the desktop asks first. The runtime home (identity, TLS certificate, device grants, data) is kept, so no re-pairing is needed.`}),`\n`,_jsx(Heading,{level:`2`,id:`security-boundary`,children:`Security boundary`}),`\n`,_jsxs(_components.p,{children:[`The trust chain is `,_jsx(_components.strong,{children:`SSH host key → your SSH authentication → pinned TLS certificate → device grant`}),`.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Host keys`}),`: every `,_jsx(_components.code,{children:`ssh`}),` call uses `,_jsx(_components.code,{children:`StrictHostKeyChecking=yes`}),`. Unknown and changed keys are hard failures; a change shows the old and new fingerprints.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Loopback only`}),`: the remote runtime binds `,_jsx(_components.code,{children:`127.0.0.1:\u003cport>`}),`, and the tunnel binds `,_jsx(_components.code,{children:`127.0.0.1:\u003clocal-port>`}),` on the desktop with `,_jsx(_components.code,{children:`ExitOnForwardFailure=yes`}),`. Nothing listens publicly.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`TLS pinning`}),`: the runtime’s self-signed certificate reaches the desktop over SSH and is pinned on first use; a different certificate is rejected.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Pairing code`}),`: fetched with `,_jsx(_components.code,{children:`pairing-code --json`}),` and claimed directly. It is never shown in the UI, written to the server log, or included in diagnostics.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Artifacts`}),`: only from a signed release manifest; size and SHA-256 are checked on the desktop and again on the host.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Remote commands`}),`: scripts go to `,_jsx(_components.code,{children:`sh -s`}),` on stdin, and every argument is shell-quoted and validated.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Phones`}),`: an SSH/WSL runtime is reachable only through the desktop’s tunnel; phones cannot pair with it directly.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshooting`,children:`Troubleshooting`}),`\n`,_jsxs(_components.p,{children:[`Each failure shows a classified cause, next steps, and `,_jsx(_components.strong,{children:`Copy diagnostics`}),`. Once the runtime is installed, `,_jsx(_components.strong,{children:`View log`}),` (last 200 lines) and `,_jsx(_components.strong,{children:`Copy log command`}),` are also available.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Symptom`}),_jsx(_components.th,{children:`Error codes`}),_jsx(_components.th,{children:`What to do`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No SSH client`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ssh_client_missing`}),` / `,_jsx(_components.code,{children:`ssh_spawn_failed`})]}),_jsxs(_components.td,{children:[`Install OpenSSH: `,_jsx(_components.code,{children:`sudo apt install openssh-client`}),` on Debian/Ubuntu, `,_jsx(_components.code,{children:`brew install openssh`}),` on macOS. On Windows, use WSL.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`No SSH server`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_connection_refused`})}),_jsx(_components.td,{children:`Install/start sshd on Linux, or bootstrap. On macOS, turn on Remote Login.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Authentication failed`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_auth_failed`})}),_jsxs(_components.td,{children:[`Confirm `,_jsx(_components.code,{children:`ssh \u003calias>`}),` logs in without a prompt; check IdentityFile and ssh-agent.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Host key unknown`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_host_key_unknown`})}),_jsx(_components.td,{children:`Connect once in a terminal, compare and accept the fingerprint, then retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Host key changed`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_host_key_changed`})}),_jsxs(_components.td,{children:[`Compare with the host owner. Only after confirming a legitimate change, run `,_jsx(_components.code,{children:`ssh-keygen -R \u003chost>`}),` and reconnect.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Timeout or DNS`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ssh_timeout`}),` / `,_jsx(_components.code,{children:`ssh_dns_failed`})]}),_jsx(_components.td,{children:`Check the host name, network, VPN, and firewall.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Permission denied`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ssh_permission_denied`}),` / `,_jsx(_components.code,{children:`ssh_environment_home_not_writable`})]}),_jsx(_components.td,{children:`Fix ownership and write permission of the remote home and install root.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Low disk`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_environment_disk_low`})}),_jsx(_components.td,{children:`Free at least 512 MiB under the remote home.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`glibc too old`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ssh_environment_glibc_too_old`}),` / `,_jsx(_components.code,{children:`ssh_environment_missing_glibc`})]}),_jsx(_components.td,{children:`The host needs glibc 2.35+. musl-only hosts such as Alpine cannot run it.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Port busy`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_environment_port_busy`})}),_jsx(_components.td,{children:`Free the port or retry; Vibex tries the next free port.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Start failed`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ssh_launch_failed`}),` / `,_jsx(_components.code,{children:`ssh_runtime_start_failed`}),` / `,_jsx(_components.code,{children:`ssh_runtime_health_timeout`})]}),_jsx(_components.td,{children:`View the log, fix the cause, and retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Version incompatible`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_upgrade_incompatible`})}),_jsx(_components.td,{children:`Update the runtime or Vibex according to the compatibility state.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tunnel failed`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_tunnel_*`})}),_jsx(_components.td,{children:`Usually the local port is taken or SSH dropped; retry.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Pairing failed`}),_jsxs(_components.td,{children:[_jsx(_components.code,{children:`ssh_pairing_*`}),` / `,_jsx(_components.code,{children:`remote_*`})]}),_jsxs(_components.td,{children:[`Retry. If the runtime revoked this desktop, choose `,_jsx(_components.strong,{children:`Connect`}),` on the connection to pair again.`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Upgrade failed`}),_jsx(_components.td,{children:_jsx(_components.code,{children:`ssh_upgrade_*`})}),_jsxs(_components.td,{children:[`It rolled back to `,_jsx(_components.code,{children:`previous`}),`; inspect the new version’s log.`]})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`support-matrix`,children:`Support matrix`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Platform`}),_jsx(_components.th,{children:`Status`}),_jsx(_components.th,{children:`Verified on`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Linux x86_64`}),_jsx(_components.td,{children:`Beta`}),_jsx(_components.td,{children:`Ubuntu 24.04 (CI Docker E2E: provision, uninstall, upgrade + rollback); artifact smoke on Ubuntu 22.04`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Linux aarch64`}),_jsx(_components.td,{children:`Experimental`}),_jsx(_components.td,{children:`Artifact is built and published (glibc 2.35 baseline); no end-to-end run on aarch64 hardware`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`macOS 14 arm64`}),_jsx(_components.td,{children:`Beta`}),_jsx(_components.td,{children:`Real M1: provision, SSH disconnect, At login, sleep/wake, upgrade + rollback, uninstall`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`macOS x86_64`}),_jsx(_components.td,{children:`Experimental`}),_jsx(_components.td,{children:`x86_64 artifact only under Rosetta on Apple silicon; no Intel Mac run`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Windows 11 + WSL2`}),_jsx(_components.td,{children:`Beta`}),_jsxs(_components.td,{children:[`Real Windows 11 (Arch distro): connect without sshd, recover after `,_jsx(_components.code,{children:`wsl --shutdown`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Bootstrap: Ubuntu / Debian`}),_jsx(_components.td,{children:`Beta`}),_jsx(_components.td,{children:`Docker Ubuntu 24.04, WSL2 Ubuntu without sshd`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Bootstrap: RHEL 9, Alpine 3.20`}),_jsx(_components.td,{children:`Experimental`}),_jsx(_components.td,{children:`Containers / WSL2 only; Alpine bootstraps, but the runtime needs glibc`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Native Windows host`}),_jsx(_components.td,{children:`Unsupported`}),_jsx(_components.td,{children:`—`})]})]})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"SSH and WSL remote runtimes","description":"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.","href":"/en/ssh-runtime"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Before you start","slug":"before-you-start","depth":2,"children":[]},{"title":"Quick start (Linux over SSH)","slug":"quick-start-linux-over-ssh","depth":2,"children":[]},{"title":"macOS remote","slug":"macos-remote","depth":2,"children":[]},{"title":"Windows 11 + WSL2","slug":"windows-11-+-wsl2","depth":2,"children":[]},{"title":"Linux without sshd (bootstrap)","slug":"linux-without-sshd-bootstrap","depth":2,"children":[]},{"title":"Runtime Manager","slug":"runtime-manager","depth":2,"children":[]},{"title":"Security boundary","slug":"security-boundary","depth":2,"children":[]},{"title":"Troubleshooting","slug":"troubleshooting","depth":2,"children":[]},{"title":"Support matrix","slug":"support-matrix","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"vibex-ai","siteName":"Vibex","title":"SSH and WSL remote runtimes - Vibex","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{"zh-CN":{"href":"/ssh-runtime","matchLevel":1},"zh-TW":{"href":"/zh-TW/ssh-runtime","matchLevel":1},"en":{"href":"/en/ssh-runtime","matchLevel":0}}},"lastModified":"2026-11-02T17:00:28.628Z","originalFileLocation":"en/ssh-runtime.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Vibex\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"SSH and WSL remote runtimes - Vibex\">\u003cmeta data-mint-head property=\"og:description\" content=\"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Vibex\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://vibex.peatboy.com/docs/en/ssh-runtime\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://vibex-ai.mintlify.app/_mintlify/api/og/v2?division=Remote+development+and+self-hosting\u0026amp;title=SSH+and+WSL+remote+runtimes\u0026amp;description=Let+Vibex+install+and+run+the+authoritative+runtime+on+another+Linux+or+macOS+machine%2C+or+inside+WSL2+on+this+PC.\u0026amp;theme=e4618c451cc330865afb37f6\u0026amp;signature=0cf2f68926f85e4ac16dccc670e4b73153ba8b02132291c3e83f313329c4fcab\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"SSH and WSL remote runtimes - Vibex\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://vibex-ai.mintlify.app/_mintlify/api/og/v2?division=Remote+development+and+self-hosting\u0026amp;title=SSH+and+WSL+remote+runtimes\u0026amp;description=Let+Vibex+install+and+run+the+authoritative+runtime+on+another+Linux+or+macOS+machine%2C+or+inside+WSL2+on+this+PC.\u0026amp;theme=e4618c451cc330865afb37f6\u0026amp;signature=0cf2f68926f85e4ac16dccc670e4b73153ba8b02132291c3e83f313329c4fcab\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/vibex-ai/SKdgLG18JHlW9irk/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Vibex\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#166534\">\u003clink data-mint-head rel=\"canonical\" href=\"https://vibex.peatboy.com/docs/en/ssh-runtime\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/en/ssh-runtime.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://vibex.peatboy.com/docs/en/ssh-runtime\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-CN\" href=\"https://vibex.peatboy.com/docs/ssh-runtime\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh-TW\" href=\"https://vibex.peatboy.com/docs/zh-TW/ssh-runtime\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://vibex.peatboy.com/docs/ssh-runtime\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://vibex.peatboy.com/#organization\",\"name\":\"Vibex\",\"url\":\"https://vibex.peatboy.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/vibex-ai/H4h_RuiJ0RXtS5QI/logo/light.svg?fit=max\u0026auto=format\u0026n=H4h_RuiJ0RXtS5QI\u0026q=85\u0026s=3c71b0f6d676401b96fc5de20ed1f954\"}},{\"@type\":\"WebSite\",\"@id\":\"https://vibex.peatboy.com/docs#website\",\"name\":\"Vibex\",\"url\":\"https://vibex.peatboy.com/docs\",\"publisher\":{\"@id\":\"https://vibex.peatboy.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://vibex.peatboy.com/docs/en/ssh-runtime#webpage\",\"url\":\"https://vibex.peatboy.com/docs/en/ssh-runtime\",\"name\":\"SSH and WSL remote runtimes\",\"description\":\"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.\",\"dateModified\":\"2026-11-02T17:00:28.628Z\",\"isPartOf\":{\"@id\":\"https://vibex.peatboy.com/docs#website\"},\"breadcrumb\":{\"@id\":\"https://vibex.peatboy.com/docs/en/ssh-runtime#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://vibex.peatboy.com/docs/en/ssh-runtime#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Remote development and self-hosting\",\"item\":\"https://vibex.peatboy.com/docs/en/remote-mobile\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SSH and WSL remote runtimes\",\"item\":\"https://vibex.peatboy.com/docs/en/ssh-runtime\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://vibex.peatboy.com/docs/en/ssh-runtime#article\",\"headline\":\"SSH and WSL remote runtimes\",\"name\":\"SSH and WSL remote runtimes\",\"description\":\"Let Vibex install and run the authoritative runtime on another Linux or macOS machine, or inside WSL2 on this PC.\",\"url\":\"https://vibex.peatboy.com/docs/en/ssh-runtime\",\"mainEntityOfPage\":{\"@id\":\"https://vibex.peatboy.com/docs/en/ssh-runtime#webpage\"},\"dateModified\":\"2026-11-02T17:00:28.628Z\",\"publisher\":{\"@id\":\"https://vibex.peatboy.com/#organization\"},\"isPartOf\":{\"@id\":\"https://vibex.peatboy.com/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Vibex\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Vibex","nav":{"global":{"anchors":[{"anchor":"GitHub","icon":"https://mintlify.s3.us-west-1.amazonaws.com/vibex-ai/logo/github-mark.svg","href":"https://github.com/vibex-ai/vibex"},{"anchor":"Issues","icon":"https://mintlify.s3.us-west-1.amazonaws.com/vibex-ai/logo/github-mark.svg","href":"https://github.com/vibex-ai/vibex/issues"}]},"languages":[{"language":"zh-CN","default":true,"navbar":{"links":[{"href":"https://github.com/vibex-ai/vibex","label":"GitHub"},{"href":"https://github.com/vibex-ai/vibex/blob/main/LICENSE","label":"许可证"}],"primary":{"type":"button","label":"报告问题","href":"https://github.com/vibex-ai/vibex/issues/new"}},"pages":[{"title":"zh-CN","href":"/ssh-runtime"}]},{"language":"zh-TW","navbar":{"links":[{"href":"https://github.com/vibex-ai/vibex","label":"GitHub"},{"href":"https://github.com/vibex-ai/vibex/blob/main/LICENSE","label":"授權"}],"primary":{"type":"button","label":"回報問題","href":"https://github.com/vibex-ai/vibex/issues/new"}},"pages":[{"title":"zh-TW","href":"/zh-TW/ssh-runtime"}]},{"language":"en","navbar":{"links":[{"href":"https://github.com/vibex-ai/vibex","label":"GitHub"},{"href":"https://github.com/vibex-ai/vibex/blob/main/LICENSE","label":"License"}],"primary":{"type":"button","label":"Report an issue","href":"https://github.com/vibex-ai/vibex/issues/new"}},"tabs":[{"tab":"User guide","groups":[{"group":"Get started","pages":[{"title":"Vibex documentation","href":"/en"},{"title":"Core concepts","href":"/en/concepts"},{"title":"Install","href":"/en/install"},{"title":"Build from source","href":"/en/from-source"},{"title":"Quickstart","href":"/en/quickstart"},{"title":"Projects and workspaces","href":"/en/workspaces"}]},{"group":"Daily work","pages":[{"title":"Agent sessions","href":"/en/sessions"},{"title":"Code workbench","href":"/en/code-workbench"},{"title":"Terminal","href":"/en/terminal"},{"title":"Embedded browser","href":"/en/browser"},{"title":"Computer use","href":"/en/computer-use"},{"title":"Vibex TUI","href":"/en/tui"},{"title":"Git workflow","href":"/en/git"},{"title":"Usage statistics","href":"/en/usage"}]},{"group":"Extensions and configuration","pages":[{"title":"Config Center","href":"/en/config-center"},{"title":"Agents and provider profiles","href":"/en/agents-and-providers"},{"title":"Providers, route groups, and the local gateway","href":"/en/providers-and-gateway"},{"title":"MCP and Skills","href":"/en/mcp-and-skills"},{"title":"Settings","href":"/en/settings"}]},{"group":"Remote development and self-hosting","pages":[{"title":"Cloud development and remote development","description":"Run Vibex on a server, or reach your own desktop from your phone.","href":"/en/remote-mobile"},{"title":"SSH and WSL remote runtimes","href":"/en/ssh-runtime"},{"title":"Self-hosted headless runtime","description":"Run vibex-server on your own server so the desktop and mobile share one authoritative runtime.","href":"/en/self-hosted-server"},{"title":"Self-hosted Relay","href":"/en/relay"},{"title":"Privacy and recovery","href":"/en/privacy-and-recovery"}]},{"group":"Reference","pages":[{"title":"Shortcuts","href":"/en/reference/shortcuts"},{"title":"Environment variables","href":"/en/reference/environment-variables"},{"title":"Error codes","href":"/en/reference/error-codes"}]},{"group":"Help","pages":[{"title":"Troubleshooting","href":"/en/troubleshooting"}]}]},{"tab":"Developer guide","pages":[{"title":"Developer guide","href":"/en/developer"}]},{"tab":"Releases","pages":[{"title":"Releases","href":"/en/changelog"}]}]}]},"basePath":"","title":"SSH and WSL remote runtimes - Vibex","buildId":"dpl_9yaRmq8qi7yyMZn9oEWmKEdYMvGZ","deploymentId":"dpl_9yaRmq8qi7yyMZn9oEWmKEdYMvGZ","dynamics":[],"chunks":[]}