Phosphor

Terminal macOS com servidor MCP integrado: agentes usam seus hosts SSH, Docker, métricas ao vivo e authorized_keys através das conexões do próprio aplicativo, sob uma política por host (desativado / somente leitura / confirmar / completo) com um log de auditoria somente anexação. Gratuito, MIT.

Documentação

Phosphor

Um terminal macOS que também executa seus servidores.

Shell, Docker, métricas, chaves e arquivos — por uma única conexão SSH por host. Desbloqueado com sua impressão digital. Verde sobre preto, porque é assim que deve parecer.

Cliente SSH · gerenciador Docker · monitor de servidor · SFTP · editor authorized_keys · servidor MCP para Claude Code e Claude Desktop · macOS 26 · Swift 6 · MIT

Terminal


O problema

Você mantém quatro janelas abertas para fazer um trabalho. Um terminal para o shell. Um segundo terminal para docker logs -f. Um terceiro para htop. Uma aba do navegador para qualquer painel que alguém instalou na máquina. Cada um faz login separadamente, cada um pede a frase secreta da chave novamente, e nenhum sabe o que os outros estão vendo.

O Phosphor abre uma conexão SSH por host e multiplexa tudo através dela — o shell interativo, logs de contêineres, comandos docker, snapshots /proc, transferências SFTP, encaminhamentos de porta. Um login. Um túnel através do seu proxy. Um lugar onde o estado vive.

E como esse estado já está no aplicativo, ele também expõe um servidor MCP: Claude Code e Claude Desktop podem usar seus servidores através das suas conexões, suas chaves e sua política de acesso — com cada chamada gravada em um log de auditoria.


O que ele faz

Docker, sem sair do terminal

Docker

A lista de contêineres é uma barra lateral, não um aplicativo separado. Inspecionar, estatísticas, montagens, ambiente e logs ao vivo com --tail e um filtro, transmitidos pela conexão SSH que você já tem. Valores de ambiente cujo nome parece um segredo (PASS, KEY, TOKEN, SECRET) são mascarados na interface e nunca copiados para o log de auditoria.

Sem API do Docker Engine para expor, sem socket para tunelar: ele executa docker com saída JSON, o que funciona em qualquer máquina onde o Docker já roda.

Métricas que custam um canal

Metrics

Carga por núcleo, memória com o cache separado, discos, rede e CPU e memória por contêiner — a partir de snapshots /proc obtidos por um único canal de longa duração. Sem agente para instalar no servidor, sem enxame de canais exec. A sondagem para quando a janela está oculta, e cada buffer tem um teto.

Hosts, grupos e tags

Hosts

Um grupo por host, quantas tags você quiser. O grupo carrega as configurações — como alcançá-lo, qual chave, qual tema, o que o MCP pode fazer — e as tags servem apenas para encontrar coisas. Importe ~/.ssh/config e continue.

Desbloqueie com uma impressão digital

Touch ID

O Phosphor não tem conta nem senha própria. Há um perfil neste Mac, e sua impressão digital o abre. Senhas, frases secretas e sementes TOTP vivem no Keychain atrás de biometria; chaves podem viver no Secure Enclave, onde não podem ser copiadas da máquina. Ações arriscadas pedem confirmação novamente.

Um novo servidor, configurado por uma receita

Provisioning

Conecte-se a uma máquina nova e o Phosphor a sonda: o que está instalado, o que está escutando, se alguém já esteve aqui antes. Se estiver vazia, ele oferece uma receita — pacotes e atualizações automáticas, Docker com limites de tamanho de log, nginx, certbot, um firewall que só abre 22/80/443 e, finalmente, desativa o login por senha. Cada passo é idempotente, cada passo mostra os comandos exatos, e a proteção de bloqueio garante que o login por senha só seja fechado depois que uma segunda conexão baseada em chave provar que funciona.

Chaves que você pode realmente ver

Keys

authorized_keys como uma tabela em vez de um arquivo de texto: impressões digitais calculadas localmente, RSA fraco sinalizado, opções exibidas, entradas desabilitadas mantidas como comentários. A chave com a qual você está conectado no momento não pode ser removida sem uma confirmação explícita, gravações são atômicas e um backup permanece no servidor.

Arquivos dos dois lados

SFTP

Dois painéis, arraste entre eles ou do Finder. Mesma conexão SSH, mesmo proxy. Uma transferência interrompida retoma de onde parou.

Faça seu

Theme

Temas são JSON simples em themes/ — mantenha-os no git, troque com pessoas, importe .itermcolors, alacritty e base16. Paleta, fonte, ligaduras, altura de linha, imagem de fundo, scanlines, brilho, vinheta, opacidade da janela. Vincule um tema a um grupo para que a produção seja inconfundivelmente vermelha.

