# D3RO-VOICE V2 — 멀티플랫폼 마스터 플랜 > Windows Electron → Mac + Web + iOS + Android 확장 > 완전 로컬 → 하이브리드 (로컬 + 클라우드) 전환 --- ## 1. 전략 결정 요약 | 항목 | 결정 | |------|------| | **타겟 플랫폼** | 전부 동시 — Mac + Web + iOS + Android | | **타겟 사용자** | 개인 → 팀 확장 (Notion/Slack 성장 모델) | | **AI 인프라** | 하이브리드 — 데스크톱=로컬(Ollama+Whisper), 모바일/웹=클라우드 | | **클라우드 STT** | Google Cloud Speech-to-Text | | **클라우드 LLM** | Anthropic Claude API | | **데이터 동기화** | 클라우드 — Supabase (PostgreSQL + Realtime) | | **인증** | Supabase Auth (OAuth: Google/GitHub/Apple + Email) | | **파일 저장소** | AWS S3 / Cloudflare R2 | | **모바일** | React Native (Expo) | | **웹** | Next.js | | **수익 모델** | 프리미엄 구독 — Free / Pro / Team | | **디자인 시스템** | D3RO 인스트루먼트 미학 유지 | | **코드 재사용** | V1 비즈니스 로직 최대 재사용 (packages/core) | | **CI/CD** | 내부 GitLab CI/CD | | **타임라인** | AI 바이브코딩 기반 — 빠른 개발 | --- ## 2. Monorepo 구조 ``` d3ro-voice-v2/ ├── packages/ │ ├── core/ ← 공유 비즈니스 로직 (타입, 유틸, 서비스 인터페이스) │ ├── ui/ ← 공유 DS 컴포넌트 (MetalCard, PhosphorText 등) │ ├── api-client/ ← Supabase + AI API 래퍼 │ └── i18n/ ← 공유 i18n (12개 locale) ├── apps/ │ ├── desktop/ ← Electron (기존 V1 진화) │ ├── web/ ← Next.js │ └── mobile/ ← React Native (Expo) ├── server/ │ ├── supabase/ ← Supabase 마이그레이션/함수 │ └── edge-functions/ ← STT/LLM 프록시, 웹훅 ├── infra/ │ ├── .gitlab-ci.yml ← GitLab CI/CD │ └── docker/ ← 개발용 Docker (Supabase local) ├── turbo.json ← Turborepo 설정 ├── pnpm-workspace.yaml └── package.json ``` --- ## 3. 프리미엄 구독 티어 | 티어 | 가격 | 전사 | LLM | 동기화 | 팀 | |------|------|------|-----|--------|-----| | **Free** | $0 | 월 5시간 | 월 50회 | 1기기 | - | | **Pro** | $10/월 | 무제한 | 무제한 | 5기기 | - | | **Team** | $20/인/월 | 무제한 | 무제한 | 무제한 | 협업+관리자 | --- ## 4. 핵심 아키텍처 ### 4.1 하이브리드 AI 파이프라인 ``` [데스크톱] 마이크 → SoX → faster-whisper (로컬) → Ollama (로컬) → 로컬 DB ↓ 동기화 Supabase DB [모바일/웹] 마이크 → WebRTC → Google Cloud STT (클라우드) → Claude API (클라우드) ↓ Supabase DB ``` ### 4.2 데이터 동기화 ``` Supabase PostgreSQL (SSOT) ├── auth.users ├── public.meetings (회의 세션) ├── public.meeting_memos (메모) ├── public.meeting_documents (생성 문서) ├── public.transcripts (전사 세그먼트) ├── public.teams / team_members └── public.subscriptions Row Level Security (RLS) - 개인: user_id = auth.uid() - 팀: team_id IN (user's teams) Realtime 구독 - 회의 진행 중 실시간 전사 동기화 - 팀원 간 문서 편집 동기화 ``` ### 4.3 파일 저장소 ``` Cloudflare R2 / AWS S3 ├── audio/{user_id}/{session_id}.wav (녹음 원본) ├── exports/{user_id}/{doc_id}.pdf (내보내기) └── avatars/{user_id}.jpg ``` --- ## 5. Phase 로드맵 (AI 바이브코딩 기준) ### Phase V2-1: Monorepo + Core 추출 (2~3일) - Turborepo + pnpm 세팅 - V1에서 packages/core 추출 (타입, 유틸, 서비스 인터페이스) - packages/ui 추출 (DS 컴포넌트) - packages/i18n 추출 - apps/desktop이 packages/* import하여 기존대로 동작 확인 ### Phase V2-2: Supabase 인프라 (2~3일) - Supabase 프로젝트 생성 - DB 스키마 마이그레이션 (SQLite → PostgreSQL) - Auth 설정 (Google/GitHub/Apple OAuth) - RLS 정책 - Edge Functions: STT 프록시, LLM 프록시 ### Phase V2-3: Web App MVP (3~5일) - Next.js 앱 생성 - Supabase 연동 (Auth + DB + Realtime) - 녹음 (Web Audio API) → Google Cloud STT → Claude → DB - 회의록 생성/편집 UI (packages/ui 재사용) - 결제 연동 (Stripe) ### Phase V2-4: 데스크톱 동기화 (2~3일) - apps/desktop에 Supabase 클라이언트 추가 - 로컬 SQLite ↔ Supabase PostgreSQL 양방향 동기화 - 오프라인 지원 (로컬 우선, 온라인 시 동기화) ### Phase V2-5: Mac 빌드 (1~2일) - electron-builder macOS 타겟 - SoX macOS 바이너리 번들 - sidecar macOS PyInstaller 빌드 - Code signing + Notarization ### Phase V2-6: Mobile App MVP (3~5일) - React Native (Expo) 프로젝트 생성 - Supabase Auth 연동 - 녹음 (expo-av) → Google Cloud STT → Claude → DB - 회의록 뷰어/편집 - 푸시 알림 (회의록 완료) ### Phase V2-7: 팀 기능 (3~5일) - 팀 생성/초대/관리 - 회의록 팀 공유 + RLS - 코멘트 시스템 - 팀 대시보드 (통계) ### Phase V2-8: 결제 + 출시 (2~3일) - Stripe 결제 연동 (Free/Pro/Team) - 사용량 추적 (전사 시간, LLM 호출) - 앱스토어 출시 (iOS/Android) - 랜딩 페이지 업데이트 --- ## 6. 기술 상세 ### packages/core 추출 대상 (V1에서) ``` types.ts → packages/core/src/types/ errors.ts → packages/core/src/errors.ts ipc-channels.ts → packages/core/src/channels.ts (→ API 엔드포인트 매핑) meeting-markdown.ts → packages/core/src/utils/markdown.ts markdown-to-docx.ts → packages/core/src/utils/docx.ts i18n/*.json → packages/i18n/locales/ ``` ### packages/ui 추출 대상 ``` components/ds/ → packages/ui/src/ MetalCard, PhosphorText, Led, PhysicalButton, ScreenPanel, CrtDisplay, InstrumentPanel, MetalDial, ButtonGroup theme.ts → packages/ui/src/theme.ts ``` ### 서비스 추상화 패턴 ```typescript // packages/core/src/services/ai-service.ts interface AIService { transcribe(audio: Blob, options: STTOptions): Promise generate(prompt: string, options: LLMOptions): Promise chatStream(messages: Message[], options: ChatOptions): AsyncGenerator } // apps/desktop → LocalAIService (Ollama + faster-whisper) // apps/web/mobile → CloudAIService (Google STT + Claude API) ``` --- ## 7. GitLab CI/CD ```yaml stages: - lint - test - build - deploy # Monorepo 캐싱 variables: TURBO_TEAM: d3ro TURBO_REMOTE_CACHE: true lint: script: pnpm turbo lint test: script: pnpm turbo test build:desktop: script: pnpm turbo build --filter=@d3ro/desktop artifacts: [dist/] build:web: script: pnpm turbo build --filter=@d3ro/web artifacts: [.next/] deploy:web: script: vercel deploy --prod only: [main] ``` --- ## 8. 설계 리뷰 결정사항 (2026-04-08) | 항목 | 결정 | |------|------| | **IPC 추상화** | Adapter 패턴 — core는 순수 비즈니스 로직, transport는 adapter로 추상화 | | **동기화 전략** | Local-first + Cloud sync — 데스크톱은 SQLite 우선 + Supabase 동기화, 웹/모바일은 Supabase 직접 | | **레포 전략** | 기존 레포 안에서 monorepo로 전환 (apps/desktop으로 기존 코드 이동) | | **오프라인** | 데스크톱만 완전 오프라인 지원 (로컬 Ollama+Whisper), 모바일/웹은 클라우드 필수 | | **실시간 협업** | MVP부터 지원 — Supabase Realtime + CRDT (Yjs) | | **모바일 CI** | GitLab Runner 직접 (Mac Runner for iOS, Linux for Android) | | **브랜딩** | D3RO Voice 유지 | --- ## 9. 리스크 & 완화 | 리스크 | 영향 | 완화 | |--------|------|------| | Supabase 무료 티어 한계 | DB 500MB, Auth 50K MAU | Pro 업그레이드 ($25/월) | | Google STT 비용 | $0.006/15초 | 사용량 제한 + 프리미엄 모델 | | Claude API 비용 | $3/1M input tokens | 요약용 Haiku 사용, 캐싱 | | React Native 성능 | 긴 전사 목록 렌더링 | FlatList + 가상화 | | 오프라인→온라인 동기화 충돌 | 데이터 일관성 | CRDT 또는 last-write-wins |