Show HN: Juggler – JUCE 제작자가 만든 오픈 소스 GUI 코딩 에이전트
요약
JUCE 제작자가 개발한 Juggler는 시각적 작업대(workbench)를 제공하는 오픈 소스 GUI 코딩 에이전트입니다. 단순한 채팅 형식을 넘어 트리 구조의 세션 관리와 밀러 컬럼 방식의 시각적 탐색을 통해 LLM의 작업 과정을 직접 제어할 수 있습니다.
핵심 포인트
- 밀러 컬럼 스타일의 GUI를 통한 도구 호출 및 컨텍스트 시각화
- 단순 대화 기록이 아닌 트리 구조의 세션 및 서브 스레드 관리
- 사용자 정의가 가능한 플러그인 기반의 확장 구조
- Claude Code, OpenAI, Gemini 등 다양한 LLM 모델 지원
- 로컬 및 원격 환경을 동시에 지원하는 데스크톱/브라우저 클라이언트
Juggler
네, 또 다른 AI 코딩 에이전트입니다. 업계에는 분명히 하나가 더 필요했습니다.
Juggler의 차별점이 있다면, LLM(Large Language Model)이 자신의 코드베이스에 무엇을 하고 있는지 더 직접적으로 제어하고 싶어 하는 사람들을 위한 것이라는 점입니다. Juggler는 시각적인 작업대(workbench)를 제공합니다: 검사 가능한 도구 호출(tool calls), 분기되는 스레드(branching threads), 편집 가능한 컨텍스트(context).
웹사이트의 추가 설명: https://juggler.studio
<p align="center"> <img src="https://juggler.studio/assets/screenshot-main.webp" alt="Juggler's Miller-column workbench: tool calls, item properties and nested sub-threads" width="880"> </p> <p align="center"><em>Finder 스타일의 밀러 컬럼(Miller column) 뷰로 배치된 도구 호출(tool calls), 항목 속성(item properties) 및 중첩된 서브 스레드(nested sub-threads).</em></p>요약(TL;DR)은 다음과 같습니다:
- 제대로 된 GUI입니다. 이것은 콘솔 앱이 아닙니다. 그래픽 기반의 시각적 탐색, 검사 및 제어에 중점을 둡니다.
- 세션은 끝없이 스크롤하는 방식이 아닌 트리(tree) 구조입니다. 이는 단순한 대화 기록(transcript)이 아닌 Yjs 문서입니다. 서브 스레드를 생성하고, 상세 내용을 파고들고, 되돌아가고, 비교하고, 편집할 수 있습니다.
- 모든 중요한 정보가 보입니다. 도구 호출(tool calls), 승인(approvals), 스레드 구조, 항목 속성(item properties), 원시 컨텍스트(raw context) 등이 접을 수 있는 채팅창 안에 묻혀 있는 대신, Finder 스타일의 밀러 컬럼(Miller columns)으로 배치되어 있습니다.
- 모든 것이 플러그인 구조입니다. 컨텍스트 항목, 슬래시 명령어(/ commands), LLM 루프 전략 및 해당 UI는 사용자가 검사, 포크(fork) 또는 교체할 수 있는 JavaScript 확장 기능입니다.
- 로컬, 원격 또는 두 가지 방식을 동시에 실행할 수 있습니다. 네이티브 데스크톱 앱 및/또는 브라우저에서 동일한 UI로 동일한 세션을 사용할 수 있습니다. 여러 클라이언트가 동일한 세션에 접속할 수 있습니다.
- 일반적인 모델 동물원(model zoo)과 통신합니다. Claude Code (CLI 또는 API를 통해), OpenAI (codex 플랜 또는 API), Gemini, Ollama, OpenRouter, Z.AI, Deepseek 등이 포함됩니다.
시작하기
Releases 페이지 또는 juggler.studio를 통해 빌드를 다운로드하세요.
각 다운로드에는 동일한 두 가지 구성 요소가 포함되어 있습니다:
- Juggler app — 네이티브 데스크톱 앱 (native desktop app)입니다. 기대하는 대로 작동합니다.
juggler— 헤드리스 커맨드 라인 서버 (headless command-line server)입니다. 장시간 실행, 원격 또는 네트워크 접속이 가능한 세션을 위해 터미널에서 이를 실행하세요. 자체적인 창은 없지만, 터미널에w를 입력하여 데스크톱 앱을 열거나 출력된 브라우저 URL을 사용할 수 있습니다.
데스크톱 앱과 브라우저 탭(로컬 또는 원격 머신)은 모두 동일한 서버 세션을 보는 클라이언트(client) 역할을 할 수 있습니다.
설치 (Installing)
- macOS —
.dmg파일을 다운로드하고, 열어서 Juggler를 Applications 폴더로 드래그한 다음 실행하세요. 앱과 서버가 함께 번들로 제공되므로 서버가 자동으로 시작됩니다. 처음 실행할 때 macOS Gatekeeper가 다운로드를 차단할 수 있습니다: 앱을 우클릭(또는 Control-클릭) → 열기 (Open) → **열기 (Open)**를 선택하거나, **시스템 설정 (System Settings) → 개인정보 보호 및 보안 (Privacy & Security) → 그래도 열기 (Open Anyway)**로 이동하세요. 첫 실행 이후에는 정상적으로 열립니다. - Windows —
Juggler-<version>-setup.exe를 다운로드하고 실행하세요. 데스크톱 앱과 그에 맞는juggler.exe커맨드 라인 서버가 하나의 디렉토리에 함께 설치되며 (juggler를 PATH에 추가할 수 있음), 따라서 두 구성 요소가 서로 어긋나는 일이 없습니다. - Linux —
juggler서버 바이너리를 다운로드하여 터미널에서 실행한 다음, 브라우저나 데스크톱 앱으로 연결하세요.
데스크톱 앱과 서버는 항상 하나의 단위로 배포 및 설치됩니다 — docs/distribution.md를 참조하세요.
서버 직접 실행하기 (Running the server directly)
헤드리스 세션(headless session)을 위해 다음을 실행하기만 하면 됩니다:
juggler # 브라우저에서 연결하는 데 필요한 모든 정보를 출력합니다
기본적으로 서버는 웹 UI (web UI)를 열고, 쉬운 연결을 위해 URL과 QR 코드를 출력합니다.
서버는 기본적으로 localhost 전용입니다 — 사용자의 머신 외부에서는 접속할 수 없습니다. 네트워크상의 다른 장치가 연결할 수 있도록 하려면 터미널에서 p를 누르세요 (또는 --public 옵션과 함께 실행하세요). LAN 접속에는 비밀번호가 없습니다: 해당 주소에 접근할 수 있는 누구나 에이전트 (agent)를 제어할 수 있으므로, 신뢰할 수 있는 네트워크에서만 활성화하세요.
LAN(근거리 통신망) 너머에서의 접속 기능은 이 저장소(repository)에 내장되어 있지 않습니다. 즉, 이 소스에서 빌드된 버전은 로컬 및 LAN 환경에서만 작동합니다. juggler.studio에서 제공하는 공식 Juggler 바이너리에는 인터넷을 통해 서버에 접속할 수 있는 WAN(광역 통신망) 접속 모드가 추가로 포함되어 있습니다 (LICENSING.md에서 이 저장소에 포함되지 않은 구성 요소에 관한 라이선스 내용을 확인하세요).
무엇이 다른가요?
대화는 채팅 기록이 아닌, 편집 가능한 트리(tree)입니다
대부분의 에이전트(agent)는 단일 선형 기록(linear transcript)을 제공하며, 운이 좋다면 이를 되감기(rewind)할 수 있을 뿐입니다.
Juggler는 트리(tree) 구조를 제공합니다. 어떤 지점에서든 하위 스레드(sub-thread)로 분기될 수 있으며, 하위 스레드는 다시 또 다른 분기를 만들 수 있습니다. 사용자는 이 구조를 직접 탐색하고, 검사하고, 편집할 수 있습니다.
UI는 밀러 컬럼(Miller columns) 방식을 사용합니다. 왼쪽에는 루트(root)가 있고, 선택된 항목은 오른쪽으로 속성(properties)과 자식(children) 요소로 확장됩니다. (Finder의 열 보기(column view)를 사용해 보셨다면, 기본적인 동작 방식을 이미 이해하신 것입니다.)
모든 것이 확장 기능(extension)입니다
코어 앱(core app)은 문서와 오케스트레이션(orchestration)을 관리합니다. 문서를 구성하는 거의 모든 객체는 JavaScript 확장 기능으로 정의됩니다.
- 컨텍스트 항목 (Context items) — 대화 내의 모든 항목 유형(
read-file,replace-text,bash등)은 LLM과 통신하는 방식과 UI에 표시되는 방식을 모두 제어합니다. - 전략 (Strategies) —
plan,research와 같은 고수준의 LLM 루프(loop)나 여러분이 상상해낸 독창적인 아이디어들도 모두 플러그인(plugin)입니다. - 명령어 (Commands) —
/clear나/compact와 같은 슬래시 명령어(slash commands) 역시 세션 문서(session document)를 조작하는 플러그인일 뿐입니다.
모든 LLM 워크플로(workflow)가 터미널에서 숨어 지내는 헤드리스(headless) Python 스크립트로 남기를 원하는 것은 아닙니다. 만약 오케스트레이션 아이디어에 자체적인 UI, 컨트롤 또는 시각화가 필요하다면, Juggler는 이를 위한 플랫폼이 되어줍니다.
<p align="center"> <img src="https://juggler.studio/assets/screenshot-extensions.webp" alt="Juggler's LLM-facing tools defined as extensions" width="760"> </p> <p align="center"><em>모든 것이 플러그인입니다. 심지어 read/write/bash 도구조차 여러분이 검사하거나, 포크(fork)하거나, 교체할 수 있는 확장 기능으로 정의되어 있습니다.</em></p>멀티 클라이언트 아키텍처를 갖춘 데스크톱 앱
Juggler는 네이티브 데스크톱 앱처럼 보이지만, 그 내부에는 실시간 협업 세션 (collaborative session)을 제공하는 로컬 웹서버 (local webserver)가 작동하고 있습니다. 앱은 하나의 클라이언트일 뿐입니다. 브라우저 탭이 또 다른 클라이언트가 될 수 있고, 다른 기기가 또 다른 클라이언트가 될 수도 있습니다.
즉, 코드가 있는 곳(로컬 워크스테이션, 개발용 박스, 서버 팜 등)에서 서버를 실행하고, 편리한 곳 어디에서든 뷰 (view)를 연결할 수 있다는 의미입니다.
<p align="center"> <img src="https://juggler.studio/assets/screenshot-browser.webp" alt="One Juggler session with multiple synced clients" width="760"> </p> <p align="center"><em>하나의 세션, 여러 클라이언트 — 데스크톱 앱과 브라우저 뷰가 동기화된 상태를 유지합니다.</em></p> <p align="center"> <img src="https://juggler.studio/assets/screenshot-large.webp" alt="Juggler on a large desktop screen" width="600"> <img src="https://juggler.studio/assets/screenshot-mobile.webp" alt="Juggler in a phone browser" width="170"> </p> <p align="center"><em>대형 화면이든 주머니 속 크기든: 데스크톱 앱이든 휴대폰의 원격 브라우저든 동일한 실시간 세션을 사용합니다.</em></p>모델 지원
Juggler는 흔히 쓰이는 모델들에 연결됩니다: Claude Code (CLI 또는 API를 통해), OpenAI (codex 플랜 또는 API), Gemini, Ollama, OpenRouter, Z.AI, Deepseek 등. 더 많은 제공업체 (providers)를 추가하는 것도 쉽습니다. 만약 사용 중인 모델이 없다면, 이웃에 있는 친절한 LLM에게 PR (Pull Request)로 추가해 달라고 요청하세요.
소스에서 빌드하기
확장 기능 (extensions) 시스템의 의도는 대부분의 사용자가 실제로 앱을 빌드할 필요가 없도록 하는 것입니다. 만약 빌드가 필요하다면, 전체 설정 방법은 CONTRIBUTING.md를 참조하세요. 요약하자면 다음과 같습니다:
git clone --recurse-submodules https://github.com/juggler-ai/juggler.git
cd juggler && make build
이미 --recurse-submodules 없이 클론했다면, 다음 명령어로 가져올 수 있습니다:
git submodule update --init --recursive
Windows 바이너리는 make build-windows를 통해 어떤 호스트에서든 교차 컴파일 (cross-compile)이 가능하며, Linux 데스크톱 앱은 반드시 네이티브 (natively)로 빌드해야 합니다.
기술 스택
Juggler는 부가적인 기능 없이 간결한 네이티브 앱입니다. 백엔드는 Go이며, 윈도우 관리(windowing)를 위해 Wails를 사용합니다. UI는 Go 백엔드에 의해 제공되는 HTML/JS입니다. 세션 문서(Session documents)는 Yjs를 통해 저장 및 동기화됩니다. 확장 프로그램(Extensions)은 JavaScript입니다. Electron은 사용하지 않습니다.
프론트엔드는 TypeScript 대신 타입 체크가 적용된 JavaScript를 사용합니다. 타입은 JSDoc에 정의되며, CI에서 엄격한 정적 린팅(static linting)을 통해 강제됩니다. 소스 코드와 배포되는 결과물 사이에 별도의 빌드 단계는 없습니다.
기여하기 (Contributing)
설정, 테스트 명령 및 프로젝트 컨벤션(conventions)은 CONTRIBUTING.md를 참조하세요. 보안 문제의 경우, 공개 이슈 트래커(public issue tracker) 대신 SECURITY.md에 설명된 비공개 채널을 사용해 주세요.
라이선스 (License)
Juggler의 애플리케이션 코드는 GNU Affero General Public License v3.0 이상 라이선스를 따릅니다. 확장 SDK (web/sdk/) 및 번들된 확장 프로그램 (web/extensions/)은 Apache-2.0 라이선스를 따르므로, 카피레프트(copyleft) 의무 없이 소스 코드를 공개하지 않는 확장 프로그램을 포함하여 자유롭게 제작할 수 있습니다. 전체 라이선스 구조는 LICENSING.md를 참조하세요.
AGPL 부분은 자유롭게 사용, 수정 및 재배포할 수 있지만, 배포하거나 서비스로 호스팅하는 모든 수정 버전은 반드시 AGPLv3로 공개되어야 합니다. 이를 활용하여 폐쇄형 소스(closed-source) 작업을 하고 싶다면, 상업적 라이선스 논의를 위해 저에게 연락해 주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기