Deepharn
Un escritorio propio para DeepSeek Harness en macOS: frontend nuevo sobre su API, concha nativa en Swift y dos plugins.
- Stars
- 0
- Language
- JavaScript
- Created
- Aug 23, 2026
- Updated
- Aug 23, 2026
Introduction
Deepharn
Una app de escritorio para DeepSeek Harness en macOS, pensada para todo lo que no es programar: escribir, investigar, orquestar tareas y quedarte con lo que producen.
No es un tema ni un envoltorio de la interfaz oficial: es un frontend distinto que habla con el harness por su API, servido desde el propio harness y metido en una ventana nativa.

Tres columnas plegables: conversaciones a la izquierda, el chat en medio, y a la derecha lo que está corriendo, lo que ha producido y lo que tiene a mano.
Qué hace
- Conversaciones agrupadas en En marcha / Hoy / Antes, con su hora y sus tokens.
- Sala de control con lo que está corriendo, y entregables con los archivos que ha producido la conversación.
- En uso: qué skills ve el agente, qué subagentes ha lanzado y qué plugins están cargados.
- Selector de modelo y de esfuerzo de razonamiento, con filtro (OpenRouter ofrece más de cien modelos).
- Ajustes con instalador de plugins y gestor de skills, sin bajar a la terminal.
- Borrar conversaciones y proyectos, renombrarlos.
- Tres columnas plegables y modo «solo chat». Claro y oscuro.
La respuesta del agente se pinta según se escribe, y el texto se renderiza como markdown: párrafos, viñetas, código.
Por dentro
![]() | Modelo y esfuerzo. Agrupados por proveedor y con filtro, porque OpenRouter ofrece más de cien. El esfuerzo de razonamiento sale de lo que declara cada modelo. |
![]() | Ajustes. Proveedores activos, proyectos, skills con aviso si alguna está mal escrita, e instalador de plugins. Sin bajar a la terminal. |
![]() | Solo chat. Un botón pliega las dos columnas y deja la conversación sola. |
Cómo está montado
Tres piezas, cada una con un trabajo:
| Pieza | Qué es |
|---|---|
app/ | Concha de escritorio en Swift + WKWebView. Arranca el harness, lo vigila y lo para al salir. |
plugins/deepharn-front/ | Plugin de host: sirve el frontend en /deepharn y añade endpoints propios para instalar plugins y gestionar skills. |
plugins/deepharn-piel/ | Plugin de cliente: reescribe los tokens de color y tipografía de la interfaz oficial. Opcional. |
El frontend es HTML, CSS y JavaScript a pelo. Sin framework, sin compilación, sin dependencias: se edita y se recarga.
Por qué se sirve desde el propio harness: su API compara el Host de cada
petición y rechaza lo que venga de otro puerto. Servir el frontend desde fuera no
funciona; desde dentro, las llamadas a /api salen gratis.
Instalar
Lo que necesitas: macOS 14+ (Apple Silicon), Node 22+, pnpm, las Command Line
Tools de Xcode y el harness (npm i -g @deepseek-ai/dsh). Si te falta algo, el
instalador te lo dice antes de tocar nada.
git clone https://github.com/AxelGoal/Deepharn.git
cd Deepharn
./instalar.sh
Eso crea un perfil propio llamado deepharn —no toca el que ya uses—, instala
los dos plugins, los monta en el árbol y compila la app en /Applications.
Luego, desde Launchpad, o:
open -a Deepharn
Hacerlo a mano, paso a paso
# Un perfil propio, copiado del que ya tienes
cp -R ~/.dsh/profiles/web ~/.dsh/profiles/deepharn
# Los plugins
dsh plugin --profile deepharn add ./plugins/deepharn-front
dsh plugin --profile deepharn add ./plugins/deepharn-piel
Y sus filas en ~/.dsh/profiles/deepharn/cordis.patch.yml. Ojo con el
envoltorio insert: una entrada suelta con id: sobrescribe una fila existente
en vez de añadir una nueva.
- insert:
- id: deepharn-front
name: deepharn-front
- insert:
- id: deepharn-piel
name: deepharn-piel
Luego la app: cd app && ./construir.sh
También vale sin app: dsh --profile deepharn y abrir
http://127.0.0.1:3081/deepharn/ en el navegador.
Desinstalar
rm -rf ~/.dsh/profiles/deepharn /Applications/Deepharn.app
Nada más. El perfil que ya usabas queda intacto, y tus conversaciones también:
viven en ~/.dsh/sessions, fuera del perfil.
Cómo arranca
Abrir la app es lo único que hay que hacer:
- Comprueba los puertos 3081-3083, preguntando por su propio endpoint y no solo si el puerto responde — así no se engancha a un harness ajeno.
- Si lo encuentra, se engancha y no arranca nada. Al cerrarla, ese servidor sigue vivo.
- Si no hay nada, lo lanza:
dshinstalado, la caché de npx, onpx -y @deepseek-ai/dsh. - Si falla, dice por qué, enseña el registro y ofrece reintentar.
- Al salir, para el harness solo si lo arrancó ella.
Lo que aprendimos por el camino
Está en COMO-ESTA-HECHO.md: la API del harness, sus métodos y sus trampas. Si vas a construir algo parecido, ahí tienes el mapa.
Trastear
El frontend está en plugins/deepharn-front/web/: tres archivos, sin compilación.
Se edita y se recarga con ⌘R. Si tocas la mitad de servidor (lib/), reinicia el
harness con ⇧⌘R.
La piel —colores y tipografías— está en plugins/deepharn-piel/src/piel.css; tras
editarla, node construir.mjs la reensambla.
Si algo no aparece: el harness compone su árbol al arrancar, así que los plugins y las skills nuevas piden reinicio.
Estado
Funciona y se usa a diario, pero es joven y el harness que hay debajo está en developer preview, así que rompe compatibilidad de vez en cuando.
Lo que falta: streaming letra a letra por WebSocket (ahora sondea), adjuntar archivos, y un botón de reinicio que no pase por el menú.
Licencia
MIT.


