---
id: vzzk
type: project
title: VZZK
url: https://auejin.com/ko/projects/vzzk/
lang: ko
alternate:
  en: https://auejin.com/en/projects/vzzk/
updated: '2026-08-11'
---

# VZZK

2024.07

- **무엇** — 치지직 스트리머가 쓰는 데스크톱 봇 앱이다.
- **왜** — 방송을 하면서 채팅을 읽고 후원에 반응하고 화면 효과까지 챙기는 일은 혼자 감당하기 어렵다.
- **어떻게** — 채팅과 후원 이벤트를 소켓으로 받아 열한 종의 봇을 돌리고, 결과를 OBS 화면에 실시간 오버레이로 그린다. Tauri v2와 Angular, Rust(actix-web)로 만든 데스크톱 앱에 NestJS 클라우드 API를 붙였다.
- **새로움** — GitHub Actions로 세 운영체제 빌드를 직접 배포한다. 상용 배포 서비스를 쓰지 않고 혼자 운영한다.

## 요약

- 저장소: `vzzk`(데스크톱 앱), `vzzk-api`(클라우드 API)
- 기간: 2024-05-22 첫 커밋 ~ 2026-08-06 현재
- 기준일 두 계열: GA4/BigQuery에서 나온 수치는 **대시보드 스냅샷 2026-08-06**, 커밋·태그·테스트처럼 레포에서 나온 수치는 같은 날짜의 `vzzk` / `vzzk-api` 작업 트리 기준

---

## 1. 핵심 수치

| 지표 | 값 | 정의 / 관측창 |
|---|---:|---|
| 누적 세션 | **55,193** | `session_start` 세션 합. 2024-07-07 ~ 2026-08-05, 759일. DAU와 같은 차원별 행 구조 위에 있어 중복 합산에서 완전히 자유롭지 않다 |
| 최근 30일 평균 DAU | **90.6** | 전년 동기 75.6 대비 +19.8%, 직전 30일 90.1 대비 +0.6%. 차원별 행 합산이라 **상한값**이며 추세 비교용 |
| 4주 / 8주 잔존율 | **36.7% / 32.3%** | 해당 주차에 1회 이상 활성인 비율. 분모는 그 주차만큼 실제 관측된 코호트. 관측 가능한 최대 주차는 14주 |
| 최근 30일 세션당 에러율 | **0.16%** (5건 / 3,128세션) | 명시 로깅된 `%Fail` 이벤트만 센다 — 미처리 예외·크래시 텔레메트리는 없다. 5건 전부 `chzzk_loginFail`, 에러 0건인 날 26/30일 |
| vzzk 실행 중 방송에서 관측된 후원 | **₩30,027,318** / 44명 | 후원 이벤트의 `price` 합. 2026-05-01 ~ 2026-08-06, 98일. **vzzk의 매출이 아니며**, vzzk가 이 후원을 유발했는지는 이 데이터로 판정할 수 없다 |
| 누적 후원 추정 | 중앙 **₩2.54억**, 구간 **₩1.16억 ~ ₩4.01억** | Monte Carlo 10,000회. 26개월 중 22개월(2024-07~2026-04)은 98일 관측치로 역추정. 이 구간은 **표본 불확실성 구간이고 역추정 가정의 오차는 포함하지 않는다** |
| vzzk 자신의 월 매출 | **₩89,341** | 치지직 채널 구독 정산 실적. 2026-06·07 두 달 동일(= 구독 순증 0). 인프라 비용 약 ₩7,000(서버 $5/월). **구독자 데이터는 분석 파이프라인 밖** — 이탈·갱신을 볼 수 없다 |

부가 지표: 릴리스 태그 82개 / 749일(태그 간 중앙값 2일, 그중 GitHub Release가 게시된 태그 72개), 커밋 1,196개, 테스트 Rust 176개·웹 944 케이스(커버리지는 측정하지 않았다), 분석 인프라 월 비용 $0(BigQuery·GA4 Export 무료 한도 안. 사용량은 계측하지 않았고 API 서버·스토리지 비용은 이 값에 없다).

---

## 2. 이 제품이 지금 할 수 있는 것

**① 이벤트 처리가 전부 방송 PC 안에서 끝난다 — 서드파티 데스크톱 앱과 직접 결합**

치지직 채팅·후원 이벤트를 스트리머 PC에서 받아 처리하므로, 같은 PC의 다른 방송 도구와 직접 대화한다. TITS(아바타 물건 던지기)에 로컬 WebSocket `ws://localhost:42069`로 붙고, TTS는 Rust `rodio`로 **OS 오디오 장치에 직접 재생**해 브라우저 자동재생 정책·탭 포커스에서 자유롭고 가상 오디오 케이블로 OBS에 라우팅된다. 신청곡은 `yt-dlp`를 자식 프로세스로 띄워 로컬 HTTP Range 프록시로 중계한다. **호스팅형 웹 서비스가 구조적으로 넘을 수 없는 경계다.** 대가로 로컬 서버 접근 통제를 직접 만들어야 했다(`src-tauri/src/local_guard.rs`).

**② 서버에 스트리머 신원 정보가 없다 — 유출 사고의 폭발 반경이 구조적으로 작다**

