
100% 오프라인 AI 생산성 트래커를 구축하고 출시한 방법 (Tauri 2, Rust, Llama 3.2)
요약
Tauri 2와 Rust를 사용하여 프라이버시를 보호하는 100% 오프라인 AI 생산성 트래커 'Focus Stream'을 구축하고 Microsoft Store에 출시한 과정을 다룹니다. 로컬 LLM(Llama 3.2)을 온디바이스로 실행하기 위한 아키텍처와 모델 다운로드 전략을 설명합니다.
핵심 포인트
- 데이터 유출 방지를 위한 로컬 우선(Local-first) 아키텍처 설계
- Tauri 2와 Rust를 활용한 경량 데스크톱 애플리케이션 개발
- 설치 파일 크기 최적화를 위한 온디맨드 모델 다운로드 방식 적용
- libloading을 이용한 런타임 동적 DLL 로딩 및 추론 엔진 구현
몇 달간의 심야 코딩, 디버깅, 그리고 컴파일러 오류와의 사투 끝에, 마침내 중요한 이정표에 도달했습니다: 제 생애 첫 데스크톱 애플리케이션을 Microsoft Store에 출시했습니다. 🎉
이 앱의 이름은 Focus Stream입니다. 이 앱은 사용자가 PC에서 시간을 어떻게 보내는지 추적하고, 이를 AI가 생성한 집중 저널(focus journal)로 변환해 줍니다. 핵심은 무엇일까요? 완전히 온디바이스(on-device)로 실행된다는 점입니다. 계정도, 클라우드 데이터베이스도, 텔레메트리(telemetry)도 전혀 없습니다. 창 스냅샷(window snapshots), 활동 타임라인, 그리고 LLM 추론(inference)이 모두 로컬에서 이루어집니다.
이 포스트에서는 Focus Stream의 이면에 있는 아키텍처, 경량 데스크톱 앱에 로컬 거대 언어 모델(LLM)을 어떻게 탑재했는지, 그리고 이를 패키징하여 Microsoft Store에 배포하기 위해 무엇이 필요했는지를 공유하고자 합니다.
핵심 개념: 프라이버시 우선 AI
우리는 클라우드 기반의 활동 추적기가 사용자의 화면을 스캔한다는 뉴스를 모두 본 적이 있습니다. 생산성 추적은 매우 유용하지만, 화면 스냅샷, 열려 있는 문서, 활성 창 제목을 제3자 서버에 업로드하는 것은 심각한 프라이버시 위험으로 느껴집니다.
저는 AI 분석의 힘과 하루에 대한 자연어 질의(natural language query) 기능을 제공하면서도, 데이터가 기기를 전혀 떠나지 않는 도구를 만들고 싶었습니다.
이를 실현하기 위해, 저는 로컬 우선(local-first) 아키텍처를 설계했습니다:
[ User Desktop ]
│
▼ (Activity logs & snapshots sampled)
...
기술 스택 (Tech Stack)
저는 웹 생태계의 UI 유연성과 네이티브 성능의 시스템 후킹(system hooks) 사이의 균형을 맞춘 스택을 선택했습니다:
| 계층 (Layer) | 기술 (Technology) |
|---|---|
| 프론트엔드 (Frontend) | React 19, TypeScript, Vite, Recharts, Base UI |
| ... |
심층 분석: 로컬 LLM 과제 해결하기
데스크톱 애플리케이션 내부에서 로컬 LLM을 실행하는 것은 두 가지 주요 장애물을 발생시킵니다:
- 설치 파일 크기를 어떻게 작게 유지할 것인가? 사용자들을 돌아서게 만들지 않으려면 1.2 GB 크기의 GGUF 모델을 설치 파일에 포함할 수는 없습니다.
- 다양한 아키텍처와 하드웨어 설정(CPU vs. GPU)을 어떻게 지원할 것인가?
제가 이를 해결한 방법은 다음과 같습니다.
1. 동적 DLL 및 온디맨드(On-Demand) 모델 다운로드
AI 추론 엔진 (Inference Engine)을 메인 바이너리에 직접 컴파일하는 대신, 컴파일 타임 기능 (Compile-time features)을 사용하여 모듈형 아키텍처를 구축했습니다.
Focus Stream은 프로덕션 환경에서 ai_dll 기능 플래그 (Feature flag)와 함께 컴파일됩니다. 핵심 실행 파일은 매우 슬림합니다.
- 첫 실행: 앱은 사용자에게 Hugging Face에서 Llama 3.2 1B 모델 (~1.2 GB 양자화된 GGUF)을 로컬 앱 데이터 디렉토리로 직접 다운로드하도록 안내합니다.
- 동적 링크 (Dynamic Linking): 런타임 (Runtime) 시, 앱은 시스템 아키텍처를 확인하고 Rust의
libloading크레이트 (Crate)를 사용하여 컴파일된 C 호환 DLL (focus_stream_cpu.dll또는 향후 출시될 GPU 가속 버전)을 동적으로 로드합니다.
// 런타임에 추론 백엔드 (Inference backend)를 동적으로 로드하는 방식
pub fn load_backend(path: &Path) -> Result<Box<dyn AIBackend>, Box<dyn Error>> {
unsafe {
...
이를 통해 기본 애플리케이션 설치 파일 크기를 70MB 미만으로 유지하며, 사용자가 준비되었을 때만 무거운 LLM 가중치 (Weights)를 다운로드합니다.
2. 멀티 아키텍처 CPU 빌드 (x64 + arm64)
Windows는 Intel/AMD (x64)와 Snapdragon (arm64) 아키텍처 모두에서 실행되므로, Focus Stream은 두 가지를 모두 지원해야 했습니다.
저는 두 아키텍처를 모두 타겟팅하여 CPU DLL을 컴파일하는 PowerShell 스크립트를 작성했습니다:
# ARM64용 Rust 기반 CPU 백엔드 DLL 빌드
pwsh src-tauri/scripts/build-cpu-backend.ps1 aarch64-pc-windows-msvc
저희의 CI/CD 파이프라인에서는 x86_64-pc-windows-msvc와 aarch64-pc-windows-msvc DLL이 모두 리소스(Resources)로 번들링되어, 프로세서에 관계없이 네이티브 실행 속도를 보장합니다.
Microsoft Store 및 MSIX 패키징과의 사투
Microsoft Store용 데스크톱 앱을 패키징하는 것은 이번이 처음이었으며, 학습 곡선이 매우 가팔랐습니다. 스토어에 앱을 올리려면 .msix 컨테이너 내에서 앱 패키지에 서명해야 합니다.
버전 동기화
업데이트를 출시하려면 Microsoft Store는 XML 앱 매니페스트 (App manifest)에 4단계 버전 구조(예: 1.0.0.0)를 요구하는 반면, npm은 SemVer(예: 1.0.0)를 사용합니다.
수동 실수를 방지하기 위해, 저는 단일 진실 공급원 (Single Source of Truth) 역할을 하는 Node 스크립트(sync-version.mjs)를 작성했습니다. pnpm version을 실행하면 스크립트가 자동으로 다음 작업을 수행합니다:
package.json의 버전을 올립니다.- Tauri의 설정 파일(
tauri.conf.json)로 버전을 동기화합니다. Cargo.toml의 Cargo 버전을 동기화합니다.Package.Store.appxmanifest내의 XML 요소로 버전을 전파합니다.
CI/CD 자동화
저희의 GitHub Actions 파이프라인은 x64 및 arm64 MSIX 설치 프로그램을 모두 빌드하고, 이를 하나의 .msixbundle 파일로 병합하며, 태그가 푸시될 때 Windows Partner Center API를 사용하여 빌드를 Microsoft Store에 직접 제출합니다.
첫 데스크톱 출시를 통해 배운 교훈
- Rust는 Tauri 2와 완벽한 궁합입니다: 화면 캡처, 활성 창 폴링(Polling), 데이터베이스 캐싱과 같은 저수준 네이티브 로직을 Rust로 작성하면 매우 안전하고 빠르며, React를 사용하면 현대적인 대시보드를 쉽게 구축할 수 있습니다.
- 로컬 AI는 매우 실용적입니다: 로컬 추론 (Inference)을 실행하기 위해 RTX 4090이 필요하지는 않습니다. Llama 3.2 1B는 양자화 (Quantization)를 사용하면 중급 사양 노트북 CPU에서도 놀라울 정도로 빠르게 작동합니다. 텍스트 일기를 요약하거나 가벼운 RAG (검색 증강 생성)를 수행하기에 충분한 성능을 보여줍니다.
- 패키징이 승부의 50%를 차지합니다: 앱을 빌드하는 것은 업무의 절반에 불과합니다. 코드 서명 (Code signing), 대상 아키텍처, MSIX 매니페스트 제약 조건, 그리고 스토어 정책 검토에는 상당한 노력이 필요합니다.
다음 단계는?
이제 기반이 스토어에 출시되었으므로, 저는 다음 작업들을 진행하고 있습니다:
- 선택적 GPU 가속: 사용자가 전용 NVIDIA GPU를 보유한 경우 자동으로 로드되고, 그렇지 않으면 CPU로 폴백 (Fallback)되는 CUDA 호환 DLL 패키징.
- 더 상세한 대시보드:
recharts를 사용하여 수개월간의 생산성 트렌드를 추적하는 세밀한 차트 구축.
Focus Stream은 Microsoft Store에서 7일 무료 체험과 9.99달러의 일회성 구매(구독 없음!)로 이용 가능합니다. 개발자, 프리랜서, 또는 자신의 시간을 프라이빗하게 분석하고자 하는 분들이라면 꼭 확인해 보시기 바랍니다.
Tauri 2를 사용하여 데스크톱 앱을 구축해 보셨나요? 클라이언트 머신에서 로컬 LLM (Large Language Model) 통합을 실험해 보셨나요? 아래 댓글에서 함께 이야기해 봅시다!
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기