AI 동료를 ‘상주’시키는 데스크톱: nightly-labs/openbot 심층 분석 — 13개 provider 런타임, SQLite 이벤트 로그, 3단계 권한 모델과 v0.52.1 박스 스모크 테스트

한 줄 요약: nightly-labs/openbot은 Codex·Claude Code·Grok CLI 같은 기존 에이전트 CLI를 새로 만들지 않고, 그 위에 “상주하는 AI 동료”라는 운영 계층을 얹는 Electron 데스크톱입니다. 에이전트마다 작업 폴더·provider 세션·FIFO 큐를 따로 주고, 에이전트끼리 메시지와 파일을 주고받게 하며, 모든 상태를 하나의 SQLite 이벤트 로그로 관리합니다. 오늘(2026-10-28) GitHub Trending 전체 3위(+777 stars today), TypeScript 1위입니다. 다만 라이선스가 PolyForm Noncommercial 1.0.0(소스 공개형, OSI 오픈소스 아님)이고 에이전트 기본 권한이 Full access라는 두 가지는 도입 전에 꼭 짚어야 합니다.

OpenBot의 뼈대: Electron main 하나가 FIFO 큐·드레인 스케줄러·AttentionRegistry를 쥐고 Codex(App Server, stdio JSONL)·Claude(Agent SDK)·Grok·ACP 계열(OpenCode·Gemini·Cursor·Cline)·Pi 계열·Muse CLI를 자식 프로세스로 거느린다
OpenBot의 뼈대: Electron main 하나가 FIFO 큐·드레인 스케줄러·AttentionRegistry를 쥐고 Codex(App Server, stdio JSONL)·Claude(Agent SDK)·Grok·ACP 계열(OpenCode·Gemini·Cursor·Cline)·Pi 계열·Muse CLI를 자식 프로세스로 거느린다

1. 지금 어떤 상태의 프로젝트인가

2026-08-13(KST) 첫 릴리스 v0.1.1 이후 약 2.5개월 만에 v0.52.1까지 100개가 넘는 태그를 찍었습니다. 10월 25일 v0.50.0 → 26일 v0.51.0/0.51.1 → 27일 v0.52.0 → 28일 03:06(KST) v0.52.1로, 하루에 한두 번 릴리스되는 속도입니다. SECURITY.md도 스스로를 “development preview”로 규정하고 이전 릴리스 백포트를 보장하지 않습니다. 운영 관점에서는 “안정 버전 고정”보다 “최신 추종”을 전제로 설계된 프로젝트라는 뜻입니다.

항목 값 (2026-10-28 16:50 KST 기준 확인) 비고
저장소 nightly-labs/openbot 저작권자 Synthetify Labs sp. z o.o. (폴란드)
Stars / Forks 2,717 / 276 (GitHub API) 트렌딩 페이지 표기 2,713, 오늘 +777
Trending 순위 전체 3위 · TypeScript 1위 (daily) 1·2위는 디자인 스킬 계열 저장소
최신 버전 v0.52.1 (2026-10-28 03:06 KST) package.json version 0.52.1
라이선스 PolyForm Noncommercial 1.0.0 v0.1.11 이하만 Apache-2.0으로 남아 있음
규모 추적 파일 6,403개 · TS/TSX 5,279개 src·apps·packages TS 합계 약 74만 줄(테스트 포함)
기여자 / 열린 이슈 37명 / 243개 외부 기여는 CLA로 저작권 양도 필요
지원 플랫폼 macOS 13+(Apple silicon·Intel), Windows 10+ x64, Linux x64·arm64 AppImage 헤드리스 서버용 install-server.sh, Docker, Nix flake

2. 무엇을 해결하려는가: “세션”이 아니라 “동료”