2026-07 치지직은 외부 연동 플랫폼의 개인정보 유출(이메일·닉네임·내부 ID, 일부는 실명·생년월일·전화번호·통신사)에 대해 스트리머 주의 안내를 공지했다. vzzk-api는 **그 항목을 하나도 수집하지 않는다** — ORM·마이그레이션·사용자 테이블이 아예 없고, 시청자 세션에 담기는 것은 `channelId`·`channelName`·`expiresAt`뿐이며 치지직 accessToken은 담지 않는다. 스트리머 토큰은 서버가 아니라 사용자 PC의 OS 자격증명 저장소에 있고, 로그인은 딥링크에 토큰을 싣지 않는 PKCE 교환 코드다. **털릴 개인정보 DB가 애초에 없다.** (단, 원격 오버레이 상태 조회 경로는 아직 무인증 — §8.1)

**③ Tauri 배포·자동 업데이트를 상용 서비스 없이 자체 운영**

보통 CrabNebula Cloud 같은 구독형 서비스로 해결하는 구간을 GitHub Actions와 오브젝트 스토리지만으로 구성했다. 4플랫폼 매트릭스 빌드(Windows MSI / macOS arm64·x64 / Linux AppImage), 아티팩트별 minisign 서명, 업데이터 매니페스트만 `no-cache`로 올리는 배포, 코드 서명 인증서 갱신과 CI 시크릿 반영 자동화, 릴리스 직전 시크릿 검증 워크플로까지 직접 만들었다. **구독료 없이 서명 배포와 자동 업데이트가 돌아간다.**

**④ 제품 판단을 데이터로 하는 환경이 상시 가동**

GA4 이벤트를 활성화·가치창출·에러 3계층으로 설계하고 BigQuery로 내보내 759일 연속 시계열을 만든 뒤, 26개 쿼리를 **서버 없는 단일 HTML 대시보드**로 굽는다. 어떤 봇이 실제로 쓰이는지, 어디서 이탈하는지를 질문 단위로 조회할 수 있다. 이 환경이 있어서 "이벤트형 봇 전환율 1.8~7.9%" 같은 판단이 가능했고, 지표 결함 4건도 여기서 발견했다.

**과정에서 증명된 것**: 보안 감사로 배포 바이너리의 대칭 비밀 4종을 제거(HMAC → Ed25519 공개키 검증), 구버전 호환 경로를 감이 아니라 **연속 14일 호출 0** 관측으로 제거하는 절차 수립, 대시보드 집계 결함 4건 발견·수정(잔존율 우측 절단 W14 8.2%→38.4% 포함).

---

## 3. 본인 역할 — 1인 개발·운영

리뷰어가 없는 조건에서 규모를 유지하기 위해, 판단을 사람의 기억이 아니라 **자동화된 게이트와 레포에 박힌 규약**으로 옮기는 데 시간을 썼다.

| 영역 | 소유 범위 |
|---|---|
| 제품 | 봇 11종 기획, 오버레이 프로토콜 설계, PRO 게이팅 정책 |
| 클라이언트 | Angular 17(Signal 상태 + RxJS 이벤트, 봇 공통 기반 클래스), Rust(actix-web SSE 서버, OAuth/PKCE, 자격 검증, 키체인) |
| 서버 | NestJS `vzzk-api` — 원격 오버레이 sync, 시청자 세션 암호화, 레이트 리밋, Firebase 폴백 |
| 배포 | GitHub Actions 4플랫폼 매트릭스 빌드, 코드 서명, minisign 서명 자동 업데이트, 릴리스 자격증명 사전 검증 워크플로 |
| 품질 | cargo test / Karma 테스트, 오버레이 전용 정적 린트 자체 제작, PR·릴리스 이중 테스트 게이트 |
| 데이터 | GA4 이벤트 택소노미 설계, BigQuery 파이프라인, 대시보드 생성기, 수익 추정 모델 |
| 운영 | 릴리스 82회, 인증서 연 1회 갱신 자동화, 인프라 비용 관리 |

**1인으로 가능하게 만든 구조**: 봇 추가 비용을 상수로 만든 제네릭 기반 클래스와 코드 생성(`npm run gen:service`), Rust↔TypeScript 타입 바인딩 자동 생성(`npm run gen:bindings`, 커맨드 28개 + 타입 20개), 번들러를 거치지 않는 오버레이 HTML을 위한 자체 AST 린트, AI 에이전트용 규칙·워크플로·스킬 정의 39개 — 로딩·라우팅 메커니즘은 에이전트 도구가 제공하고 내가 작성한 것은 그 위에 올린 정의 파일이다.

**정직하게 남긴 것**: 확장 경로가 열려 있지 않은 단일 인스턴스 구조, 구버전 우회 경로 L1~L5 미제거, SR 가격 계측 공백(33,077건 중 1건), macOS 실사용 미관측, 13개 완결월이 이어지는 성장 평탄 구간, 그리고 **기술 구조가 감당하는 규모와 월 8만 원대 매출 사이의 간극**. 상세는 전체 포트폴리오 8장.

상세 포트폴리오: https://auejin.com/ko/projects/vzzk/portfolio/
