<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/assets/readme-banner-dark.png">
<img src="https://raw.githubusercontent.com/wangjc683/galley/HEAD/docs/assets/readme-banner.png" alt="Galley — Less harness. More model." width="640" />
</picture>
</p>
<p align="center">
컴퓨터에서 작동하는 가볍고 범용적인 어시스턴트: 모델 자체에 의존하는 얇은 구조(harness)로, 매번 모델이 출시될 때마다 더 나아지도록 구축되었습니다.
</p>
<p align="center">
<a href="https://github.com/wangjc683/galley/releases"><strong class="">다운로드</strong></a>
·
<a href="#quick-start">빠른 시작(Quick Start)</a>
·
<a href="#a-quick-tour">투어(Tour)</a>
·
<a href="./docs/README.md">문서(Docs)</a>
·
<a href="./README.zh-CN.md">중국어</a>
</p>
<p align="center">
<a href="https://github.com/wangjc683/galley/releases"><img src="https://img.shields.io/github/v/release/wangjc683/galley?include_prereleases&style=flat-square&label=release&color=c68762&labelColor=211f1c" alt="Latest Release" /></a>
<a href="https://github.com/wangjc683/galley/releases"><img src="https://img.shields.io/badge/platform-macOS%20%7C%20Windows-c68762?style=flat-square&labelColor=211f1c" alt="Platform: macOS | Windows" /></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-c68762?style=flat-square&labelColor=211f1c" alt="License: MIT" /></a>
</p>
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="docs/screenshots/en/hero-dark.png">
<img src="https://raw.githubusercontent.com/wangjc683/galley/HEAD/docs/screenshots/en/hero.png" alt="Galley main conversation view: an agent working through a multi-step browser run" width="800" />
</picture>
<br/>
<sub class="">시스템의 외관을 따릅니다 — 라이트 또는 다크 모드.</sub>
</p>
Galley란 무엇인가</div>}{
Galley는 사용자의 컴퓨터에서 구동되는 개인 AI 어시스턴트로, 실제로 작업을 수행합니다 — 브라우저, 터미널, 파일은 물론 휴대폰까지 제어할 수 있습니다. 이 시스템의 구조(harness)는 의도적으로 가볍습니다: 엔진이 도구 세트를 최소화하고 컨텍스트를 밀집시켜 모델 자체의 능력이 작업을 처리하게 하며, 모든 모델 업그레이드는 Galley 업그레이드로 즉시 반영됩니다 — 저희가 따라잡을 때까지 기다릴 필요가 없습니다.
하나의 어시스턴트로 충분하지 않을 때는 Galley가 팀이 됩니다. 여러 세션이 병렬로 진행되며, 언제든지 전환하거나, 인계받거나, 재개할 준비가 되어 있습니다. 사용자는 GUI에서 진행 상황을 확인하고 지침을 보내고; Supervisor Agent는 CLI를 통해 동일한 팀을 오케스트레이션합니다 — 두 가지 역할, 하나의 공유 상태, 모든 것이 사용자 기기에서 이루어집니다.
주요 특징 (Highlights)
작업을 수행하는 단일 에이전트
번들된 엔진(bundled engine)에 의해 구동됩니다 — GenericAgent의 파생 작업물이며, 설치 프로그램 내부에 포함되어 첫 실행 시 바로 사용할 수 있습니다.
- 🖥️ 시스템 수준 실행 (System-level execution) — 터미널, 파일, 키보드 및 마우스, 화면 비전, 심지어 ADB를 통한 휴대폰까지: 정보를 검색하는 것부터 작업을 완료하는 것까지 가능합니다.
- 🌐 실제 브라우저 사용 — 번들된 확장 프로그램을 Chrome 또는 Edge에 한 번만 로드하면, 에이전트는 이미 로그인되어 있는 사용자의 브라우저에서 작동합니다. 재로그인이 필요 없습니다.
- 🧬 자체 진화하는 스킬 (Self-evolving skills) — 해결하는 모든 새로운 작업은 재사용 가능한 스킬이 됩니다; 이 스킬 트리는 사용자 기기에서 성장합니다.
- 💰 측정된 토큰 효율성 — 긴 컨텍스트 대신 밀집된 컨텍스트를 사용합니다: 선도적인 에이전트보다 입력 토큰을 3~6배 적게 사용하여 Lifelong AgentBench에서 100% 달성했습니다 (paper). 기본 창 크기는 90K입니다.
- 🔌 로컬 모델 포함 모든 모델 지원 — Anthropic 및 OpenAI부터 DeepSeek, Kimi, GLM까지 프리셋을 제공하며, ChatGPT 로그인, 호환 가능한 모든 엔드포인트, 키가 필요 없는 Ollama를 지원합니다; 대화당 추론 노력(reasoning effort)이 적습니다.
- 📖 읽기 패널 (Reading panel) — 에이전트가 작성한 파일을 대화 옆에 열어 보여줍니다: Markdown, 코드, 이미지, CSV는 표 형태로 표시됩니다. 구성 요소(composer)에서 파일이나 이미지를 추가하고; Git 저장소의 변경 사항을 읽기 전용으로 통합 또는 분할하여 검토합니다.
실제로 관리할 수 있는 하나의 팀
Galley의 오케스트레이션 레이어입니다. 사용자는 GUI에서 작업하고, Supervisor Agent는 안정적인 galley CLI를 통해 작동합니다. 둘 다 동일한 세션과 히스토리를 공유하는 일급(first-class) 운영자이므로 분리된 세계가 아닙니다.
- 🧭 프로젝트 + 병렬 세션 — 프로젝트에 폴더, 코드 레포지토리 또는 문서 디렉터리를 지정하면, 여러 세션이 그 주변에서 병렬로 진행되도록 할 수 있습니다.
- 🔧 투명한 실행(Transparent runs) — 추론 스트림을 관찰할 수 있으며, 모든 단계는 전체 인자 및 결과가 열리고, 완료된 실행은 한 줄로 접힙니다.
- ⏰ 예정된 작업(Scheduled tasks) — 매일, 매주 또는 매월 실행되는 프롬프트가 새 세션에서 작동하며, 그 결과는 사이드바에 대기합니다. Galley는 실행 중이어야 하며 로그인 시 시작할 수 있습니다.
- 💬 IM 채널 — WeChat, Feishu, Telegram 또는 Discord: 휴대폰의 동일한 어시스턴트가 데스크톱 세션으로 더 긴 작업을 전달합니다.
- 💾 백그라운드 + 검색 — 창을 닫아도 Galley는 메뉴 바/트레이에 남아 있으며, 작업이 완료되면 알림을 보내고, ⌘K (Windows에서는 Ctrl+K)를 통해 모든 과거 대화를 검색할 수 있습니다.
간단한 투어
<table
<tr>
<td width="50%" valign="top"><img src="https://raw.githubusercontent.com/wangjc683/galley/HEAD/docs/screenshots/en/tools.png" alt="Tool timeline" /><br/><sub>툴 타임라인 (Tool timeline) — 모든 호출의 인자(arguments), 결과(result), 타이밍을 인라인으로 표시합니다.</sub></td>
<td width="50%" valign="top"><img src="https://raw.githubusercontent.com/wangjc683/galley/HEAD/docs/screenshots/en/reading.png" alt="Reading panel" /><br/><sub>읽기 패널 (Reading panel) — 대화 옆에서 작업 트리의 변경 사항을 검토합니다.</sub></td>
</tr>
<tr>
<td width="50%" valign="top"><img src="https://raw.githubusercontent.com/wangjc683/galley/HEAD/docs/screenshots/en/projects.png" alt="Project view" /><br/><sub>프로젝트 뷰 (Project view) — 하나의 프로젝트를 중심으로 세션이 진행됩니다.</sub></td>
<td width="50%" valign="top"><img src="https://raw.githubusercontent.com/wangjc683/galley/HEAD/docs/screenshots/en/scheduled.png" alt="Scheduled tasks" /><br/><sub>예약된 작업 (Scheduled tasks) — 매일 아침 자동으로 실행되는 프롬프트입니다.</sub></td>
</tr>
<tr>
<td width="50%" valign="top"><img src="https://raw.githubusercontent.com/wangjc683/galley/HEAD/docs/screenshots/en/search.png" alt="Search" /><br/><sub>⌘K — 모든 과거 대화에서 일치하는 라인으로 바로 이동합니다.</sub></td>
</tr>
</table>
빠른 시작 (Quick Start)
먼저 모델을 어떻게 연결할지 결정해야 합니다. 코딩을 위한 ChatGPT / Codex, OpenAI, Anthropic, DeepSeek, Kimi, MiniMax, OpenRouter, SiliconFlow, Xiaomi MiMo, Zhipu GLM에 대한 사전 설정(Presets)이 내장되어 있으며, 엔드포인트가 미리 채워져 있습니다: ChatGPT / Codex는 사용자의 ChatGPT 계정으로 로그인하며, 나머지는 API 키를 사용합니다. 다른 OpenAI 또는 Anthropic과 호환되는 모든 엔드포인트의 경우 'Custom'을 선택하고 해당 URL을 입력하면 됩니다. Ollama와 같은 로컬 서버는 키가 필요하지 않습니다.
- Galley 다운로드 — macOS 및 Windows 설치 프로그램은 [Releases]에서 받을 수 있습니다.
- 모델 설정 - 첫 실행 시 제공업체를 선택하고 API 키를 붙여넣거나(또는 ChatGPT로 로그인) 합니다. 연결은 자동으로 테스트됩니다.
- 사용 시작 - 메인 대화 보기로 들어가려면 "Galley 사용 시작(Start using Galley)"을 클릭합니다 (ChatGPT 로그인 시 바로 해당 화면으로 이동합니다).
| 플랫폼 | 설치 파일 |
|---|
| macOS Apple Silicon | filename에 macOS_aarch64.dmg 포함 |
| ... | |
<details>
<summary>설치 참고 사항</summary>
Galley는 아직 코드 서명(code-signed)되지 않았습니다. 만약 macOS가 첫 실행을 차단하면 다음 명령어를 실행하세요:
xattr -dr com.apple.quarantine /Applications/Galley.app
Windows에서는 SmartScreen이 게시자가 알 수 없다고 표시할 때 "추가 정보(More info)"를 선택한 후 → "실행(Run anyway)"을 선택합니다.
이미 GenericAgent 환경을 가지고 있다면, **설정(Settings) → 런타임(Runtime) → 더 보기(More) → 외부 GA 연결(Connect external GA)**에서 GA 폴더를 선택하세요. 한 번 연결되면 Galley는 엄격하게 읽기 전용으로 유지되며 사용자의 외부 GA의 코드, 메모리, SOP 또는 mykey.py에 절대 접근하지 않습니다. 브라우저 제어 및 채널은 패키징된 엔진(bundled engine)에서만 실행되며, 설정(Settings) → 모델(Models) 아래 제공업체들은 패키징된 엔진을 사용합니다. 외부 GA는 자체의 mykey.py를 계속 사용합니다.
</details>
Supervisor / 채널
실행 중인 GUI에서 **설정(Settings) → 에이전트(Agent)**를 여세요:
| 버튼 | 기능 |
|---|
| Copy SOP | 짧은 galley-supervisor-sop.md를 복사합니다. 이를 통해 에이전트가 Galley 작업을 검사하고, 계속 진행하거나, 시작하거나, 분할하거나, 기다릴 수 있습니다. 고급 세부 정보는 Supervisor 참고 자료에 있습니다. |
| ... | |
You don't need to learn the CLI yourself — tell your Supervisor Agent what you want in natural language and let it operate Galley. The copied SOP is a lightweight hot path; detailed commands and advanced orchestration stay in the reference and Agent API. Claude Code 사용자는 동일한 SOP를 스킬로 설치할 수 있습니다: galley-supervisor (Codex 사본은 .agents/skills/ 아래에 있습니다.). | |
작업은 하나의 거대한 프롬프트가 되는 대신 오른쪽 컨테이너로 확장됩니다:
- 단순 요청 — 단일 세션에서 읽거나 따릅니다;
- 프로젝트/폴더 작업 — Project Workspace를 사용하여 작업 공간을 연결하고 세션을 병렬로 실행합니다.
또한 설정(Settings) → 채널(Channels) 에서 WeChat / Feishu / Telegram / Discord에 연결하여 휴대폰에서도 동일한 어시스턴트에 접근할 수 있으며, 이 경우 더 긴 작업은 데스크톱 세션으로 전달됩니다.
<details>
<summary>CLI 예시 보기</summary>
Galley가 실행 중일 때, 같은 장치에 있는 Supervisor Agent는 galley를 통해 작업을 전송할 수 있습니다:
명령어 작성 시 --supervisor와 --reason를 사용합니다. --supervisor를 설정하면 작업이 via=supervisor로 기록되고 (그렇지 않으면 via=cli) 합니다. Supervisor가 생성한 세션과 메시지는 사이드바와 타임라인에 Supervisor 표시를 가져서, 사람이 에이전트로부터 무엇이 왔는지 한눈에 볼 수 있습니다.
전체 명령어 참고 자료, JSON 스키마 및 종료 코드는 Agent API 문서에 있습니다。
</details>
아키텍처
GUI와 CLI는 **동등한 프런트엔드(peer frontends)**입니다. 즉, GUI가 CLI를 감싸는 구조가 아니라, 두 개가 각각 동일한 Rust Core에 직접 연결됩니다. GUI는 앱 내부에서, CLI는 로컬 소켓을 통해 연결되는 방식입니다. Core가 단일 권한 주체로서 세션/프로젝트 상태, 예약된 작업, SQLite 쓰기, 그리고 Galley가 실행하는 모든 Python 프로세스를 관리합니다. 기본적으로 이들은 번들된 엔진 위에서 바로 사용할 수 있도록 준비되어 있습니다.
flowchart TB
GUI["Galley GUI<br/>Tauri · React"] -- in-process --> Core
CLI["Galley CLI<br/>Rust"] -- "local socket · named pipe<br/>no TCP · no token" --> Core
...
세 가지 종류의 프로세스 모두 Python을 실행합니다. 외부 GA(GenericAgent)를 연결할 때는 세션 러너가 대신 사용하며, IM 채널과 브라우저 브리지는 비활성화됩니다.
기술 스택: Tauri v2 + React 19 + TypeScript 5.8 + Tailwind v4 / Rust (Galley Core + Galley CLI) / Python (러너, GenericAgent 래핑) / SQLite + FTS5 trigram
더 많은 문서:
Architecture ·
Contributing ·
Docs index
내부 작동 방식 (Under the Hood)
기능 목록에는 없지만 Galley의 엔지니어링 품질을 결정하는 몇 가지 설계 선택 사항:
<details>
<summary>여섯 가지 설계 선택 사항 보기</summary>
-
GUI를 감싸는 CLI가 아닌, 동등한 프런트엔드(Peer frontends). GUI와 CLI는 각각 독립적으로 Rust Core에 접근하므로 어느 한쪽도 다른 쪽에 의존하지 않습니다. 창을 닫아도 Core, 그 세션들, 그리고 CLI는 백그라운드에서 계속 실행됩니다. 채팅 앱 역시 자체 프로토콜이 필요하지 않았습니다. 각 IM 채널 내부에서도 어시스턴트는 Supervisor가 사용하는 것과 동일한 CLI를 통해 Galley를 구동합니다.
-
Rust Core가 단일 권한 주체(Single authority)입니다. 세션/프로젝트의 상태 머신, 예약된 작업, SQLite 쓰기, 그리고 모든 자식 프로세스는 한 곳에 모여 있습니다. 프런트엔드는 투영(projections)을 읽고 의도(intents)를 보내는 역할을 하며, 자체적으로 쓸 수 있는 상태(writable state)를 보유하지 않아 근본적인 다중 엔드 상태 표류(multi-end state drift) 문제를 제거합니다.
</details>
-
로컬 우선 보안 모델. 프로세스 간 트래픽은 Unix 소켓(0600) 또는 Windows 이름 있는 파이프를 통해 전송되며, 로컬호스트에서만 작동하고 토큰이나 TLS가 필요 없습니다. 이는 신뢰 경계(trust boundary)가 '동일한 기기의 동일 사용자'이기 때문입니다. 네트워크 스타일의 인증을 로컬 도구에 강제하지 않는 것은 의도적인 생략입니다.
-
Agent API는 버전이 지정된 공개 계약입니다. CLI 출력에는 schemaVersion이 포함됩니다. 특정 버전 내에서는 변경 사항이 추가적(additive)일 수만 있으며, 하위 호환성을 깨는(breaking change) 변경은 새로운 버전을 사용합니다. 현재 버전은 3이며, 변경되지 않은 모든 명령어는 여전히 1과 2를 반환합니다. 명령어 작성 시 누가, 그리고 왜 요청했는지(via / supervisor / reason) 기록됩니다. 슈퍼바이저는 이를 신뢰하며 프로그래밍할 수 있습니다.