Claude Code나 Codex CLI는 기본적으로 터미널 하나 = 세션 하나입니다. 오래 일을 맡기면 금방 세 가지 문제가 생깁니다. ① 컨텍스트 창이 차서 세션을 갈아엎어야 하고, ② 여러 에이전트에게 일을 나누면 결과물 전달을 사람이 손으로 해야 하며, ③ 다른 provider로 갈아타면 대화 이력이 끊깁니다. OpenBot의 답은 에이전트를 이름·지침·아바타·메모리·스킬·루틴을 가진 영속 객체로 만들고, 실제 추론은 각 벤더 CLI에 위임하는 것입니다.

  • 영속 에이전트: 에이전트마다 ~/OpenBot/Agents/<agent> 작업 폴더와 독립 provider 세션. 모델·추론 강도·프로필·알림·브라우저 상태도 에이전트 단위.
  • 큐: 메시지는 FIFO 큐에 쌓이고 일시정지/재개/취소, 크래시 후에도 유지(crash-safe persistence).
  • 협업: 에이전트 간 메시지·답장·리액션·이미지·관리형 파일 전송, 그리고 여러 에이전트가 참여하는 “채널”.
  • 도구: 에이전트가 직접 여닫고 조작하는 임베디드 브라우저, 동봉된 cua-driver를 통한 Computer Use(macOS·Windows·Linux).
  • 원격: 데스크톱을 “서버로 게시”하면 팀원·iPhone 앱·브라우저 클라이언트(openbot.run/app)가 WebRTC로 붙습니다.

3. 아키텍처: Electron main이 CLI들을 거느리는 구조

README의 아키텍처 블록을 그대로 옮기면 다음과 같습니다. 핵심은 모델 호출을 직접 하지 않는다는 점입니다. Codex는 로컬 Codex App Server를 stdio JSONL로, Claude는 Claude Agent SDK 세션을 stream JSON으로 붙이고, OpenCode·Gemini(Antigravity ACP 서버)·Cursor(cursor-agent acp)·Cline(cline --acp)·사용자 정의 에이전트는 ACP(Agent Client Protocol)로 통일합니다.

Electron main
├── local Codex App Server process over stdio JSONL
├── local Claude Agent SDK session over stream JSON
├── SQLite command log and read projections
├── secure typed IPC handlers
└── sandboxed WebContentsView browser host
    ↕ typed preload bridge
SolidJS renderer
Cloudflare Workers
└── TanStack Start + Solid 2 account API
    ├── D1 accounts, email challenges, hashed sessions, and team tunnels
    └── R2 account avatars
디렉터리 책임 읽을 때 포인트
src/main Electron 생명주기, 창 보안, 로컬 프로토콜, IPC 등록, 로컬 자동화 서버 automation-server.ts(루프백 HTTP), acp-registry*.ts
src/backend provider 어댑터, 영속화, 메시지 스케줄링, 전송, 브라우저 호스트 agent/drain-scheduler.ts, agent/workspace-sandbox.ts, process-confinement.ts
src/preload 타입이 지정된 window.openbot API만 노출 verify:preload가 IPC_ENDPOINTS 밖 메서드 노출을 막음
src/renderer SolidJS UI Kobalte·Lucide는 @openbot/ui에만 허용(check:ui)
packages/contracts 프로세스 경계 계약·공유 한도·순수 검증 DEFAULT_AGENT_ACCESS 같은 기본값이 여기 있음
apps/auth-api Cloudflare Workers + D1 계정 API, 공개 사이트 일회용 이메일 코드는 해시로만 저장, 10분 만료
apps/{slack,discord,telegram}-app, apps/mobile 메시징 연동, Expo 기반 모바일 앱 모바일도 같은 WebRTC 전송을 숨은 DOM 컴포넌트로 사용

provider 목록은 생각보다 넓습니다. 박스에서 앱을 띄웠을 때 런타임이 점검한 provider는 codex, claude, grok, opencode, antigravity(Gemini), cursor, cline, acp, pi, inception, deepseek, openrouter, muse 13종이었습니다(로그 기준). inception·deepseek·openrouter는 “Pi CLI가 설치되지 않았다”는 메시지로 실패해, Pi 런타임을 경유하는 구조임을 알 수 있습니다. 또 Ollama·LM Studio 같은 로컬 OpenAI 호환 서버 자동 감지와 커스텀 엔드포인트도 지원합니다.

