Phosphor

Terminal de macOS con servidor MCP integrado: los agentes usan tus hosts SSH, Docker, métricas en vivo y authorized_keys a través de las conexiones propias de la app, bajo una política por host (off / solo lectura / confirmar / completo) con un registro de auditoría de solo añadidura. Gratis, MIT.

Documentación

Phosphor

Una terminal de macOS que también ejecuta tus servidores.

Shell, Docker, métricas, claves y archivos — a través de una conexión SSH por host. Desbloqueada con tu huella digital. Verde sobre negro, porque así es como debería verse.

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

Terminal


El problema

Tienes cuatro ventanas abiertas para hacer un solo trabajo. Una terminal para el shell. Una segunda terminal para docker logs -f. Una tercera para htop. Una pestaña del navegador para cualquier panel que alguien haya instalado en la máquina. Cada una inicia sesión por separado, cada una vuelve a pedir la frase de contraseña de la clave, y ninguna sabe qué están viendo las demás.

Phosphor abre una conexión SSH por host y multiplexa todo a través de ella — el shell interactivo, registros de contenedores, comandos docker, instantáneas /proc, transferencias SFTP, reenvíos de puertos. Un solo inicio de sesión. Un solo túnel a través de tu proxy. Un solo lugar donde vive el estado.

Y como ese estado ya está en la aplicación, también expone un servidor MCP: Claude Code y Claude Desktop pueden usar tus servidores a través de tus conexiones, tus claves y tu política de acceso — con cada llamada escrita en un registro de auditoría.


Qué hace

Docker, sin salir de la terminal

Docker

La lista de contenedores es una barra lateral, no una aplicación separada. Inspección, estadísticas, montajes, entorno y registros en vivo con --tail y un filtro, transmitidos a través de la conexión SSH que ya tienes. Los valores de entorno cuyo nombre parece un secreto (PASS, KEY, TOKEN, SECRET) están enmascarados en la interfaz y nunca se copian en el registro de auditoría.

Sin API de Docker Engine que exponer, sin socket que tunelizar: ejecuta docker con salida JSON, lo que funciona en cualquier máquina donde Docker ya se ejecute.

Métricas que cuestan un canal

Metrics

Carga por núcleo, memoria con la caché desglosada, discos, red y CPU y memoria por contenedor — a partir de instantáneas /proc tomadas a través de un único canal de larga duración. Sin agente que instalar en el servidor, sin enjambre de canales exec. El sondeo se detiene cuando la ventana está oculta, y cada búfer tiene un límite máximo.

Hosts, grupos y etiquetas

Hosts

Un grupo por host, tantas etiquetas como quieras. El grupo lleva la configuración — cómo alcanzarlo, qué clave, qué tema, qué se le permite hacer a MCP — y las etiquetas son solo para encontrar cosas. Importa ~/.ssh/config y sigue adelante.

Desbloqueo con huella digital

Touch ID

Phosphor no tiene cuenta ni contraseña propia. Hay un perfil en este Mac, y tu huella digital lo abre. Las contraseñas, frases de contraseña y semillas TOTP viven en el Llavero detrás de la biometría; las claves pueden vivir en el Enclave Seguro, donde no se pueden copiar de la máquina en absoluto. Las acciones arriesgadas vuelven a preguntar.

Un servidor nuevo, configurado con una receta

Provisioning

Conéctate a una máquina nueva y Phosphor la sondea: qué está instalado, qué está escuchando, si alguien ha estado aquí antes. Si está vacía, ofrece una receta — paquetes y actualizaciones automáticas, Docker con límites de tamaño de registros, nginx, certbot, un firewall que solo abre 22/80/443, y finalmente deshabilitar el inicio de sesión con contraseña. Cada paso es idempotente, cada paso muestra los comandos exactos, y la protección de bloqueo significa que el inicio de sesión con contraseña se cierra solo después de que una segunda conexión basada en claves haya demostrado que funciona.

Claves que realmente puedes ver

Keys

authorized_keys como una tabla en lugar de un archivo de texto: huellas digitales calculadas localmente, RSA débil marcado, opciones mostradas, entradas deshabilitadas mantenidas como comentarios. La clave con la que estás conectado actualmente no se puede eliminar sin una confirmación explícita, las escrituras son atómicas y una copia de seguridad permanece en el servidor.

Archivos en ambos lados

SFTP

Dos paneles, arrastra entre ellos o desde Finder. La misma conexión SSH, el mismo proxy. Una transferencia interrumpida se reanuda donde se detuvo.

