몇 달 전에 텔레그램 봇을 하나 만들었음. 폰에서 텔레그램으로 메시지를 보내면, 집에 있는 맥에서 Claude가 돌아가면서 코딩, 커밋, 푸시, 파일 정리 같은 걸 대신 해주는 시스템.
카페에서 밥 먹다가 “블로그 새 글 써줘”라고 텔레그램에 치면, 집 맥에서 AI가 글을 작성하고 워드프레스에 올리고 SEO 설정까지 해줌. 커밋이 필요하면 “/커밋 blog 제목 수정”이라고 보내면 됨. 출퇴근길에도 사진 찍어서 보내면 태그별로 자동 분류해서 로컬에 저장해둠.
그런데 3월 20일, Anthropic이 Claude Code Channels라는 기능을 공식으로 냈음. 텔레그램에서 Claude Code 세션에 메시지를 보내고, Claude가 작업하고 답장하는 것. 컨셉이 거의 같음.
내 봇이 하는 일과 공식 Channels가 하는 일, 뭐가 같고 뭐가 다른지 비교해봤음.
내가 만든 텔레그램 봇
왜 만들었냐면, 단순함. 혼자 개발하면서 여러 프로젝트를 관리하는데, 매번 맥 앞에 앉아야만 작업할 수 있는 게 답답했음. 외출 중에 “아 그거 커밋 안 했다”, “블로그 글 하나 올려야 하는데” 같은 상황이 자주 생기는데, 그때마다 집에 가서 터미널 열고 하는 건 비효율적임.
그래서 텔레그램을 리모컨으로 쓰는 봇을 만든 것. TypeScript + Node.js로 만들었고, Polling 방식이라 서버 없이 맥에서 직접 돌림.
할 수 있는 것들:
1. AI PM한테 작업 지시 (/작업)
가장 핵심 기능임. 텔레그램에서 이렇게 보내면
/작업 블로그 새 글 써줘
이런 흐름으로 돌아감.
- 봇이 Claude CLI를 호출해서 PM 에이전트한테 작업을 넘김
- PM이 작업을 분석하고 실행 계획을 세움
- 계획을 텔레그램으로 보여주면서 “실행”과 “취소” 인라인 버튼을 띄움
- “실행” 누르면 진짜 작업 시작. 완료되면 결과를 텔레그램으로 보고
- 워크로그에 자동 기록 (PM이 누락하면 봇이 직접 폴백 기록)
계획을 먼저 보여주고 확인받는 2단계 구조가 핵심임. AI한테 “알아서 해”라고 맡기면 가끔 엉뚱한 방향으로 가는데, 계획을 먼저 보고 OK/취소를 선택할 수 있으니까 안전함. 취소 누르면 아무것도 안 건드림.
내부적으로는 다음 명령을 exec()으로 실행함.
claude -p '{프롬프트}' --output-format json --dangerously-skip-permissions
Claude Code의 PM 스킬이 작업을 분석하고, 필요하면 블로그/백엔드/프론트엔드 에이전트한테 분배하는 구조. 타임아웃은 5분.
2. Git 원격 조작 (/커밋, /푸시, /병합)
외출 중에 Git 작업이 필요할 때 씀.
/커밋 blog 오타 수정 → git add + commit
/푸시 blog → git push
/병합 blog feature/new-post → git merge
프로젝트 별칭도 지원함. tb는 telegram-bridge, sv는 secret-vault. 매번 긴 이름 안 쳐도 됨. 프로젝트 이름 안 쓰면 playbook이 기본값.
이건 Claude를 거치지 않고 직접 git 명령을 실행함. 단순한 작업에 Claude 5분 타임아웃을 기다릴 필요 없으니까, 30초 타임아웃으로 빠르게 처리.
3. 사진/파일 자동 수거 + 태그 분류
이건 Channels에는 없는 기능임. 폰에서 사진이나 파일을 텔레그램으로 보내면 맥의 로컬 폴더에 자동 저장됨. 해시태그로 분류도 됨.
#blog → ~/telegram/blog/
#밥로그 → ~/telegram/blog/bablog/
#office → ~/telegram/office/
#dev → ~/telegram/dev/
(태그 없음) → ~/telegram/general/
날짜별 하위 폴더로 정리되고, 캡션에 메모를 쓰면 같은 이름의 .txt 파일로 저장됨. 여러 장을 한번에 보내면 미디어 그룹을 인식해서 같은 태그를 공유함 (30초 캐시).
블로그 글 쓸 때 특히 유용함. 밖에서 맛집 사진 찍어서 이렇게 보내면
#밥로그 이수역 맛집, 된장찌개
, 나중에 블로그 에이전트가 이 사진을 가져다 글을 작성할 수 있음.
4. 보안
오너 Chat ID 기반 인증. 봇 토큰과 오너 ID를 credentials 파일에서 읽어오고, 작업 명령은 오너만 실행 가능. 다른 사람이 메시지를 보내면 조용히 무시됨.
모든 명령어는 한글이 기본임. /작업, /커밋, /푸시, /병합, /현황. 영문 별칭도 있긴 한데, 폰에서 한글이 더 빠름.
Claude Code Channels는 뭐가 다른지
3월 20일에 나온 Claude Code Channels(v2.1.80)은 Anthropic 공식 기능임. 컨셉은 비슷한데 접근 방식이 완전히 다름.
핵심 차이: 세션 주입 vs 독립 실행
내 봇은 Claude CLI를 독립적으로 호출하는 구조임. 봇이 돌아가고 있으면 Claude Code 세션이 떠 있을 필요 없음. 메시지가 오면 그때 claude -p 명령으로 새 세션을 만들어서 작업하고 끝냄.
Channels는 다름. 이미 실행 중인 Claude Code 세션에 메시지를 주입하는 방식임. 다음처럼 세션을 띄워놓으면
claude --channels plugin:telegram@claude-plugins-official
, 텔레그램에서 보낸 메시지가 <channel> 이벤트로 세션에 들어감. Claude가 기존 컨텍스트(열려 있는 파일, 이전 대화)를 유지한 채로 응답함.
이 차이가 꽤 큼.
| 내 텔레그램 봇 | Claude Code Channels | |
| 실행 구조 | 메시지마다 새 Claude 세션 | 기존 세션에 이벤트 주입 |
| 컨텍스트 유지 | 매번 리셋 (stateless) | 세션 컨텍스트 유지 |
| Claude Code 필요 | X (CLI만 호출) | O (세션이 떠 있어야 함) |
| 코드 작성 | 직접 만들어야 함 | 플러그인 설치만 |
| 지원 채널 | 텔레그램만 | 텔레그램 + 디스코드 + iMessage |
| 2단계 확인 | O (계획→승인→실행) | X (바로 실행) |
| Git 명령 | O (/커밋, /푸시, /병합) | 자연어로 요청 가능 |
| 사진/파일 수거 | O (태그 분류) | X |
| 워크로그 자동 기록 | O | X |
| 프로젝트 라우팅 | O (playbook, blog, tb 등) | 현재 작업 디렉토리 기준 |
| 권한 원격 승인 | X | O (permission relay) |
| 보안 방식 | 오너 Chat ID 고정 | 페어링 코드 + 허용목록 |
Channels가 더 나은 점:
컨텍스트 유지가 가장 큼. 내 봇은 매번 새 세션이라 이전 작업 맥락이 없음. “아까 그거 수정해줘”가 안 됨. Channels는 세션이 유지되니까 연속적인 대화가 가능함. 코드를 고치다가 외출해서 텔레그램으로 “아까 그 함수에 에러 핸들링 추가해줘”라고 하면, Claude가 아까 뭘 고쳤는지 기억하고 이어서 작업함.
권한 원격 승인(Permission Relay)도 강력함. Claude가 작업 중에 파일 수정이나 명령 실행 승인이 필요하면, 텔레그램으로 승인 요청을 보내줌. 폰에서 승인/거부를 누를 수 있음. 내 봇은 --dangerously-skip-permissions로 권한 체크를 전부 스킵하는데, 이건 편하지만 안전하지는 않음.
멀티 채널. 텔레그램뿐 아니라 디스코드, iMessage도 지원함. iMessage는 macOS 전용인데 별도 봇 토큰 없이 AppleScript로 동작함. 자기한테 문자 보내면 됨.
웹훅 수신도 가능함. CI/CD 파이프라인이나 에러 트래커에서 이벤트를 받아서 Claude 세션에 주입할 수 있음. 빌드 실패 알림이 오면 Claude가 바로 에러를 보고 수정을 시작하는 식.
내 봇이 더 나은 점:
독립 실행. Claude Code 세션이 안 떠 있어도 됨. npm start로 봇만 돌려놓으면 24시간 대기하다가, 메시지 오면 그때 Claude를 호출함. Channels는 세션이 꺼지면 메시지를 받을 수 없음.
2단계 확인 워크플로우. “실행 계획 보여주고 → 인라인 버튼으로 확인” 구조는 안전성 면에서 Channels보다 나음. Channels는 메시지가 들어오면 Claude가 바로 작업을 시작하는데, 내 봇은 반드시 사람이 한번 확인하고 승인해야 실행됨.
사진/파일 수거 + 태그 분류. Channels에는 이 기능이 없음. 텔레그램으로 사진 보내면 태그별로 자동 정리되는 건 내 봇만의 기능. 블로그 운영할 때 특히 유용함.
워크로그 자동 기록. 작업이 끝나면 다음 경로에 자동으로 기록됨
worklog/{프로젝트}/{날짜}.md
. PM이 누락하면 봇이 직접 폴백으로 기록함. 나중에 뭘 했는지 추적 가능.
프로젝트 라우팅. 여러 프로젝트를 별칭으로 관리함. /커밋 tb 메시지하면 telegram-bridge에, /푸시 blog하면 blog에. Channels는 현재 세션의 작업 디렉토리에 묶임.
같은 문제, 다른 접근
둘 다 “폰에서 AI한테 일을 시키고 싶다”는 같은 문제를 풀고 있음. 하지만 접근이 다름.
내 봇은 “Claude CLI를 원격 호출하는 리모컨”. 독립적이고, 커스텀이 자유롭고, 2단계 확인으로 안전하고, 사진 수거 같은 부가 기능도 붙어있음. 대신 매번 새 세션이라 맥락이 끊기고, 코드를 직접 만들어야 함.
다만 맥락이 끊기는 문제를 그냥 두지는 않았음. 워크로그 시스템이 이걸 보완함. 모든 작업이 끝나면 worklog/{프로젝트}/{날짜}.md에 자동으로 기록되니까, 다음 세션에서 PM이 워크로그를 읽고 이전에 뭘 했는지 파악할 수 있음. 프로젝트별 CLAUDE.md에도 규칙과 구조가 정리되어 있어서, 새 세션이어도 프로젝트 맥락은 유지됨. Git 히스토리까지 합치면 “어제 뭘 했고 오늘 뭘 해야 하는지”를 AI가 스스로 파악할 수 있는 구조. 세션 컨텍스트가 아니라 파일 시스템 자체를 기억 저장소로 쓰는 방식임. Channels의 세션 유지와는 접근이 다르지만, 실용적으로는 충분히 동작함.
Channels는 “실행 중인 Claude Code 세션의 확장”. 세션 컨텍스트가 유지되고, 권한 원격 승인이 되고, 디스코드/iMessage도 되고, 웹훅도 받을 수 있음. 대신 세션이 떠 있어야 하고, 플러그인 구조라 커스텀의 폭이 좁음.
개인적으로는 Channels를 쓰지 않고 기존 텔레그램 봇을 계속 쓸 생각임. 이유는 단순함. 커스텀이 자유로움.
2단계 확인 워크플로우, 사진 수거, 워크로그, 프로젝트 라우팅 같은 건 내 워크플로우에 맞게 직접 만든 기능이고, Channels 플러그인 구조 안에서는 이런 걸 구현하기 어려움. Channels는 공식 플러그인 설치하면 바로 되는 편의성이 강점인데, 반대로 플러그인이 제공하는 범위 안에서만 가능함.
내 봇은 코드 한 줄이면 기능을 추가하거나 바꿀 수 있음. PM 에이전트 연동, 에이전트 간 작업 분배, 워크로그 폴백 같은 건 전부 내 코드에서 자유롭게 붙인 것. 이런 수준의 커스텀은 공식 기능으로는 나오기 어려움.
결국 중간 브릿지를 직접 만들어서 쓰는 게, 공식 채널에 의존하는 것보다 유연함. 내 워크플로우가 바뀌면 봇도 바로 바꾸면 되니까. 공식 기능은 Anthropic의 업데이트를 기다려야 함.
한 가지 확실한 건, “폰에서 AI한테 일 시키기”가 더 이상 해커들의 장난감이 아니라는 것. Anthropic이 공식 기능으로 낸 건, 이 방식이 실제로 유용하다는 걸 검증해준 것. 직접 만들어서 쓰다 보면 공감이 됨. 한번 써보면 없이 못 삶.
이 텔레그램 봇 시스템의 구축 과정은 AI로 1인 개발팀 만들기 시리즈에서 다뤘음. Claude Code 자체가 궁금하면 Claude Code 사용법 가이드 참고.