도구 카탈로그와 컨텍스트 예산

agent/tool-catalog.ts는 모든 어댑터에 직접 도구 11개 + 탐색 도구 3개를 줍니다. 직접 도구는 ask_user, attach_files_to_response, list_agents, send_message, search_memories, remember, forget_memory, react_to_user_message, request_api_key, routine_no_update, routine_report_failure이고, 나머지 수많은 내장 도구는 tool_search → tool_describe → tool_call로 필요할 때만 스키마를 불러옵니다. MCP의 “도구 수십 개를 매 턴 통째로 싣는” 비용 문제를 정면으로 다룬 설계입니다. 흥미로운 디테일은 강한 매칭(정확한 이름 등) 최대 3개는 검색 결과에 원본 스키마를 바로 넣어 “describe 한 단계”를 생략한다는 점입니다. 문서는 “모델 스텝마다 전체 컨텍스트가 다시 전송되므로 스텝 하나를 줄이는 게 스키마 추가 비용보다 싸다”고 근거를 밝힙니다.

이 예산은 CI로 강제됩니다. bun run check:agent-context가 지침·노출 도구·카탈로그·가이던스 바이트 수를 측정해 늘어나면 실패시킵니다. 박스에서 돌린 실측값은 아래와 같습니다.

측정 항목 (check:agent-context, v0.52.1) 바이트 의미
instructions.claude 14,041 Claude용 상시 개발자 지침
instructions.codex 13,939 Codex용 상시 개발자 지침
visible-tools 12,955 매 턴 노출되는 도구 정의
catalog.schemas 75,869 지연 로드되는 전체 스키마(매 턴 X)
catalog.descriptions 36,106 검색 결과용 짧은 설명
guidance 21,066 브라우저·관리·루틴 등 상세 가이던스(필요 시 로드)

즉 상시 부담은 지침 약 14KB + 도구 약 13KB 수준이고, 75KB짜리 스키마 묶음은 필요할 때만 들어옵니다. 작은 컨텍스트 로컬 모델을 붙일 계획이라면 이 27KB 안팎이 “사용자 메시지 전에 깎이는 몫”이라는 점을 기억해 두면 좋습니다.

4. 상태 관리: 하나의 SQLite 이벤트 로그 + 프로젝션

상태 관리: openbot.db의 orchestration_events와 command_receipts가 projection 읽기 모델로 투영된다(박스 실측 테이블 76개·마이그레이션 40개). 채널은 모델 없는 결정 규칙을 먼저 쓰고, provider 교체 시 최대 32,000자 발췌 패킷을 넘긴다
상태 관리: openbot.db의 orchestration_events와 command_receipts가 projection 읽기 모델로 투영된다(박스 실측 테이블 76개·마이그레이션 40개). 채널은 모델 없는 결정 규칙을 먼저 쓰고, provider 교체 시 최대 32,000자 발췌 패킷을 넘긴다

