
맥미니 한 대, 맥북 한 대. 각각에 AI 봇이 돌아간다.
둘 다 OpenClaw 위에서 돌아가는 Claude 기반 에이전트다. OpenClaw는 AI 에이전트를 위한 데몬(daemon)이다. 텔레그램, 슬랙 같은 메시징 채널과 연결되고, 크론 스케줄링, 메모리, 스킬 시스템을 제공한다. 쉽게 말하면 AI를 “항상 켜져 있는 동료”로 만들어주는 프레임워크다.
맥미니의 **로디(🦊)**는 24시간 상주하면서 15개 서비스를 PM2로 관리하고, Docker 컨테이너를 돌리고, ngrok 터널을 유지한다. 맥북의 **누비(🐕)**는 이동 중에 쓰는 가벼운 봇이다.
처음엔 각자 따로 썼다. 그러다 자연스러운 의문이 생겼다.
“얘네끼리 일을 나눌 수 있으면?”
OpenClaw — 봇이 사는 집
협업 이야기를 하기 전에, 봇이 돌아가는 환경을 먼저 설명해야 한다.
OpenClaw가 제공하는 것들:
- 항상 켜져 있는 게이트웨이 — 데몬으로 돌아가면서 메시지를 받고, heartbeat를 보내고, 크론잡을 실행한다
- 메모리 시스템 —
MEMORY.md(인덱스) +memory/YYYY-MM-DD.md(일별 로그) +memory/topics/(주제별). 세션이 죽어도 기억이 남는다 - 스킬 시스템 — SKILL.md + 스크립트로 구성된 플러그인. 블로그 발행, 문서 검색, 이미지 생성 같은 능력을 모듈로 관리한다
- 크론 스케줄링 — 정해진 시간에 봇이 알아서 작업을 실행한다
sessions_send/sessions_spawn— 다른 세션에 메시지를 보내거나, 서브 에이전트를 띄워서 독립된 작업을 맡기는 기능
이 인프라 위에서 로디와 누비가 각자의 성격과 역할을 갖고 살아간다.
로디의 성격 파일(SOUL.md)에는 이렇게 적혀 있다:
Be genuinely helpful, not performatively helpful. Skip the “Great question!” — just help.
같은 Claude 모델을 쓰지만, SOUL.md와 MEMORY.md가 다르면 완전히 다른 봇이 된다. 시간이 지날수록 각자의 전문성이 깊어진다. 메모리가 인격이다.
1차 시도: 메시지부터 보내보자
가장 먼저 시도한 건 OpenClaw의 sessions_send였다.
sessions_send → nubimon → "이거 확인해봐"안 됐다. sessions_send는 같은 게이트웨이 안에서만 동작한다. 로디는 맥미니, 누비는 맥북. 완전히 다른 인스턴스다.
실시간 양방향 통신을 만들 것인가, 아니면 우회할 것인가.
맥북은 외출할 때만 켜진다. 상시 연결이 보장 안 되는 환경에서 실시간 통신 인프라를 세우는 건 과잉 설계다.
비동기로 충분한 일은 비동기로 하자. 이게 결론이었다.
파일 기반 우편함