Hazlo tuyo

Theme

Los temas son JSON simple en themes/ — guárdalos en git, compártelos con personas, importa .itermcolors, alacritty y base16. Paleta, fuente, ligaduras, altura de línea, imagen de fondo, líneas de escaneo, brillo, viñeta, opacidad de ventana. Vincula un tema a un grupo para que la producción sea inconfundiblemente roja.

Y hay un gato en la esquina. O una ardilla planeadora. Duerme mientras la aplicación está bloqueada, nunca cubre tu salida, y un interruptor lo apaga para siempre.


Dale a un agente tus servidores sin darle tus claves

Phosphor también es un servidor de Protocolo de Contexto de Modelo. Registra un comando y Claude Code, Claude Desktop, Cursor o cualquier otro cliente MCP puede listar tus hosts, leer métricas, inspeccionar contenedores, seguir registros y — cuando lo permitas — ejecutar comandos, reiniciar contenedores, administrar authorized_keys, y agregar, cambiar o eliminar hosts en tu propia lista. Cualquier cosa que edite la lista te pregunta primero, en todos los modos.

La diferencia con darle a un modelo un shell: la aplicación mantiene la conexión, el agente no tiene nada.

Herramienta de shell con ssh sin procesarCredenciales en una configuración MCPPhosphor
Dónde vive la claveen disco, legible por el agenteen disco, legible por el agenteLlavero / Enclave Seguro, detrás de Touch ID
Qué es alcanzabletodotodosolo los hosts que habilitaste, en el modo que configuraste
rm -rf /se ejecutase ejecutarechazado por una lista de denegación que anula todos los modos
Humano en el circuitoningunoningunoconfirmación por escritura, los permisos expiran en 15 min
Rastro despuéshistorial de shell, tal vezningunoun registro de auditoría sin herramienta de escritura
Secretos en la salidalo que sea que esté en pantallalo que sea que esté en pantallaenmascarados antes de que el modelo los vea
Bucle descontroladoilimitadoilimitadoescrituras con límite de velocidad
claude mcp add phosphor /Applications/Phosphor.app/Contents/MacOS/phosphor-mcp

En el registro MCP es io.github.Kirusshenkin/phosphor; cada versión también incluye un paquete .mcpb con un SHA-256 publicado para clientes que instalan de esa manera.

Trece herramientas, siete de ellas de solo lectura. Cada host comienza disabled — nada es alcanzable hasta que elijas read-only, confirm o full para él, y se supone que los servidores de producción permanezcan read-only. Un servidor comprometido puede poner lo que quiera en una línea de registro que el modelo lee; aún así no puede otorgarse a sí mismo un modo, superar la lista de denegación o borrar el registro de intentarlo.

Detalles completos: docs/MCP.md — catálogo de herramientas, política, auditoría, y el error exacto que recibe el agente cuando la aplicación está cerrada, bloqueada o rechazando.

Principios

Sin integraciones. El único tráfico de red que hace la aplicación es SSH a tus propios servidores y la fuente de actualizaciones. Sin telemetría, sin cuentas, sin servicios de terceros, nada que llame a casa.

Los secretos siguen siendo secretos. Nunca en una línea de registro, un informe de fallo, una entrada de auditoría MCP o un mensaje de error. El desplazamiento de la terminal no se escribe en disco por defecto.

Los errores te dicen qué hacer. "No se pudo conectar" es un error. "El proxy en 127.0.0.1:10808 no responde — ¿V2Box está en ejecución?" es un mensaje de error. La aplicación distingue un proxy muerto de un servidor inalcanzable de una credencial rechazada, porque de lo contrario el diagnóstico es adivinar.

Se mantiene rápida porque está abierta todo el día. Los bytes de la red se agrupan en ventanas de ~16 ms antes de llegar al emulador, la ruta de dibujo no asigna nada, cada búfer está limitado, el sondeo se detiene cuando la ventana no está visible, y las animaciones solo tocan transform y opacity.

Concurrencia estricta de Swift 6, en cada objetivo, sin escapatorias. El trabajo de red, análisis y disco vive en actores; solo los modelos de vista están en el actor principal.

Dos idiomas. Inglés y ruso, ambos a través de un Catálogo de Cadenas. Ni una cadena de interfaz codificada — un linter lo verifica.


Estado