OpenBot의 진짜 설계 포인트는 UI가 아니라 상태 소유권입니다. userData/openbot.db가 에이전트·대화·큐·리액션·첨부·provider 세션 바인딩의 유일한 진실 원천이고, 명령은 orchestration_events와 orchestration_command_receipts에 기록된 뒤 projection_* 읽기 모델로 투영됩니다. 박스에서 첫 실행 직후 DB를 열어 보니 테이블 76개, 적용된 마이그레이션 40개였고, 메모리 검색은 agent_memory_search_* 계열의 FTS5 가상 테이블로 구현돼 있었습니다.

  • provider 소유 상태와 분리: ~/.codex, ~/.claude, ~/.grok, ~/.gemini, ~/.cursor, ~/.cline 등은 각 CLI가 관리하는 로그인·재개 상태일 뿐, OpenBot 대화 저장소가 아닙니다. 그래서 provider를 바꿔도 OpenBot 쪽 대화는 하나로 유지됩니다.
  • provider 교체 핸드오프: 새 provider 세션에는 최대 32,000자의 패킷을 넘깁니다(최근 메시지 24,000 · 과거 발췌 4,000 · 작업 단계 2,000 · 지침/참조 2,000). 문서가 명시하듯 “의미 요약이 아니라 발췌”이고 모델 호출이 없습니다. 생략된 텍스트는 별도 지연 도구로 다시 가져옵니다.
  • 에이전트 공용 DB: ~/OpenBot/Shared/Data/agent-data.db에 에이전트들이 스스로 테이블을 만들고 서로 JOIN할 수 있습니다. 모든 에이전트가 모든 테이블을 읽고 쓰되, DROP/ALTER는 만든 에이전트만 가능하며 이 규칙은 SQL 문자열 파싱이 아니라 SQLite authorizer로 강제됩니다.
  • 첨부 무결성: 전송마다 .openbot-transfer.json 매니페스트(소유자·수신자·크기·SHA-256)를 두고, 생성된 첨부는 대화·메일박스 커밋이 성공한 뒤에만 보이며, 파일 삭제는 outbox로 재시도합니다.
저장 위치 내용 운영 시 주의
~/OpenBot/Agents/ 에이전트별 작업 폴더 에이전트 삭제 시 작업 폴더도 삭제됨
~/OpenBot/Shared, /Transfers 공유 파일, 관리형 전송 스냅샷 Workspace only 에이전트도 쓰기 가능한 루트
userData/openbot.db (+WAL) 이벤트 로그와 프로젝션 백업 대상 1순위. 다운그레이드 호환은 보장 안 됨
browser-tabs.json 임베디드 브라우저 탭 상태 마이그레이션 러너 밖, 읽을 때마다 재검증
provider-runtimes/ OpenBot이 내려받아 고정한 provider CLI 시작 시·매시간 업스트림 최신 릴리스 확인
Cloudflare D1/R2 계정, 멤버십, 초대, 논리 세션, 아바타 채팅·파일·명령은 실리지 않는다고 명시

채널: 누가 일을 맡을지 정하는 규칙

여러 에이전트가 있는 채널에서 가장 어려운 문제는 “이 메시지를 누가 처리하나”입니다. ChannelService는 먼저 모델 없이 결정 가능한 경우를 처리합니다: 지정 수신자 → 답장이 달린 작업 → 작업 없는 멤버 메시지에 대한 답장 → 유일한 열린 작업의 명확한 후속 → 멤버가 하나뿐인 채널. 그 외에는 리드 에이전트의 provider·모델로 작업 도구가 없는 별도 세션을 열어, 전체 대화 대신 채널 요약과 허용된 결과 스키마만 주고 라우팅을 맡깁니다. 잘못되거나 오래된 라우팅이 브로드캐스트로 번지지 않게 막고, 자동 배정은 루트 요청당 8개, 채널당 동시 활성 배정은 2개(CHANNEL_PARALLEL_LIMIT)로 제한합니다. 또 채널 설정 변경 도구는 루트 요청 작성자가 사람일 때만 동작해, 루틴 실행이나 에이전트가 쓴 요청(신뢰할 수 없는 입력)이 채널 구성을 바꾸지 못하게 했습니다. 에이전트 간 프롬프트 인젝션 전파를 구조적으로 끊는 좋은 예입니다.

5. 권한 모델: 3단계, 그러나 기본값은 Full access

