Chat em tempo real,
sem sair do terminal.

O hackerchat é um cliente de chat que roda no terminal, um servidor WebSocket enxuto e um SDK em JavaScript. Você sobe o servidor, entra numa sala e conversa direto do shell, ou de qualquer interface que fale WebSocket.

Ver no GitHub (abre em nova aba)
$

Três peças, um protocolo.

Cliente, servidor e SDK trocam frames JSON por WebSocket. Cada peça é um repositório independente, e qualquer uma delas pode ser substituída por uma implementação sua.

Servidor WebSocket

Hub em Node.js que cria salas sob demanda e roteia mensagens entre os clientes conectados. Sem banco de dados, sem cadastro, sem estado fora da memória.

O protocolo no fio

Cada mensagem é um objeto JSON com um evento e um payload. Quatro eventos cobrem tudo: entrar numa sala, enviar mensagem, receber a lista de usuários e saber quando alguém entra ou sai.

cliente envia
{ "event": "joinRoom",
  "message": { "userName": "alice",
               "roomId": "general" } }

{ "event": "message",
  "message": "hello, world" }
servidor devolve
{ "event": "updateUsers",
  "message": [{ "id": "…", "userName": "alice" }] }

{ "event": "newUserConnected",
  "message": { "id": "…", "userName": "alice" } }

{ "event": "message",
  "message": { "userName": "alice",
               "message": "hello, world" } }

{ "event": "disconnectUser",
  "message": { "id": "…", "userName": "alice" } }

Rodando em dois terminais.

O servidor público foi desativado. Clone o servidor, rode localmente e aponte o cliente para ele. Leva menos de um minuto.

Requer Node.js 24 ou mais recente.

  1. Suba o servidor

    Clone o repositório e rode em modo de desenvolvimento. Ele escuta na porta 9898 por padrão; use a variável PORT para trocar.

    terminal 1
    git clone https://github.com/matheussartori/hackerchat-server.git
    cd hackerchat-server
    npm install
    npm run dev
    # listening on ws://0.0.0.0:9898
  2. Conecte um cliente

    Em outro terminal, rode o cliente com npx, sem instalar nada. As flags --username e --room são obrigatórias, e --hostUri aponta para o seu servidor.

    terminal 2
    npx @matheussartori/hackerchat-client \
      --username alice \
      --room general \
      --hostUri ws://localhost:9898
  3. Converse

    Abra um terceiro terminal com outro nome de usuário, ou entre pelo playground no fim da página, e veja as mensagens chegarem em tempo real.

    terminal 3
    npx @matheussartori/hackerchat-client \
      --username bob \
      --room general \
      --hostUri ws://localhost:9898

Prefere um comando mais curto?

Instale o cliente globalmente e chame hackerchat direto.

instalação global
npm install -g @matheussartori/hackerchat-client
hackerchat --username alice --room general --hostUri ws://localhost:9898

Flags, atalhos e variáveis.

Tudo o que o cliente e o servidor aceitam, num lugar só.

Flags do cliente
flagdescriçãouso
--usernameNome exibido na sala.obrigatória
--roomSala para entrar. É criada se ainda não existir.obrigatória
--hostUriURL WebSocket do servidor, com ws:// ou wss://. Sem ela, o cliente tenta o endereço público antigo, que foi desativado.recomendada
Atalhos da interface
teclaação
EnterEnvia a mensagem.
PgUp / PgDnRola o histórico uma página por vez.
Ctrl+U / Ctrl+DRola o histórico uma linha por vez.
Home / EndVai para a mensagem mais antiga ou volta para a mais recente.
Esc / Ctrl+CSai do cliente.
Variáveis do servidor
variávelpadrãodescrição
PORT9898Porta TCP em que o servidor escuta.
LOG_LEVELerrorNível mínimo de log: debug, info, warning ou error.

Três repositórios, dois pacotes no npm.

Tudo em TypeScript, sob licença MIT. O servidor não é publicado no npm: clone e rode.

Teste o SDK no navegador.

Esta seção usa o @matheussartori/hackerchat-js-sdk para se conectar a um servidor hackerchat. Suba um servidor local, ou informe o endereço de um seu, e entre numa sala.

o que roda por trás
import { useHackerchat } from '@matheussartori/hackerchat-js-sdk/react'

const { status, users, messages, sendMessage } = useHackerchat({
  url: 'ws://localhost:9898',
  userName: 'alice',
  roomId: 'general',
})

Conectar

URL WebSocket completa, com ws:// ou wss://.
Como você aparece na sala.
Letras, números e traços. É criada se não existir.
Endereços localhost funcionam mesmo com esta página em HTTPS.