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.