✴️

Claude Code WebUI

Introduce tu contraseña para acceder

Inicio

Conversaciones
Arrastra una conversación a un grupo para moverla · con Ctrl/⌘ la copia
✴️

Claude Code, en tu propio servidor

Crea una conversación para empezar. El agente trabaja dentro de este contenedor: puede leer y escribir archivos, ejecutar comandos y usar herramientas.

▸ Tareas
💻 De mi ordenador
🖥 De este servidor
☁️ De OneDrive / SharePoint / Google Drive

Terminal real del contenedor (bash como root).
Aquí también puedes usar el CLI claude directamente.

☁️ Claude Code web

Tus sesiones de claude.ai/code. Puedes engancharte en vivo (lo que escribas va a esa sesión y su respuesta vuelve aquí) o traértela para seguirla con el motor de este contenedor. Cada sesión pertenece a la suscripción que la creó, así que con varias cuentas elige arriba con cuál miras: lo que hagas aquí queda atado a esa.

Grafos
Buzones
💬 Conversación
💬 Conversación
💬 Conversación
WhatsApp
💬 Conversación
Repositorios
🐙

Panel de GitHub

Selecciona un repositorio para ver su estado completo: cambios, ramas, commits y pull requests — con commit, push, pull, merge y merge de PRs desde aquí.

⚠ Merge en curso con conflictos. Resuélvelos (puedes pedírselo al agente) y commitea, o

Cambios

Pulsa un fichero para ver su diff.

Ramas

Commits recientes

Pulsa un commit para ver sus cambios.

Pull Requests

Issues

Actions

💠

Obsidian

Conecta tu vault. Recomendado: instala el plugin comunitario Git (obsidian-git) en tu Obsidian y sincroniza el vault con un repo de GitHub; este panel lo clona y hace pull/commit/push contra el mismo repo. Alternativa: una carpeta local del servidor (sin sincronización).

Vault en GitHub (recomendado)

Carpeta local

Notas

Vault

Ajustes del vault

🗒️

Elige una nota del árbol, crea una nueva (+) o abre la de hoy (📅).

⏰ Rutinas

Prompts programados que se ejecutan solos con el agente (Claude o Codex). Cada ejecución aparece como conversación en el grupo «Rutinas» del chat, en tiempo real.

Nueva rutina

Se clonan o actualizan antes de cada ejecución y quedan asociados a la conversación, igual que al abrir un chat desde un repo.

Rutina

Estado

Repositorios

Configuración

Instrucciones

Ejecuciones

💰 Consumo

OpenRouter

Consultando…

Gasto por modelo · últimos 30 días

Actividad por día

Lo que OpenRouter guarda es el desglose por día, modelo y proveedor de los últimos 30 días cerrados — no la lista petición a petición de su web.

Antigravity

Consultando…

Ollama

Consultando…

Tokens por modelo · últimos 7 días

Ajustes

Agentes y modelos

Una vez al día el panel pregunta a los registros (npm, Google y xAI) cuál es la última versión de cada CLI y compara los catálogos de modelos con la foto del día anterior. No instala nada por su cuenta: si hay algo nuevo lo dice aquí, en el inicio y en la barra superior, y actualizar es un clic.

Las actualizaciones se instalan en el volumen (/data/bin), que va delante en el PATH del agente, de los trabajos y de la terminal, así que sobreviven a los despliegues y tapan a la copia de la imagen sin tocarla. «Volver a la de la imagen» quita esa copia. Los CLIs de la imagen se instalan sin fijar versión y su capa queda cacheada: un despliegue normal no los renueva.

Los catálogos de OpenRouter y Ollama se refrescan solos en el selector (30 minutos de caché): aquí no se «actualizan», se comparan con la foto anterior para poder avisar de los modelos nuevos. Con lo que cada CLI dice de sus modelos (más abajo) se hace lo mismo.

Novedades en los catálogos de modelos

De dónde sale el selector de modelos

