Walkie-Talkie — Remote Terminal Access

2 min read Original article ↗

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.