둘 다 iCloud에 접근할 수 있다. 옵시디언 볼트가 iCloud에 있으니까.
codemon/Bot/
├── rodimon/ ← 로디 수신함
├── nubimon/ ← 누비 수신함
└── _share/ ← 공용 자료
└── skills/ ← 공유 스킬로디가 누비한테 할 말이 있으면 Bot/nubimon/에 마크다운 파일을 만든다. 누비는 주기적으로 자기 수신함을 확인한다.
원시적이지만 동작했다. 그리고 의외로 이 방식이 가진 장점이 있었다.
- 메시지가 파일로 남는다. 대화 기록이 자동 보존됨
- iCloud 동기화라서 추가 인프라 비용 0원
- 옵시디언에서 모바일로도 확인 가능
단점은 명확했다. 실시간이 아니고, heartbeat 주기(30분)에 의존한다. 급한 건 결국 내가 텔레그램으로 직접 전달한다.
그래도 괜찮았다. 봇 간 통신의 80%는 급하지 않은 공지나 문서 공유다.
능력의 공유 — 스킬 시스템
써보니까 메시지 전달보다 더 중요한 게 있었다. 스킬 공유.
로디가 docsearch라는 스킬을 만들었다. 옵시디언 볼트에서 문서를 검색하는 Python 스크립트다. 누비도 쓰려면?
GitHub + 심볼릭 링크. 이게 답이었다.
git clone https://github.com/codemon-ai/clawd-skills.git ~/shared-skills
ln -sf ~/shared-skills/skills/docsearch ~/clawd/skills/docsearch로디가 스킬을 수정하고 push하면, 누비가 pull하는 순간 반영된다. 여기에 iCloud 경로도 이중으로 걸어둔다:
- Git: 버전 관리가 필요한 핵심 스킬
- iCloud: 빠르게 공유만 하면 되는 간단한 스킬
이중 경로. 한 쪽이 안 되면 다른 쪽이 있다. 중복은 비효율이 아니라 안전장치다.
회의록을 봇이 쓰는 세상

예상 못 한 활용이 하나 있었다. 회의록.
블루망고라는 태국 여행 예약 플랫폼 프로젝트를 하고 있다. PG 연동 회의가 있었는데, 슬랙으로 대화가 오가는 동안 로디가 자동으로 회의 내용을 정리했다.
로디는 슬랙 채널의 모든 메시지를 수신한다. OpenClaw의 슬랙 연동 덕분이다. requireMention: false로 설정하면 멘션 없이도 모든 메시지를 읽는다.
회의가 끝나면 참석자, 결정 사항, 액션 아이템이 정리된 마크다운 파일이 만들어져 있다. 사람이 회의하고, 봇이 기록한다.
이게 되니까 다음 회의에서 “저번에 뭘로 결정했지?”를 봇한테 물어볼 수 있다. 메모리 시스템 덕분에 맥락이 보존되니까.
블루망고 v2를 기획할 때는 한 걸음 더 나갔다. 로디가 기존 아키텍처를 분석하고, 누비에게 리서치를 맡기고, 둘이 각자 작성한 문서를 Bot/_share/docs/에 모아서 하나의 기획서로 합쳤다.
봇이 회의에 참석하고, 기록하고, 다음 회의를 준비하는 것. 생각보다 자연스럽게 일어났다.
로디가 서버를 살린 날

2월 13일 새벽, 게이트웨이가 죽어있었다. PM2 프로세스가 전부 내려가 있었다.
로디가 한 일:
- Docker 시작 — PostgreSQL, Redis, n8n 등 12개 컨테이너
- ecosystem.config.js 정리 — 26개 서비스 중 14개 활성화
- 포트 충돌 해결 — 머니몬(8000)과 집몬(8000) 충돌 → 집몬을 8010으로
- DB 인증 수정 — PostgreSQL user/password 불일치 3개 서비스 수정
- venv 재생성 — Python venv가 x86_64로 빌드되어 있어서 arm64로 재생성
- ngrok 정리 — 무료 엔드포인트 삭제, 커스텀 도메인 재설정
이 과정에서 로디는 동시에 Claude Code에게 minimon(TUI 대시보드) 개발을 위임하고 있었다. OpenClaw의 exec로 백그라운드에서 Claude Code를 돌리면서, 서비스 복구를 병렬로 진행한 거다.
한 봇이 서버 관리 + 개발 위임을 동시에 처리하는 건 혼자 하던 때와 질적으로 다른 경험이었다.
봇이 봇한테 일을 시키는 구조
OpenClaw에는 sessions_spawn이라는 기능이 있다. 서브 에이전트를 독립 세션으로 띄워서 작업을 맡기는 것이다.
리서치 위임, 코드 리뷰, 콘텐츠 초안 — 별도 세션에서 독립적으로 작업하고, 완료되면 메인 세션에 결과를 전달한다.
그리고 Claude Code 위임은 exec로 직접 CLI를 호출한다. Claude Code가 파일을 읽고 쓰고, git commit하고, npm build까지 한다. 로디는 진행 상황을 확인하면서 다른 일을 병렬로 처리한다.
위임의 레이어가 생긴다. 사람 → 로디(오케스트레이션) → Claude Code(코딩) / 서브 에이전트(리서치). 사람은 방향만 잡고, 실행은 봇들이 나눠서 한다.
매일 돌아가는 콘텐츠 파이프라인

