Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.
Use remote access when Plannotator runs on one machine but you want to review from a phone, tablet, or another computer. You are not deploying a persistent Plannotator server. Each command starts a temporary session that normally exits after you approve, send feedback, or close it.
Choose a connection
Method
Use it when
Connection
Tailscale Serve
The machine running Plannotator and the review device can join the same tailnet
HTTPS through Tailscale, while Plannotator stays bound to 127.0.0.1
Trusted Wi-Fi, LAN, or private VPN
The review device can reach the machine running Plannotator directly
Plain HTTP to an unauthenticated server bound to 0.0.0.0
SSH or development-container forwarding
Plannotator runs on a remote host or inside a container and the browser runs on your local computer
Plain HTTP through a forwarded local port
Plannotator does not add a login screen or per-request authentication to a remote session. Do not expose its port to the public internet or an untrusted network.
Use Tailscale
Before you start:
Install Plannotator v0.27.0 or later on the machine that runs your agent.
Install Tailscale and connect the agent host and review device to the same tailnet.
Enable HTTPS certificates for the tailnet.
Permit the review device to reach the agent host through your Tailscale access rules.
Then start the session with --tailscale:
plannotator review --tailscale
The same flag works for document annotation and the last-message picker:
Plannotator prints an HTTPS URL and displays a QR code in an interactive terminal. It keeps the temporary server on 127.0.0.1 and uses Tailscale Serve as the HTTPS proxy.
--tailscale works in the compiled Plannotator CLI. The Pi extension does not accept this flag.
Replace devbox.internal with a resolvable hostname, an IPv4 address such as 192.168.1.42, or a bracketed IPv6 address such as [fd7a:115c:a1e0::42].PLANNOTATOR_REMOTE=1 binds the temporary server to 0.0.0.0. PLANNOTATOR_URL_HOST changes only the URL that Plannotator prints. It does not change the bind address. The value must contain only a hostname or IP address, with no scheme, port, path, credentials, or whitespace.Remote mode uses port 19432 by default. Set a fixed port or a range when you need different network or concurrency behavior:
The compiled CLI prints the complete URL and displays its QR code when standard error is an interactive terminal. Pi reports the reachable URL but does not display the QR code.The core review, annotation, and approval flows work over plain HTTP. Browser features that require a secure context, including creating an encrypted short share link, require HTTPS.
PLANNOTATOR_URL_HOST=auto detects a Tailscale MagicDNS name or tailnet IPv4 address. For WireGuard, ZeroTier, a corporate VPN, or a LAN, set the hostname or IP address explicitly.
Forward a session over SSH
From your local computer, connect with the same local and remote port:
ssh -L 19432:127.0.0.1:19432 user@host
Inside that SSH session, start Plannotator:
plannotator review
Over SSH, remote mode turns on by itself from SSH_TTY or SSH_CONNECTION and uses port 19432, so you do not need PLANNOTATOR_REMOTE=1 or PLANNOTATOR_PORT. To use another port, set PLANNOTATOR_PORT and forward that port instead. If the shell lacks those SSH variables, for example in a tmux session started outside SSH, set PLANNOTATOR_REMOTE=1.Open http://localhost:19432, or the port you set, on your local computer. Plain SSH usually cannot open your local browser for you. The terminal prints the address.Remote mode listens on every interface of the remote host. The SSH tunnel does not stop another network peer from reaching the port through a different interface. Keep the port blocked by the host firewall and network policy.
Forward a development-container port
A VS Code development container usually opens the browser by itself. If it does not, or in any other development container, add the fixed port and remote mode to devcontainer.json:
Rebuild the container, start a review, and open http://localhost:19432 or the forwarded port from the editor’s Ports view. Keep its visibility private. Setting PLANNOTATOR_PORT without PLANNOTATOR_REMOTE=1 is not enough for a published Docker port, because local mode binds to 127.0.0.1 inside the container. A VS Code forwarded port can still reach that address.VS Code Remote and VS Code development containers usually provide a BROWSER helper that opens the forwarded URL on your local computer. Plannotator uses that helper when it is available. You can also set PLANNOTATOR_BROWSER to a browser or script.
Control deprecated link sharing
Remote access and link sharing are separate features. A live remote session lets another browser make the decision while the agent waits. The deprecated OSS sharing flow creates an asynchronous link that another person returns later.Disable link sharing when you only need the live remote session:
export PLANNOTATOR_SHARE=disabled
The variable applies to the compiled CLI, Pi, and integrations that use Plannotator’s shared configuration resolver. An explicit OpenCode share setting takes precedence.When sharing remains enabled, a remote Markdown session can produce a complete share URL in addition to the live session URL. The Markdown is inside that complete URL and can remain in terminal logs or shell capture.With sharing enabled, remote raw HTML uses the paste service because it cannot use the hash-only Markdown format. The compiled CLI encrypts and uploads the HTML when the remote session starts. Pi serves the HTML through the forwarded live session but does not upload it automatically at startup. Disable sharing before opening sensitive remote HTML when that upload is not intended.
Protect the annotate-mode agent terminal
The embedded agent terminal in annotate mode is disabled during remote and --tailscale sessions. Enabling it allows the browser to run commands on the machine that hosts Plannotator:
A working session returns 200. Replace 19432 if you selected another port. If the other device cannot connect, check these items:
The process that started Plannotator is in remote mode: it has PLANNOTATOR_REMOTE=1 or true, or SSH_TTY or SSH_CONNECTION with PLANNOTATOR_REMOTE not set to 0 or false.
The hostname or IP address resolves from the review device.
The firewall permits only the intended private path to the selected port.
An SSH or development-container forward uses the same port as Plannotator.
Tailscale is connected on both devices and its access rules permit the connection.
See Troubleshooting for port conflicts and host-specific checks.Last verified on August 12, 2026, against Plannotator v0.27.1 and product commits b69742c, 5f33b72, and ed6f44b. The SSH and development-container sections and the remote mode check were last verified on November 4, 2026, against product commit 98b38209c. Maintained by the Plannotator project.
Last modified on November 5, 2026
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Plannotator","description":"Plannotator product and open-source documentation, planning templates, framework profiles, comparisons, and guides to AI-assisted development.","colors":{"primary":"#6D5BD0","light":"#8A7BE0","dark":"#8A7BE0"},"logo":{"light":"https://mintcdn.com/plannotator/vqDpSTQONLoR6rqS/images/totman_transparent.webp?fit=max\u0026auto=format\u0026n=vqDpSTQONLoR6rqS\u0026q=85\u0026s=979a51a8f7a0fc863c02150b818d7df0","dark":"https://mintcdn.com/plannotator/vqDpSTQONLoR6rqS/images/totman_transparent.webp?fit=max\u0026auto=format\u0026n=vqDpSTQONLoR6rqS\u0026q=85\u0026s=979a51a8f7a0fc863c02150b818d7df0"},"favicon":"https://mintcdn.com/plannotator/R7DK-7odgGi8zHBh/favicon.png?fit=max\u0026auto=format\u0026n=R7DK-7odgGi8zHBh\u0026q=85\u0026s=3ab0d16d5c5acbc3b715b15b24274415","navbar":{"links":[{"href":"https://help.plannotator.ai/workspaces/","label":"Workspaces Help"},{"href":"https://github.com/backnotprop/plannotator","label":"GitHub"},{"href":"https://plannotator.ai","label":"Plannotator.ai"}],"primary":{"type":"button","label":"Open source","href":"/open-source/"}},"footer":{"socials":{}},"search":{"prompt":"Search Plannotator docs and guides…"},"seo":{"metatags":{"canonical":"https://docs.plannotator.ai","og:image":"https://plannotator.ai/assets/plannotator-generic-og-v1.jpg","twitter:image":"https://plannotator.ai/assets/plannotator-generic-og-v1.jpg","twitter:card":"summary_large_image"}},"errors":{"404":{"redirect":false,"title":"Page not found","description":"Use the product switcher, navigation, or search to find a page."}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"metadata":{"timestamp":true},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"plannotator","hasAudioNarration":false,"actualSubdomain":"plannotator","customDomains":["docs.plannotator.ai"],"gitSource":{"type":"github","owner":"plannotator","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":false,"mountPath":"","label":""},"entitlements":{"AI_CHAT":{"status":"ENABLED"}},"buildId":"6aebe80b859848b3a5e3dcb5","clientVersion":"0.0.4128","searchFilterCounts":[{"language":"default","tag":"Open Source","count":53},{"language":"default","tag":"Learn","count":31},{"language":"default","tag":"Planning Library","count":24},{"language":"default","tag":"Code review","count":12},{"language":"default","tag":"Start","count":12},{"language":"default","tag":"Agents","count":10},{"language":"default","tag":"Reference","count":10},{"language":"default","tag":"Templates","count":10},{"language":"default","tag":"Frameworks","count":9},{"language":"default","tag":"AI development workflows","count":9}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","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":"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":"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":"editor-metadata","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},{"name":"live-agents","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}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"open-source/remote-access","slug":"/open-source/remote-access","pageMetadata":{"title":"Open Plannotator on Another Device","sidebarTitle":"Remote access","description":"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.","keywords":["Plannotator remote access","Plannotator phone","Plannotator iPad","Plannotator LAN","Plannotator SSH port forwarding"],"og:type":"article","href":"/open-source/remote-access"},"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: \"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.\"\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={a:`a`,code:`code`,li:`li`,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,Note,Table,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Use remote access when Plannotator runs on one machine but you want to review from a phone, tablet, or another computer. You are not deploying a persistent Plannotator server. Each command starts a temporary session that normally exits after you approve, send feedback, or close it.`}),`\n`,_jsx(Heading,{level:`2`,id:`choose-a-connection`,children:`Choose a connection`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Method`}),_jsx(_components.th,{children:`Use it when`}),_jsx(_components.th,{children:`Connection`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Tailscale Serve`}),_jsx(_components.td,{children:`The machine running Plannotator and the review device can join the same tailnet`}),_jsxs(_components.td,{children:[`HTTPS through Tailscale, while Plannotator stays bound to `,_jsx(_components.code,{children:`127.0.0.1`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Trusted Wi-Fi, LAN, or private VPN`}),_jsx(_components.td,{children:`The review device can reach the machine running Plannotator directly`}),_jsxs(_components.td,{children:[`Plain HTTP to an unauthenticated server bound to `,_jsx(_components.code,{children:`0.0.0.0`})]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`SSH or development-container forwarding`}),_jsx(_components.td,{children:`Plannotator runs on a remote host or inside a container and the browser runs on your local computer`}),_jsx(_components.td,{children:`Plain HTTP through a forwarded local port`})]})]})]}),`\n`,_jsx(Warning,{children:_jsx(_components.p,{children:`Plannotator does not add a login screen or per-request authentication to a remote session. Do not expose its port to the public internet or an untrusted network.`})}),`\n`,_jsx(Heading,{level:`2`,id:`use-tailscale`,children:`Use Tailscale`}),`\n`,_jsx(_components.p,{children:`Before you start:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Install Plannotator `,_jsx(_components.code,{children:`v0.27.0`}),` or later on the machine that runs your agent.`]}),`\n`,_jsx(_components.li,{children:`Install Tailscale and connect the agent host and review device to the same tailnet.`}),`\n`,_jsx(_components.li,{children:`Enable HTTPS certificates for the tailnet.`}),`\n`,_jsx(_components.li,{children:`Permit the review device to reach the agent host through your Tailscale access rules.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Then start the session with `,_jsx(_components.code,{children:`--tailscale`}),`:`]}),`\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:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`plannotator review --tailscale`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The same flag works for document annotation and the last-message picker:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,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:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`plannotator annotate path/to/spec.md --tailscale`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`plannotator annotate-last --tailscale`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Plannotator prints an HTTPS URL and displays a QR code in an interactive terminal. It keeps the temporary server on `,_jsx(_components.code,{children:`127.0.0.1`}),` and uses Tailscale Serve as the HTTPS proxy.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`--tailscale`}),` works in the compiled Plannotator CLI. The Pi extension does not accept this flag.`]})}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/open-source/tailscale`,children:`Set up and troubleshoot Tailscale remote reviews`}),` for installation links, HTTPS approval, Serve conflicts, cleanup behavior, access failures, and command limits.`]}),`\n`,_jsx(Heading,{level:`2`,id:`use-trusted-wi-fi-a-lan-or-another-private-vpn`,children:`Use trusted Wi-Fi, a LAN, or another private VPN`}),`\n`,_jsx(_components.p,{children:`Set remote mode and advertise a hostname or IP address that the other device can reach:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,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:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`PLANNOTATOR_REMOTE=1 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`PLANNOTATOR_URL_HOST=devbox.internal \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`plannotator review`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Replace `,_jsx(_components.code,{children:`devbox.internal`}),` with a resolvable hostname, an IPv4 address such as `,_jsx(_components.code,{children:`192.168.1.42`}),`, or a bracketed IPv6 address such as `,_jsx(_components.code,{children:`[fd7a:115c:a1e0::42]`}),`.`]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`PLANNOTATOR_REMOTE=1`}),` binds the temporary server to `,_jsx(_components.code,{children:`0.0.0.0`}),`. `,_jsx(_components.code,{children:`PLANNOTATOR_URL_HOST`}),` changes only the URL that Plannotator prints. It does not change the bind address. The value must contain only a hostname or IP address, with no scheme, port, path, credentials, or whitespace.`]}),`\n`,_jsxs(_components.p,{children:[`Remote mode uses port `,_jsx(_components.code,{children:`19432`}),` by default. Set a fixed port or a range when you need different network or concurrency behavior:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,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:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`PLANNOTATOR_PORT=19432-19463 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`PLANNOTATOR_REMOTE=1 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`PLANNOTATOR_URL_HOST=devbox.internal \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`plannotator review`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The compiled CLI prints the complete URL and displays its QR code when standard error is an interactive terminal. Pi reports the reachable URL but does not display the QR code.`}),`\n`,_jsx(_components.p,{children:`The core review, annotation, and approval flows work over plain HTTP. Browser features that require a secure context, including creating an encrypted short share link, require HTTPS.`}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.code,{children:`PLANNOTATOR_URL_HOST=auto`}),` detects a Tailscale MagicDNS name or tailnet IPv4 address. For WireGuard, ZeroTier, a corporate VPN, or a LAN, set the hostname or IP address explicitly.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`forward-a-session-over-ssh`,children:`Forward a session over SSH`}),`\n`,_jsx(_components.p,{children:`From your local computer, connect with the same local and remote port:`}),`\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:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`ssh -L 19432:127.0.0.1:19432 user@host`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Inside that SSH session, start Plannotator:`}),`\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:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`plannotator review`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Over SSH, remote mode turns on by itself from `,_jsx(_components.code,{children:`SSH_TTY`}),` or `,_jsx(_components.code,{children:`SSH_CONNECTION`}),` and uses port `,_jsx(_components.code,{children:`19432`}),`, so you do not need `,_jsx(_components.code,{children:`PLANNOTATOR_REMOTE=1`}),` or `,_jsx(_components.code,{children:`PLANNOTATOR_PORT`}),`. To use another port, set `,_jsx(_components.code,{children:`PLANNOTATOR_PORT`}),` and forward that port instead. If the shell lacks those SSH variables, for example in a tmux session started outside SSH, set `,_jsx(_components.code,{children:`PLANNOTATOR_REMOTE=1`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`Open `,_jsx(_components.code,{children:`http://localhost:19432`}),`, or the port you set, on your local computer. Plain SSH usually cannot open your local browser for you. The terminal prints the address.`]}),`\n`,_jsx(_components.p,{children:`Remote mode listens on every interface of the remote host. The SSH tunnel does not stop another network peer from reaching the port through a different interface. Keep the port blocked by the host firewall and network policy.`}),`\n`,_jsx(Heading,{level:`2`,id:`forward-a-development-container-port`,children:`Forward a development-container port`}),`\n`,_jsxs(_components.p,{children:[`A VS Code development container usually opens the browser by itself. If it does not, or in any other development container, add the fixed port and remote mode to `,_jsx(_components.code,{children:`devcontainer.json`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`7`,language:`json`,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:`json`,children:_jsxs(_components.code,{language:`json`,numberOfLines:`7`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"containerEnv\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"PLANNOTATOR_REMOTE\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"1\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"PLANNOTATOR_PORT\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"19432\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#9CDCFE`},children:` \"forwardPorts\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`19432`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Rebuild the container, start a review, and open `,_jsx(_components.code,{children:`http://localhost:19432`}),` or the forwarded port from the editor’s `,_jsx(_components.strong,{children:`Ports`}),` view. Keep its visibility private. Setting `,_jsx(_components.code,{children:`PLANNOTATOR_PORT`}),` without `,_jsx(_components.code,{children:`PLANNOTATOR_REMOTE=1`}),` is not enough for a published Docker port, because local mode binds to `,_jsx(_components.code,{children:`127.0.0.1`}),` inside the container. A VS Code forwarded port can still reach that address.`]}),`\n`,_jsxs(_components.p,{children:[`VS Code Remote and VS Code development containers usually provide a `,_jsx(_components.code,{children:`BROWSER`}),` helper that opens the forwarded URL on your local computer. Plannotator uses that helper when it is available. You can also set `,_jsx(_components.a,{href:`/open-source/reference/environment-variables#session-and-browser`,children:_jsx(_components.code,{children:`PLANNOTATOR_BROWSER`})}),` to a browser or script.`]}),`\n`,_jsx(Heading,{level:`2`,id:`control-deprecated-link-sharing`,children:`Control deprecated link sharing`}),`\n`,_jsx(_components.p,{children:`Remote access and link sharing are separate features. A live remote session lets another browser make the decision while the agent waits. The deprecated OSS sharing flow creates an asynchronous link that another person returns later.`}),`\n`,_jsx(_components.p,{children:`Disable link sharing when you only need the live remote session:`}),`\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:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` PLANNOTATOR_SHARE=disabled`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The variable applies to the compiled CLI, Pi, and integrations that use Plannotator’s shared configuration resolver. An explicit OpenCode `,_jsx(_components.code,{children:`share`}),` setting takes precedence.`]}),`\n`,_jsx(_components.p,{children:`When sharing remains enabled, a remote Markdown session can produce a complete share URL in addition to the live session URL. The Markdown is inside that complete URL and can remain in terminal logs or shell capture.`}),`\n`,_jsx(_components.p,{children:`With sharing enabled, remote raw HTML uses the paste service because it cannot use the hash-only Markdown format. The compiled CLI encrypts and uploads the HTML when the remote session starts. Pi serves the HTML through the forwarded live session but does not upload it automatically at startup. Disable sharing before opening sensitive remote HTML when that upload is not intended.`}),`\n`,_jsx(Heading,{level:`2`,id:`protect-the-annotate-mode-agent-terminal`,children:`Protect the annotate-mode agent terminal`}),`\n`,_jsxs(_components.p,{children:[`The embedded agent terminal in annotate mode is disabled during remote and `,_jsx(_components.code,{children:`--tailscale`}),` sessions. Enabling it allows the browser to run commands on the machine that hosts Plannotator:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`3`,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:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`PLANNOTATOR_AGENT_TERMINAL_REMOTE=1 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`PLANNOTATOR_REMOTE=1 \\\\`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`plannotator annotate path/to/spec.md`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Use this setting only when every device and network path that can reach the session is trusted. The terminal token is not an authentication boundary.`}),`\n`,_jsx(Heading,{level:`2`,id:`troubleshoot-the-connection`,children:`Troubleshoot the connection`}),`\n`,_jsx(_components.p,{children:`During a session, check the server on the machine running Plannotator:`}),`\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:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` -fsS -o /dev/null -w `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`'%{http_code}\\\\n'`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` http://127.0.0.1:19432/`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`A working session returns `,_jsx(_components.code,{children:`200`}),`. Replace `,_jsx(_components.code,{children:`19432`}),` if you selected another port. If the other device cannot connect, check these items:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`The process that started Plannotator is in remote mode: it has `,_jsx(_components.code,{children:`PLANNOTATOR_REMOTE=1`}),` or `,_jsx(_components.code,{children:`true`}),`, or `,_jsx(_components.code,{children:`SSH_TTY`}),` or `,_jsx(_components.code,{children:`SSH_CONNECTION`}),` with `,_jsx(_components.code,{children:`PLANNOTATOR_REMOTE`}),` not set to `,_jsx(_components.code,{children:`0`}),` or `,_jsx(_components.code,{children:`false`}),`.`]}),`\n`,_jsx(_components.li,{children:`The hostname or IP address resolves from the review device.`}),`\n`,_jsx(_components.li,{children:`The firewall permits only the intended private path to the selected port.`}),`\n`,_jsx(_components.li,{children:`An SSH or development-container forward uses the same port as Plannotator.`}),`\n`,_jsx(_components.li,{children:`Tailscale is connected on both devices and its access rules permit the connection.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See `,_jsx(_components.a,{href:`/open-source/troubleshooting#remote-ssh-and-development-containers`,children:`Troubleshooting`}),` for port conflicts and host-specific checks.`]}),`\n`,_jsxs(_components.p,{children:[`Last verified on August 12, 2026, against Plannotator `,_jsx(_components.code,{children:`v0.27.1`}),` and product commits `,_jsx(_components.code,{children:`b69742c`}),`, `,_jsx(_components.code,{children:`5f33b72`}),`, and `,_jsx(_components.code,{children:`ed6f44b`}),`. The SSH and development-container sections and the remote mode check were last verified on November 4, 2026, against product commit `,_jsx(_components.code,{children:`98b38209c`}),`. Maintained by the Plannotator project.`]})]})}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":"Open Plannotator on Another Device","sidebarTitle":"Remote access","description":"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.","keywords":["Plannotator remote access","Plannotator phone","Plannotator iPad","Plannotator LAN","Plannotator SSH port forwarding"],"og:type":"article","href":"/open-source/remote-access"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Choose a connection","slug":"choose-a-connection","depth":2,"children":[]},{"title":"Use Tailscale","slug":"use-tailscale","depth":2,"children":[]},{"title":"Use trusted Wi-Fi, a LAN, or another private VPN","slug":"use-trusted-wi-fi-a-lan-or-another-private-vpn","depth":2,"children":[]},{"title":"Forward a session over SSH","slug":"forward-a-session-over-ssh","depth":2,"children":[]},{"title":"Forward a development-container port","slug":"forward-a-development-container-port","depth":2,"children":[]},{"title":"Control deprecated link sharing","slug":"control-deprecated-link-sharing","depth":2,"children":[]},{"title":"Protect the annotate-mode agent terminal","slug":"protect-the-annotate-mode-agent-terminal","depth":2,"children":[]},{"title":"Troubleshoot the connection","slug":"troubleshoot-the-connection","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"plannotator","siteName":"Plannotator","title":"Open Plannotator on Another Device - Plannotator","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-05T02:21:04.227Z","gitLastModified":"2026-11-05T02:20:57.000Z","originalFileLocation":"open-source/remote-access.mdx"},"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=\"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Plannotator\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_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=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Open Plannotator on Another Device - Plannotator\">\u003cmeta data-mint-head property=\"og:description\" content=\"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Plannotator\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.plannotator.ai/open-source/remote-access\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://plannotator.ai/assets/plannotator-generic-og-v1.jpg\">\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=\"Open Plannotator on Another Device - Plannotator\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://plannotator.ai/assets/plannotator-generic-og-v1.jpg\">\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=\"/mintlify-assets/_mintlify/favicons/plannotator/hZJJbeM0ENum3mVc/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Plannotator\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6D5BD0\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.plannotator.ai/open-source/remote-access\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/open-source/remote-access.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.plannotator.ai/#organization\",\"name\":\"Plannotator\",\"url\":\"https://docs.plannotator.ai\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/plannotator/vqDpSTQONLoR6rqS/images/totman_transparent.webp?fit=max\u0026auto=format\u0026n=vqDpSTQONLoR6rqS\u0026q=85\u0026s=979a51a8f7a0fc863c02150b818d7df0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.plannotator.ai#website\",\"name\":\"Plannotator\",\"url\":\"https://docs.plannotator.ai\",\"publisher\":{\"@id\":\"https://docs.plannotator.ai/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.plannotator.ai/open-source/remote-access#webpage\",\"url\":\"https://docs.plannotator.ai/open-source/remote-access\",\"name\":\"Open Plannotator on Another Device\",\"description\":\"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.\",\"dateModified\":\"2026-11-05T02:20:57.000Z\",\"isPartOf\":{\"@id\":\"https://docs.plannotator.ai#website\"},\"breadcrumb\":{\"@id\":\"https://docs.plannotator.ai/open-source/remote-access#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.plannotator.ai/open-source/remote-access#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Start\",\"item\":\"https://docs.plannotator.ai/open-source\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Open Plannotator on Another Device\",\"item\":\"https://docs.plannotator.ai/open-source/remote-access\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.plannotator.ai/open-source/remote-access#article\",\"headline\":\"Open Plannotator on Another Device\",\"name\":\"Open Plannotator on Another Device\",\"description\":\"Open a Plannotator session from a phone, tablet, local browser, or another computer through Tailscale, a trusted private network, SSH, or a development-container port forward.\",\"url\":\"https://docs.plannotator.ai/open-source/remote-access\",\"mainEntityOfPage\":{\"@id\":\"https://docs.plannotator.ai/open-source/remote-access#webpage\"},\"image\":\"https://plannotator.ai/assets/plannotator-generic-og-v1.jpg\",\"dateModified\":\"2026-11-05T02:20:57.000Z\",\"keywords\":\"Plannotator remote access, Plannotator phone, Plannotator iPad, Plannotator LAN, Plannotator SSH port forwarding\",\"publisher\":{\"@id\":\"https://docs.plannotator.ai/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.plannotator.ai#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Plannotator\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Plannotator\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/open-source/remote-access.md","siteName":"Plannotator","nav":{"global":null,"products":[{"product":"Plannotator","icon":"house","pages":[{"title":"Plannotator","href":""}]},{"product":"Open Source","icon":"code-branch","groups":[{"group":"Start","pages":[{"title":"Plannotator OSS Documentation","sidebarTitle":"Overview","href":"/open-source"},{"title":"Install Plannotator","sidebarTitle":"Installation","href":"/open-source/start/installation"},{"title":"Plannotator Open Source Security","sidebarTitle":"Security","href":"/open-source/security"},{"title":"Self-Host Plannotator's Deprecated Share Services","sidebarTitle":"Self-hosting","href":"/open-source/self-hosting"},{"title":"Set Up the Plannotator Inbox for Your Coding Agents","sidebarTitle":"Inbox","href":"/open-source/inbox"},{"title":"Review Plannotator Sessions over Tailscale","sidebarTitle":"Tailscale remote reviews","description":"Open Plannotator review and annotation sessions from another device through Tailscale Serve without binding the server beyond localhost.","href":"/open-source/tailscale"},{"title":"Open Plannotator on Another Device","sidebarTitle":"Remote access","href":"/open-source/remote-access"},{"title":"Install and Manage Plannotator Skills","sidebarTitle":"Skills","description":"Install Plannotator's core or extra agent skills, choose specific skills and hosts, update them, and remove them.","href":"/open-source/start/skills"},{"title":"Annotate Your First Plan","sidebarTitle":"Quickstart: Planning","href":"/open-source/start/quickstart"},{"title":"Review Your First Code Change","sidebarTitle":"Quickstart: Code Review","href":"/open-source/start/code-review-quickstart"},{"title":"Open Plannotator","sidebarTitle":"Open Plannotator","href":"/open-source/start/open-plannotator"},{"title":"Turn Plannotator Feedback into Agent Skills","sidebarTitle":"Compound value","href":"/open-source/start/compound-value"}]},{"group":"Plans and documents","pages":[{"title":"Review an AI Coding Plan with Plannotator","sidebarTitle":"Plan review","href":"/open-source/workflows/plan-review"},{"title":"Open and Annotate Markdown, Documents, URLs, and Folders","sidebarTitle":"Documents","href":"/open-source/workflows/documents"},{"title":"Annotate a Folder with Plannotator","sidebarTitle":"Folders","href":"/open-source/workflows/folders"},{"title":"Annotate HTML in Plannotator","sidebarTitle":"HTML","href":"/open-source/workflows/html"},{"title":"Add Annotations and Send Feedback","sidebarTitle":"Annotations and feedback","href":"/open-source/workflows/annotations-and-feedback"},{"title":"Answer Your Agent's Questions Asynchronously","sidebarTitle":"Questions","href":"/open-source/workflows/questions"},{"title":"Use Local Version History and Plan Diffs","sidebarTitle":"Version history","href":"/open-source/workflows/version-history"},{"title":"Share a Plannotator Session","sidebarTitle":"Sharing","href":"/open-source/workflows/sharing"}]},{"group":"Code review","pages":[{"title":"Code Review with Plannotator","sidebarTitle":"Code review overview","href":"/code-review/index"},{"title":"Review local code changes","sidebarTitle":"Local changes","href":"/open-source/workflows/local-changes"},{"title":"Review GitButler Workspaces, Stacks, and Branches","sidebarTitle":"GitButler","href":"/open-source/workflows/gitbutler"},{"title":"Review pull requests and merge requests","sidebarTitle":"Pull requests and merge requests","href":"/open-source/workflows/pull-requests"},{"title":"Ask AI during a review","sidebarTitle":"Ask AI","href":"/open-source/workflows/ask-ai"},{"title":"Ask This Session: Ask AI Answered by Your Agent","sidebarTitle":"Ask this session","href":"/open-source/workflows/ask-this-session"},{"title":"Run Agent Reviews, Code Tours, and Guided Reviews","sidebarTitle":"Agent and guided reviews","href":"/open-source/workflows/agent-reviews"}]},{"group":"Reference","pages":[{"title":"Automate and Customize Plannotator","sidebarTitle":"Reference overview","href":"/open-source/reference/index"},{"title":"Plannotator CLI reference","sidebarTitle":"CLI","href":"/open-source/reference/cli"},{"title":"Configure Plannotator","sidebarTitle":"Configuration","href":"/open-source/reference/configuration"},{"title":"Plannotator environment variables","sidebarTitle":"Environment variables","href":"/open-source/reference/environment-variables"},{"title":"Plannotator OSS Privacy and Data Flow","sidebarTitle":"Privacy and data flow","href":"/open-source/reference/privacy-and-data-flow"},{"title":"Customize Feedback","sidebarTitle":"Custom feedback","href":"/open-source/reference/custom-feedback"},{"title":"Plannotator keyboard shortcuts","sidebarTitle":"Keyboard shortcuts","href":"/open-source/reference/keyboard-shortcuts"},{"title":"Use Plannotator Approval Gates and Automation Hooks","sidebarTitle":"Gates and hooks","href":"/open-source/reference/hooks"},{"title":"Plannotator Local Server and API","sidebarTitle":"Local server and API","href":"/open-source/reference/local-api"},{"title":"Add external annotations to Plannotator","sidebarTitle":"External annotations","href":"/open-source/reference/external-annotations"}]},{"group":"Agents","pages":[{"title":"Choose Your Agent","sidebarTitle":"Agents","href":"/open-source/agents/index"},{"title":"Use Plannotator with Claude Code","sidebarTitle":"Claude Code","href":"/open-source/agents/claude-code"},{"title":"Use Plannotator with Codex","sidebarTitle":"Codex","href":"/open-source/agents/codex"},{"title":"Use Plannotator with OpenCode","sidebarTitle":"OpenCode","href":"/open-source/agents/opencode"},{"title":"Use Plannotator with Copilot CLI","sidebarTitle":"Copilot CLI","href":"/open-source/agents/copilot-cli"},{"title":"Use Plannotator with Gemini CLI","sidebarTitle":"Gemini CLI","href":"/open-source/agents/gemini-cli"},{"title":"Use Plannotator with Pi","sidebarTitle":"Pi","href":"/open-source/agents/pi"},{"title":"Use Plannotator with Amp","sidebarTitle":"Amp","href":"/open-source/agents/amp"},{"title":"Use Plannotator with Droid","sidebarTitle":"Droid","href":"/open-source/agents/droid"},{"title":"Use Plannotator with Kiro CLI","sidebarTitle":"Kiro CLI","href":"/open-source/agents/kiro-cli"}]},{"group":"Editors and notes","pages":[{"title":"Open Plannotator in VS Code","sidebarTitle":"VS Code","href":"/open-source/agents/vscode"},{"title":"Open review files in Zed","sidebarTitle":"Zed","href":"/open-source/agents/zed"},{"title":"Save Plannotator Plans to Obsidian or Bear","sidebarTitle":"Obsidian and Bear","href":"/open-source/agents/notes"},{"title":"Save Plannotator Plans to Octarine","sidebarTitle":"Octarine","href":"/open-source/agents/octarine"}]},{"group":"Troubleshooting","pages":[{"title":"Troubleshoot Plannotator","sidebarTitle":"Troubleshooting","href":"/open-source/troubleshooting"}]},{"group":"Related project","pages":[{"title":"Artifact Server: A Local Workspace for AI Agent Artifacts","sidebarTitle":"Artifact Server","href":"/open-source/artifact-server"}]}]},{"product":"Planning Library","icon":"books","pages":[{"title":"Planning Library","href":"/templates"}]},{"product":"Learn","icon":"graduation-cap","pages":[{"title":"Learn","href":"/learn"}]}]},"basePath":"","title":"Open Plannotator on Another Device - Plannotator","buildId":"dpl_5tKr6cUUeuVJdEZ9JAEY3h4soMJ8","deploymentId":"dpl_5tKr6cUUeuVJdEZ9JAEY3h4soMJ8","dynamics":[],"chunks":[]}