AI 직원들이 진짜 사무실처럼 일하는 로컬 오피스 시뮬레이터
PandyOffice는 Obsidian 볼트를 지식 베이스로 삼아, 로컬 LLM(Ollama) 으로 직원과 대화하고 Claude Code CLI 로 코드 수정 작업을 맡기는 데스크톱 앱입니다. 팀을 만들고 직원을 배치하면, 각 직원이 자기 역할(SOUL)과 팀 지식(BRAIN)을 가지고 질문에 답하거나 격리된 브랜치에서 코드를 고칩니다.
| 항목 | 내용 |
|---|---|
| 프론트엔드 | Vite + React (:5173) |
| 백엔드 | Express, ESM (:3001) |
| 대화 모델 | Ollama qwen2.5:1.5b-instruct-q4_K_M (로컬) |
| 임베딩 모델 | Ollama bge-m3 |
| 코드 작업 | Claude Code CLI (격리 브랜치) |
| 지식 베이스 | Obsidian 볼트 (마크다운) |
직원을 클릭하면 대화가 열리고, 볼트에 쌓인 노트를 근거로 답합니다. 코드 작업을 부여하면 Claude Code CLI가 ai/work/… 전용 브랜치에서만 움직이고 main 은 건드리지 않습니다. 모든 데이터는 여러분의 Obsidian 볼트 안에 평범한 마크다운과 JSON으로 저장되므로, 앱을 끄더라도 내용은 그대로 남습니다.
주의
- 백엔드는 자동 리로드가 없습니다.
server/아래 파일을 고쳤다면npm run dev를 다시 실행하세요.- 코드 작업은 자동으로 merge / push 하지 않습니다. 결과는 사람이 직접 checkout 해서 검토합니다.
- Node.js 18 이상
- Ollama (로컬 LLM 실행)
- Claude Code CLI (코드 수정 작업을 쓸 경우)
- Obsidian 볼트 하나 (없으면 빈 폴더로 시작해도 됩니다)
# 1. 의존성 설치
npm install
# 2. Ollama 모델 풀
ollama pull qwen2.5:1.5b-instruct-q4_K_M
ollama pull bge-m3
# 3. 환경 변수 (.env)
# OBSIDIAN_VAULT_PATH=/path/to/your/vault
# PORT=3001
# 4. 개발 서버 실행 (프론트 :5173 + 백엔드 :3001 동시 기동)
npm run dev브라우저에서 http://localhost:5173 을 열면 회사 평면도가 나타납니다.
| 변수 | 기본값 | 설명 |
|---|---|---|
OBSIDIAN_VAULT_PATH |
~/Documents/obsidian |
Obsidian 볼트 경로 |
PORT |
3001 |
백엔드 포트 |
OLLAMA_MODEL_MAIN |
qwen2.5:1.5b-instruct-q4_K_M |
대화 모델 교체용 |
Notion 토큰은 환경 변수가 아니라 앱 안의 소스 탭에서 팀별로 저장됩니다(암호화 파일).
회사 평면도 → 팀 방 내부 → 팀 관리 탭
(팀 클릭) (직원 클릭→대화) (직원 / 작업 / 소스 / 기록 / 그래프 / 기억)
방을 클릭하면 정사각형 사무실 안으로 들어가, 책상에 앉은 직원을 만나게 됩니다. 직원을 클릭하면 그 자리에서 대화창이 열립니다.
팀을 만들 때 아이콘과 방 디자인을 고릅니다. 기본 나무 바닥, 16종 프리셋 사진(Room1~16.png), 또는 직접 올린 사진을 방 배경으로 쓸 수 있고, 평면도와 방 내부 양쪽에 똑같이 적용됩니다.
직원마다 SOUL.md(역할·성격)와 팀 공용 BRAIN.md(지식 베이스)를 가집니다. 아바타는 기본 판다 이미지 또는 업로드한 사진을 씁니다.
질문을 던지면 bge-m3 로 볼트 청크를 임베딩·검색해 Top-K 근거를 모으고, Ollama가 그 위에서 답합니다. 최근 4턴까지 맥락을 유지하며, 답변을 초안으로 제출해 승인함으로 보낼 수 있습니다.
직원에게 코드 수정 작업을 배정하면 Claude Code CLI가 ai/work/… 격리 브랜치에서 실행합니다. 진행 로그와 git diff를 실시간으로 보고, 대기 → 진행 → 검토 → 완료 칸반으로 흐름을 관리합니다. main 은 절대 건드리지 않고, 자동 push도 없습니다.
- Notion — 토큰을 암호화 저장하고 페이지 URL을 등록하면 자식 페이지까지 재귀 동기화합니다.
- GitHub 로컬 레포 — 경로를 등록하면 README/
.md를 미러링해 그래프와 RAG에 반영합니다.
볼트 마크다운을 스캔해 위키링크 + 시맨틱 엣지로 force-graph를 그립니다. 노드를 클릭하면 노트 미리보기와 RAG 대화가 열립니다.
- 승인함 — 문서 초안과 코드 작업을 한곳에서 검토 / 승인 / 변경 요청 / 반려합니다.
- 누적 기억 — 결정 사항·용어를 추가하면 LLM이 요약해 이후 대화 맥락에 주입합니다.
- 기록 — 최근 작업을 요약한 회의록을 카테고리·날짜로 모아 봅니다.
모든 데이터는 볼트 안에 평범한 파일로 저장됩니다.
{OBSIDIAN_VAULT_PATH}/
└─ {팀이름}/
├─ team.json # 팀 메타 (이름, 아이콘, 방 디자인, 직원, 소스)
├─ BRAIN.md # 팀 지식 베이스
├─ notes/ # 직접 작성한 노트
├─ notion/ # Notion 동기화 결과
├─ github/ # 레포 README 미러
├─ agents/{직원id}/
│ ├─ SOUL.md # 직원 역할·성격 지침
│ └─ memory.json # 누적 기억
├─ tasks.json # 작업 목록 & 상태
├─ approvals.json # 승인 목록
└─ meeting-logs/ # 기록 (.md)
- 코드 작업은 전용 브랜치(
ai/work/…)에서만 실행 —main미접촉 - 작업 완료 후 자동 merge / push 없음 — 사람이 직접 검토
- Notion 토큰은 헤더로만 전달, 로그·에러에 노출 안 함
- 레포 등록 해제는 목록에서 제거만, 실제 git 폴더는 삭제하지 않음
- 이미지 data URL은 약 3MB 상한과 형식 검증을 거침
로컬 16GB 머신 기준입니다.
- 대화 모델
qwen2.5:1.5b-instruct-q4_K_M은keep_alive: 30m으로 상주합니다. qwen3같은 대용량 모델은 메모리 부족으로 권장하지 않습니다.OLLAMA_MODEL_MAIN으로 교체할 수 있습니다.- 코드 수정은 Claude Code CLI가 처리하므로 로컬 GPU가 필요 없습니다.




