Cliente SSH estilo Termius — rápido, dark e com suas credenciais criptografadas.
Instalação · Funcionalidades · Monitor · Rodando local · Release · Importação · Segurança · Contribuindo
| 🔐 Vault criptografado | Servidores e senhas em arquivo local cifrado (Argon2id + AES-256-GCM), destravado com senha-mestre |
| ⚡ Conexão em 2 clicks | Credenciais salvas (senha ou chave privada) — clicou, conectou |
| 🗂️ Abas | Uma aba por conexão; clicar num servidor já conectado só foca a aba, nunca duplica |
| 🏷️ Tags com cor | Categorias coloridas, agrupamento na sidebar e drag & drop pra reorganizar e mover entre grupos |
| 📁 SFTP | Navegador de arquivos por sessão — duplo click baixa direto pro seu computador, com barra de progresso; pastas inteiras e multi-seleção |
| 🗃️ Modo Arquivos (GUI) | Gerenciador de arquivos em tela cheia com editor embutido (syntax highlight), grid, menu de contexto, renomear, ou abrir em nano/vim no terminal. Abre na pasta onde o terminal está |
| ✏️ nano/vim no editor do app | No terminal, nano arquivo, vim arquivo ou vi arquivo (arquivo que já existe) abre no editor embutido. Com flags, arquivo novo ou dentro de tmux/screen roda o editor de verdade; command nano arquivo força o do terminal. Funciona em bash, zsh e sh: o app define as funções na sessão ao conectar, sem gravar nada no servidor |
| 📊 Modo Monitor | KPIs do servidor (CPU, memória, disco, uptime), stack instalada, PM2 ao vivo com detalhe por processo, sites nginx, logs Laravel, ações rápidas e kit de ajuda — detalhes |
| 📥 Importação / exportação | Importa CSV/JSON (cole ou escolha o arquivo; duplicados são atualizados) e exporta o vault confirmando a senha-mestre |
| Comandos salvos que rodam com 1 click na sessão ativa (aparecem só com uma sessão conectada) | |
| 🔀 Port forwarding | Túneis locais por servidor, liga/desliga no menu do servidor |
| 🧭 Conexão explicada | Overlay mostra cada etapa em tempo real (DNS → TCP → handshake → host key → auth → shell), com retry e cancelamento |
| 🛡️ Host key TOFU | Fingerprint salva no primeiro acesso; se mudar, a conexão é recusada (proteção MITM) |
| 🔄 Auto-update | Checa releases assinadas a cada 5 min (ou no botão), mostra as notas e instala com 1 click; changelog completo dentro do app |
| 🚪 Fechamento limpo | Fechar a aba manda exit pro shell remoto antes de derrubar o canal — sem sessão sshd órfã no servidor |
Com uma sessão conectada, o seletor na barra de abas alterna entre Terminal, Arquivos e Monitor. O Monitor roda comandos de leitura pela sessão auxiliar (a mesma do SFTP) e renderiza tudo formatado, sem você digitar nada:
- Servidor: load/CPU, memória, disco e uptime com sparklines, a cada 5s
- Stack instalada: versões de PHP, Composer, Node, npm, PM2, nginx, Docker, git e o SO
- PM2: tabela ao vivo com id, modo (cluster com índice da instância, ou fork), badge worker pra processos de fila, status, CPU com histórico, memória, restarts e uptime. Clicar na linha abre o "monit" daquele processo em tempo real (2s): CPU e memória com gráfico, restarts instáveis, métricas custom do
pm2 monit(heap, event loop…), script/cwd/node/logs, logs parseados e coloridos por nível (timestamp, pid, filtro stdout/stderr, intercalados por horário) e ações restart · reload (cluster) · stop/start · seguir logs no terminal - Ações rápidas (aparecem conforme o que está instalado): testar/reload da config do nginx, log de erros, gerenciador de sites (ativar/desativar, criar com template e editar no editor embutido), logs Laravel parseados por nível, log do PHP-FPM, containers e uso do Docker, serviços com falha, disco por pasta e top processos. Várias são "ao vivo" (auto-refresh)
- Kit de ajuda: receitas prontas (criar usuário, sudo, chave SSH, ufw, certbot…) pra copiar ou rodar no terminal
Baixe o instalador do seu sistema na página de Releases:
| Sistema | Arquivo |
|---|---|
| 🍎 macOS (Apple Silicon) | SSHDeck_x.x.x_aarch64.dmg |
| 🍎 macOS (Intel) | SSHDeck_x.x.x_x64.dmg |
| 🪟 Windows | SSHDeck_x.x.x_x64-setup.exe ou .msi |
| 🐧 Linux | .AppImage, .deb ou .rpm |
macOS: o app não é assinado/notarizado (sem conta de desenvolvedor). Se aparecer "app danificado" ou o Gatekeeper bloquear, rode uma vez no Terminal:
xattr -dr com.apple.quarantine /Applications/SSHDeck.app
Na primeira abertura, crie sua senha-mestre — ela protege o vault com todos os servidores e senhas.
Pré-requisitos:
- Node.js 20+
- Rust (stable)
- Linux:
libwebkit2gtk-4.1-dev build-essential libssl-dev librsvg2-dev libayatana-appindicator3-dev
git clone https://github.com/Skuth/sshdeck.git
cd sshdeck
npm install
npm run tauri dev # desenvolvimento com hot reloadVerificação rápida do parser de importação:
node --experimental-strip-types src/lib/importParse.check.tsBuild local do instalador do seu sistema:
npm run tauri build # sai em src-tauri/target/release/bundle/O workflow release.yml cuida de tudo — você só escolhe o tamanho do bump:
- GitHub → Actions → Release → Run workflow
- Escolha o bump:
patch,minoroumajor - A pipeline então:
- bumpa a versão em
package.json,tauri.conf.json,Cargo.tomleCargo.lock(scripts/bump.mjs) - gera a seção nova do
CHANGELOG.mda partir dos changesets em.changeset/(fallback: commits desde a última release) e apaga os arquivos consumidos - commita, cria a tag
vX.Y.Ze faz push - builda macOS (arm64 + Intel), Windows e Linux, publica a Release com o changelog no corpo e gera o
latest.jsonassinado que o auto-update do app consome
- bumpa a versão em
Pela linha de comando: gh workflow run Release -f bump=minor
Botão Importar na sidebar — cole o conteúdo ou escolha um arquivo.
CSV (cabeçalho obrigatório; tags separadas por ;):
name,host,port,username,password,tags
API Prod,10.0.0.5,22,root,s3nh4,produção;aws
Banco,10.0.0.6,2222,deploy,outra$enha,databasesJSON (array com os mesmos campos; aceita também user, hostname, keyPath, passphrase):
[
{ "name": "API Prod", "host": "10.0.0.5", "username": "root", "password": "s3nh4", "tags": ["produção"] },
{ "name": "Com chave", "host": "10.0.0.7", "username": "deploy", "keyPath": "/Users/eu/.ssh/id_ed25519" }
]- Servidor com
keyPathentra como autenticação por chave privada; sem, como senha - Duplicados (mesmo host + porta + usuário) são atualizados, não duplicados
- Tag nova ganha uma cor automática da paleta — troque no gerenciador de tags (ícone 🏷️ na sidebar)
- O vault (
vault.bin) é cifrado com AES-256-GCM; a chave vem da senha-mestre via Argon2id — nada é gravado em texto plano - A senha-mestre não é armazenada em lugar nenhum; sem ela, o arquivo é inútil
- Host key TOFU: a fingerprint SHA-256 de cada servidor é salva no primeiro connect (
known_hosts.json) e a conexão é recusada se mudar - Senhas nunca saem da sua máquina — a conexão SSH é feita direto pelo app (libssh2)
As regras estão em AGENTS.md — valem pra pessoas e pra qualquer agente de código. Resumo:
- Todo PR que muda comportamento traz um changeset em
.changeset/(uma linha por mudança, em inglês, prefixoFeat:/Fix:/Chore:/Refact:) - Mudou algo que está neste README (funcionalidade, instalação, importação, release, segurança)? Atualiza o README no mesmo PR
CHANGELOG.mde versão são gerados pela pipeline — não edite à mão- Commits em inglês com os mesmos quatro prefixos; comentário no código só onde explica um porquê
Tauri 2 (Rust) · React 19 + TypeScript · shadcn/ui + Tailwind 4 · zustand · TanStack Query · xterm.js · ssh2/libssh2