La lista de cada motor la dice su propio CLI: el SDK de Claude (supportedModels, según tu plan), codex app-server, el ACP de Grok Build, agy models (con sesión) y el bundle del Gemini CLI. Se vuelve a preguntar cada seis horas, con cada comprobación y con este botón; si un CLI no contesta se sigue enseñando la última lista buena o, si nunca contestó, la de respaldo del código. Por eso actualizar un CLI trae sus modelos nuevos al selector.

Claude, OpenRouter y Ollama

Alternativa sin API key: usa tu suscripción de Claude (Pro/Max). Abre la pestaña Terminal, ejecuta claude e inicia sesión con el enlace que muestra (o usa claude setup-token). La sesión queda guardada en el volumen persistente.

Varias suscripciones vivas a la vez —la personal y la del trabajo—, elegibles por conversación desde la barra del chat. Cada cuenta guarda su sesión aparte, así que iniciar sesión en una no cierra la otra. Las skills, subagentes y comandos son comunes a todas: lo único que cambia es con qué suscripción se paga el turno.

Para autenticar una cuenta: créala aquí, abre una Terminal de esa cuenta (se elige al crearla) y ejecuta claude. Ojo: si tienes una ANTHROPIC_API_KEY configurada arriba, la usa la cuenta principal y factura por token; las demás cuentas van siempre por suscripción.

Da acceso a todo el catálogo de OpenRouter (Kimi K3, Gemini, DeepSeek, Llama…) desde el mismo selector de modelos: aparecen agrupados por proveedor con el prefijo or:. Se usa su endpoint compatible con Anthropic, así que el agente funciona igual (herramientas, streaming y razonamiento incluidos). Tu clave de Anthropic no se envía en esos turnos.

Solo para 💰 Consumo. La clave de inferencia deja ver lo que gasta ella misma, pero el saldo de la cuenta y el histórico de actividad los guarda OpenRouter detrás de otra clave, a propósito, para que el historial no quede a la vista de cualquiera que tenga una clave normal. Se crea en openrouter.ai → Settings → Provisioning Keys. No se usa para los turnos.

Desde la v0.14 Ollama sirve /v1/messages, que es la Messages API de Anthropic: el agente habla con él sin traductor, igual que con OpenRouter. Aparecen en el selector como ollama:local/… y ollama:cloud/….

⚠ El panel corre en un contenedor, así que 127.0.0.1 es el contenedor y no la máquina. Para un Ollama en el mismo servidor, pon http://172.17.0.1:11434 (el puente de Docker) y arranca Ollama con OLLAMA_HOST=0.0.0.0. Para uno en otra máquina, su URL completa.

⚠ La ventana de contexto la decide tu servidor de Ollama, no el modelo. Por defecto son 4096 tokens y recorta el prompt sin decirlo: el system prompt de Claude Code ya no cabe ahí y el agente contesta como si no hubiera leído nada. Arranca Ollama con OLLAMA_CONTEXT_LENGTH=65536 (o lo que aguante tu RAM) antes de dar por malo un modelo.

Es un tope de tokens y no de euros a propósito: Ollama no publica el consumo de la cuenta por API, así que un importe sería inventado. Lo medido son los tokens, y se ven en 💰 Consumo. Lo local no lleva tope: no factura. El contador se pone a cero el día 1.

Comportamiento del agente

Lo que rige cada conversación nueva salvo que un tipo de uso o un perfil diga otra cosa. Las claves y las cuentas están en Motores y claves.

Panel de deliberación — la herramienta consultar_panel: varios modelos responden a la vez a la misma consulta y un juez compara las respuestas (consenso, contradicciones, aportes únicos, puntos ciegos). Cada llamada son N+1 completions de pago y tarda un par de minutos, así que el agente solo debería usarla cuando equivocarse salga caro. Un miembro con prefijo agy: (p. ej. agy:gemini-3.1-pro) va por la suscripción de Antigravity y no cuesta por token.

Es el que más importa: la mayor parte de la mejora viene de la síntesis, no de la diversidad del panel.

OpenAI · Codex

