{"id":48635122,"url":"https://github.com/gilhyun/octopal","last_synced_at":"2026-05-04T15:02:04.326Z","repository":{"id":349891250,"uuid":"1202549192","full_name":"gilhyun/Octopal","owner":"gilhyun","description":"Agentic workplace messenger for Claude Code. Collaborate with your Claude Code agents more efficiently. A group chat interface where multiple agents work together in real time.","archived":false,"fork":false,"pushed_at":"2026-05-04T03:44:57.000Z","size":35845,"stargazers_count":7,"open_issues_count":0,"forks_count":2,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-04T04:16:01.908Z","etag":null,"topics":["ai","ai-agents","claude","claude-code","group-chats","multi-agent"],"latest_commit_sha":null,"homepage":"https://octopal.app","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gilhyun.png","metadata":{"files":{"readme":"README.ko.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-06T06:18:58.000Z","updated_at":"2026-05-04T03:44:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/gilhyun/Octopal","commit_stats":null,"previous_names":["gilhyun/octopal"],"tags_count":45,"template":false,"template_full_name":null,"purl":"pkg:github/gilhyun/Octopal","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gilhyun%2FOctopal","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gilhyun%2FOctopal/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gilhyun%2FOctopal/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gilhyun%2FOctopal/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gilhyun","download_url":"https://codeload.github.com/gilhyun/Octopal/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gilhyun%2FOctopal/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32612318,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","ai-agents","claude","claude-code","group-chats","multi-agent"],"created_at":"2026-04-09T09:20:18.427Z","updated_at":"2026-05-04T15:02:04.320Z","avatar_url":"https://github.com/gilhyun.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Octopal\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"Octopal Logo\" width=\"180\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003e스페이스를 만들고, 에이전트와 대화하세요.\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  AI 에이전트들의 팀 워크스페이스.\u003cbr /\u003e\n  무료 \u0026 오픈소스 — macOS \u0026 Windows 지원.\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Early_Beta-v0.1.43-orange?style=flat-square\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Tauri_2-FFC131?style=flat-square\u0026logo=tauri\u0026logoColor=black\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Rust-000000?style=flat-square\u0026logo=rust\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/React_18-61DAFB?style=flat-square\u0026logo=react\u0026logoColor=black\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/TypeScript-3178C6?style=flat-square\u0026logo=typescript\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Vite-646CFF?style=flat-square\u0026logo=vite\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Goose_ACP-000000?style=flat-square\u0026logo=goose\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/Claude-D97757?style=flat-square\u0026logo=anthropic\u0026logoColor=white\" /\u003e\n  \u003cimg src=\"https://img.shields.io/badge/GPT-412991?style=flat-square\u0026logo=openai\u0026logoColor=white\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.producthunt.com/posts/octopal-open-source?embed=true\u0026utm_source=badge-featured\u0026utm_medium=badge\u0026utm_souce=badge-octopal-open-source\" target=\"_blank\"\u003e\u003cimg src=\"https://api.producthunt.com/widgets/embed-image/v1/featured.svg?post_id=octopal-open-source\u0026theme=light\" alt=\"Octopal on Product Hunt\" height=\"40\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  🌐 \u003ca href=\"https://octopal.app\"\u003e\u003cstrong\u003eoctopal.app\u003c/strong\u003e\u003c/a\u003e \u0026nbsp;|\u0026nbsp;\n  \u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e | \u003cstrong\u003e한국어\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"demo.gif\" alt=\"Octopal Demo\" width=\"800\" /\u003e\n\u003c/p\u003e\n\n---\n\n## Octopal이란?\n\nOctopal은 여러 AI 프로바이더(Claude, GPT, Ollama 등)를 지원하는 AI 에이전트 팀 워크스페이스입니다. 서로 다른 모델의 에이전트를 배치하고, 바로 협업을 시작하세요.\n\n[**Goose**](https://github.com/block/goose)(by Block) 기반 — 오픈소스 멀티 에이전트 프레임워크로, Agent Control Protocol(ACP)을 통해 AI 프로바이더를 오케스트레이션합니다. Goose가 프로바이더 라우팅, 도구 실행, 세션 관리를 담당하여 각 에이전트가 역할에 맞는 최적의 모델을 활용할 수 있습니다.\n\n모든 에이전트 데이터는 프로젝트 폴더의 `octopal-agents/` 디렉토리에 저장됩니다. 각 에이전트가 `config.json`과 `prompt.md`를 가진 서브폴더로 관리됩니다.\n\n## Philosophy\n\n\u003e **스페이스를 만들고, 에이전트와 대화하세요.**\n\n**하나의 심플한 메타포, 제로 인프라.**\n\n옥토팔만의 심플한 구조는 익숙한 개념들을 강력한 AI 워크스페이스로 즉시 만들어줍니다. 서버도, 계정도 필요 없어요 — 모든 것이 내 컴퓨터 안에 있습니다.\n\n| 개념 | 역할 | 설명 |\n|------|------|------|\n| 📁 폴더 | **팀** | 각 폴더가 독립적인 팀이 됩니다. 고유한 에이전트와 컨텍스트를 가집니다. |\n| 📁 octopal-agents/ | **에이전트** | 각 서브폴더가 에이전트를 정의합니다 — 설정, 프롬프트, 성격까지. |\n| 🏢 워크스페이스 | **회사** | 폴더들을 하나의 워크스페이스로 묶으면, 나만의 AI 회사가 완성됩니다. |\n\n복잡한 설정 없이, 클라우드 없이 — 내 컴퓨터와 AI 에이전트만 있으면 됩니다.\n\n## 하이라이트\n\n| | 기능 | 설명 |\n|---|------|------|\n| 🐙 | **Octo Agents** | `octopal-agents/` 서브폴더로 에이전트를 정의합니다. 각 폴더가 고유한 역할, 성격, 능력을 가진 독립 에이전트입니다. |\n| 💬 | **그룹 채팅** | 에이전트들이 서로, 그리고 당신과 자연스럽게 대화합니다. @멘션으로 지정하거나, 오케스트레이터가 자동 라우팅합니다. |\n| 🧠 | **히든 오케스트레이터** | 스마트 오케스트레이터가 컨텍스트를 읽고 적시에 적절한 에이전트를 호출합니다. 당신이 지시하면, 에이전트가 협업합니다. |\n| 📁 | **폴더 = 팀** | 폴더가 팀, 워크스페이스가 회사. 파일 정리하듯 에이전트 팀을 조직하세요. |\n| 🤖 | **멀티 모델** | Claude와 GPT 에이전트를 같은 방에서 운영하세요. 에이전트마다 다른 프로바이더 — 크로스모델 협업이 기본입니다. |\n| 🎯 | **에이전트별 모델 지정** | 에이전트마다 원하는 모델을 지정하세요 — 코딩은 GPT-4o, 글쓰기는 Claude, 로컬은 Ollama. 자유롭게 조합 가능. |\n| 🏠 | **로컬 모델 (Ollama)** | Ollama나 OpenAI 호환 로컬 서버를 연결하세요. API 키 없이 내 하드웨어로 완전 오프라인 에이전트 운영 가능. |\n| 🔗 | **Agent-to-Agent** | 에이전트끼리 @멘션으로 연쇄 협업을 일으킵니다. 당신이 개입하지 않아도 됩니다. |\n| 🔒 | **로컬 퍼스트, 프라이버시 퍼스트** | 모든 것이 내 컴퓨터에서 실행됩니다. 클라우드 서버도, 데이터 수집도 없어요 — 내 에이전트, 내 파일, 내 통제. |\n\n## 시작하기\n\n1. **옥토팔 앱 실행** — 앱을 열고 워크스페이스를 만드세요. 당신의 회사가 몇 초 만에 준비됩니다.\n2. **폴더 추가** — 폴더를 추가하면 `octopal-agents/` 디렉토리가 생성됩니다. 폴더가 팀, 서브폴더가 에이전트 — 바로 일할 준비 완료.\n3. **에이전트 만들고 채팅** — 각 에이전트에 역할을 부여하고 채팅을 시작하세요. @멘션으로 필요한 에이전트를 부르거나, 오케스트레이터에게 맡기세요.\n\n## 주요 기능\n\n### 채팅\n- 멀티 에이전트 그룹 채팅 — 대화를 중재하는 히든 에이전트가 당신의 질문에 답변할 수 있는 분야별 전문가 에이전트를 자동 호출합니다.\n- `@멘션` 라우팅, `@all` 전체 호출\n- 실시간 스트리밍 응답 + Markdown 렌더링 (GFM, 코드 하이라이팅)\n- 이미지/텍스트 파일 첨부 (드래그 앤 드롭, 붙여넣기)\n- 연속 메시지 디바운싱 (1.2초 버퍼링 후 에이전트 호출)\n- 메시지 페이지네이션 (스크롤 올리면 50건씩 로드)\n\n### 에이전트 관리\n- 에이전트 생성/편집/삭제 (이름, 역할, 이모지 아이콘, 색상)\n- 세분화된 권한 관리 (파일 쓰기, 셸 실행, 네트워크 접근)\n- 경로 기반 접근 제어 (allowPaths / denyPaths)\n- 에이전트 핸드오프 \u0026 권한 요청 UI\n- 자동 디스패처 라우팅\n\n### 위키\n- 워크스페이스별 공유 지식 베이스 — 메모, 의사결정, 컨텍스트를 모든 에이전트와 세션에서 접근 가능\n- 마크다운 페이지 CRUD (생성, 조회, 수정, 삭제)\n- 실시간 편집 및 라이브 미리보기\n- 같은 워크스페이스의 모든 에이전트가 위키 페이지를 읽고 쓸 수 있음\n- 세션 간 영속성 — 앱을 재시작해도 위키 페이지 유지\n\n### 워크스페이스\n- 워크스페이스 생성/이름변경/삭제\n- 멀티 폴더 관리 (폴더 추가/제거)\n- `octopal-agents/` 변경 감지 (파일 시스템 워치)\n\n## 사전 준비\n\n소스에서 Octopal을 빌드하려면 두 가지가 필요합니다.\n\n### 1. Rust 툴체인 (Tauri 백엔드 빌드용)\n\nOctopal은 Tauri 앱이므로 `cargo`가 `PATH`에 등록되어 있어야 합니다.\n\n```bash\n# macOS / Linux\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nsource \"$HOME/.cargo/env\"\n```\n\n\u003e Windows는 [`rustup-init.exe`](https://rustup.rs)를 다운로드해 실행하세요.\n\u003e 플랫폼별 추가 의존성은 [Tauri 사전 요구사항 가이드](https://tauri.app/start/prerequisites/)를\n\u003e 참고하세요 (macOS: Xcode Command Line Tools, Windows: WebView2 + MSVC,\n\u003e Linux: `webkit2gtk`).\n\n### 2. 프로바이더 CLI (에이전트 통신용)\n\nOctopal은 각 에이전트를 Goose ACP를 통해 프로바이더로 라우팅합니다. 사용하실\n프로바이더의 CLI를 설치하세요 — 최소 하나는 필요합니다:\n\n```bash\n# Anthropic (Claude) — Pro/Max 구독을 claude-acp 어댑터로\nnpm install -g @anthropic-ai/claude-code           # claude CLI\nnpm install -g @zed-industries/claude-agent-acp    # ACP 어댑터\nclaude login                                       # OAuth 한 번\n\n# OpenAI (GPT) — ChatGPT Plus/Pro 구독을 chatgpt_codex로\nnpm install -g @openai/codex                       # codex CLI\ncodex login                                        # OAuth 한 번\n# ChatGPT 측 OAuth는 Octopal이 첫 메시지에서 Goose 통해 자동 처리\n```\n\n\u003e Claude는 왜 npm 패키지가 두 개인가요? Goose v1.31.0의 `claude-acp`\n\u003e 프로바이더가 `claude-agent-acp` 어댑터를 spawn하고, 그 어댑터가 다시\n\u003e `claude` CLI를 spawn하는 구조입니다. 둘 다 `PATH`에 있어야 합니다.\n\u003e Octopal의 PATH 보강 로직이 nvm/asdf/homebrew 설치 위치를 자동 탐색\n\u003e 합니다.\n\n\u003e API 키 경로 (Settings → Providers → API Key)를 쓰시면 위 CLI들이\n\u003e 필요 없습니다. Claude Pro/Max 또는 ChatGPT 구독이 없으면 API 키를\n\u003e 붙여넣으세요.\n\n## 다운로드\n\n👉 **[최신 버전 다운로드](https://github.com/gilhyun/Octopal/releases)** (macOS / Windows)\n\n\u003e **⚠️ Windows 사용자 안내**\n\u003e\n\u003e 앱을 처음 실행할 때 보안 경고가 나타날 수 있습니다.\n\u003e\n\u003e - **Windows**: _Windows가 PC를 보호했습니다_ (SmartScreen) → **\"추가 정보\"** 클릭 → **\"실행\"**을 클릭하세요.\n\n## 개발 환경 세팅\n\n이 프로젝트는 **pnpm**을 씁니다 (`package.json`의 `packageManager` 필드로\n명시). 없다면 `corepack enable \u0026\u0026 corepack prepare pnpm@latest --activate`.\n\n```bash\n# 의존성 설치\npnpm install\n\n# 개발 모드 (Hot Reload)\npnpm dev\n\n# 프로덕션 빌드\npnpm build\n```\n\n### 스크립트\n\n| 명령어 | 설명 |\n|--------|------|\n| `pnpm dev` | Tauri 개발 모드 (Vite + Rust 백엔드, 핫 리로드) |\n| `pnpm build` | 프로덕션 빌드 — Rust 백엔드 + Vite 프론트엔드 컴파일, `.app` / `.dmg`(플랫폼별) 산출. **서명 키 불필요.** |\n| `pnpm build:signed` | 업데이터 아티팩트 포함 릴리스 빌드. **메인테이너 전용** — `TAURI_SIGNING_PRIVATE_KEY` 환경변수 필요 (GitHub releases 자동 업데이트 채널용; CI에서 자동 설정). |\n\n\u003e **왜 `pnpm tauri build`가 아니라 `pnpm build`인가요?** 전자는\n\u003e `scripts/tauri-build.mjs`를 거쳐서 서명 키가 있을 때만 업데이터\n\u003e 아티팩트를 활성화합니다. 후자(`pnpm tauri build`)도 일반 `.app`/`.dmg`\n\u003e 빌드는 정상 동작합니다 — 기본 `tauri.conf.json`이\n\u003e `createUpdaterArtifacts: false`로 출시되므로 기여자는 \"private key\n\u003e not set\" 에러를 만나지 않습니다.\n\n## 빌드 \u0026 CI\n\n### GitHub Actions (자동 릴리즈)\n\nOctopal은 버전 태그를 푸시하면 GitHub Actions가 자동으로 빌드 \u0026 릴리즈합니다:\n\n```bash\n# 태그 찍고 푸시 — macOS + Windows 자동 빌드\ngit tag v0.1.43\ngit push origin v0.1.43\n```\n\n워크플로우 (`.github/workflows/release.yml`) 동작:\n1. **빌드** — macOS (유니버설: Intel + Apple Silicon) + Windows (MSI + NSIS) 동시 빌드\n2. **Goose 번들** — 플랫폼별 Goose sidecar 바이너리 자동 다운로드\n3. **서명 \u0026 공증** — 코드 서명 + Apple 공증 (메인테이너 secrets 필요)\n4. **릴리즈** — DMG, MSI, EXE + 자동 업데이트 아티팩트로 GitHub Release 생성\n\n### 포크해서 직접 빌드하기\n\nOctopal을 포크하면 CI가 포크에서도 동작합니다. 알아둘 점:\n\n| 항목 | 설명 |\n|------|------|\n| **Secrets** | 포크에는 원본 레포의 secrets가 없습니다. 서명/공증은 스킵되고, 서명 안 된 빌드가 만들어집니다. |\n| **GITHUB_TOKEN** | GitHub가 포크 레포에 자동 제공합니다. 릴리즈는 포크의 Releases 페이지에 생성됩니다. |\n| **Goose sidecar** | Block의 공개 GitHub Releases에서 다운로드 — secrets 없이 동작합니다. |\n| **자동 업데이트** | `TAURI_SIGNING_PRIVATE_KEY` 없으면 동작하지 않습니다. 수동 다운로드 필요. |\n\n포크에서 서명을 설정하려면 레포 secrets에 추가:\n- `TAURI_SIGNING_PRIVATE_KEY` — 업데이터 아티팩트 서명용\n- `APPLE_CERTIFICATE` / `APPLE_CERTIFICATE_PASSWORD` — macOS 코드 서명용\n- `APPLE_ID` / `APPLE_PASSWORD` / `APPLE_TEAM_ID` — Apple 공증용\n\n\u003e Secrets 없어도 괜찮습니다. `pnpm build`로 로컬에서 서명 없는 앱을 바로 빌드할 수 있습니다.\n\n## 기술 스택\n\n| Layer | Tech |\n|-------|------|\n| Desktop | Tauri 2 (Rust 백엔드) |\n| Frontend | React 18 + TypeScript 5.6 |\n| Build | Vite 5 + Cargo |\n| AI Engine | Goose ACP (Claude + OpenAI 멀티 프로바이더) |\n| Markdown | react-markdown + remark-gfm + rehype-highlight |\n| Icons | Lucide React |\n| i18n | i18next + react-i18next |\n| Styling | CSS (Dark Theme + Custom Fonts) |\n\n\u003e **왜 Rust?** Octopal은 Electron 대신 [Tauri 2](https://tauri.app)를 사용합니다. Rust 기반 백엔드는 훨씬 작은 바이너리 크기(~10MB vs ~200MB), 낮은 메모리 사용량, 네이티브 OS 통합을 제공하면서도 동일한 React + TypeScript 프론트엔드를 유지합니다.\n\n## 프로젝트 구조\n\n```\nOctopal/\n├── src-tauri/                    # Tauri / Rust 백엔드\n│   ├── src/\n│   │   ├── main.rs               # 앱 엔트리포인트\n│   │   ├── lib.rs                # 플러그인 등록, 커맨드 라우팅\n│   │   ├── state.rs              # 공유 앱 상태\n│   │   └── commands/             # Tauri IPC 커맨드 핸들러\n│   │       ├── agent.rs          # 에이전트 라이프사이클\n│   │       ├── claude_cli.rs     # Claude CLI 스폰 \u0026 스트리밍\n│   │       ├── dispatcher.rs     # 메시지 라우팅 / 오케스트레이션\n│   │       ├── files.rs          # 파일 시스템 작업\n│   │       ├── folder.rs         # 폴더 관리\n│   │       ├── workspace.rs      # 워크스페이스 CRUD\n│   │       ├── wiki.rs           # 위키 페이지 CRUD\n│   │       ├── settings.rs       # 앱 설정\n│   │       ├── octo.rs           # 에이전트 설정 읽기/쓰기 (octopal-agents/)\n│   │       ├── backup.rs         # 상태 백업\n│   │       └── file_lock.rs      # 파일 잠금\n│   ├── Cargo.toml                # Rust 의존성\n│   └── tauri.conf.json           # Tauri 앱 설정\n│\n├── renderer/src/                 # React 프론트엔드\n│   ├── App.tsx                   # 루트 컴포넌트 (상태 관리, 에이전트 오케스트레이션)\n│   ├── main.tsx                  # React 엔트리포인트\n│   ├── globals.css               # 전체 스타일 (다크 테마, 폰트, 애니메이션)\n│   ├── types.ts                  # 런타임 타입 정의\n│   ├── utils.ts                  # 유틸리티 (색상, 경로)\n│   ├── global.d.ts               # TypeScript 글로벌 인터페이스\n│   │\n│   ├── components/               # UI 컴포넌트\n│   │   ├── ChatPanel.tsx         # 채팅 UI (메시지, 작성, 멘션, 첨부)\n│   │   ├── LeftSidebar.tsx       # 워크스페이스/폴더/탭 네비게이션\n│   │   ├── RightSidebar.tsx      # 에이전트 목록 \u0026 활동 상태\n│   │   ├── ActivityPanel.tsx     # 에이전트 활동 로그\n│   │   ├── WikiPanel.tsx         # 위키 페이지 관리\n│   │   ├── SettingsPanel.tsx     # 설정 (일반/에이전트/외관/단축키/정보)\n│   │   ├── AgentAvatar.tsx       # 에이전트 아바타\n│   │   ├── MarkdownRenderer.tsx  # 마크다운 렌더러\n│   │   ├── EmojiPicker.tsx       # 이모지 선택기\n│   │   ├── MentionPopup.tsx      # @멘션 자동완성\n│   │   └── modals/               # 모달 다이얼로그\n│   │\n│   └── i18n/                     # 다국어\n│       ├── index.ts              # i18next 설정\n│       └── locales/\n│           ├── en.json           # English\n│           └── ko.json           # 한국어\n│\n└── assets/                       # 로고, 아이콘\n```\n\n## 아키텍처\n\n```\n┌──────────────────────────────────────────────┐\n│                  Tauri 2                      │\n│  ┌─────────────┐         ┌────────────────┐  │\n│  │  Rust Core   │  IPC    │   WebView      │  │\n│  │  (commands/) │◄───────►│   (React)      │  │\n│  │  lib.rs      │ invoke  │   App.tsx      │  │\n│  └──────┬──────┘         └───────┬────────┘  │\n│         │                        │            │\n│    ┌────▼────┐           ┌──────▼──────┐     │\n│    │ File    │           │ Components  │     │\n│    │ System  │           │ ChatPanel   │     │\n│    │ Agents  │           │ Sidebars    │     │\n│    │ Wiki    │           │ Modals      │     │\n│    │ State   │           │ Settings    │     │\n│    └────┬────┘           └─────────────┘     │\n│         │                                     │\n│    ┌────▼────┐                               │\n│    │ Goose   │                               │\n│    │ ACP     │                               │\n│    │ (spawn) │                               │\n│    └────┬────┘                               │\n│         │                                     │\n│    ┌────▼────────────────────┐               │\n│    │ Claude CLI │ OpenAI Codex│               │\n│    │ (Anthropic)│ (OpenAI)   │               │\n│    └─────────────────────────┘               │\n└──────────────────────────────────────────────┘\n```\n\n## 데이터 저장\n\n| 항목 | 경로 |\n|------|------|\n| 상태 (Dev) | `~/.octopal-dev/state.json` |\n| 상태 (Prod) | `~/.octopal/state.json` |\n| 대화 이력 | `~/.octopal/room-log.json` |\n| 첨부 파일 | `~/.octopal/uploads/` |\n| 위키 | `~/.octopal/wiki/{workspaceId}/` |\n| 설정 | `~/.octopal/settings.json` |\n\n## 변경 이력\n\n릴리즈 노트와 업데이트 내역은 [CHANGELOG.md](CHANGELOG.md)를 참고하세요.\n\n## 라이선스\n\n[MIT License](LICENSE) © gilhyun\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgilhyun%2Foctopal","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgilhyun%2Foctopal","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgilhyun%2Foctopal/lists"}