Compila, se ejecuta, 179 pruebas en verde. Once pantallas: bloqueo, hosts, terminal con sesiones persistentes, archivos, Docker, monitor, claves, aprovisionamiento, actividad de IA y configuración. Interfaz en ruso e inglés.

Lo que funciona contra un servidor real: SSH a través de una conexión multiplexada por host, listado de contenedores con acciones y registros en streaming, métricas /proc, lectura y edición de authorized_keys, recetas de aprovisionamiento, ambos paneles de archivos y un shell interactivo que usa el mismo socket.

MCP funciona de extremo a extremo: un shim phosphor-mcp se incluye dentro del paquete, habla JSON-RPC sobre stdio y hace proxy a un socket local que posee la aplicación. Cada host comienza deshabilitado, las escrituras necesitan una decisión de una persona, una lista de denegación anula cada modo, y el registro de auditoría no tiene herramienta de escritura — el modelo puede actuar pero no puede borrar su rastro.

Los hosts se importan desde ~/.ssh/config, desde known_hosts y desde una bóveda de Termius, cuyo volcado de texto plano se elimina una vez que los hosts están dentro del perfil cifrado.

Lo que aún no está construido: el transporte nativo de Citadel (el basado en procesos está probado y funciona), la mascota en la esquina y las actualizaciones dentro de la aplicación a través de Sparkle.

La CPU en reposo es cero — sin temporizadores, el sondeo se pausa cuando la ventana está en segundo plano.

Instalación

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

O descarga Phosphor.zip desde la página de versiones y arrastra la aplicación a Aplicaciones.

macOS te advertirá la primera vez. La aplicación está firmada ad-hoc — no hay certificado de desarrollador de Apple detrás — así que todo lo descargado de internet cae en cuarentena. Esto no es un daño:

  1. Haz doble clic en la aplicación, descarta la advertencia.
  2. Configuración del Sistema → Privacidad y Seguridad → desplázate hacia abajo → Abrir de todos modos.
  3. Confirma. Nunca vuelve a preguntar.

El comando xattr anterior hace lo mismo en un solo paso.

Cada versión incluye SHA256SUMS.txt; verifica con shasum -a 256 -c SHA256SUMS.txt.

Aún no hay actualizador dentro de la aplicación — revisa la página de versiones. La versión que estás ejecutando está en el panel Acerca de.

Primeros pasos

Un recorrido guiado de la primera ejecución: docs/GUIDE.ru.md (ruso), docs/GUIDE.en.md (inglés).

Para agentes de IA

Cada versión lleva latest.json, para que no haya que raspar nada:

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" }
}

El paquete contiene un shim MCP stdio. Regístralo y Phosphor expone sus herramientas:

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

El shim habla con la aplicación en ejecución a través de un socket Unix en el directorio de inicio del usuario; no lleva credenciales propias. Si la aplicación está cerrada o bloqueada, lo dice y cada llamada de herramienta falla de forma segura — el acceso MCP está desactivado por defecto y debe otorgarse en la aplicación, por sesión, con una huella digital.

Publicación

Etiqueta y empuja:

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

.github/workflows/release.yml ejecuta las pruebas, luego .github/scripts/package.sh — que es el mismo script usado localmente, así que una versión siempre se puede reproducir en tu propia máquina:

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

Produce dist/Phosphor-<version>.zip, una copia llamada Phosphor.zip (solo un nombre de archivo exacto funciona detrás de /releases/latest/download/), SHA256SUMS.txt y latest.json. El flujo de trabajo descomprime el archivo nuevamente y ejecuta codesign --verify sobre él antes de publicar: un paquete cuya firma no sobrevive el viaje de ida y vuelta no se abrirá en la máquina de nadie.

Compilación

Requiere macOS 26+ y un conjunto de herramientas 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

Estructura

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

Contribuciones

El plan viene primero — los requisitos aterrizan en docs/PLAN.md antes de cualquier código. Convenciones que vale la pena conocer antes de una solicitud de extracción: código, nombres y mensajes de confirmación en inglés; cadenas visibles para el usuario en inglés y ruso a través de Strings, nunca codificadas; concurrencia estricta de Swift 6 en cada objetivo; sin errores tragados, y cada mensaje dice qué pasó y qué hacer; sin secretos en registros, errores o la auditoría; búferes limitados y nada asignado en la ruta de dibujo.

Seguridad

Por favor, reporta vulnerabilidades de forma privada — ver SECURITY.md. El modelo de amenazas es docs/PLAN.md §15.

Licencia

MIT