지금 가장 잘 돌아가는 협업 사례는 콘텐츠 발행이다.
매일 3번 콘텐츠가 나간다:
- 08:00 — 경제 브리핑 블로그 → 08:30 인스타
- 12:00 — 코드몬 업데이트 인스타
- 20:00 — 인문학/역사 블로그 → 인스타
이 파이프라인에서 로디가 하는 일:
- 이미지 생성 — Gemini 3 Pro Image로 흑백 이미지 5장 (병렬 배치)
- 텍스트 오버레이 — Pillow로 폰트 합성
- CDN 업로드 — Vercel CDN에 이미지 push
- Graph API 발행 — Instagram 캐러셀 자동 발행
- 블로그 MDX 생성 — 같은 이미지로 블로그 포스트 작성
코드몬은 원고를 옵시디언에 쓴다. 로디가 이미지를 만들고, 텍스트를 입히고, 발행한다. “좋아, 올려”라고 하면 3분 안에 블로그 + 인스타 동시 발행이 끝난다.
이게 가능한 건 OpenClaw의 스킬 시스템 덕분이다. 각 스킬이 모듈로 분리되어 있어서 조합이 자유롭다.
내가 내린 판단들
돌아보면 중요했던 판단이 몇 개 있다.
“비동기로 충분한 일은 비동기로.” 실시간 인프라는 문제가 커지면 그때 세우면 된다.
“파일 > 프로토콜.” 마크다운 파일을 폴더에 넣는 방식. 디버깅이 쉽고, 사람도 읽을 수 있고, 도구 의존성이 없다.
“역할 분리.” 로디는 상주하는 서버 관리자 + 콘텐츠 편집장, 누비는 이동하는 리서처. 비대칭이 자연스럽다.
“메모리가 인격이다.” 같은 모델이지만 SOUL.md와 MEMORY.md가 다르면 완전히 다른 봇이 된다. 시간이 지날수록 각자의 전문성이 깊어진다.
아직 못 푼 것들
실시간 양방향은 여전히 없다. 급한 건 사람이 텔레그램으로 중계한다.
메모리 동기화. 로디가 알고 있는 걸 누비는 모른다. 공유 메모리 레이어가 필요하다.
크론잡의 실수. 바로 오늘, 인스타 크론잡이 확정된 이미지가 아닌 다른 버전을 발행했다. 확정 이미지를 안전한 곳에 보관하도록 개선했다. 실수에서 시스템이 나아지는 과정이다.
마무리
완벽한 멀티 에이전트 시스템을 만든 게 아니다. iCloud 폴더에 파일 넣고, GitHub으로 스크립트 공유하고, 가끔 사람이 중계하는 소박한 구조다.
하지만 이게 돌아간다. 매일 쓰고 있다. 그리고 매주 조금씩 나아진다.
기술 선택에서 중요한 건 “최적”이 아니라 **“지금 동작하면서 내일 개선할 수 있는가”**다.
기술 스택
- AI 프레임워크: OpenClaw
- 통신: iCloud 공유 폴더, GitHub
- 서버: Mac mini M1 (PM2 + Docker + ngrok)
- 모바일: MacBook Air M2
- 콘텐츠: Gemini 3 Pro Image + Pillow + Instagram Graph API
이 글에 나온 구조는 정답이 아니다. 맥 2대와 iCloud라는 내 환경에 맞춘 해결책이다. 원리는 빌려가되, 구현은 자기 환경에 맞게.