Electron 대신 Tauri 2로 다시 짠 크로스플랫폼 GUI 프록시 클라이언트. Rust로 wrapping한 데스크탑 + Go의 mihomo 코어를 한 묶음으로 묶었다. 데스크탑 앱이 가벼우면서 강력하게 만드는 패턴의 좋은 케이스 스터디.
"룰 기반 터널"이라는 개념부터.
Clash는 원래 Go로 짠 룰 기반 네트워크 터널(rule-based tunnel)이다. 어떤 트래픽은 직접 보내고, 어떤 트래픽은 프록시 서버 A로 보내고, 또 다른 트래픽은 차단 — 이런 규칙을 YAML로 정의해 두면 알아서 라우팅한다.
여기서 핵심 용어 정리.
"왜 GUI가 필요한가" — Clash/mihomo는 본래 명령줄 도구로, YAML 설정 파일을 직접 편집해야 했다. 일반 사용자에겐 진입장벽이 너무 높다. GUI 클라이언트는 — 프로파일 가져오기, 노드 선택, 룰 편집, 트래픽 시각화, 시스템 트레이 통합을 마우스 클릭으로 가능하게 한다. Clash Verge Rev는 그 GUI 중 데스크탑에서 가장 활발히 유지되는 옵션 중 하나.
전체 글의 핵심 메시지.
같은 데스크탑 GUI 앱이라도 — Electron(Chromium + Node.js 임베드)으로 만들면 100MB가 넘는다. Tauri 2(OS 기본 WebView + Rust)로 만들면 10MB 안으로 줄어든다. 메모리 사용량도 1/3 수준. 같은 기능, 다른 골격.
Clash Verge Rev는 "Tauri 2로 데스크탑 앱을 다시 짜면 어떻게 보이나"의 모범 사례다. 거기에 Go로 짠 mihomo 코어를 Rust 측에서 자식 프로세스로 띄워 — 세 언어 생태계가 한 앱에 공존하는 흥미로운 케이스이기도 하다.
트렌딩 7위까지 올라온 맥락.
Clash Verge Rev는 사실 2023년부터 있던 레포다. 2026년에 다시 트렌딩에 오른 이유는 3가지로 정리된다.
2023년 본가 Dreamacro/clash가 유지보수 중단을 선언. 그 빈자리를 — 코어는 MetaCubeX/mihomo, 데스크탑 GUI는 clash-verge-rev가 차지하며 사실상의 표준이 됐다. 2026년 들어 안정성·기능이 충분히 성숙해, 신규 사용자 유입이 다시 늘고 있다.
2024년 말 Tauri 2가 정식 출시. 모바일(iOS/Android) 지원 + 새 권한 시스템 + IPC 개편. 데스크탑 앱을 만들 때 Electron 대안으로 Tauri 2를 평가하는 개발자들이 — "실제로 어떻게 짜야 하지?"의 답을 찾을 때 clash-verge-rev 코드를 참조하는 흐름이 생겼다. mihomo 같은 외부 코어 통합, 시스템 트레이, 권한 처리 등 Tauri 2의 거의 모든 기능을 실전에 활용한 케이스.
Windows (x64/x86), Linux (x64/arm64), macOS 11+ (Intel/Apple Silicon) — 한 코드베이스에서 빌드. 메모리 사용량도 Electron 기반 경쟁자(Clash for Windows 등)보다 압도적으로 적다. "가볍고 빠르고 어디서나 동작"이 입소문의 핵심.
3개 언어 생태계가 한 앱에 공존.
OS의 기본 웹뷰(macOS WKWebView, Windows WebView2, Linux WebKitGTK)를 Rust 셸에 임베드해 데스크탑 앱을 만드는 프레임워크. Chromium을 같이 번들하지 않아서 크기·메모리가 작다. Rust 측에서는 시스템 트레이, 단축키, 파일 시스템, 네트워크, 자식 프로세스 관리 등을 처리.
Tauri 앱에 외부 바이너리(여기선 mihomo)를 sidecar(부속 프로세스)로 포함시키는 기능. src-tauri/tauri.conf.json에 등록하면 패키징 시 자동으로 함께 들어가고, Rust 코드에서 Command::new로 자식 프로세스로 띄울 수 있다. Clash Verge Rev는 mihomo 바이너리를 sidecar로 묶어 사용자가 따로 설치하지 않아도 되게 만든다.
Rust 측과 웹뷰(프론트엔드) 측의 통신. Tauri 2의 commands(프론트 → Rust 함수 호출) + events(Rust → 프론트 이벤트 푸시) 양방향 채널을 사용. mihomo의 HTTP API(127.0.0.1의 RESTful 인터페이스)도 Rust 측에서 프록시해서 프론트에 전달한다.
UI는 React 19로 작성. src/ 폴더에 컴포넌트·페이지·훅·서비스 분리. 전역 상태는 @tanstack/react-query v5(서버 상태)로 관리. TypeScript로 타입 안전성 확보.
Next-gen 프론트엔드 빌드 도구. esbuild + Rollup을 기반으로 빠른 HMR(Hot Module Reload) + 작은 번들 사이즈 제공. pnpm dev로 띄우면 Vite dev 서버가 돌고, Tauri는 그 dev 서버를 웹뷰에 로드.
구글 머티리얼 디자인 시스템의 React 구현체. 라이트/다크 모드, 커스텀 컬러 스킴, CSS Injection까지 사용자 커스터마이징 가능.
Go로 짠 네트워크 터널 엔진. SOCKS5/HTTP/HTTPS/VMess/Trojan/Hysteria 등 모든 프로토콜 처리, 룰 매칭, DNS 처리, 부하 분산. RESTful API(기본 9090 포트)로 외부에서 제어 가능. clash-verge-rev는 이 mihomo를 자식 프로세스로 띄우고 — RESTful API로 노드 변경·룰 변경·트래픽 조회를 한다.
패키지 매니저는 pnpm(npm/yarn 대비 디스크 공간 절약 + 빠른 설치). GitHub Actions로 — 푸시할 때마다 자동 빌드 + 5개 플랫폼(Win-x64, Win-x86, Linux-x64, Linux-arm64, macOS-universal) 바이너리를 만들어 Release에 자동 첨부.
설정·프로파일을 WebDav 호환 서버(Nextcloud 등)에 자동 백업. 여러 기기 간 동기화에 사용. Rust 측에서 HTTP 요청을 처리.
이 3개 언어 스택을 한 패키지로 묶는 게 핵심 도전. JS/TS(프론트) ↔ Rust(셸) ↔ Go(코어) 세 계층 사이의 빌드 파이프라인이 복잡한데, Tauri 2가 sidecar 패턴으로 이걸 깔끔하게 처리해 준다.
한 앱처럼 보이지만 사실 3개의 프로세스.
한 앱처럼 보이지만 사실은 3개의 분리된 프로세스가 있다. 사용자가 GUI에서 "노드 A로 바꿔" 클릭하면 — 프로세스 1(React)이 IPC로 프로세스 2(Rust)에 명령 → 프로세스 2가 HTTP API로 프로세스 3(mihomo)에 명령 → mihomo가 실제 라우팅 변경. 이 3단 통신이 거의 모든 작업의 패턴이다.
mihomo Go 바이너리를 Tauri sidecar로 포함시켜 사용자 설치를 한 번에 끝낸다. tauri.conf.json의 externalBin 배열에 추가하면 — 빌드 시 자동 포함, 권한 자동 부여, 실행 시 자식 프로세스로 띄움. "여러 언어 코어를 하나의 데스크탑 앱으로 묶는 표준 패턴".
웹뷰(JS)는 보안상 OS 자원을 못 만진다. 대신 Rust 측이 command로 노출한 함수만 호출 가능. 파일 쓰기·시스템 프록시 설정 변경·TUN 모드 토글 같은 권한 필요 작업은 Rust 함수로만 가능. 권한 누수 방지의 핵심.
mihomo의 9090 포트 API를 직접 노출하면 보안 위험. 대신 Rust 측이 — JS 측 요청을 받아 검증한 뒤 localhost mihomo API로 프록시. 외부에서 들어오는 요청은 막고, 내부 요청만 허용.
창을 닫아도 트레이에 남아 동작 — VPN/프록시 앱의 표준 UX. Tauri 2의 시스템 트레이 API + 글로벌 단축키 API로 OS별 차이 추상화. "창 닫음"은 트레이로 minimize, "Quit"만 진짜 종료로 분기.
사용자는 보통 프록시 제공자(VPN 서비스)로부터 YAML 프로파일 URL을 받는다. clash-verge-rev는 — URL 가져오기 + Merge(여러 프로파일 합치기) + Script(JavaScript로 동적 변경)를 지원. "가져온 프로파일에 내 규칙 한 줄 끼우기" 같은 흔한 시나리오 해결.
Tauri 표준 모노레포 구조.
UI 전체. pages/에 메인 화면들(Proxies·Profiles·Connections·Logs·Rules·Settings 같은 탭), services/에 Rust command 호출 래퍼들이 있다. 프론트 개발자는 거의 이 폴더만 만져도 된다.
JS → Rust 호출이 시작되는 곳. #[tauri::command] 어트리뷰트가 붙은 함수들. 예: set_proxies(현재 프록시 노드 변경), get_clash_info(mihomo 정보 조회), patch_clash_config(설정 패치). 새 기능 추가 시 거의 항상 여기 함수가 하나 더 생긴다.
mihomo 자식 프로세스를 띄우고·죽이고·재시작하고·로그를 읽는 코드. "코어 헬스 체크 + 비정상 종료 시 자동 재시작" 같은 운영 로직이 여기. Tauri Sidecar API와 Rust의 std::process·tokio::process를 섞어 사용.
앱 메타데이터(이름·버전·아이콘)·창 설정(크기·제목)·sidecar 등록·번들 옵션·플랫폼별 권한 등이 모두 여기. Tauri의 모든 설정이 모이는 곳이라, Tauri 학습 시 첫 정독 대상.
데스크탑 앱 개발자가 봐야 할 패턴.
Tauri 1 시절엔 "장난감" 평가가 많았지만, Tauri 2가 모바일 지원 + 새 권한 모델로 정식화한 이후 clash-verge-rev 같은 본격 앱들이 나왔다. 같은 기능의 Electron 대비 바이너리 크기 1/10, 메모리 1/3이 실측 가능한 차이.
여러 언어 코어(Go·Python·Rust)를 한 데스크탑 앱에 묶을 때 — sidecar는 가장 깔끔한 패턴. 빌드·배포·자식 프로세스 관리가 자동화된다. Python 데이터 분석 코어 + Rust 셸 + React UI 같은 조합도 같은 패턴으로 가능.
웹뷰가 OS 자원을 직접 못 만지는 게 약점이 아니라 보안 자산이다. Rust commands로 명시적으로 노출한 함수만 가능. 잘못 만든 Electron 앱이 흔히 빠지는 RCE 위험을 구조적으로 차단.
mihomo의 9090 포트를 외부에 노출하면 큰 보안 위험. Rust 측이 프록시해서 — 인증된 IPC 요청만 통과시키는 패턴. 외부 도구 통합 시 표준 운영 패턴이라 다른 곳에도 적용 가능.
7개 언어 README(중·영·스페인·러·일·한·페르시아) + 앱 내 13개 로케일 i18n(ar·de·en·es·fa·id·jp·ko·ru·tr·tt·zh·zhtw). 오픈소스가 글로벌하게 퍼지려면 첫 페이지부터 영어 외 언어 옵션이 보여야 한다. 코드만큼 i18n 인프라가 중요하다는 사례.
실행 + 개발 환경.
Windows (x64/x86, Windows 10 이상), Linux (x64/arm64, WebKitGTK 4.1 필요), macOS 11+ (Intel/Apple Silicon). Release 페이지에서 OS별 인스톨러 다운로드.
일반 시스템 프록시 모드는 권한 없이 OK. TUN 모드는 가상 NIC 생성을 위해 — Windows에선 관리자, macOS/Linux에선 sudo·setuid가 필요. 앱이 안내해 준다.
Rust(rustup), Node.js 또는 Bun, 그리고 OS별 의존성. macOS는 Xcode CLT, Linux는 webkit2gtk·build-essential 등, Windows는 Microsoft C++ Build Tools + WebView2 런타임. Tauri 공식 문서의 "Prerequisites" 페이지가 정답.
패키지 매니저로 pnpm 사용. npm install -g pnpm으로 설치. pnpm i로 의존성 설치, pnpm dev로 dev 서버 + Tauri 실행.
난이도 ★~★★★★★.
Release 페이지에서 자기 OS용 인스톨러 받아 설치. 프록시 제공자 YAML URL을 가져와 등록 → 노드 선택 → 트래픽 확인. UX 흐름을 자기 도구의 참고로 사용.
레포 clone → pnpm i → pnpm dev. 어디 한 UI 텍스트를 자기 이름으로 바꿔 보기. Hot Reload가 동작하는 걸 확인. Tauri 개발 흐름 익히기.
src-tauri/src/cmd/에 get_current_time command 추가, src/services/에 호출 래퍼 추가, src/pages/ 어딘가에 버튼 + 결과 표시. JS → Rust → JS 왕복의 완전한 사이클을 손에 익힌다.
예: yt-dlp 바이너리를 sidecar로 추가하고, "URL 입력 → 다운로드" 기능을 만든다. tauri.conf.json의 externalBin 등록 → Rust 측에서 Command::new로 호출 → stdout을 IPC로 프론트에 스트리밍. sidecar 패턴 전 과정을 자기 손으로 굴려 본다.
clash-verge-rev를 fork해 핵심만 남기고 — Tauri 2 셸 + Sidecar 한 개 + 단순 UI로 미니멀한 템플릿을 만든다. 자기 도메인의 데스크탑 앱 시작점으로 활용. 1주일 분량으로 충분히 가능.
4주 코스.
Tauri 공식 사이트의 Getting Started 따라하기. 5개 OS에서 빌드 시도. Tauri 2의 권한 시스템(capabilities·permissions) 개념 익히기.
src-tauri/src/cmd/의 command들과 src/services/의 호출 래퍼들 — 페어로 읽으며 IPC 패턴 익히기. core/의 mihomo 관리 코드도.
자기 도메인의 외부 도구 한 개(yt-dlp·ffmpeg·llama.cpp 등)를 sidecar로 묶어 미니 앱 만들기. 빌드 → 패키징까지 한 번 완주.
mihomo 프로토콜·규칙 시스템·DNS 옵션 정독. 자기가 만드는 앱이 네트워크와 무관해도 — 룰 매칭, 우선순위, 메트릭, 헬스 체크 같은 개념은 다른 분야에도 적용된다.
관련 용어 한 번에.
tauri.conf.json의 externalBin 배열에 등록. 여러 언어 코어를 한 데스크탑 앱에 묶는 표준 패턴.레포·문서·관련 프로젝트.
pnpm i && pnpm dev 한 번이면 자기 OS에서 띄울 수 있다. 자기가 만들고 싶은 데스크탑 앱의 출발 템플릿으로 fork.