VZZK

2024.07

다운로드 56,000+ · 누적 방송 55,600+ (2026-08 기준)

무엇
치지직 스트리머가 쓰는 데스크톱 봇 앱이다.
방송을 하면서 채팅을 읽고 후원에 반응하고 화면 효과까지 챙기는 일은 혼자 감당하기 어렵다.
어떻게
채팅과 후원 이벤트를 소켓으로 받아 열한 종의 봇을 돌리고, 결과를 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 rodioOS 오디오 장치에 직접 재생해 브라우저 자동재생 정책·탭 포커스에서 자유롭고 가상 오디오 케이블로 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장.

상세 포트폴리오 →