1. ¿Por qué ejecutar Claude Code Channels en un Mac mini?
La documentación oficial es explícita: «Los eventos solo llegan mientras la sesión está abierta, así que para una configuración always-on ejecutas Claude en un proceso en segundo plano o en un terminal persistente». Un portátil que se duerme, cierra la tapa o se reinicia por una actualización deja tu bot fuera de línea sin avisar; la Bot API de Telegram no ofrece historial ni búsqueda, así que Claude no puede recuperar mensajes antiguos, y Telegram conserva las actualizaciones no entregadas como máximo 24 horas. Un Mac mini dedicado de MyRemoteMac mantiene esa sesión abierta 24/7 en Apple Silicon (Claude Code es compatible con macOS 13+ en ARM64), con root completo por SSH, VNC para los diálogos de permisos de macOS que solo aparecen una vez, 1 Gbps incluido y un precio mensual fijo. También es el único tipo de host cloud que puede ejecutar el canal de iMessage, exclusivo de macOS: lee la base de datos de Mensajes y controla Messages.app mediante AppleScript, imposible en un VPS Linux.
| Característica | VPS cloud (Linux) | Mac mini (MyRemoteMac) |
|---|---|---|
| Coste mensual | Variable (ver análisis de costes) | M4 desde $85/mes · M6 desde $149/mes (fijo) |
| Canal de iMessage | Imposible (solo macOS) | Sí, Messages.app + Acceso total al disco |
| Canales de Telegram / Discord | Sí | Sí (solo saliente, sin puerto de entrada) |
| Sesión always-on | Sí | Sí (SLA del 99,9 %) |
| Hardware | Compartido, virtualizado | Mac físico dedicado 1:1 |
| Acceso y toolchain | SSH | SSH + VNC, root completo, Xcode y Simulator en la misma sesión |
Ventaja clave: Channels conecta las apps de chat con una sesión de Claude Code que ya tiene abierto tu proyecto real. En un Mac mini ese proyecto puede ser una app iOS o macOS, el agente al que escribes desde tu teléfono puede compilarla y probarla con Xcode en la misma máquina (consulta nuestra guía de desarrollo remoto con Xcode). Los tres plugins oficiales retransmiten las solicitudes de permiso, así que apruebas o rechazas cada llamada Bash, Write o Edit desde el chat.
2. Requisitos previos
Claude Code Channels es una función de la CLI propietaria Claude Code de Anthropic, no un producto aparte, y requiere un plan de Claude de pago. Es una research preview: el flag --channels ni siquiera aparece todavía en claude --help, y Anthropic indica que su sintaxis y su protocolo pueden cambiar. Los datos siguientes se verificaron contra la documentación oficial el 28 de septiembre de 2026 (Claude Code 2.1.283).
- Un Mac mini dedicado de MyRemoteMac, M4 desde $85/mes (16 GB / 256 GB) o M6 desde $149/mes. Claude Code necesita macOS 13.0+, 4 GB+ de RAM y un procesador ARM64 o x64: cualquiera de ellos cumple.
- Acceso SSH y VNC a tu Mac mini (ambos incluidos con tu suscripción a MyRemoteMac). SSH es para el terminal; VNC es para el inicio de sesión en el navegador y los diálogos de Acceso total al disco / Automatización de macOS que necesita el canal de iMessage.
- Una cuenta de Claude con acceso a Claude Code: Pro ($20/mes), Max (desde $100/mes), Team ($25/usuario/mes), Enterprise, o una clave API de Console facturada por token. El plan gratuito de claude.ai no incluye Claude Code. Los canales no están disponibles en Amazon Bedrock, Agent Platform de Google Cloud ni Microsoft Foundry. En Team/Enterprise, un Owner debe activar primero los canales (claude.ai → Admin settings → Claude Code → Channels).
- Bun en el Mac mini: «Cada canal compatible es un plugin que requiere Bun» (se instala en el Paso 1).
- Credenciales del bot para tu canal: un token de bot de Telegram obtenido de @BotFather, o una aplicación de bot de Discord con el Message Content Intent activado e invitada a un servidor que compartas con ella. iMessage no necesita token: la documentación exige macOS, Acceso total al disco, un permiso de Automatización en la primera respuesta y «cualquier dispositivo con sesión iniciada en tu Apple ID» para escribirte a ti mismo, mantener al usuario del Mac mini con la sesión iniciada y Mensajes conectado es nuestra inferencia a partir de ese mecanismo (ver Paso 3), y recomendamos un Apple ID dedicado con autenticación de dos factores en lugar del personal.
- Familiaridad básica con los comandos del terminal, tmux y la edición de ~/.claude/settings.json.
3. Paso 1: Conectar por SSH, instalar Claude Code y Bun
Conéctate por SSH a tu Mac mini con las credenciales de tu panel de MyRemoteMac, confirma la versión de macOS y luego instala Claude Code. El instalador nativo es el método que recomienda Anthropic: no necesita Node.js y se actualiza solo en segundo plano. Homebrew y npm son alternativas documentadas (el paquete npm instala el mismo binario nativo y requiere Node.js 22+; nunca lo ejecutes con sudo).
Conectar por SSH y comprobar los requisitos
# Connect to your Mac mini
ssh admin@your-server-ip
# Confirm Apple Silicon (Claude Code supports x64 and ARM64)
uname -m
# arm64
# Claude Code and Bun both need macOS 13.0+
sw_vers -productVersion
Instalar Claude Code (instalador nativo oficial)
Ejecuta el instalador, luego verifica la versión y deja que claude doctor ejecute su diagnóstico de solo lectura. El cask claude-code de Homebrew sigue el canal stable (alrededor de una semana de retraso, evita las regresiones) y no se actualiza automáticamente; claude-code@latest sigue el canal latest.
# Recommended: official native installer (no Node.js needed, auto-updates in the background)
curl -fsSL https://claude.ai/install.sh | bash
# Pin a release channel or exact version at install time if you prefer:
# curl -fsSL https://claude.ai/install.sh | bash -s stable
# Alternative A: Homebrew (stable channel; does not auto-update)
# brew install --cask claude-code
# Alternative B: npm (Node.js 22+, same native binary, never with sudo)
# npm install -g @anthropic-ai/claude-code
# Verify (prints e.g. "2.1.283 (Claude Code)") and run read-only diagnostics
claude --version && claude doctor
Instalar Bun (requerido por todos los plugins de canal)
Los plugins oficiales de canal son scripts de Bun. El mínimo del propio Bun también es macOS 13.0+. Tanto bun.com/install (de la documentación de Bun) como bun.sh/install (de los README de los plugins) son oficiales; Homebrew también funciona. Los plugins no indican ninguna versión mínima de Bun.
# Official Bun installer
curl -fsSL https://bun.com/install | bash
# Homebrew alternative: brew install oven-sh/bun/bun
# Open a new shell (or source ~/.zshrc), then verify
bun --version
4. Paso 2: Autenticarse y elegir un modo de permisos
Los canales requieren autenticación de Anthropic: un inicio de sesión en claude.ai (Pro, Max, Team, Enterprise) o una clave API de Console. Lanza claude una vez y sigue el inicio de sesión en el navegador. Por SSH, el navegador puede mostrar un código para pegar en el prompt «Paste code here if prompted»; en un Mac mini headless también puedes completar el inicio de sesión en la sesión VNC. En macOS, las credenciales van al Llavero; si el Llavero está bloqueado (habitual por SSH), Claude Code recurre a ~/.claude/.credentials.json con modo 0600.
Iniciar sesión (suscripción o clave API)
Para una sesión always-on, el inicio de sesión por suscripción es el punto débil: caduca (Claude Code avisa al arrancar «Your login expires in 3 days · run /login to renew», y una sesión desatendida «deja de avanzar en cuanto la credencial caduca»). Dos remedios documentados: generar un token OAuth de un año con claude setup-token (Pro/Max/Team/Enterprise; solo puede hacer peticiones al modelo) y exportarlo donde se ejecuta la sesión, o usar una ANTHROPIC_API_KEY de Console, facturada por token.
# Option A: subscription login (Pro, Max, Team, Enterprise)
cd ~/project
claude
# Follow the browser login. Over SSH, paste the code shown at
# "Paste code here if prompted": or finish the login over VNC.
# Option B: Console API key, billed per token (Claude Code asks once to approve it)
export ANTHROPIC_API_KEY="sk-ant-YOUR_API_KEY_HERE"
claude
# Option C (always-on subscription box): one-year OAuth token, printed once, never saved
claude setup-token
export CLAUDE_CODE_OAUTH_TOKEN=your-token
# Check which credential is active
# inside Claude Code: /status (see the "Login" row)
Modelo y proveedores
La sesión usa el modelo que selecciona tu plan; cámbialo con /model o claude --model <alias> (alias como opus, sonnet, haiku) y el nivel de esfuerzo con /effort. No existe opción de modelo local ni de proveedor externo para Channels: los backends Bedrock, Vertex y Foundry están excluidos, y enrutar hacia un endpoint que no sea Claude no es una configuración soportada. Si quieres un LLM local en el mismo Mac mini, trátalo como una carga de trabajo aparte, consulta nuestra guía de LLM locales.
Elegir un modo de permisos y fijar el canal de versiones
Desde Claude Code 2.1.283, el modo auto (un clasificador revisa las acciones) es el modo de inicio integrado para las sesiones interactivas. Para una sesión de canal recomendamos mantener la aprobación humana en el bucle: en modo Manual (--permission-mode default) cada solicitud Bash, Write o Edit se retransmite a tu chat en la allowlist, donde respondes yes <id> o no <id>. En modo auto decide el clasificador y «no se abriría ningún diálogo que el lado remoto pudiera responder». Como la función es una research preview, fija también el canal de versiones stable y una versión mínima en ~/.claude/settings.json (ajustes de usuario, los modos auto y bypass definidos en el .claude/settings.json de un proyecto se ignoran):
# ~/.claude/settings.json (user settings: applies to every project on the Mac mini)
{
"permissions": {
"defaultMode": "default"
},
"sandbox": {
"enabled": true
},
"autoUpdatesChannel": "stable",
"minimumVersion": "2.1.211"
}
# minimumVersion = the version YOU validated on this Mac mini (the docs' example is "2.1.100").
# Auto-updates and `claude update` refuse to install anything below it, so never set it to a
# version you have not tested with --channels: 2.1.283 has an open launchd regression (#97701).
# Equivalent per-launch flag instead of defaultMode:
# claude --permission-mode default --channels plugin:telegram@claude-plugins-official
No desactives los permisos. La propia advertencia de la documentación sobre --dangerously-skip-permissions / bypassPermissions: «Usa este modo únicamente en entornos aislados como contenedores, máquinas virtuales o dev containers sin acceso a internet, donde Claude Code no pueda dañar tu sistema anfitrión» y «no ofrece ninguna protección contra la inyección de prompts ni las acciones no deseadas». Se rechaza como root/sudo en macOS, las reglas deny siguen aplicándose y los administradores pueden bloquearlo con permissions.disableBypassPermissionsMode. Si un Mac mini dedicado, aislado y de total confianza debe funcionar sin supervisión, el patrón documentado es claude -p "<prompt>" --dangerously-skip-permissions como usuario no root, una opción claramente advertida, nunca la predeterminada. El patrón desatendido más seguro es -p --permission-mode auto --permission-prompts none (2.1.259+), que rechaza todo lo que pediría confirmación en lugar de bloquearse.
5. Paso 3: Conectar Telegram, Discord o iMessage
La research preview incluye tres plugins oficiales de canal, Telegram, Discord e iMessage, más una demo en localhost llamada fakechat, todos del marketplace de Anthropic claude-plugins-official (Apache-2.0). Cada uno se instala como plugin dentro de Claude Code, se configura con tus propias credenciales de bot y se activa en una sesión con el flag --channels. Dos reglas se aplican a todos: debes salir y reiniciar Claude Code con --channels después de instalar un plugin, y el bot solo puede responder mientras esa sesión está en ejecución. Cada plugin aprobado mantiene una allowlist de remitentes: «solo los ID que hayas añadido pueden enviar mensajes, y todos los demás se descartan silenciosamente».
Telegram (primer canal recomendado)
Crea el bot en Telegram: abre @BotFather, envía /newbot, dale un nombre visible y un nombre de usuario único terminado en bot, y copia el token. Luego, dentro de una sesión de Claude Code en el Mac mini, instala el plugin (elige el ámbito de usuario cuando se te pregunte), guarda el token, reinicia con el flag del canal, empareja y bloquea la política. El plugin hace long-polling contra la Bot API, así que el Mac mini no necesita ningún puerto de entrada.
# 1. In Telegram: open @BotFather, send /newbot, copy the token
# 2. Inside a Claude Code session on the Mac mini (choose the USER scope when asked)
/plugin install telegram@claude-plugins-official
# "Marketplace not found"? add it first, then retry:
# /plugin marketplace add anthropics/claude-plugins-official
# If the summary says "Run /reload-plugins to activate.", do so.
# 3. Store the token (written to ~/.claude/channels/telegram/.env;
# a TELEGRAM_BOT_TOKEN in the shell environment takes precedence)
/telegram:configure <token>
# 4. Exit Claude Code and restart with the channel flag
claude --channels plugin:telegram@claude-plugins-official
# 5. Send any message to your bot: it replies with a pairing code. Then, in Claude Code:
/telegram:access pair <code>
/telegram:access policy allowlist # only your account can send from now on
Discord (alternativa)
En el Discord Developer Portal crea una New Application, abre Bot, haz clic en Reset Token y cópialo, activa Message Content Intent en Privileged Gateway Intents y luego usa OAuth2 → URL Generator con el scope bot y los permisos View Channels, Send Messages, Send Messages in Threads, Read Message History, Attach Files y Add Reactions para invitarlo a un servidor en el que estés, los DM solo funcionan si compartes un servidor con el bot. Los canales de servidor (guild) se activan uno a uno por ID de canal.
# Discord Developer Portal (https://discord.com/developers/applications):
# New Application > Bot > Reset Token (copy it) > enable Message Content Intent
# OAuth2 > URL Generator: scope "bot"; permissions View Channels, Send Messages,
# Send Messages in Threads, Read Message History, Attach Files, Add Reactions
# Open the generated URL and invite the bot to a server you are in
# Inside Claude Code (token saved to ~/.claude/channels/discord/.env, or set DISCORD_BOT_TOKEN)
/plugin install discord@claude-plugins-official
/discord:configure <token>
# Restart with the channel, DM the bot for a pairing code, pair, lock down
claude --channels plugin:discord@claude-plugins-official
/discord:access pair <code>
/discord:access policy allowlist
# Several channels at once: pass the entries space-separated
# claude --channels plugin:telegram@claude-plugins-official plugin:discord@claude-plugins-official
iMessage (solo macOS, la ventaja del Mac mini)
Sin token de bot: el plugin lee ~/Library/Messages/chat.db directamente y envía las respuestas mediante AppleScript. La primera lectura solicita Acceso total al disco, el aviso nombra la app que lanzó Bun (Terminal, iTerm, tu IDE), y la primera respuesta dispara un aviso de Automatización («Terminal quiere controlar Mensajes»). Ambos son diálogos gráficos, así que hazlo por VNC; sin Acceso total al disco el servidor termina con «authorization denied». Luego abre Mensajes en cualquier dispositivo con sesión iniciada en tu Apple ID y envíate un mensaje a ti mismo: el chat contigo mismo omite el control de acceso, y los demás contactos deben añadirse a la allowlist explícitamente. El plugin consulta chat.db una vez por segundo, empieza desde la última fila (sin repetición tras un reinicio), añade «Sent by Claude» salvo que IMESSAGE_APPEND_SIGNATURE=false, e ignora SMS/RCS por defecto porque «los ID de remitente de SMS se pueden suplantar». Nuestra inferencia a partir de ese mecanismo, no una frase de la documentación: mantén al usuario del Mac mini con la sesión iniciada y Mensajes conectado.
# Over VNC: System Settings > Privacy & Security > Full Disk Access > add your terminal app
# (or click "Allow" when the first read of ~/Library/Messages/chat.db prompts)
# Inside Claude Code (user scope), then relaunch with the channel
/plugin install imessage@claude-plugins-official
claude --channels plugin:imessage@claude-plugins-official
# From any device signed into your Apple ID: open Messages and text yourself.
# The first reply triggers the macOS Automation prompt ("Terminal wants to control Messages"): click OK.
# Let another contact in (phone in +country format, or Apple ID email)
/imessage:access allow +15551234567
Prueba opcional: fakechat en localhost
Para probar el flujo sin ningún servicio externo, la demo oficial fakechat sirve una interfaz de chat en http://localhost:8787 (accede a ella mediante un túnel SSH o por VNC). No tiene tokens ni control de acceso, así que úsala solo para pruebas. Si Claude Code pide permiso para la primera respuesta, apruébalo.
/plugin install fakechat@claude-plugins-official
claude --channels plugin:fakechat@claude-plugins-official
# From your laptop, tunnel the demo UI (it listens on localhost only)
ssh -N -L 8787:127.0.0.1:8787 admin@your-server-ip
# then open http://localhost:8787
Lo que verás: el mensaje entrante aparece en tu terminal, pero el texto de la respuesta no, el terminal muestra la llamada a la herramienta y una confirmación como «sent», y la respuesta aparece en la app de chat. En modo -p (no interactivo), las herramientas que necesitan entrada por terminal, preguntas de opción múltiple y aprobación del modo plan, están desactivadas para que la sesión nunca se bloquee; en la sesión tmux interactiva que recomienda esta guía, el modo plan funciona (restaurado para las sesiones --channels en 2.1.126). Los diálogos de confianza del proyecto y de consentimiento MCP nunca se retransmiten, así que confía primero en la carpeta del proyecto y aprueba localmente el servidor MCP del plugin.
6. Paso 4: Mantener la sesión viva 24/7 y actualizar
Anthropic no prescribe ningún mecanismo de servicio: la documentación solo dice que ejecutes Claude «en un proceso en segundo plano o en un terminal persistente», y no hay instrucciones sobre launchd, systemd, screen ni nohup en code.claude.com a fecha del 28 de septiembre de 2026. Lo que sí está documentado es una página de configuración de tmux, así que tmux es un host soportado. Todo lo que hay en esta sección más allá de los ajustes de tmux es nuestra recomendación para un Mac mini de MyRemoteMac, claramente señalada como tal.
Ejecutar la sesión de canal en tmux (nuestra recomendación)
Inicia la sesión interactiva claude --channels dentro de una sesión tmux con nombre por SSH y desconéctate. Puedes volver a conectarte en cualquier momento para responder a una solicitud que no se haya retransmitido, renovar el inicio de sesión con /login o leer el aviso de Channels al arrancar. Añade los tres ajustes de tmux que documenta Anthropic para que las notificaciones lleguen al terminal exterior y Shift+Enter funcione:
# Install tmux
brew install tmux
# The three settings Anthropic documents for running Claude Code inside tmux
printf 'set -g allow-passthrough on\nset -s extended-keys on\nset -as terminal-features "xterm*:extkeys"\n' >> ~/.tmux.conf
# Start a named session in your project and launch the channel session inside it
tmux new -s claude -c ~/project
claude --channels plugin:telegram@claude-plugins-official
# Detach: Ctrl-b d Reattach later: tmux attach -t claude
# Renew an expiring login from inside the session: /login
Supervisor opcional: un LaunchAgent de usuario (nuestro, con una advertencia)
Para recrear la sesión tmux tras un reinicio o un fallo puedes registrar un LaunchAgent de usuario con RunAtLoad y KeepAlive cuyo programa sea un pequeño script envoltorio. Debe ser un LaunchAgent, no un LaunchDaemon: los permisos de iMessage (Acceso total al disco, Automatización), Messages.app y el inicio de sesión del Llavero pertenecen a la sesión del usuario conectado, lo que en un Mac mini headless significa que el inicio de sesión automático debe estar activado (Ajustes del Sistema > Usuarios y grupos). Dos advertencias: no está comprobado si un proceso Bun lanzado de este modo recibe su propio permiso de Acceso total al disco sin un aviso gráfico, y el issue de regresión abierto #97701 (2026-09-27) informa de que un daemon --channels supervisado por launchd reinicia sesiones cada ~2 minutos en 2.1.283, sin respuesta de los mantenedores en el momento de escribir esto. Prueba en tu versión de destino y mantén fijado el canal stable.
# OUR RECOMMENDATION: not documented by Anthropic. See the warning about issue #97701 above.
# 1. Wrapper script: ~/bin/claude-channels.sh (chmod 700)
#!/bin/zsh
export PATH="$HOME/.local/bin:$HOME/.bun/bin:/opt/homebrew/bin:/usr/bin:/bin" # where `which claude` / `which bun` point
# Optional: one-year token from `claude setup-token`, stored in a chmod 600 file
[ -f "$HOME/.claude-channels.env" ] && source "$HOME/.claude-channels.env"
tmux has-session -t claude 2>/dev/null || \
tmux new -d -s claude -c "$HOME/project" \
'claude --permission-mode default --channels plugin:telegram@claude-plugins-official'
# Stay alive while the session exists, so launchd's KeepAlive relaunches us when it dies
while tmux has-session -t claude 2>/dev/null; do sleep 30; done
# 2. LaunchAgent: ~/Library/LaunchAgents/com.example.claude-channels.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"><dict>
<key>Label</key><string>com.example.claude-channels</string>
<key>ProgramArguments</key><array><string>/Users/admin/bin/claude-channels.sh</string></array>
<key>RunAtLoad</key><true/>
<key>KeepAlive</key><true/>
<key>ThrottleInterval</key><integer>30</integer>
<key>StandardOutPath</key><string>/Users/admin/Library/Logs/claude-channels.log</string>
<key>StandardErrorPath</key><string>/Users/admin/Library/Logs/claude-channels.log</string>
</dict></plist>
# 3. Load it into the logged-in user session (LaunchAgent, never a LaunchDaemon)
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.claude-channels.plist
launchctl print gui/$(id -u)/com.example.claude-channels
# Unload: launchctl bootout gui/$(id -u)/com.example.claude-channels
Mantener el Mac mini despierto y con la sesión iniciada
Administración genérica de macOS, no un punto de la documentación de Claude Code: desactiva el reposo para que la sesión y el poller de Mensajes nunca se detengan (ejecuta man pmset en el Mac para más detalles), y activa el inicio de sesión automático para tu usuario de modo que los LaunchAgents y Messages.app vuelvan tras un reinicio.
# Generic macOS administration (see `man pmset`): never sleep
sudo pmset -a sleep 0 disksleep 0 standby 0 powernap 0
# Automatic login for your user (needed for LaunchAgents and Messages.app after a reboot):
# System Settings > Users & Groups > Automatic login: set it over VNC
# Reboot-test once, then message the bot again
sudo reboot
Actualizar Claude Code, Bun y los plugins
El instalador nativo comprueba si hay actualizaciones al arrancar y periódicamente, las descarga en segundo plano y aplica la nueva versión la próxima vez que inicias Claude Code, así que una sesión tmux de larga duración conserva su versión hasta que la reinicies. claude update la aplica de inmediato. Como la sintaxis de --channels «puede cambiar según los comentarios», vuelve a leer la documentación de channels tras cada actualización y revisa de nuevo el aviso de Channels al arrancar por si hay una línea de advertencia.
# Claude Code (native installer): apply a pending update now
claude update
# "Successfully updated from X to version Y" or "Claude Code is up to date (X)"
claude doctor # shows the last update attempt
# Homebrew: brew upgrade claude-code npm: npm install -g @anthropic-ai/claude-code@latest
# Channel plugins: refresh the catalogue, then update
claude plugin marketplace update claude-plugins-official
claude plugin update telegram@claude-plugins-official
# (loads in the next session, or after /reload-plugins in a running one)
# Bun
bun upgrade # curl install | brew upgrade bun (Homebrew install)
# Restart the channel session so the new versions take effect
tmux kill-session -t claude
tmux new -s claude -c ~/project
claude --channels plugin:telegram@claude-plugins-official
# Re-read the startup "Channels" notice for any warning line
7. Refuerzo de la seguridad
Cada mensaje entrante aterriza en una sesión con acceso al sistema de archivos, a git y al shell, y «cualquiera que pueda responder a través del canal puede aprobar o rechazar el uso de herramientas en tu sesión». La documentación de referencia es tajante: «Un canal sin control de acceso es un vector de inyección de prompts». Estos son los controles documentados, más nuestras recomendaciones donde la documentación guarda silencio:
-
Activa la allowlist justo después del emparejamiento. Ejecuta
/telegram:access policy allowlist(o el equivalente de Discord) en cuanto tu propia cuenta esté emparejada. Cuando la lista sea definitiva, TELEGRAM_ACCESS_MODE=static / IMESSAGE_ACCESS_MODE=static desactivan por completo el emparejamiento en tiempo de ejecución. - Incluye en la allowlist solo a remitentes a los que confiarías la autoridad de aprobación. Las aprobaciones retransmitidas cubren Bash, Write y Edit; desde 2.1.211 el texto retransmitido se sanea y desde 2.1.234 las credenciales se enmascaran como [REDACTED] y la retransmisión solo va a los servidores registrados mediante --channels, pero la documentación sigue diciendo que trates los campos retransmitidos como no confiables.
- Mantén activadas las solicitudes de permiso. Modo Manual más retransmisión, o modo auto con el clasificador, nunca bypassPermissions en una máquina que contenga código o credenciales reales. Las reglas deny de los ajustes bloquean comandos en todos los modos.
- Activa el sandbox de Bash (función oficial, nuestra recomendación es activarla): en macOS no hay nada que instalar, usa el framework Seatbelt integrado. Añade entradas sandbox.credentials para ~/.ssh y ~/.aws porque la política de lectura por defecto todavía los permite.
- Restringe los archivos de tokens (nuestra recomendación, la documentación no indica un modo de archivo): los comandos configure escriben ~/.claude/channels/<telegram|discord>/.env; las variables de entorno TELEGRAM_BOT_TOKEN / DISCORD_BOT_TOKEN tienen prioridad sobre los archivos. Nunca los subas a un repositorio; rótalos vía BotFather o el portal de Discord si se filtran.
- Superficie de privacidad de iMessage: el Acceso total al disco da a la app de terminal y a todo lo que lanza acceso de lectura a toda la base de datos de Mensajes, y el permiso de Automatización le permite enviar iMessages en tu nombre. Usa un Apple ID dedicado con 2FA en el Mac mini dedicado, y deja IMESSAGE_ALLOW_SMS en su valor por defecto false.
- Sin puertos de entrada. Los plugins oficiales consultan Telegram o se conectan en saliente al gateway de Discord; fakechat solo escucha en localhost. Si construyes un canal webhook personalizado a partir de la documentación de referencia (cargable en la preview solo con --dangerously-load-development-channels, que la documentación dice no usar nunca con fuentes no confiables), expón su puerto únicamente a través de la VPN WireGuard del Mac mini.
# Restrict the channel state and token files (our recommendation: no documented mode)
chmod 700 ~/.claude/channels
chmod 600 ~/.claude/channels/*/.env
# Freeze the allowlists once they are final (disables runtime pairing)
export TELEGRAM_ACCESS_MODE=static
export IMESSAGE_ACCESS_MODE=static
# Bash sandbox with strict mode and protected credential paths: ~/.claude/settings.json
{
"sandbox": {
"enabled": true,
"allowUnsandboxedCommands": false,
"credentials": {
"files": [
{ "path": "~/.aws/credentials", "mode": "deny" },
{ "path": "~/.ssh", "mode": "deny" }
],
"envVars": [
{ "name": "GITHUB_TOKEN", "mode": "deny" }
]
}
}
}
# Team/Enterprise admins: managed settings (users cannot override)
# "channelsEnabled": true
# "allowedChannelPlugins": [{ "marketplace": "claude-plugins-official", "plugin": "telegram" }]
# "permissions": { "disableBypassPermissionsMode": "disable" }
8. Resolución de problemas comunes
El bot no responde
La respuesta oficial: «asegúrate de que Claude Code se está ejecutando con --channels … El bot solo puede responder mientras el canal está activo». Una sesión SSH cerrada, un fallo, un reinicio o el reposo dejan el bot fuera de línea sin avisar. Desde 2.1.281 el nombre del plugin instalado también debe coincidir exactamente con la entrada de --channels:
# Is the session still there?
tmux attach -t claude
# Was it started WITH the flag, and with the exact plugin name?
claude --channels plugin:telegram@claude-plugins-official
# Read the startup "Channels" notice: it says why a channel did not register
# Telegram: the Bot API offers no history or search, so Claude cannot fetch older messages;
# Telegram holds undelivered updates for at most 24 hours.
# Discord can catch up: ask Claude to use fetch_messages (max 100).
«Marketplace claude-plugins-official not found» o no existe el comando /telegram:configure
Añade primero el marketplace, elige el ámbito de usuario al instalar y ejecuta /reload-plugins si el resumen de instalación lo pide (o simplemente reinicia):
/plugin marketplace add anthropics/claude-plugins-official
/plugin install telegram@claude-plugins-official # choose the USER scope
/reload-plugins
/telegram:configure <token>
# Bun missing? every channel plugin requires it
bun --version
El canal se conecta pero no llega ningún mensaje (organización Team, Enterprise o Console)
channelsEnabled es un ajuste gestionado que los usuarios no pueden anular. En claude.ai Team/Enterprise está bloqueado por defecto hasta que un Owner lo activa; las organizaciones de Console que despliegan ajustes gestionados también deben definirlo. El servidor MCP se conecta igualmente y sus herramientas funcionan, solo faltan los mensajes entrantes, con una advertencia al arrancar. Revisa el aviso de arranque y pregunta a tu Owner:
# Owner: claude.ai > Admin settings > Claude Code > Channels, or in managed settings:
# "channelsEnabled": true
# Pro/Max accounts without an organization skip this check entirely.
# Also check that the plugin is on the allowlist (or the org's allowedChannelPlugins)
# and that nothing forces MCP_PROTOCOL_NEGOTIATION=auto in the environment
El servidor de iMessage termina con «authorization denied»
No se concedió Acceso total al disco a la app que lanzó Bun, o Claude Code se inició desde un lanzador distinto (sshd, un servidor tmux iniciado en otro sitio, un LaunchAgent) del que aprobaste. Concédelo por VNC y vuelve a lanzarlo desde el mismo sitio:
# Over VNC: System Settings > Privacy & Security > Full Disk Access > add the terminal app
# that launches your tmux/claude session, then restart the session from that same app.
# The reply path needs the Automation grant as well: the first outbound reply shows
# "Terminal wants to control Messages": click OK in the VNC session.
# SMS/RCS senders are ignored by design unless IMESSAGE_ALLOW_SMS=true (not recommended)
La sesión se detiene: «Login expired · Please run /login»
Un inicio de sesión por suscripción caduca y una sesión desatendida deja de avanzar. Vuelve a conectarte a tmux y renuévalo, o pasa la máquina always-on a un token OAuth de un año o a una clave API:
tmux attach -t claude
/login # renew the subscription login
/status # check the "Login" row
# Or make the box independent of the browser login:
claude setup-token # one-year CLAUDE_CODE_OAUTH_TOKEN (Pro/Max/Team/Enterprise)
# or export ANTHROPIC_API_KEY (Console, per-token billing)
# Over SSH the Keychain may be locked: credentials then live in ~/.claude/.credentials.json (0600)
9. Análisis de costes vs. VPS cloud
Claude Code Channels no añade ningún coste propio, pero Claude Code en sí requiere un plan de pago, igual en cualquier host. Lo que cambia es la máquina. Un VPS Linux de uso general es más barato al mes que un Mac mini, pero no puede ejecutar el canal de iMessage, no tiene Xcode y comparte su hardware. Esto es lo que cuesta una configuración típica en USD al mes:
| Caso de uso | Acceso a Claude | Host VPS Linux | Host Mac mini (MyRemoteMac) | Lo que aporta el Mac mini |
|---|---|---|---|---|
| Desarrollador individual, Telegram o Discord | Pro, $20/mes | ~$20–40/mes (estimación) | $85/mes (M4, 16 GB / 256 GB) | Hardware dedicado 1:1, VNC, toolchain de macOS |
| Desarrollador individual, iMessage | Pro, $20/mes | Imposible (solo macOS) | $85/mes (M4) | El único tipo de host que puede ejecutarlo |
| Uso intensivo, varias sesiones, compilaciones con Xcode | Max, desde $100/mes | ~$40–80/mes (estimación) | $149/mes (M6) | Xcode, Simulator, compilaciones rápidas en Apple Silicon |
| Bot de equipo (un Owner activa los canales) | Team, $25/usuario/mes | ~$40–80/mes (estimación) | $149/mes (M6) | Una máquina dedicada por equipo, se aplican los ajustes gestionados |
Supuestos: las cifras de VPS son nuestros rangos aproximados para instancias Linux de uso general de entrada (4–8 GB) y de gama media (16 GB), no cotizaciones de un proveedor concreto. Los precios de los planes de Claude proceden de claude.com/pricing a 28 de septiembre de 2026 (Pro $20/mes o $17/mes con facturación anual; Max desde $100/mes; Team $25/usuario/mes estándar o $20 anual, $125 premium). La facturación por clave API de Console es por token, precios de lista first-party en el momento de escribir esto: Sonnet 5 $2/$10, Opus 5 $5/$25, Haiku 4.5 $1/$5 por millón de tokens de entrada/salida. Los planes de suscripción tienen cuota: un bot always-on comparte la misma asignación que tu programación interactiva. Anthropic no publica el consumo de RAM ni de CPU de una sesión de canal, así que dimensionamos de forma cualitativa: un Mac mini M4 con 16 GB es más que suficiente para una sesión de Claude Code + plugin Bun; elige el M6 (disponible desde el 22 de septiembre de 2026) si la misma máquina también ejecuta compilaciones pesadas, varias sesiones o un modelo local.
En resumen: Si solo necesitas Telegram o Discord y nunca tocas macOS, un VPS Linux es el host más barato. El Mac mini justifica su precio cuando el agente debe tener abierto tu proyecto de Xcode, cuando quieres iMessage o cuando quieres hardware dedicado y no virtualizado con VNC para los avisos de macOS que solo aparecen una vez, desde $85/mes además del plan de Claude que ya pagas.
10. Claude Code Channels vs. OpenClaw
Resuelven problemas distintos. Claude Code Channels es una función de una CLI propietaria, no un asistente independiente: conecta Telegram, Discord o iMessage con una sesión de Claude Code ya en ejecución, así que el valor es «hablar con el agente de programación que tiene tu repo abierto», con soporte de Anthropic, el modelo de permisos de Claude Code, aprobaciones sí/no retransmitidas con prompts saneados, allowlists de remitentes, el sandbox de Bash y ajustes gestionados de organización. Es exclusivo de Claude mediante autenticación de Anthropic, no tiene daemon propio y los canales personalizados solo se pueden cargar tras un flag de desarrollo durante la preview. OpenClaw (github.com/openclaw/openclaw, MIT, mantenido por la comunidad, unas 391k estrellas en GitHub frente a 148k de anthropics/claude-code a 28 de septiembre de 2026) es un gateway de código abierto y autoalojado que funciona 24/7 como su propio servicio launchd supervisado, admite muchas más plataformas de chat (WhatsApp, Telegram, Discord, iMessage, Slack, Signal, Teams, Google Chat y más) y te deja elegir el proveedor de modelos, incluidos modelos locales. Varios artículos secundarios han presentado Channels como una alternativa a OpenClaw; la documentación oficial no hace tal comparación.
Elige Channels si ya pagas Claude Pro, Max o Team y quieres que los archivos reales de tu proyecto sean accesibles desde tu teléfono con soporte oficial y permisos retransmitidos. Elige OpenClaw para WhatsApp, Slack o Signal, elección de proveedor, modelos locales o un verdadero funcionamiento como daemon, consulta nuestra guía de OpenClaw en Mac mini (y su primo en Python, Hermes Agent). Ambos puentes de iMessage necesitan macOS con Mensajes conectado y los mismos permisos TCC, y precisamente por eso un Mac mini dedicado 1:1 encaja con cualquiera de los dos.
11. Preguntas frecuentes
¿Claude Code Channels es gratuito o de código abierto?
No en ninguno de los dos casos para Claude Code en sí: la CLI es propietaria («© Anthropic PBC. All rights reserved. Use is subject to Anthropic's Commercial Terms of Service.») y requiere una cuenta Pro, Max, Team, Enterprise o Console, el plan gratuito de claude.ai no incluye Claude Code. Solo los plugins de canal del repositorio claude-plugins-official son de código abierto (Apache-2.0). Channels no añade ningún cargo adicional más allá de tu plan o tu uso de la API.
¿Tengo que mantener un terminal abierto para que el bot funcione?
Sí, la sesión debe permanecer abierta. Según la documentación oficial, los eventos solo llegan mientras la sesión de Claude Code se ejecuta con --channels, así que para una configuración always-on la ejecutas en un proceso en segundo plano o en un terminal persistente. Anthropic no prescribe ningún mecanismo; nuestra recomendación en un Mac mini es una sesión tmux con nombre a la que puedas volver a conectarte por SSH, opcionalmente supervisada por un LaunchAgent de usuario (consulta las salvedades en el Paso 4).
¿Puedo usar un modelo local, Ollama, Bedrock o Vertex con Channels?
No. Los canales requieren autenticación de Anthropic mediante claude.ai o una clave API de Console y no están disponibles en Amazon Bedrock, Agent Platform de Google Cloud ni Microsoft Foundry. Enrutar hacia un endpoint que no sea Claude no es una configuración soportada. Puedes seguir ejecutando un LLM local en el mismo Mac mini como carga de trabajo aparte, consulta nuestra guía de LLM locales, pero no como cerebro de una sesión de canal.
¿Qué configuración de Mac mini debo elegir?
Los requisitos declarados por Anthropic son modestos (macOS 13+, 4 GB+ de RAM) y no se publica ningún consumo por sesión, así que dimensionamos de forma cualitativa: el Mac mini M4 con 16 GB / 256 GB a $85/mes es más que suficiente para una sesión de Claude Code más un plugin de canal en Bun. Elige el Mac mini M6 desde $149/mes si la misma máquina también va a ejecutar compilaciones pesadas con Xcode, varias sesiones de canal o un modelo local en paralelo.
¿Funciona el canal de iMessage en un Mac mini headless?
Sí, con dos pasos gráficos que se hacen una sola vez por VNC: conceder Acceso total al disco a la app que lanzó Bun y hacer clic en OK en el aviso de Automatización («Terminal quiere controlar Mensajes») en la primera respuesta. El plugin lee el ~/Library/Messages/chat.db del usuario conectado y controla Messages.app mediante AppleScript, así que, nuestra inferencia a partir de ese mecanismo, no una frase de la documentación, mantén al usuario con la sesión iniciada y Mensajes conectado al Apple ID, y activa el inicio de sesión automático para que sobreviva a los reinicios. Usa un Apple ID dedicado con 2FA.
¿Y WhatsApp, Slack, Signal o Teams?
No son canales oficiales. La research preview incluye los plugins de Telegram, Discord e iMessage más la demo fakechat; cualquier otro canal es un servidor MCP personalizado que, durante la preview, solo se carga tras --dangerously-load-development-channels o el ajuste allowedChannelPlugins de una organización. Claude in Slack es una función distinta que lanza sesiones en la nube. Si la prioridad es la amplitud de plataformas, OpenClaw encaja mejor.
12. Fuentes y lecturas adicionales
Todos los comandos, flags y requisitos de esta guía se verificaron el 28 de septiembre de 2026 contra la documentación oficial de Claude Code, el CHANGELOG (Claude Code 2.1.283, publicado en npm el 25 de septiembre de 2026) y el repositorio claude-plugins-official (telegram 0.0.7, discord 0.0.4, imessage 0.1.0, fakechat 0.0.1). Channels es una research preview cuyos flags pueden cambiar, consulta estas páginas para conocer el estado actual:
- Documentación de Claude Code: Channels (inicio rápido, Telegram / Discord / iMessage, controles enterprise)
- Documentación de Claude Code: Referencia de Channels (contrato del protocolo, retransmisión de permisos, flag de desarrollo)
- Documentación de Claude Code: Configurar Claude Code (requisitos del sistema, instaladores, canales de versiones, actualizaciones)
- Documentación de Claude Code: Autenticación (inicio de sesión, setup-token, almacenamiento de credenciales, caducidad)
- Documentación de Claude Code: Modos de permisos (default, auto, advertencias sobre bypassPermissions)
- Documentación de Claude Code: Modo headless / -p (channels, --permission-prompts none, SIGTERM)
- Documentación de Claude Code: Sandboxing (Seatbelt de macOS, sandbox.credentials)
- Documentación de Claude Code: Ajustes (ubicación de los archivos y precedencia)
- Documentación de Claude Code: Configuración del terminal (ajustes oficiales de tmux)
- Documentación de Claude Code: Configuración del modelo (/model, alias, effort)
- Documentación de Claude Code: Referencia de la CLI de plugins (plugin update, marketplace update)
- Documentación de Claude Code: Remote Control (una función distinta, para evitar confusiones)
- Plugin oficial de canal de Telegram (README)
- Plugin de Telegram: ACCESS.md (dmPolicy, allowFrom, modo de acceso static)
- Plugin oficial de canal de Discord (README)
- Plugin oficial de canal de iMessage (README)
- Plugin de iMessage: ACCESS.md (política de allowlist, SMS, firma)
- CHANGELOG de Claude Code (2.1.80 research preview de --channels, 2.1.81 retransmisión de permisos, 2.1.128, 2.1.211, 2.1.234, 2.1.281)
- Issue de GitHub #97701: reinicios en bucle de la sesión --channels supervisada por launchd en 2.1.283 (abierto)
- Bun: instalación (macOS 13.0+)
- claude.com/pricing: planes Pro, Max y Team (Claude Code incluido)
Guías relacionadas
Instalar OpenClaw en Mac mini
La alternativa de código abierto e independiente del proveedor, con más de 20 plataformas de chat y su propio servicio gateway en launchd.
Instalar Hermes Agent en Mac mini
El agente de código abierto de Nous Research capaz de mejorarse a sí mismo: instalador de una línea, Telegram y Discord, launchd, Ollama local.
Desarrollo remoto con Xcode
Dale al agente al que escribes desde tu teléfono un proyecto real de Xcode para compilar y probar en el mismo Mac mini.
Alquila un Mac mini M6
El Mac mini más reciente de Apple con el M6 de 12 núcleos, dedicado 1:1 desde $149/mes, para varias sesiones o compilaciones pesadas.