WKTR — Git Worktree를 시각적으로 관리하는 데스크탑 앱을 만들었다

거대한 프로젝트에서 브랜치 전환할 때마다 IDE가 뻗어서 알게 된 Git Worktree. 터미널로 관리하기 번거로워서 React + Tauri로 네오브루탈리즘 디자인의 데스크탑 앱을 만들었다.

WKTR — Git Worktree를 시각적으로 관리하는 데스크탑 앱을 만들었다

Git Worktree를 사용하게 된 계기

요즘 Git Worktree가 다시 주목받는 이유는 Claude, Copilot 같은 AI Agent들이 서로 충돌 없이 병렬로 작업하기 위해서라고 한다. 하지만 내가 worktree를 처음 알게 된 건 훨씬 현실적인 문제 때문이었다.

거대한 프로젝트에서 브랜치를 전환할 때마다 IDE가 뻗었다. 인덱싱이 다시 돌고, Gradle sync가 걸리고, 빌드 캐시가 날아가고... 급한 hotfix를 위해 브랜치를 바꿨다가 다시 돌아오면 또 한참을 기다려야 했다. 그래서 자연스럽게 여러 작업 디렉토리를 따로 만들어두고 쓰다가, Git Worktree라는 정식 기능이 있다는 걸 알게 됐다.

문제는 워크트리를 터미널에서 관리하는 게 은근히 번거롭다는 것이었다. git worktree list, git worktree add, 경로 지정, 안 쓰는 워크트리 정리... 명령어 자체는 어렵지 않지만, 어떤 워크트리에서 뭘 하고 있는지 한눈에 파악하기가 어려웠다. 그래서 직접 GUI 앱을 만들기로 했다.

WKTR Dashboard
WKTR 대시보드 — 모든 워크트리의 상태를 한눈에 볼 수 있다

기술 스택 — 왜 React + Tauri인가

처음에는 Compose Multiplatform을 써보려 했다. 안드로이드 개발자니까 Kotlin으로 데스크탑 앱도 만들 수 있으면 좋겠다 싶었는데, 결론부터 말하면 실패했다. 데스크탑 환경에서의 생태계가 아직 충분히 성숙하지 않았고, 레퍼런스도 부족했다.

결국 가장 보편적인 데스크탑 앱 스택을 선택하게 됐다.

  • Tauri v2 — Electron 대비 앱 크기가 2~5MB 수준으로 가볍고, Rust 기반이라 보안과 성능이 좋다
  • React 19 + TypeScript — 프론트엔드
  • Vite — 빌드 도구
  • Zustand — 상태 관리
  • Vanilla CSS — 디자인 시스템

바이브 코딩을 여러 번 해보다 보니 느낀 건데, AI가 채택하는 도구들이 꽤 공통적이다. React, TypeScript, Vite, Zustand... 이런 조합은 AI가 가장 잘 다루는 스택이기도 하고, 커뮤니티 레퍼런스가 많아서 결과물의 품질도 높게 나오는 것 같다.

재미있는 건 파일시스템과 상호작용하는 백엔드 부분이다. Tauri의 Rust 커맨드로 Git CLI를 호출하는 구조인데, 이 Rust 코드는 무려 AI가 짰다. 14개의 Tauri 커맨드가 있고, git worktree list --porcelain 파싱부터 git diff, git status 처리까지 전부 들어있다. 나는 Rust를 모르기 때문에 읽어보고 "아 이렇게 돌아가는구나" 하고 확인만 했다. 잘 돌아간다.

WKTR Branches
브랜치 탐색기 — 어떤 브랜치에 워크트리가 있는지, 없는 브랜치에서 바로 생성할 수 있다

디자인 — 네오브루탈리즘

바이브 코딩으로 만든 프로젝트들의 산출물을 구경하다 보면 가끔 굉장히 힙한(?) 디자인이 눈에 들어왔다. 두꺼운 테두리, 블러 없는 하드 쉐도우, 선명한 색상 대비... 뭔가 의도적으로 "거칠지만 세련된" 느낌이었는데, 이름을 몰랐다.

이번에 알게 된 이름이 네오브루탈리즘(Neobrutalism)이었다. 웹 디자인 트렌드 중 하나로, 브루탈리즘 건축에서 영감을 받았다고 한다. 특징은 명확하다:

  • 3px 두께의 검정 테두리
  • 블러 없는 하드 오프셋 쉐도우 (5px 5px 0px 0px)
  • 선명한 원색 팔레트 (오렌지, 퍼플, 그린, 레드)
  • 직각 모서리 (border-radius: 0)
  • hover 시 translate + shadow 이동으로 눌리는 듯한 인터랙션

이 트렌드도 언젠가 시들해지겠지만, 개인 취향이랑 잘 맞아서 차용했다. 따뜻한 크림색 배경에 볼드한 컴포넌트들이 올라가는 느낌이 꽤 마음에 든다. 다크 모드도 지원한다.

배포 — 소스는 비공개, 앱은 공개

AI가 짜준 코드를 오픈소스로 공개하는 것에 대해 좀 회의적이다. 솔직히 가치가 있냐고 하면 뭐 잘 모르겠고, 가끔 상도없는(?) 행위도 많이 나오는 걸 보기도 해서... 소스 코드는 공개하지 않기로 했다.

대신 빌드된 앱은 누구나 설치할 수 있게 배포했다. 배포 파이프라인은 이렇게 구성했다:

  1. 데스크탑 앱 빌드 — GitHub Actions에서 macOS (Apple Silicon + Intel), Windows, Linux용 앱을 동시에 빌드
  2. Docker 이미지 빌드 — 빌드된 앱들(.dmg, .msi, .AppImage, .deb)과 앱 소개 랜딩 페이지를 함께 서빙하는 nginx 기반 Docker 이미지를 만든다
  3. 홈서버 배포 — Docker 이미지를 GHCR에 올리고, 홈서버에서 pull 받아 운영한다

Homebrew Tap도 만들어뒀으니 macOS 사용자는 brew install로도 설치할 수 있다.

마치며 — 아이디어와 진입 장벽에 대한 생각

아이디어만 있으면 반복적으로 하는 일을 더 쉽게 할 수 있는 나만의 프로그램은 정말 쉽게 만들 수 있는 시대가 됐다. 이 프로젝트도 핵심 기능은 며칠이면 돌아가는 수준까지 왔으니까.

그런데 그만큼 카피의 비용도 저렴해졌다. AI로 생산성을 올리면서도 진입의 허들을 높이려면 어떻게 해야 할까, 고민이 많이 된다.

최근 엄재웅 님이 공개하신 Hot Swan 같은 것이 정말 좋은 사례라고 생각한다. 이 프로젝트는 정말로 안드로이드에 대한 해박한 지식 없이는 만들 수 없는, AI가 학습하지 못한 영역의 제품이라 카피가 어려운 프로젝트이기 때문이다. 내가 쉬우면 남도 쉬운 영역이라는 생각으로, 본질적인 도메인 지식의 차이를 만들어내기 위해 계속 노력해야겠다는 생각을 하고 있는 중이다.

이번 프로젝트 자체는 온전하게 잘 출시되었는데, 관심 있으신 분들은 wktr.ryukim.in에서 가이드에 따라 설치해서 사용해 주시면 감사하겠습니다.