Permite usar modelos de OpenAI en el chat (grupo «OpenAI (Codex)» del selector), con traspaso de contexto al cambiar de modelo. Para autenticarte con tu suscripción de ChatGPT: abre la Terminal y ejecuta codex login --device-auth (te dará un código para aprobar desde otro dispositivo). Con API key: codex login --with-api-key. La sesión queda en el volumen persistente.

xAI · Grok Build

Permite usar Grok en el chat (grupo «xAI (Grok Build)» del selector). Va con tu suscripción SuperGrok o X Premium+: abre la Terminal y ejecuta grok login --device-auth (te da un código para meter en el navegador, así que funciona sin salir del contenedor). La sesión queda en el volumen persistente. No hace falta clave de API: la API de api.x.ai es de pago por token y una superficie distinta de la suscripción.

Es el CLI ajeno que más hereda del panel, porque lee de fábrica la configuración de Claude Code: le llegan CLAUDE.md, las skills, la memoria, ccjob, las herramientas mcp__webui__* y las tarjetas de permiso. Lo que no: las herramientas de Claude Code (trae las suyas, con subagentes propios en worktrees) ni los cuadros de plan y de pregunta.

GitHub

Integración al estilo Claude Code web: clona repos, trabaja en ramas y crea PRs. Usa un Personal Access Token (fine-grained con Contents: Read/Write y Pull requests: Read/Write, o classic con scope repo). El agente también dispone del CLI gh ya autenticado.

Microsoft 365

Conecta Outlook, SharePoint/OneDrive y el calendario: buzón lateral, explorador de archivos con edición completa, correos y ficheros como contexto de una conversación, y herramientas para el agente. Hace falta un registro de aplicación en Entra ID (Azure). La URL de retorno que debes dar de alta en el registro es .

Desactivado, el agente solo deja el borrador en Outlook y lo envías tú desde el chat. Actívalo solo si sabes lo que haces: el modo de permisos por defecto del panel no pide confirmación para nada.
En modo delegado, los buzones compartidos a los que ya tengas acceso. En modo aplicación, los que el administrador haya abierto con una ApplicationAccessPolicy.

Google

Conecta Gmail, Google Drive y Google Calendar. Hace exactamente lo mismo que Microsoft 365 y por los mismos sitios: el buzón lateral, la agenda, el explorador de archivos y las herramientas del agente son los mismos — el panel mira de qué cuenta es cada cosa y pregunta a quien toca.

Hace falta un proyecto en Google Cloud con las APIs de Gmail, Drive, Calendar y People activadas, y un ID de cliente OAuth de tipo «Aplicación web». La URL de retorno autorizada que debes dar de alta es .

Desactivado, el agente solo deja el borrador en Gmail y lo envías tú desde el chat. Es un ajuste aparte del de Microsoft a propósito: son dos aplicaciones distintas y puedes querer una cosa en cada una.
Cada cuenta inicia sesión por su cuenta: pulsa «Conectar cuenta» otra vez para añadir una segunda y las dos quedan disponibles a la vez. La marcada como principal es la que se usa cuando no dices cuál.

WhatsApp

Vincula tu teléfono y trae tus chats al panel: lista lateral, chats como contexto de una conversación y herramientas de WhatsApp para el agente. Es el mismo papel que tiene Outlook, con tu número real.

⚠️ Léelo antes de vincular. Esto se conecta como WhatsApp Web usando tu número real. No es una API oficial de Meta y su uso va contra sus Términos de Servicio: existe riesgo de que el número sea bloqueado. Úsalo con un número que puedas permitirte perder.
Sin vincular.
Desactivado, el agente solo deja el borrador en el chat y lo envías tú. Actívalo solo si sabes lo que haces: en WhatsApp no hay «deshacer», y el modo de permisos por defecto del panel no pide confirmación para nada.
Se le pone a los números que escribas sin prefijo al empezar un chat nuevo: «600 11 12 22» sale como +34 600 11 12 22. Déjalo vacío para tener que escribir siempre el número completo.
Se configura una sola vez para todo el panel, en Voz, aquí abajo: el mismo proveedor sirve para las notas de voz de WhatsApp, para los audios que llegan por correo y para los del chat.

Voz