3단계 권한 모델: 기본값은 Full access(DEFAULT_AGENT_ACCESS = full). Workspace only는 Codex·Claude는 자체 샌드박스, Grok·OpenCode·Cursor·Cline·Gemini는 OS 샌드박스 프로세스로 집행되며 후자는 현재 macOS에서만 시작된다
3단계 권한 모델: 기본값은 Full access(DEFAULT_AGENT_ACCESS = full). Workspace only는 Codex·Claude는 자체 샌드박스, Grok·OpenCode·Cursor·Cline·Gemini는 OS 샌드박스 프로세스로 집행되며 후자는 현재 macOS에서만 시작된다

README 최상단 경고문은 “에이전트가 danger-full-access와 approvalPolicy: never로 실행된다”고 말합니다. 코드를 보면 현재는 조금 더 세분화돼 있습니다. 에이전트 접근 수준은 Workspace only / Ask first / Full access 세 단계이고, packages/contracts/src/ipc-agents.ts의 DEFAULT_AGENT_ACCESS는 "full"입니다. “Ask first”는 access=full에 자동 승인(autoApprove)만 끈 상태로, Codex에는 approvalPolicy: "on-request"를 유지합니다(문서 설명: never로 두면 MCP 도구 호출과 elicitation이 거부되기 때문). 결국 README 경고문과 실제 기본 동작(Full access + 자동 승인)이 같은 방향이라는 점이 중요합니다.

Provider Workspace only 집행 방식 Linux에서
Codex Codex 자체 workspace-write 샌드박스(쓰기 루트: 작업 폴더, Shared, /tmp·$TMPDIR) 동작
Claude workspaceOnly 플래그 → Bash는 Claude 샌드박스, 루트 밖 파일 편집은 확인 요청 동작
Grok · OpenCode · Antigravity(Gemini) · Cursor · Cline 세션 단위 샌드박스가 없어 provider 프로세스를 따로 띄우고 OS 샌드박스로 통째로 가둠(process-confinement.ts) 프로세스가 시작되지 않음 → Full access를 골라야 함 (현재 macOS만 지원)

실무적으로 해석하면, Linux에서 Grok·OpenCode·Cursor·Cline 에이전트는 사실상 Full access로만 돌릴 수 있습니다. 그리고 Workspace only라도 “읽기와 네트워크는 열려 있다”고 코드 주석이 명시합니다. 쓰기만 막는 모델이므로 홈 디렉터리의 비밀 파일 열람·외부 전송 위험은 남습니다.

반대로 OpenBot이 “지켜야 할 경계”로 선언한 것도 분명합니다(SECURITY.md): 원격 페이지가 Node.js·preload 브리지·관리형 첨부·특권 IPC에 닿지 못할 것, IPC는 신뢰된 렌더러에서만 받을 것, 첨부 ID가 정규 저장 루트를 벗어나지 못할 것, Codex·Claude 자격증명을 OpenBot 저장소로 복사하지 않을 것, 진단 데이터에 토큰·원시 stderr를 남기지 않을 것, 브라우저 탭은 소유 에이전트/스레드에 묶일 것. 즉 위협 모델은 “에이전트는 믿는다, 웹과 원격 클라이언트는 믿지 않는다”입니다.

위험 시나리오 OpenBot 기본 상태 권장 완화책
에이전트가 브라우저에서 읽은 페이지의 프롬프트 인젝션 Full access + 자동 승인이면 셸·파일·네트워크까지 그대로 도달 민감 작업 에이전트는 Ask first, 브라우징 담당 에이전트는 별도 OS 계정/VM
Linux에서 Workspace only가 필요한 경우 Grok·OpenCode·Cursor·Cline은 시작 불가 Codex/Claude 에이전트로 한정하거나 Docker 서버 모드(seccomp 프로필) 사용
로컬 스크립트 API(openbot-cli) 에이전트별 allowAutomation 켤 때만 127.0.0.1에 바인딩, 토큰 파일 0600, Origin/Host 헤더 있으면 거부 필요한 에이전트만 켜고, 같은 사용자 계정의 다른 프로세스도 토큰을 읽을 수 있음을 전제
Linux AppImage 샌드박스 Ubuntu 23.10+/Debian 13은 AppArmor 프로필 필요 제공 프로필 설치. --no-sandbox는 쓰지 말라고 README가 명시
제품 분석(OpenPanel) 프로덕션 빌드는 기본 활성(설정이 없으면 enabled), 메시지·경로·명령은 미포함 앱의 분석 설정에서 opt-out. 결제/호스팅 이벤트는 서버가 보내 데스크톱 설정과 무관