E há um gato no canto. Ou um sugar glider. Ele dorme enquanto o aplicativo está bloqueado, nunca cobre sua saída, e um interruptor o desliga para sempre.


Dê a um agente seus servidores sem dar suas chaves

O Phosphor também é um servidor Model Context Protocol. Registre um comando e Claude Code, Claude Desktop, Cursor ou qualquer outro cliente MCP pode listar seus hosts, ler métricas, inspecionar contêineres, seguir logs e — quando você permitir — executar comandos, reiniciar contêineres, gerenciar authorized_keys e adicionar, alterar ou remover hosts na sua própria lista. Qualquer coisa que edite a lista pede sua confirmação primeiro, em todos os modos.

A diferença de entregar a um modelo um shell: o aplicativo mantém a conexão, o agente não mantém nada.

Ferramenta de shell com ssh brutoCredenciais em uma configuração MCPPhosphor
Onde a chave viveno disco, legível pelo agenteno disco, legível pelo agenteKeychain / Secure Enclave, atrás do Touch ID
O que é alcançáveltudotudoapenas hosts que você habilitou, no modo que você definiu
rm -rf /executaexecutarecusado por uma lista de negação que substitui todos os modos
Humano no circuitonenhumnenhumconfirmação por gravação, concessões expiram em 15 min
Rastro depoishistórico do shell, talveznenhumum log de auditoria sem ferramenta de gravação
Segredos na saídao que estiver na telao que estiver na telamascarados antes de o modelo vê-los
Loop descontroladoilimitadoilimitadogravações com limite de taxa
claude mcp add phosphor /Applications/Phosphor.app/Contents/MacOS/phosphor-mcp

No registro MCP, é io.github.Kirusshenkin/phosphor; cada versão também envia um pacote .mcpb com um SHA-256 publicado para clientes que instalam dessa forma.

Treze ferramentas, sete delas somente leitura. Cada host começa disabled — nada é alcançável até você escolher read-only, confirm ou full para ele, e servidores de produção devem permanecer read-only. Um servidor comprometido pode colocar qualquer coisa em uma linha de log que o modelo lê; ainda assim não pode conceder a si mesmo um modo, passar pela lista de negação ou apagar o registro da tentativa.

Detalhes completos: docs/MCP.md — catálogo de ferramentas, política, auditoria e o erro exato que o agente recebe quando o aplicativo está fechado, bloqueado ou recusando.

Princípios

Sem integrações. O único tráfego de rede que o aplicativo faz é SSH para seus próprios servidores e o feed de atualizações. Sem telemetria, sem contas, sem serviços de terceiros, nada telefonando para casa.

Segredos permanecem secretos. Nunca em uma linha de log, relatório de falha, entrada de auditoria MCP ou mensagem de erro. O scrollback do terminal não é gravado no disco por padrão.

Erros dizem o que fazer. "Não foi possível conectar" é um bug. "O proxy em 127.0.0.1:10808 não está respondendo — o V2Box está rodando?" é uma mensagem de erro. O aplicativo distingue um proxy morto de um servidor inalcançável de uma credencial recusada, porque caso contrário o diagnóstico é adivinhação.

Ele permanece rápido porque fica aberto o dia todo. Bytes da rede são agrupados em janelas de ~16 ms antes de chegarem ao emulador, o caminho de desenho não aloca nada, cada buffer é limitado, a sondagem para quando a janela não está visível e animações só tocam transform e opacity.

Concorrência estrita Swift 6, em todos os alvos, sem saídas de emergência. Trabalho de rede, análise e disco vive em atores; apenas view models estão no ator principal.

Dois idiomas. Inglês e russo, ambos por meio de um String Catalog. Nem uma string de interface codificada — um linter verifica.


Status

Compila, roda, 179 testes verdes. Onze telas: bloqueio, hosts, terminal com sessões persistentes, arquivos, Docker, monitor, chaves, provisionamento, atividade de IA e configurações. Interface em russo e inglês.

O que funciona contra um servidor real: SSH por uma conexão multiplexada por host, listagem de contêineres com ações e logs em streaming, métricas /proc, leitura e edição de authorized_keys, receitas de provisionamento, ambos os painéis de arquivos e um shell interativo que usa o mesmo socket.

O MCP funciona de ponta a ponta: um shim phosphor-mcp é enviado dentro do pacote, fala JSON-RPC sobre stdio e faz proxy para um socket local que o aplicativo possui. Cada host começa desabilitado, gravações precisam de uma decisão de uma pessoa, uma lista de negação substitui todos os modos, e o log de auditoria não tem ferramenta de gravação — o modelo pode agir, mas não pode apagar seu rastro.

Hosts importam de ~/.ssh/config, de known_hosts e de um cofre Termius, cujo dump de texto simples é excluído assim que os hosts estão dentro do perfil criptografado.

