Open Pair

July 31, 2026 · View on GitHub

CI

Real-time collaborative editing between VS Code and Neovim (or VS Code and VS Code) with no Microsoft account required. Uses direct TCP connections with AES-256-GCM end-to-end encryption — optionally exposed over the internet via SSH tunnels (localhost.run, serveo) or ngrok. Neovim interop via live-share.nvim.

Supported combinations

HostGuestNotes
VS Code / compatible editorVS Code / compatible editorFull support
VS Code / compatible editorNeovim (live-share.nvim)Full support
Neovim (live-share.nvim)VS Code / compatible editorFull support

Demo

Gifs used with permission from azratul, maintainer of live-share.nvim.

Neovim as Host, VS Code as Guest

Neovim Host - VS Code Guest

VS Code as Host, Neovim as Guest

VS Code Host - Neovim Guest

Features

FeatureStatus
Guest mode (join a Neovim or VS Code host)
Host mode (serve Neovim or VS Code guests)
AES-256-GCM end-to-end encryption
Remote cursors & selections
Follow mode
Shared terminalWIP
Read-only guest role

Compatible editors

Works in any VS Code-compatible editor:

Requirements

  • A compatible editor (see above)
  • To join a Neovim session: live-share.nvim running as host
  • To use a tunnel: ssh in PATH (for localhost.run / serveo) or ngrok CLI

Usage

Joining a session (VS Code as guest)

Works when the host is either another VS Code instance or a Neovim session running live-share.nvim.

  1. Get the share URL from the host (e.g. tcp://1.2.3.4:9876#key=... or host.example.com:80#key=...)
  2. Open the Command Palette (Ctrl+Shift+P) and run Open Pair: Join Session
  3. Paste the URL and enter your display name
  4. Use Open Pair: Open Workspace File to browse the remote file tree
  5. Use Open Pair: Toggle Follow Mode to follow a peer's cursor
  6. Use Open Pair: Show Peers to see who is connected
  7. Run Open Pair: Stop Session to disconnect

Hosting a session (VS Code as host)

VS Code and Neovim guests can join the same session simultaneously.

  1. Open a folder or workspace in VS Code
  2. Run Open Pair: Start Hosting from the Command Palette
  3. Enter your display name and port (default: 9876)
  4. Choose a tunnel provider or None for local network only
  5. The share URL is automatically copied to your clipboard
  6. Share the URL — guests can join from VS Code or Neovim
  7. Approve or deny each incoming connection (read-write or read-only)
  8. Run Open Pair: Stop Session to end the session

URL formats

FormatTransportWhen to use
tcp://host:port#key=...Raw TCPngrok tcp:// or direct LAN
host:port#key=...WebSocketlocalhost.run, serveo, bore.pub
https://host#key=...WebSocketlocalhost.run HTTPS URLs

Tunnel providers

ProviderCommandNotes
nokey@localhost.runsshRecommended — no account needed
localhost.runsshRequires a localhost.run account
serveo.netsshPublic SSH tunnel
ngrokngrokRequires ngrok CLI and auth token
NoneLocal network / VPN only

With bore, share the port from the listening at bore.pub:<port> line — not 7835, which is bore's control port and never carries tunnel traffic.

Settings

SettingDefaultDescription
openPair.connectTimeout15Seconds to wait for the connection to the host to be established. Raise this on slow tunnels.
openPair.approvalTimeout60Seconds to wait for the host to accept the join request, once connected.

Limitations

  • Neovim compatibility: requires live-share.nvim with protocol version 3+
  • Single workspace folder: only the first workspace folder is shared when hosting
  • No offline mode: an active network connection is required
  • Tunnel reliability: third-party tunnels (serveo, localhost.run) may be unreliable or unavailable; for stable use prefer ngrok or a direct connection

Troubleshooting

"Could not establish a connection"

  • Nothing completed a handshake at that address — usually the wrong host or port rather than a host that stopped sharing. Re-check the URL against what the host is actually sharing
  • Check that the port is open in any firewall on the host machine
  • If using a tunnel, wait a few seconds for it to establish before sharing the URL

"Connected, but the host never accepted"

  • The address is reachable, so the host is running. They either declined the request or never saw the dialog — raise openPair.approvalTimeout if they need longer
  • Try a different tunnel provider — serveo and localhost.run can be flaky

"No encryption key found in URL"

  • The #key=... fragment must be present in the URL. Make sure it wasn't stripped by your messaging app (some apps remove URL fragments)

Files appear garbled (wrong encoding)

  • This can happen with UTF-16 LE files on Windows. Update to v0.1.8+

Cursor of remote peer doesn't appear

  • The remote file must be open in an editor tab (not just in the file tree)

Debug info

  • Run Open Pair: Debug Info from the Command Palette to dump session state, transport mode, and peer list to an output channel

Development

git clone https://github.com/darkerthanblack2000/open-pair
cd open-pair
npm install
npm run compile   # single build
npm run watch     # rebuild on save
npm run typecheck # type-check without building
npm run lint      # ESLint
npm run format    # Prettier

Press F5 in VS Code to launch the Extension Development Host.

See CONTRIBUTING.md for more details.

License

MIT — see LICENSE