Open source terminal sharing

Your terminal, anywhere.

Access your terminal from any browser. One command to start. Scan a QR code to connect.

No install. No config. No signup.

How it works

A WebSocket server bridges your terminal to the browser. Secure tokens, real-time I/O.

01

Run the command

Starts a local server with a unique token

02

Open the link

Or scan the QR code from your phone

03

You're connected

Full terminal access in your browser

Packages

Modular packages you can use together or independently. Install what you need.

@walkie-talkie/cli

One-command terminal server. Generates tokens, prints QR codes, and opens the web client. No config required.

--open--port--dir--force
$ npx @walkie-talkie/cli@latest
@walkie-talkie/react

React hooks and a drop-in terminal component. useWalkieTalkie() for connection state, TerminalView for rendering.

useWalkieTalkieTerminalViewdefaultTheme
$ npm i @walkie-talkie/react
@walkie-talkie/client

Framework-agnostic WebSocket client. Auto-reconnect with exponential backoff, session resumption, and typed messages.

WalkieTalkieClientConnectionStatesaveConnection
$ npm i @walkie-talkie/client
@walkie-talkie/shared

Protocol types and constants. Use this to build your own client in any language or runtime.

ServerMessageClientMessageTerminalInfo
$ npm i @walkie-talkie/shared

Custom terminal UI in minutes

The React package gives you everything you need to build custom terminal experiences. Full xterm.js rendering with auto-resize, theming, and connection management out of the box.

useWalkieTalkie()Connection state, terminal list, I/O
TerminalViewDrop-in xterm.js component
defaultThemePre-built terminal color scheme
usePersistedStatelocalStorage-backed React state
MyTerminal.tsx
import { useWalkieTalkie, TerminalView }
from '@walkie-talkie/react';
function App() {
const { connect, terminals, sendInput,
resizeTerminal, registerOutputHandler,
createTerminal } = useWalkieTalkie();
return (
<TerminalView
terminalId={terminals[0].id}
isActive={true}
onInput={d => sendInput(id, d)}
onResize={resizeTerminal}
registerOutput={registerOutputHandler}
/>
);
}

Or go framework-agnostic

The client package handles WebSocket connections, auth, and reconnection. No React required — use it with any framework or vanilla JS.

connect()Authenticate and open a session
onStateChange()Subscribe to connection state
onMessage()Handle all server messages
resumeSession()Reconnect to an existing session
client.ts
import { WalkieTalkieClient }
from '@walkie-talkie/client';
const client = new WalkieTalkieClient();
client.onStateChange(state => {
console.log('State:', state);
});
client.onMessage(msg => {
if (msg.type === 'terminal:output')
terminal.write(msg.data);
});
// Connect with server URL + token
client.connect('ws://localhost:3456', token);

Protocol reference

Every message type, at a glance.

Client → Server

auth
terminal:create
terminal:input
terminal:resize
terminal:kill
terminal:list

Server → Client

auth:ok
auth:fail
terminal:created
terminal:output
terminal:exited
terminal:list
error

One command. Real terminal. Any device.

Open source, MIT licensed. Start building in seconds.

View on GitHub →