O que ainda não está construído: o transporte nativo Citadel (o baseado em processo é testado e funciona), o animal de estimação no canto e atualizações no aplicativo via Sparkle.

CPU ociosa é zero — sem timers, a sondagem pausa quando a janela está em segundo plano.

Instalação

curl -fsSL https://github.com/Kirusshenkin/terminalOs/releases/latest/download/Phosphor.zip -o Phosphor.zip
unzip -q Phosphor.zip -d /Applications
xattr -dr com.apple.quarantine /Applications/Phosphor.app

Ou baixe Phosphor.zip da página de versões e arraste o aplicativo para Applications.

O macOS avisará na primeira vez. O aplicativo é assinado ad-hoc — não há certificado Apple Developer por trás — então tudo baixado da internet cai em quarentena. Isso não é dano:

  1. Clique duas vezes no aplicativo, dispense o aviso.
  2. System Settings → Privacy & Security → role para baixo → Open Anyway.
  3. Confirme. Ele nunca pergunta novamente.

O comando xattr acima faz a mesma coisa em um passo.

Cada versão envia SHA256SUMS.txt; verifique com shasum -a 256 -c SHA256SUMS.txt.

Não há atualizador no aplicativo ainda — verifique a página de versões. A versão que você está executando está no painel Sobre.

Começando

Um passo a passo guiado da primeira execução: docs/GUIDE.ru.md (em russo), docs/GUIDE.en.md (em inglês).

Para agentes de IA

Cada versão carrega latest.json, então nada precisa ser raspado:

curl -fsSL https://github.com/Kirusshenkin/terminalOs/releases/latest/download/latest.json
{
  "version": "0.1.0",
  "url": "https://github.com/.../Phosphor-0.1.0.zip",
  "sha256": "…",
  "mcp": { "command": "/Applications/Phosphor.app/Contents/MacOS/phosphor-mcp",
           "transport": "stdio" }
}

O pacote contém um shim MCP stdio. Registre-o e o Phosphor expõe suas ferramentas:

{
  "mcpServers": {
    "phosphor": {
      "command": "/Applications/Phosphor.app/Contents/MacOS/phosphor-mcp"
    }
  }
}

O shim fala com o aplicativo em execução por um socket Unix no diretório home do usuário; ele não carrega credenciais próprias. Se o aplicativo estiver fechado ou bloqueado, ele diz isso e toda chamada de ferramenta falha de forma segura — o acesso MCP está desligado por padrão e precisa ser concedido no aplicativo, por sessão, com uma impressão digital.

Lançamento

Marque e envie:

git tag v0.1.0 && git push origin v0.1.0

.github/workflows/release.yml executa os testes, depois .github/scripts/package.sh — que é o mesmo script usado localmente, então um lançamento sempre pode ser reproduzido na sua própria máquina:

MARKETING_VERSION=0.1.0 BUILD_NUMBER=1 ./.github/scripts/package.sh

Ele produz dist/Phosphor-<version>.zip, uma cópia chamada Phosphor.zip (apenas um nome de arquivo exato funciona atrás de /releases/latest/download/), SHA256SUMS.txt e latest.json. O workflow descompacta o arquivo novamente e executa codesign --verify nele antes de publicar: um pacote cuja assinatura não sobrevive à ida e volta não abrirá na máquina de ninguém.

Compilação

Requer macOS 26+ e um toolchain Swift 6.3.

git clone https://github.com/Kirusshenkin/terminalOs.git
cd terminalOs
swift build
swift test
./.github/scripts/check.sh     # format, lint, build, tests — before every commit
git config core.hooksPath .github/hooks   # once: blocks commits with real addresses or keys

Estrutura

Sources/          PhosphorCore, VaultKit, HostsKit, SSHKit, DockerKit,
                  MetricsKit, KeysKit, ThemeKit, ProvisionKit, PhosphorUI
design/           UI artboards (.dc.html), one per screen
docs/PLAN.md      The full architecture plan, in Russian
docs/images/      Screenshots rendered from the artboards

Contribuindo

O plano vem primeiro — requisitos entram em docs/PLAN.md antes de qualquer código. Convenções que vale a pena saber antes de um pull request: código, nomes e mensagens de commit em inglês; strings visíveis ao usuário em inglês e russo por meio de Strings, nunca codificadas; concorrência estrita Swift 6 em cada alvo; sem erros engolidos, e cada mensagem diz o que aconteceu e o que fazer; sem segredos em logs, erros ou auditoria; buffers limitados e nada alocado no caminho de desenho.

Segurança

Por favor, relate vulnerabilidades de forma privada — veja SECURITY.md. O modelo de ameaça é docs/PLAN.md §15.

Licença

MIT