1. Pourquoi faire tourner Claude Code Channels sur un Mac mini ?
La documentation officielle est explicite : "Events only arrive while the session is open, so for an always-on setup you run Claude in a background process or persistent terminal." (les événements n'arrivent que tant que la session est ouverte ; pour un fonctionnement permanent, lancez Claude dans un processus d'arrière-plan ou un terminal persistant). Un portable qui se met en veille, dont on ferme l'écran ou qui redémarre pour une mise à jour met votre bot hors ligne en silence ; l'API Bot de Telegram n'offre ni historique ni recherche, Claude ne peut donc pas récupérer les messages plus anciens, et Telegram ne conserve les mises à jour non livrées que 24 heures au maximum. Un Mac mini dédié chez MyRemoteMac garde cette session ouverte 24h/24 sur Apple Silicon (Claude Code prend en charge macOS 13+ sur ARM64), avec un accès root complet via SSH, VNC pour les dialogues de permission macOS à valider une seule fois, 1 Gbps inclus et un tarif mensuel fixe. C'est aussi le seul type d'hôte cloud capable de faire tourner le canal iMessage, réservé à macOS : il lit la base de données de Messages et pilote Messages.app via AppleScript, impossible sur un VPS Linux.
| Fonctionnalité | VPS cloud (Linux) | Mac mini (MyRemoteMac) |
|---|---|---|
| Coût mensuel | Variable (voir l'analyse des coûts) | M4 dès $85/mois · M6 dès $149/mois (fixe) |
| Canal iMessage | Impossible (macOS uniquement) | Oui, Messages.app + Accès complet au disque |
| Canaux Telegram / Discord | Oui | Oui (sortant uniquement, aucun port entrant) |
| Session toujours ouverte | Oui | Oui (SLA 99,9 %) |
| Matériel | Partagé, virtualisé | Mac physique dédié 1:1 |
| Accès & outils | SSH | SSH + VNC, accès root complet, Xcode et Simulator dans la même session |
Avantage clé : Channels relie les applications de messagerie à une session Claude Code qui a déjà votre vrai projet ouvert. Sur un Mac mini, ce projet peut être une app iOS ou macOS, l'agent à qui vous écrivez depuis votre téléphone peut la compiler et la tester avec Xcode sur la même machine (voir notre guide de développement Xcode à distance). Les trois plugins officiels relaient les demandes de permission : vous approuvez ou refusez chaque appel Bash, Write ou Edit depuis la conversation.
2. Prérequis
Claude Code Channels est une fonctionnalité de la CLI propriétaire Claude Code d'Anthropic, pas un produit à part, et elle exige un abonnement Claude payant. C'est une research preview : le flag --channels n'apparaît même pas encore dans claude --help, et Anthropic précise que sa syntaxe et son protocole peuvent changer. Les informations ci-dessous ont été vérifiées par rapport à la documentation officielle le 28 septembre 2026 (Claude Code 2.1.283).
- Un Mac mini dédié chez MyRemoteMac, M4 dès $85/mois (16 Go / 256 Go) ou M6 dès $149/mois. Claude Code exige macOS 13.0+, 4 Go de RAM ou plus et un processeur ARM64 ou x64 : toutes les configurations conviennent.
- Un accès SSH et VNC à votre Mac mini (tous deux fournis avec votre abonnement MyRemoteMac). SSH sert au terminal ; VNC sert à la connexion via le navigateur et aux dialogues macOS Accès complet au disque / Automatisation dont le canal iMessage a besoin.
- Un compte Claude avec accès à Claude Code : Pro ($20/mois), Max (dès $100/mois), Team ($25/siège/mois), Enterprise, ou une clé API Console facturée au token. L'offre gratuite de claude.ai n'inclut pas Claude Code. Les channels ne sont pas disponibles sur Amazon Bedrock, Google Cloud Agent Platform ni Microsoft Foundry. Sur Team/Enterprise, un Owner doit d'abord activer les channels (claude.ai → Admin settings → Claude Code → Channels).
- Bun sur le Mac mini : "Each supported channel is a plugin that requires Bun" (chaque canal pris en charge est un plugin qui nécessite Bun), installé à l'Étape 1.
- Des identifiants de bot pour votre canal : un token de bot Telegram obtenu auprès de @BotFather, ou une application bot Discord avec le Message Content Intent activé et invitée sur un serveur que vous partagez avec elle. iMessage n'a pas besoin de token : la documentation exige macOS, l'Accès complet au disque, une autorisation Automatisation à la première réponse et "any device signed into your Apple ID" (n'importe quel appareil connecté à votre identifiant Apple) pour vous écrire à vous-même, garder l'utilisateur du Mac mini connecté avec Messages ouvert sur ce compte est notre déduction de ce mécanisme (voir Étape 3), et nous recommandons un identifiant Apple dédié avec authentification à deux facteurs plutôt que votre identifiant personnel.
- Des notions de base sur les commandes du terminal, tmux et l'édition de ~/.claude/settings.json.
3. Étape 1 : Connexion en SSH, installation de Claude Code et Bun
Connectez-vous en SSH à votre Mac mini avec les identifiants de votre tableau de bord MyRemoteMac, confirmez la version de macOS, puis installez Claude Code. L'installeur natif est la méthode recommandée par Anthropic : il n'a pas besoin de Node.js et se met à jour seul en arrière-plan. Homebrew et npm sont des alternatives documentées (le paquet npm installe le même binaire natif et exige Node.js 22+ ; ne le lancez jamais avec sudo).
Connexion en SSH et vérification des prérequis
# 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
Installation de Claude Code (installeur natif officiel)
Lancez l'installeur, puis vérifiez la version et laissez claude doctor exécuter ses diagnostics en lecture seule. Le cask Homebrew claude-code suit le canal stable (environ une semaine de retard, sans les régressions) et ne se met pas à jour tout seul ; claude-code@latest suit la dernière version.
# 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
Installation de Bun (requis par tous les plugins de canal)
Les plugins de canal officiels sont des scripts Bun. Le minimum de Bun lui-même est aussi macOS 13.0+. bun.com/install (documentation Bun) et bun.sh/install (README des plugins) sont tous deux officiels ; Homebrew fonctionne aussi. Les plugins n'indiquent aucune version minimale 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. Étape 2 : Authentification et choix d'un mode de permissions
Les channels exigent une authentification Anthropic : une connexion claude.ai (Pro, Max, Team, Enterprise) ou une clé API Console. Lancez claude une première fois et suivez la connexion dans le navigateur. Via SSH, le navigateur peut afficher un code à coller à l'invite "Paste code here if prompted" ; sur un Mac mini sans écran, vous pouvez aussi terminer la connexion dans la session VNC. Sur macOS, les identifiants vont dans le Trousseau ; si le Trousseau est verrouillé (cas typique via SSH), Claude Code se rabat sur ~/.claude/.credentials.json en mode 0600.
Connexion (abonnement ou clé API)
Pour une session permanente, la connexion par abonnement est le point faible : elle expire (au démarrage, Claude Code avertit "Your login expires in 3 days · run /login to renew", et une session sans surveillance "stops making progress once the credential expires", c'est-à-dire cesse d'avancer dès que l'identifiant expire). Deux remèdes documentés : générer un token OAuth valable un an avec claude setup-token (Pro/Max/Team/Enterprise ; il ne peut faire que des requêtes de modèle) et l'exporter là où tourne la session, ou utiliser une ANTHROPIC_API_KEY issue de la Console, facturée au 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)
Modèle et fournisseurs
La session utilise le modèle sélectionné par votre offre ; changez-le avec /model ou claude --model <alias> (alias tels que opus, sonnet, haiku) et le niveau d'effort avec /effort. Il n'existe aucune option de modèle local ni de fournisseur tiers pour Channels : les backends Bedrock, Vertex et Foundry sont exclus et le routage vers un endpoint non-Claude n'est pas une configuration prise en charge. Si vous voulez un LLM local sur le même Mac mini, traitez-le comme une charge de travail séparée, voir notre guide LLM local.
Choix d'un mode de permissions et épinglage du canal de release
Depuis Claude Code 2.1.283, le mode auto (un classifieur examine les actions) est le mode de départ intégré des sessions interactives. Pour une session de canal, nous recommandons de garder une validation humaine dans la boucle : en mode Manual (--permission-mode default), chaque demande Bash, Write ou Edit est relayée dans votre conversation allowlistée, où vous répondez yes <id> ou no <id>. En mode auto, c'est le classifieur qui décide et "no dialog would open for the remote side to answer" (aucun dialogue ne s'ouvrirait pour que le côté distant réponde). Comme la fonctionnalité est une research preview, épinglez aussi le canal de release stable et une version minimale dans ~/.claude/settings.json (réglages utilisateur, les modes auto et bypass définis dans le .claude/settings.json d'un projet sont ignorés) :
# ~/.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
Ne désactivez pas les permissions. L'avertissement de la documentation elle-même sur --dangerously-skip-permissions / bypassPermissions : "Only use this mode in isolated environments like containers, VMs, or dev containers without internet access, where Claude Code cannot damage your host system" (n'utilisez ce mode que dans des environnements isolés sans accès Internet, où Claude Code ne peut pas endommager votre système hôte), et il "offers no protection against prompt injection or unintended actions" (n'offre aucune protection contre l'injection de prompt ou les actions involontaires). Il est refusé en root/sudo sur macOS, les règles deny s'appliquent toujours, et les administrateurs peuvent le bloquer avec permissions.disableBypassPermissionsMode. Si un Mac mini dédié, isolé et entièrement de confiance doit tourner sans surveillance, le schéma documenté est claude -p "<prompt>" --dangerously-skip-permissions en tant qu'utilisateur non-root, une option clairement signalée comme risquée, jamais le choix par défaut. Le schéma sans surveillance le plus sûr est -p --permission-mode auto --permission-prompts none (2.1.259+), qui refuse tout ce qui déclencherait une demande au lieu de bloquer.
5. Étape 3 : Connexion de Telegram, Discord ou iMessage
La research preview fournit trois plugins de canal officiels, Telegram, Discord et iMessage, plus une démo sur localhost appelée fakechat, tous issus de la marketplace Anthropic claude-plugins-official (Apache-2.0). Chacun s'installe comme plugin dans Claude Code, se configure avec vos propres identifiants de bot et s'active dans une session avec le flag --channels. Deux règles s'appliquent à tous : vous devez quitter et redémarrer Claude Code avec --channels après avoir installé un plugin, et le bot ne peut répondre que tant que cette session tourne. Chaque plugin approuvé maintient une allowlist d'expéditeurs : "only IDs you've added can push messages, and everyone else is silently dropped" (seuls les identifiants que vous avez ajoutés peuvent envoyer des messages, tous les autres sont ignorés en silence).
Telegram (premier canal recommandé)
Créez le bot dans Telegram : ouvrez @BotFather, envoyez /newbot, donnez-lui un nom d'affichage et un nom d'utilisateur unique se terminant par bot, puis copiez le token. Ensuite, dans une session Claude Code sur le Mac mini, installez le plugin (choisissez la portée user quand on vous le demande), enregistrez le token, redémarrez avec le flag de canal, appairez-vous et verrouillez la politique. Le plugin fait du long polling sur l'API Bot, le Mac mini n'a donc besoin d'aucun port entrant.
# 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 (alternative)
Dans le Portail développeur Discord, créez une New Application, ouvrez Bot, cliquez sur Reset Token et copiez-le, activez Message Content Intent sous Privileged Gateway Intents, puis utilisez OAuth2 → URL Generator avec le scope bot et les permissions View Channels, Send Messages, Send Messages in Threads, Read Message History, Attach Files et Add Reactions pour l'inviter sur un serveur dont vous êtes membre, les DM ne fonctionnent que si vous partagez un serveur avec le bot. Les salons de serveur (guild) sont activés un par un, par identifiant de salon.
# 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 (macOS uniquement, l'avantage du Mac mini)
Pas de token de bot : le plugin lit directement ~/Library/Messages/chat.db et envoie les réponses via AppleScript. La première lecture déclenche une demande d'Accès complet au disque, la demande nomme l'app qui a lancé Bun (Terminal, iTerm, votre IDE), et la première réponse déclenche une demande d'Automatisation ("Terminal wants to control Messages"). Les deux sont des dialogues graphiques, faites-le donc via VNC ; sans Accès complet au disque, le serveur se termine avec "authorization denied". Ouvrez ensuite Messages sur n'importe quel appareil connecté à votre identifiant Apple et envoyez-vous un message : la conversation avec vous-même contourne le contrôle d'accès, les autres contacts doivent être ajoutés explicitement à l'allowlist. Le plugin interroge chat.db une fois par seconde, démarre à la dernière ligne (aucun rejeu après un redémarrage), ajoute "Sent by Claude" sauf si IMESSAGE_APPEND_SIGNATURE=false, et ignore les SMS/RCS par défaut parce que "SMS sender IDs are spoofable" (les identifiants d'expéditeur SMS sont falsifiables). Notre déduction de ce mécanisme, et non une phrase de la documentation : gardez l'utilisateur du Mac mini connecté avec Messages ouvert sur son compte.
# 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
Test à blanc optionnel : fakechat sur localhost
Pour tester le flux sans aucun service externe, la démo officielle fakechat sert une interface de chat sur http://localhost:8787 (accessible via un tunnel SSH ou via VNC). Elle n'a ni token ni contrôle d'accès, réservez-la donc aux tests. Si Claude Code demande une permission pour la première réponse, approuvez-la.
/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
Ce que vous verrez : le message entrant apparaît dans votre terminal, mais pas le texte de la réponse, le terminal affiche l'appel d'outil et une confirmation du type "sent", et la réponse apparaît dans l'application de messagerie. En mode -p (non interactif), les outils qui exigent une saisie dans le terminal, questions à choix multiples et validation du mode plan, sont désactivés pour que la session ne se bloque jamais ; dans la session tmux interactive recommandée par ce guide, le mode plan fonctionne (rétabli pour les sessions --channels en 2.1.126). Les dialogues de confiance du projet et de consentement MCP ne sont jamais relayés : faites d'abord confiance au dossier du projet et approuvez localement le serveur MCP du plugin.
6. Étape 4 : Maintien de la session 24h/24 et mise à jour
Anthropic ne prescrit aucun mécanisme de service : la documentation dit seulement de lancer Claude "in a background process or persistent terminal" (dans un processus d'arrière-plan ou un terminal persistant), et il n'existe aucune instruction launchd, systemd, screen ou nohup sur code.claude.com au 28 septembre 2026. Ce qui est documenté, c'est une page de configuration tmux, tmux est donc un hôte pris en charge. Dans cette section, tout ce qui dépasse les réglages tmux est notre recommandation pour un Mac mini MyRemoteMac, clairement signalée comme telle.
Lancer la session de canal dans tmux (notre recommandation)
Lancez la session interactive claude --channels dans une session tmux nommée via SSH et détachez-la. Vous pouvez vous y rattacher à tout moment pour répondre à une demande qui n'a pas été relayée, renouveler la connexion avec /login ou lire l'avis Channels affiché au démarrage. Ajoutez les trois réglages tmux documentés par Anthropic pour que les notifications atteignent le terminal extérieur et que Shift+Entrée fonctionne :
# 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
Superviseur optionnel : un LaunchAgent utilisateur (le nôtre, avec un avertissement)
Pour recréer la session tmux après un redémarrage ou un plantage, vous pouvez enregistrer un LaunchAgent utilisateur avec RunAtLoad et KeepAlive dont le programme est un petit script wrapper. Ce doit être un LaunchAgent, pas un LaunchDaemon : les autorisations iMessage (Accès complet au disque, Automatisation), Messages.app et la connexion au Trousseau appartiennent à la session de l'utilisateur connecté, ce qui, sur un Mac mini sans écran, signifie que l'ouverture de session automatique doit être activée (Réglages Système > Utilisateurs et groupes). Deux avertissements : on ignore si un processus Bun lancé ainsi reçoit sa propre autorisation d'Accès complet au disque sans dialogue graphique (non testé), et l'issue de régression ouverte #97701 (2026-09-27) signale qu'un démon --channels supervisé par launchd recrée des sessions toutes les ~2 minutes sur la 2.1.283, sans réponse des mainteneurs au moment où nous écrivons. Testez sur votre version cible et gardez le canal stable épinglé.
# 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
Garder le Mac mini éveillé et la session ouverte
Administration macOS générique, pas un point de la documentation Claude Code : désactivez la mise en veille pour que la session et le poller Messages ne s'interrompent jamais (lancez man pmset sur le Mac pour les détails), et activez l'ouverture de session automatique pour votre utilisateur afin que les LaunchAgents et Messages.app reviennent après un redémarrage.
# 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
Mise à jour de Claude Code, Bun et des plugins
L'installeur natif vérifie les mises à jour au démarrage et périodiquement, télécharge en arrière-plan et applique la nouvelle version au prochain lancement de Claude Code, une session tmux de longue durée garde donc sa version tant que vous ne la redémarrez pas. claude update l'applique immédiatement. Comme la syntaxe de --channels "may change based on feedback" (peut changer en fonction des retours), relisez la documentation des channels après chaque mise à jour et revérifiez l'avis Channels affiché au démarrage à la recherche d'une ligne d'avertissement.
# 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. Durcissement de la sécurité
Chaque message entrant atterrit dans une session qui a accès au système de fichiers, à git et au shell, et "anyone who can reply through the channel can approve or deny tool use in your session" (quiconque peut répondre via le canal peut approuver ou refuser l'usage des outils dans votre session). La documentation de référence est sans détour : "An ungated channel is a prompt injection vector." (un canal sans contrôle d'accès est un vecteur d'injection de prompt). Voici les contrôles documentés, plus nos recommandations là où la documentation reste muette :
-
Passez en allowlist immédiatement après l'appairage. Lancez
/telegram:access policy allowlist(ou l'équivalent Discord) dès que votre propre compte est appairé. Une fois la liste définitive, TELEGRAM_ACCESS_MODE=static / IMESSAGE_ACCESS_MODE=static désactivent complètement l'appairage à chaud. - N'allowlistez que des expéditeurs à qui vous confiez le pouvoir d'approbation. Les approbations relayées couvrent Bash, Write et Edit ; depuis la 2.1.211 le texte relayé est assaini et depuis la 2.1.234 les identifiants sont masqués en [REDACTED] et le relais ne va qu'aux serveurs enregistrés via --channels, mais la documentation dit toujours de traiter les champs relayés comme non fiables.
- Gardez les demandes de permission actives. Mode Manual plus relais, ou mode auto avec le classifieur, jamais bypassPermissions sur une machine qui contient du vrai code ou des identifiants. Les règles deny des réglages bloquent les commandes dans tous les modes.
- Activez le sandbox Bash (fonctionnalité officielle, notre recommandation est de l'activer) : sur macOS, il n'y a rien à installer, il utilise le framework Seatbelt intégré. Ajoutez des entrées sandbox.credentials pour ~/.ssh et ~/.aws, car la politique de lecture par défaut les autorise encore.
- Restreignez les fichiers de token (notre recommandation, la documentation n'indique aucun mode de fichier) : les commandes configure écrivent ~/.claude/channels/<telegram|discord>/.env ; les variables d'environnement TELEGRAM_BOT_TOKEN / DISCORD_BOT_TOKEN priment sur les fichiers. Ne les commitez jamais ; en cas de fuite, régénérez-les via BotFather ou le portail Discord.
- Surface de confidentialité iMessage : l'Accès complet au disque donne à l'app de terminal et à tout ce qu'elle lance un accès en lecture à l'intégralité de la base de données Messages, et l'autorisation Automatisation lui permet d'envoyer des iMessages en votre nom. Utilisez un identifiant Apple dédié avec 2FA sur le Mac mini dédié, et laissez IMESSAGE_ALLOW_SMS à sa valeur par défaut false.
- Aucun port entrant. Les plugins officiels interrogent Telegram ou se connectent en sortie à la gateway de Discord ; fakechat n'écoute que sur localhost. Si vous construisez un canal webhook personnalisé à partir de la documentation de référence (chargeable pendant la preview uniquement avec --dangerously-load-development-channels, que la documentation dit de ne jamais utiliser pour des sources non fiables), n'exposez son port que via le VPN WireGuard du 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. Résolution des problèmes courants
Le bot ne répond pas
La réponse officielle : "make sure Claude Code is running with --channels … The bot can only reply while the channel is active." (vérifiez que Claude Code tourne avec --channels ; le bot ne peut répondre que tant que le canal est actif). Une session SSH fermée, un plantage, un redémarrage ou une mise en veille met le bot hors ligne en silence. Depuis la 2.1.281, le nom du plugin installé doit aussi correspondre exactement à l'entrée --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" ou pas de commande /telegram:configure
Ajoutez d'abord la marketplace, choisissez la portée user à l'installation, et lancez /reload-plugins si le résumé d'installation le demande (ou redémarrez simplement) :
/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
Le canal se connecte mais aucun message n'arrive (organisation Team, Enterprise ou Console)
channelsEnabled est un réglage managé que les utilisateurs ne peuvent pas outrepasser. Sur claude.ai Team/Enterprise, il est bloqué par défaut tant qu'un Owner ne l'active pas ; les organisations Console qui déploient des réglages managés doivent aussi le définir. Le serveur MCP se connecte quand même et ses outils fonctionnent, seuls les messages entrants manquent, avec un avertissement au démarrage. Vérifiez l'avis de démarrage et demandez à votre 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
Le serveur iMessage se termine avec "authorization denied"
L'Accès complet au disque n'a pas été accordé à l'app qui a lancé Bun, ou Claude Code a été démarré depuis un autre lanceur (sshd, un serveur tmux démarré ailleurs, un LaunchAgent) que celui que vous avez approuvé. Accordez-le via VNC et relancez depuis le même endroit :
# 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 session s'arrête : "Login expired · Please run /login"
Une connexion par abonnement expire et une session sans surveillance cesse d'avancer. Rattachez-vous à tmux et renouvelez-la, ou faites passer la machine permanente à un token OAuth valable un an ou à une clé 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. Analyse des coûts vs VPS cloud
Claude Code Channels n'ajoute aucun coût propre, mais Claude Code lui-même exige une offre payante, la même quel que soit l'hôte. Ce qui change, c'est la machine. Un VPS Linux généraliste coûte moins cher par mois qu'un Mac mini, mais il ne peut pas faire tourner le canal iMessage, n'a pas Xcode et partage son matériel. Voici ce que coûte une configuration typique, en USD par mois :
| Cas d'usage | Accès Claude | Hôte VPS Linux | Hôte Mac mini (MyRemoteMac) | Ce que le Mac mini apporte |
|---|---|---|---|---|
| Développeur solo, Telegram ou Discord | Pro, $20/mois | ~$20–40/mois (hypothèse) | $85/mois (M4, 16 Go / 256 Go) | Matériel dédié 1:1, VNC, outils macOS |
| Développeur solo, iMessage | Pro, $20/mois | Impossible (macOS uniquement) | $85/mois (M4) | Le seul type d'hôte capable de le faire tourner |
| Usage intensif, plusieurs sessions, builds Xcode | Max, dès $100/mois | ~$40–80/mois (hypothèse) | $149/mois (M6) | Xcode, Simulator, builds Apple Silicon rapides |
| Bot d'équipe (un Owner active les channels) | Team, $25/siège/mois | ~$40–80/mois (hypothèse) | $149/mois (M6) | Une machine dédiée par équipe, réglages managés appliqués |
Hypothèses : les chiffres VPS sont nos fourchettes approximatives pour des instances Linux généralistes d'entrée de gamme (4–8 Go) et de milieu de gamme (16 Go), pas des devis d'un fournisseur précis. Les prix des offres Claude proviennent de claude.com/pricing au 28 septembre 2026 (Pro $20/mois ou $17/mois en facturation annuelle ; Max dès $100/mois ; Team $25/siège/mois en standard ou $20 en annuel, $125 en premium). La facturation par clé API Console est au token, tarifs publics first-party au moment où nous écrivons : Sonnet 5 $2/$10, Opus 5 $5/$25, Haiku 4.5 $1/$5 par million de tokens en entrée/sortie. Les abonnements sont plafonnés : un bot permanent partage le même quota que votre codage interactif. Anthropic ne publie aucune empreinte RAM ou CPU pour une session de canal, nous dimensionnons donc qualitativement : un Mac mini M4 avec 16 Go suffit largement pour une session Claude Code + plugin Bun ; choisissez le M6 (disponible depuis le 22 septembre 2026) si la même machine fait aussi tourner des builds lourds, plusieurs sessions ou un modèle local.
En résumé : Si vous n'avez besoin que de Telegram ou Discord et ne touchez jamais à macOS, un VPS Linux est l'hôte le moins cher. Le Mac mini justifie son prix quand l'agent doit avoir votre projet Xcode ouvert, quand vous voulez iMessage, ou quand vous voulez du matériel dédié non virtualisé avec VNC pour les dialogues macOS à valider une seule fois, dès $85/mois en plus de l'offre Claude que vous payez déjà.
10. Claude Code Channels vs OpenClaw
Ils résolvent des problèmes différents. Claude Code Channels est une fonctionnalité d'une CLI propriétaire, pas un assistant autonome : il relie Telegram, Discord ou iMessage à une session Claude Code déjà en cours, la valeur est donc "parler à l'agent de codage qui a votre dépôt ouvert", avec le support d'Anthropic, le modèle de permissions de Claude Code, des approbations yes/no relayées avec des prompts assainis, des allowlists d'expéditeurs, le sandbox Bash et les réglages managés d'organisation. Il est réservé à Claude via l'authentification Anthropic, n'a pas de démon propre, et les canaux personnalisés ne se chargent que derrière un flag de développement pendant la preview. OpenClaw (github.com/openclaw/openclaw, MIT, maintenu par la communauté, environ 391 000 étoiles GitHub contre 148 000 pour anthropics/claude-code au 28 septembre 2026) est une gateway open-source auto-hébergée qui tourne 24h/24 comme son propre service launchd supervisé, prend en charge bien plus de plateformes de messagerie (WhatsApp, Telegram, Discord, iMessage, Slack, Signal, Teams, Google Chat et plus) et vous laisse choisir le fournisseur de modèle, y compris des modèles locaux. Plusieurs articles secondaires ont présenté Channels comme une alternative à OpenClaw ; la documentation officielle ne fait aucune comparaison de ce genre.
Choisissez Channels si vous payez déjà Claude Pro, Max ou Team et voulez que vos vrais fichiers de projet soient accessibles depuis votre téléphone, avec un support officiel et des permissions relayées. Choisissez OpenClaw pour WhatsApp, Slack ou Signal, le choix du fournisseur, les modèles locaux ou un vrai fonctionnement en démon, voir notre guide OpenClaw sur Mac mini (et son cousin en Python, Hermes Agent). Les deux bridges iMessage exigent macOS avec Messages connecté et les mêmes autorisations TCC, et c'est exactement pour cela qu'un Mac mini dédié 1:1 convient aux deux.
11. FAQ
Claude Code Channels est-il gratuit ou open source ?
Non sur les deux points pour Claude Code lui-même : la CLI est propriétaire ("© Anthropic PBC. All rights reserved. Use is subject to Anthropic's Commercial Terms of Service.") et exige un compte Pro, Max, Team, Enterprise ou Console, l'offre gratuite de claude.ai n'inclut pas Claude Code. Seuls les plugins de canal du dépôt claude-plugins-official sont open source (Apache-2.0). Channels n'ajoute aucun frais au-delà de votre offre ou de votre consommation d'API.
Dois-je garder un terminal ouvert pour que le bot fonctionne ?
Oui, la session doit rester ouverte. Selon la documentation officielle, les événements n'arrivent que tant que la session Claude Code tourne avec --channels ; pour un fonctionnement permanent, lancez-la dans un processus d'arrière-plan ou un terminal persistant. Anthropic ne prescrit aucun mécanisme ; notre recommandation sur un Mac mini est une session tmux nommée à laquelle vous pouvez vous rattacher via SSH, supervisée en option par un LaunchAgent utilisateur (voir les réserves à l'Étape 4).
Puis-je utiliser un modèle local, Ollama, Bedrock ou Vertex avec Channels ?
Non. Les channels exigent une authentification Anthropic via claude.ai ou une clé API Console et ne sont pas disponibles sur Amazon Bedrock, Google Cloud Agent Platform ni Microsoft Foundry. Le routage vers un endpoint non-Claude n'est pas une configuration prise en charge. Vous pouvez toujours faire tourner un LLM local sur le même Mac mini comme charge de travail séparée, voir notre guide LLM local, mais pas comme cerveau d'une session de canal.
Quelle configuration de Mac mini choisir ?
Les exigences annoncées par Anthropic sont modestes (macOS 13+, 4 Go de RAM ou plus) et aucune empreinte par session n'est publiée, nous dimensionnons donc qualitativement : le Mac mini M4 avec 16 Go / 256 Go à $85/mois suffit largement pour une session Claude Code plus un plugin de canal Bun. Choisissez le Mac mini M6 dès $149/mois si la même machine doit aussi faire tourner des builds Xcode lourds, plusieurs sessions de canal ou un modèle local en parallèle.
Le canal iMessage fonctionne-t-il sur un Mac mini sans écran ?
Oui, avec deux étapes graphiques à faire une seule fois via VNC : accorder l'Accès complet au disque à l'app qui a lancé Bun, et cliquer sur OK dans la demande d'Automatisation ("Terminal wants to control Messages") à la première réponse. Le plugin lit le ~/Library/Messages/chat.db de l'utilisateur connecté et pilote Messages.app via AppleScript, donc, notre déduction de ce mécanisme, et non une phrase de la documentation, gardez l'utilisateur connecté avec Messages ouvert sur l'identifiant Apple, et activez l'ouverture de session automatique pour qu'il survive aux redémarrages. Utilisez un identifiant Apple dédié avec 2FA.
Et WhatsApp, Slack, Signal ou Teams ?
Ce ne sont pas des canaux officiels. La research preview fournit les plugins Telegram, Discord et iMessage plus la démo fakechat ; tout autre canal est un serveur MCP personnalisé qui, pendant la preview, ne se charge que derrière --dangerously-load-development-channels ou le réglage allowedChannelPlugins d'une organisation. Claude in Slack est une fonctionnalité différente qui lance des sessions cloud. Si l'étendue des plateformes est la priorité, OpenClaw est le meilleur choix.
12. Sources et lectures complémentaires
Chaque commande, chaque flag et chaque prérequis de ce guide a été vérifié le 28 septembre 2026 par rapport à la documentation officielle de Claude Code, au CHANGELOG (Claude Code 2.1.283, publié sur npm le 25 septembre 2026) et au dépôt claude-plugins-official (telegram 0.0.7, discord 0.0.4, imessage 0.1.0, fakechat 0.0.1). Channels est une research preview dont les flags peuvent changer, consultez ces pages pour l'état actuel :
- Documentation Claude Code : Channels (quickstart, Telegram / Discord / iMessage, contrôles entreprise)
- Documentation Claude Code : Référence Channels (contrat du protocole, relais des permissions, flag de développement)
- Documentation Claude Code : Installation de Claude Code (configuration requise, installeurs, canaux de release, mises à jour)
- Documentation Claude Code : Authentification (connexion, setup-token, stockage des identifiants, expiration)
- Documentation Claude Code : Modes de permissions (default, auto, avertissements bypassPermissions)
- Documentation Claude Code : Mode headless / -p (channels, --permission-prompts none, SIGTERM)
- Documentation Claude Code : Sandboxing (Seatbelt macOS, sandbox.credentials)
- Documentation Claude Code : Réglages (emplacement des fichiers et priorité)
- Documentation Claude Code : Configuration du terminal (réglages tmux officiels)
- Documentation Claude Code : Configuration du modèle (/model, alias, effort)
- Documentation Claude Code : Référence CLI des plugins (plugin update, marketplace update)
- Documentation Claude Code : Remote Control (une fonctionnalité différente, pour lever l'ambiguïté)
- Plugin de canal Telegram officiel (README)
- Plugin Telegram : ACCESS.md (dmPolicy, allowFrom, mode d'accès static)
- Plugin de canal Discord officiel (README)
- Plugin de canal iMessage officiel (README)
- Plugin iMessage : ACCESS.md (politique d'allowlist, SMS, signature)
- CHANGELOG de Claude Code (2.1.80 research preview --channels, 2.1.81 relais des permissions, 2.1.128, 2.1.211, 2.1.234, 2.1.281)
- Issue GitHub #97701 : sessions --channels recréées en boucle sous launchd sur la 2.1.283 (ouverte)
- Bun : installation (macOS 13.0+)
- claude.com/pricing : offres Pro, Max et Team (Claude Code inclus)
Guides associés
Installer OpenClaw sur Mac mini
L'alternative open-source et indépendante du fournisseur, avec plus de 20 plateformes de messagerie et son propre service gateway launchd.
Installer Hermes Agent sur Mac mini
L'agent open-source auto-améliorant de Nous Research : installation en une ligne, Telegram et Discord, launchd, Ollama local.
Développement Xcode à distance
Donnez à l'agent à qui vous écrivez depuis votre téléphone un vrai projet Xcode à compiler et tester sur le même Mac mini.
Louer un Mac mini M6
Le tout nouveau Mac mini d'Apple avec la puce M6 12 cœurs, dédié 1:1 dès $149/mois, pour plusieurs sessions ou des builds lourds.