6. 설치·실행·평가: 실제 명령

릴리스 바이너리 (권장)

# Linux x64 — 체크섬부터 확인
V=0.52.1; B=https://github.com/nightly-labs/openbot/releases/download/v$V
curl -LO $B/OpenBot-$V-x86_64.AppImage
curl -LO $B/SHA256SUMS-linux.txt
sha256sum -c SHA256SUMS-linux.txt
chmod +x OpenBot-$V-x86_64.AppImage

# Ubuntu 23.10+ / Debian 13: unprivileged userns 제한 해제용 AppArmor 프로필
./OpenBot-$V-x86_64.AppImage --appimage-extract resources/linux/openbot.apparmor
sudo install -m 0644 squashfs-root/resources/linux/openbot.apparmor /etc/apparmor.d/openbot
sudo systemctl reload apparmor
./OpenBot-$V-x86_64.AppImage

헤드리스 서버 / Docker

# 상시 서버 (Ubuntu 24.04/26.04 + systemd) — 스크립트 내용을 먼저 읽고 실행할 것
curl -fsSL https://raw.githubusercontent.com/nightly-labs/openbot/main/scripts/install-server.sh -o install-server.sh
less install-server.sh && sudo bash install-server.sh
sudo openbot login

# Docker: Electron 샌드박스를 켠 채로 돌리기 위한 seccomp 프로필 동반
curl -fsSLO https://raw.githubusercontent.com/nightly-labs/openbot/main/docker/seccomp.json
docker run -d --name openbot --restart unless-stopped \
  --security-opt seccomp=seccomp.json --security-opt no-new-privileges:true \
  --shm-size 1g --stop-timeout 60 -v openbot-data:/data \
  ghcr.io/nightly-labs/openbot:latest
docker exec -it openbot openbot login

소스에서 개발·검증

git clone https://github.com/nightly-labs/openbot.git && cd openbot
curl -fsSL https://bun.com/install | bash -s "bun-v1.4.2"   # Bun 정확한 버전 고정
nvm use                                                      # Node 24 (.nvmrc)
bun install --frozen-lockfile
bun run codex:doctor        # 모델 턴 없이 Codex CLI·App Server 핸드셰이크·로그인 점검
bun run dev                 # Auth API + Signal + Electron (워크트리별 프로필·포트 자동 할당)

# 오프라인 e2e (가짜 ACP 에이전트/가짜 서버, 과금 없음)
bun run test:custom-agents
bun run test:acp-directories
bun run test:provider-detection
bun run test:ui-blocks
bun run check:agent-context
bun run check               # Biome + 타입체크 + 오프라인 테스트 + 브라우저 스모크 + 프로덕션 빌드

스크립트에서 에이전트를 부르려면 에이전트 설정에서 Local scripts를 켠 뒤 번들된 CLI를 씁니다. 종료 코드가 잘 정의돼 있어 CI·cron에 붙이기 좋습니다(0 완료, 1 턴 실패/거부, 2 잘못된 명령줄, 3 사람 응답 대기, 4 타임아웃(작업은 계속), 5 OpenBot 미실행/에이전트 없음).

openbot-cli list --json
openbot-cli run reviewer "어제 머지된 PR 요약해서 Shared에 저장" --wait --timeout 30m --json
echo "로그 분석" | openbot-cli run ops - --wait --id nightly-2026-10-28

7. 박스 스모크 테스트: 키·로그인 없이 확인한 것