Audio a texto para todo el panel: las notas de voz de WhatsApp, los audios que llegan como adjunto de un correo, los ficheros que sueltas en el chat y lo que dictas con el 🎤 del compositor. Los audios largos se trocean solos y cada transcripción se cachea, así que el mismo audio no se paga dos veces.

Viene apagado, pero encenderlo es barato: la opción recomendada es en este servidor, que corre Whisper dentro del contenedor. No necesita clave de nadie, no cuesta por minuto y —lo que más importa con notas de voz de clientes— el audio no sale de la máquina. Solo la primera vez tarda, mientras se descarga el modelo.

Local gasta CPU del contenedor y va más lento; los otros dos van rápidos pero mandan el audio fuera y se pagan por minuto.
Vacío = se usa GEMINI_API_KEY / OPENAI_API_KEY del entorno.
Para fijar uno concreto sin esperar a que cambie el código.
Código ISO como es o en. Fijarlo ayuda cuando el audio es corto o tiene ruido.
Encendido, un audio que entra por el chat o por un correo llega ya como texto. Apagado, se transcribe solo cuando lo pides tú o el agente.
Tope de seguridad: por encima, el panel se niega en vez de mandar medio gigabyte a un proveedor de pago.

Skills automáticas

El agente puede destilar lo que aprende resolviendo una tarea en una skill reutilizable, y mejorarla cuando le corriges. Las revisas en Recursos → Skills.

En «Proponer», las propuestas se guardan fuera de .claude/skills, así que el motor no las carga hasta que las apruebas.

Memoria persistente

Lo que el agente sabe entre conversaciones. Se inyecta en todas ellas, así que conviene que sea corto y curado; el propio agente la actualiza con la herramienta recordar.

Heartbeat (vigilancia proactiva)

Cada N minutos el agente repasa esta checklist y solo habla si encuentra algo («mira si hay correo urgente de X», «comprueba que el job nocturno dejó el CSV»). Con la checklist vacía no cuesta nada: ni sesión ni tokens. Se aplaza solo mientras haya turnos en marcha.

Tipos de uso

Lo que se ofrece al crear una conversación. Cada tipo fija un modelo y un esfuerzo de razonamiento; después puedes cambiar el modelo en la barra del chat sin restricción.

Perfiles (entornos)

Perfiles con workspace, modelo, esfuerzo, permisos, variables, personalidad, skills propias, aislamiento de credenciales y permisos de red (como en Claude Code web). Asigna un perfil a cada conversación desde la barra del chat: el agente se ciñe a ese entorno y no ve las claves de los demás.

Se clonan o actualizan y quedan adjuntos a la conversación en cuanto le pones este perfil, en la rama que elijas aquí. El clon base lo comparten todas las conversaciones, así que otra puede moverlo de rama: si necesitas aislamiento de verdad, pon rama de trabajo (crea un worktree propio).

Al asignar el perfil, la conversación se mueve a ese grupo del árbol de la izquierda. Con «/» se anidan subgrupos.
Se antepone a las instrucciones de sistema en cada turno de las conversaciones con este perfil.
Marca las que este perfil debe ver. Las no marcadas quedan ocultas para el agente.
Las conversaciones de este entorno solo ven SUS variables: no heredan las globales de Ajustes ni las credenciales del contenedor, no pueden leer /data/config.json (donde están las claves de los demás entornos) ni el workspace de otro entorno, y buscar_en_conversaciones se limita a este entorno. Desmárcalo solo si este perfil debe trabajar con todo lo del panel.
Si la fijas, el turno usa esa suscripción aunque el selector del chat diga otra cosa (y ese selector sale bloqueado).
Lo impone un proxy local: afecta al agente, a curl, git, npm, pip, a los trabajos de ccjob y a las terminales de la conversación. Los endpoints del propio motor (Anthropic, OpenRouter…) se permiten siempre: sin ellos no habría turno.
Un dominio a secas incluye sus subdominios (example.com deja pasar api.example.com); con *. delante, solo los subdominios.
Desmarca los que este entorno no deba montar: cada servidor lleva sus propias credenciales.