박스 스모크 테스트(v0.52.1): AppImage SHA256 OK, Xvfb 헤드리스 실행으로 언어 선택 온보딩 화면 확인, provider 13종 점검, 오프라인 e2e 4종 passed. dbus가 없어 계정 세션 저장(secure storage)은 불가했다
박스 스모크 테스트(v0.52.1): AppImage SHA256 OK, Xvfb 헤드리스 실행으로 언어 선택 온보딩 화면 확인, provider 13종 점검, 오프라인 e2e 4종 passed. dbus가 없어 계정 세션 저장(secure storage)은 불가했다

MoricWorld 작업 박스(Linux x64, 8코어, Bun 1.4.2, Node 20 — 요구 버전 24보다 낮음)에서 v0.52.1을 두 경로로 확인했습니다. provider 로그인은 하지 않았으므로 실제 모델 턴은 돌리지 않았습니다.

단계 명령 관찰 결과
무결성 sha256sum -c SHA256SUMS-linux.txt OpenBot-0.52.1-x86_64.AppImage: OK (297MB)
패키지 내부 --appimage-extract 압축 해제 917MB. resources/에 cli/openbot-cli.mjs, cua-driver/linux/x64(wayland-helper 포함), AppArmor 프로필, 관리형 스킬 3종(openbot-data, site-hosting, skill-creator)
CLI node openbot-cli.mjs list --json {"ok":false,"exitCode":5,...} — 앱 미실행 시 문서대로 종료 코드 5
헤드리스 실행 xvfb-run, 임시 HOME·--user-data-dir Electron 샌드박스 정상 기동, 언어 선택 온보딩 화면 표시. provider 13종 점검 후 전부 “not downloaded/not installed”
로컬 DB sqlite로 openbot.db 조회 테이블 76개, schema_migrations 40행, FTS5 메모리 인덱스
경고 실행 로그 dbus 없음 → “secure storage is unavailable”로 계정 세션 미저장, openbot:// 스킴 등록 실패, 일부 IPC가 로그인 전 401
소스 의존성 bun install --frozen-lockfile 5.6초(캐시 상태), Electron 44.9.3 설치, postinstall이 .githooks를 git hooks로 활성화
오프라인 e2e test:custom-agents 외 3종 4종 모두 passed (0.3~0.9초). 시크릿이 디스크·요약에 남지 않음, 크래시 메시지 토큰 마스킹, 재시작 후 세션 재개, 키가 다른 origin으로 새지 않음 등을 검증

관찰에서 나온 실무 팁 세 가지입니다. 첫째, 데스크톱 AppImage는 libsecret/dbus 같은 데스크톱 세션 서비스를 전제로 하므로 서버라면 install-server.sh나 Docker 경로가 맞습니다. 둘째, bun install의 postinstall이 저장소의 .githooks를 자동으로 켜므로, 포크에서 작업할 때 훅 내용을 한 번 확인하세요. 셋째, 오프라인 e2e들이 “provider에 돈 안 쓰고” 계약을 검증하는 수준이 높아, 사내 커스텀 ACP 에이전트를 붙일 때 test:custom-agents를 회귀 테스트 템플릿으로 삼기 좋습니다.

8. 비슷한 도구와 비교

최근 트렌딩에 올라온 “에이전트 운영 계층” 프로젝트들과 비교하면 OpenBot의 위치가 선명해집니다. 아래 수치는 오늘 GitHub API로 확인한 값입니다.

프로젝트 라이선스 / 언어 Stars 중심 개념 OpenBot과의 차이
nightly-labs/openbot PolyForm NC / TypeScript 2,717 영속 에이전트 “팀”, 큐·채널·파일 전송·브라우저 —
stablyai/orca MIT / TypeScript 108,385 git worktree 기반 코딩 에이전트 함대 코드 작업 병렬화 중심. OpenBot은 코딩 외 업무·상주 동료 중심
JetBrains/thinkrail Apache-2.0 / TypeScript 4,385 pi 에이전트용 경량 IDE, 스펙 그래프 IDE·스펙 주도 개발. OpenBot은 IDE가 아니라 메신저형 워크스페이스
makecindy/cindy Apache-2.0 / TypeScript 7,717 여러 에이전트 CLI를 잇는 클라이언트 접근 방식은 가장 비슷. OpenBot은 채널 라우팅·팀 원격·이벤트 로그가 더 무겁게 설계됨
multica-ai/multica NOASSERTION / Go 54,056 사람과 에이전트를 한 팀으로, 셀프호스팅 서버형 팀 플랫폼. OpenBot은 로컬 데스크톱이 호스트이고 WebRTC로 공유
zeronsh/zeron MIT / Rust 3,410 코딩 에이전트용 네이티브 컨트롤 플레인 제어판 성격. OpenBot은 에이전트 간 협업 프로토콜까지 포함

9. 라이선스: “오픈소스”로 부르기 전에

이 저장소는 MoricWorld Opensource 카테고리에서 다루지만, 엄밀히는 소스 공개(source-available) 소프트웨어입니다. README 스스로 “independent source-available project”라고 하고, Nix 안내에서는 “OpenBot is not free software”라며 allowUnfreePredicate 설정을 요구합니다.

용도 PolyForm Noncommercial 1.0.0 하에서
개인 연구·실험·학습·취미 허용 (상업적 적용 예상이 없을 것)
비영리·교육기관·공공연구·정부기관 자금 출처와 무관하게 허용
회사 업무에 사용, 사내 배포, 유료 서비스에 포함 별도 상업 라이선스 필요 (licenses@openbot.run)
수정·재배포 허용 목적 범위 안에서 가능, 라이선스 전문과 “Required Notice:” 줄 동봉 필수
v0.1.11 이하 Apache-2.0으로 계속 이용 가능(현재 기능과는 큰 차이)
기여 외부 기여자는 CLA로 저작권을 Synthetify Labs에 양도

회사 노트북에서 “업무 자동화”로 쓰는 순간 비상업 범위를 벗어날 가능성이 크므로, 팀 도입은 법무 확인이나 상업 라이선스 문의가 먼저입니다. 또 각 provider(Claude 구독 등)의 약관은 그대로 적용된다고 README가 따로 강조합니다.

10. 정리: 누가 써야 하나

  • 잘 맞는 경우: 개인 또는 비영리 환경에서 Codex·Claude·Grok 구독을 이미 갖고 있고, 리서치·리뷰·운영 같은 반복 업무를 “이름 붙은 동료”에게 나눠 맡기고 싶은 사람. provider를 바꿔도 대화와 메모리를 유지하고 싶은 사람.
  • 신중해야 하는 경우: 상업적 사용(라이선스), Linux에서 쓰기 격리가 필요한 Grok·OpenCode·Cursor·Cline 에이전트(현재 불가), 안정 버전 고정이 필요한 조직(하루 1~2회 릴리스, 백포트 없음).
  • 설계 관점의 수확: 지연 로드 도구 카탈로그와 CI로 강제하는 컨텍스트 예산, 모델 없이 먼저 결정하는 채널 라우팅, SQLite authorizer로 강제하는 에이전트 공용 DB 권한, 32,000자 발췌 핸드오프. 직접 에이전트 런타임을 만드는 팀이라면 OpenBot을 쓰지 않더라도 docs/architecture/는 읽어 볼 가치가 큽니다.

테크부터 경제, 생활까지. 복잡한 소식을 쉽게 풀어봅니다. 오늘 오후의 결론은 이렇습니다. OpenBot은 “에이전트를 더 똑똑하게”가 아니라 “에이전트를 더 오래, 여럿이, 덜 손 가게” 일하게 만드는 운영 계층이고, 그 대가로 넓은 기본 권한과 비상업 라이선스를 받아들여야 합니다.