Servidores MCP

JSON con los servidores MCP disponibles para el agente. Ejemplo: {"github": {"command": "npx", "args": ["-y", "@modelcontextprotocol/server-github"], "env": {"GITHUB_TOKEN": "…"}}}

Variables de entorno

Se inyectan al agente y a las terminales. Formato NOMBRE=valor, una por línea.

CLAUDE.md del workspace

Memoria/instrucciones del proyecto que Claude Code lee automáticamente.

Gateways

Habla con este mismo agente desde otros canales. Cada chat externo se convierte en una conversación aquí, visible en tiempo real.

Telegram

Funciona por long-polling: no necesita webhook. Escribe al bot y te dirá tu chat ID si aún no estás autorizado.

WhatsApp (Meta Cloud API)

Configura el webhook en Meta: · campo messages.

Esto es el gateway Cloud API: recibe mensajes y el agente contesta solo. Es un transporte distinto del de la vista 📱 WhatsApp (Baileys), que vincula tu número real y trae tus chats al panel. No tiene sentido tener los dos activos sobre el mismo número.

Webhook HTTP (para n8n, Make, scripts…)

Uso: con JSON {"message": "…", "sessionKey": "opcional"}

Seguridad

Al cambiarla se cierra la sesión en el resto de dispositivos.

Verificación en dos pasos (2FA)

Cargando…

Escanea el QR con Google Authenticator, 1Password, Authy… o introduce la clave a mano:

Códigos de recuperación — guárdalos ahora; no se volverán a mostrar. Cada uno vale para un solo acceso si pierdes la app:


              
            

Sesiones activas

Cargando…

Últimos accesos

Conversaciones de Claude Code ⇄

Trae aquí una conversación que tengas en Claude Code y sigue con todo su contexto, o llévate una de este panel a tu Claude Code. Se intercambia el propio transcript del motor, no un resumen.

Para exportar: menú ⋯ de cada conversación → ⤴ Exportar a Claude Code.

Python persistente 🐍

Los paquetes se instalan en un entorno virtual dentro del volumen (/data/venv), así no se pierden al reiniciar. Instala con pip install … desde el chat o el terminal; para apt no hay persistencia.

Ver paquetes instalados

Sistema

Son páginas de disco que el kernel guarda en RAM porque las acaba de leer. No hace falta vaciarla: si la memoria hace falta, el kernel la suelta solo. Soltarla a mano solo sirve para bajar el contador que factura el proveedor, y lo único que provoca es que esos ficheros se vuelvan a leer del disco cuando alguien los use.

💾 Consejo: añade un volumen en Railway montado en /data para que configuración, conversaciones y workspace sobrevivan a los redeploys.

⤓ Traer una conversación de Claude Code

Se importa el transcript de la conversación, así que al escribir aquí el agente continúa con todo su contexto, no solo con el texto.

Conversaciones de Claude Code que ya están en este contenedor: las de la terminal (claude) y las de este panel. Útil para pasar al panel algo que empezaste en la terminal.

En tu ordenador (Claude Code de terminal)
Cada conversación es un fichero en ~/.claude/projects/<carpeta-del-proyecto>/<id>.jsonl. Para localizar la que quieres:

ls -lt ~/.claude/projects/*/ | head
# o busca por su contenido:
grep -rl "una frase de la conversación" ~/.claude/projects | head

Sube ese .jsonl aquí. También vale desde el móvil si te lo envías.

En Claude Code web (claude.ai/code)
Esa sesión vive en un contenedor de Anthropic; no hay API pública para descargarla desde fuera. Pídeselo a la propia sesión: que copie su ~/.claude/projects/…/<id>.jsonl al repositorio (o te lo entregue como fichero) y súbelo aquí.

Para devolverla a Claude Code
En el menú ⋯ de cualquier conversación tienes ⤴ Exportar a Claude Code: te descarga un zip con el transcript, un script que lo deja donde Claude Code lo busca y las instrucciones.

⤴ Llevar esta conversación a Claude Code

Se descarga el transcript en el formato de Claude Code, con un script que lo instala en tu máquina. Después la sigues con claude --resume.

Si la indicas, el transcript ya viene apuntando ahí. Si no, el script la ajusta a la carpeta donde lo ejecutes.

🔍 Buscar en Outlook

Busca en tus buzones y adjunta los hilos que necesites a esta conversación: quedan volcados como markdown y el agente los lee con el resto del material.

📱 Buscar en WhatsApp

Busca entre tus chats y adjunta los que necesites a esta conversación: quedan volcados como markdown y el agente los lee con el resto del material. Busca por nombre de contacto y también dentro de los mensajes.

➕ Añadir a una conversación

…o crear una conversación nueva

✍️ Redactar

✍️ Firmas de correo

Varias firmas con nombre y, por cada buzón, cuál va en los mensajes nuevos y cuál en las respuestas y reenvíos — el mismo modelo que Outlook. Se insertan en los correos que salen de este panel.

No se sincronizan con Outlook. Microsoft Graph no expone las firmas del buzón por ninguna vía pública (ni mailboxSettings ni beta), y la única que hubo —EWS— se retira en octubre de 2026. Así que estas firmas viven en el panel: lo que escribas aquí no aparece en Outlook web ni en el de escritorio, ni al revés.

Tus firmas

Firma predeterminada de cada buzón

📅 Nueva reunión

🔁 Es una reunión periódica

¿El cambio se aplica solo a esta cita o a toda la serie?

📎 Elegir archivo

📁 Mover a la carpeta…

📧 Correos de esta conversación

✨ Skill

♻️ Reiniciar contexto

El agente deja de recordar lo hablado y empieza de cero. Los mensajes que ves en pantalla son otra cosa: puedes conservarlos como registro o borrarlos también. Compactar es el término medio: el motor arranca de cero pero con un resumen de lo esencial.

Detalle

🕸 Grafos de conocimiento

Un grafo es un mapa del código extraído del AST: qué llama a qué, quién importa a quién. Se construye en local y sin coste en tokens. Al adjuntarlo a una conversación, el agente recibe el informe y puede consultar el grafo citando fichero y línea.

graphify no está instalado en el entorno Python del panel.

Los documentos (.md, .sql, configs…) se indexan por su estructura, en local y sin coste. La lectura semántica profunda de PDFs e imágenes necesitaría una clave de LLM y no está activada.

Grafos ya construidos en el despliegue

Si un repo ya trae su grafo hecho (una carpeta graphify-out/, o un graph.json versionado), se importa tal cual: sin reconstruirlo, al instante y sin necesitar graphify. A partir de ahí es un grafo más — se adjunta, se ve y se rehace igual.

Grafos existentes

✴️ ¿Para qué es esta conversación?

Fija el modelo y el esfuerzo de razonamiento. Puedes cambiarlos después desde la barra del chat.

🏛 Someter al panel de deliberación

Varios modelos responden a la vez y un juez compara: consenso, contradicciones, aportes únicos y puntos ciegos. El agente recopilará antes el contexto del repositorio que haga falta. Elige con qué panel.

Diff


      

🧩 Nueva conversación desde un perfil

El perfil trae su workspace, su modelo, sus permisos, sus claves, su acceso a la red y —si los declara— sus repositorios con su rama y su grupo. Se prepara todo antes de abrir la conversación.

📦 Añadir repo a esta conversación

El agente quiere usar una herramienta


      

🤔 El agente necesita tu respuesta

Responde para que pueda continuar (o planificar) mejor.

📱 Vincular WhatsApp

En el teléfono: WhatsApp → Ajustes → Dispositivos vinculados → Vincular un dispositivo, y escanea este código.

Más cómodo desde el móvil. Escribe tu número con prefijo de país (sin «+» ni espacios) y luego, en el teléfono: Dispositivos vinculados → Vincular con el número de teléfono.

⚙️ Tareas y trabajos en segundo plano

Todo lo que está corriendo en el panel, de todas las conversaciones. Marca lo que quieras para detenerlo o quitarlo del listado.

📋 Plan propuesto