바이브 코딩으로 만든 '라미' - 모바일 로컬 LLM 앱

바이브 코딩으로 만든 '라미' - 모바일 로컬 LLM 앱

프로젝트 개요

프로젝트: 라미 (Llami Native App)
개발 기간: 2025.06 ~ 2025.09 (약 3개월)
기술 스택: React Native, Expo SDK 53, TypeScript, llama.rn, NativeWind
커밋 수: 125 commits


무엇을 만들었나

“라미”는 스마트폰에서 직접 실행되는 로컬 LLM AI 어시스턴트 앱이다. 클라우드 서버 없이 기기 내에서 AI 모델이 돌아간다.

주요 기능:

  • 📱 로컬 LLM 실행 (llama.rn)
  • 📷 카메라 + OCR (ONNX 모델)
  • 🎤 음성 인식
  • 💬 대화 기록 관리
  • 🌐 온라인/오프라인 모드 지원

왜 만들었나

ChatGPT 같은 서비스를 쓰면서 느낀 불편함:

  • 인터넷 없으면 못 씀
  • 개인정보가 서버로 전송됨
  • API 비용 부담

스마트폰 성능이 좋아진 지금, 로컬에서 LLM을 돌릴 수 있지 않을까? 이 궁금증에서 시작했다.


바이브 코딩 경험

125번의 커밋 동안 Claude와 함께 코딩했다. 특히 복잡했던 부분들:

1. 네이티브-웹 브릿지 아키텍처

앱의 핵심 구조가 독특하다. AI 모델은 네이티브 컨텍스트에서 실행되고, UI는 WebView에서 렌더링된다.

/store/native/  → React Native 컨텍스트 (모델, 오디오)
/store/dom/     → WebView 컨텍스트 (UI 상태)
/store/bridge.tsx → postMessage로 둘을 연결

이 구조 설계를 Claude와 함께 논의하면서 잡아갔다.

2. 메모리 관리 이슈

로컬 LLM은 메모리를 많이 먹는다. iOS에서 메모리 한계에 부딪혔을 때:

"entitlements": {
  "com.apple.developer.kernel.extended-virtual-addressing": true,
  "com.apple.developer.kernel.increased-memory-limit": true
}

이런 설정들을 찾아서 적용했다.

3. 스트리밍 응답 처리

AI 응답을 실시간으로 보여주는 스트리밍 처리. 무한루프 버그, 입력 비활성화 타이밍 등 세세한 UX 문제들을 잡아갔다.


기술적 도전

llama.rn 통합

React Native에서 LLM을 돌리기 위해 llama.rn을 사용했다. 모델 다운로드, 초기화, 추론까지 전 과정을 네이티브 모듈로 처리.

ONNX OCR

카메라로 찍은 이미지에서 텍스트를 추출하는 OCR 기능. ONNX 런타임을 활용했다.

다국어 지원

한국어(ko)와 영어(en) 지원. i18n 구조를 깔끔하게 잡았다.


배운 점

  1. 로컬 LLM의 가능성: 스마트폰에서 충분히 실용적인 AI를 돌릴 수 있다
  2. 메모리 최적화의 중요성: 모바일에서는 리소스 관리가 핵심
  3. 바이브 코딩의 효율성: 복잡한 네이티브 앱도 AI와 함께라면 훨씬 빠르게 개발 가능
  4. 하이브리드 아키텍처: 네이티브 + WebView 조합의 장단점 체득

앱스토어 출시

라미는 실제로 앱스토어에 출시되었다. 버전 1.3.12까지 업데이트하며 사용자 피드백을 반영했다.


마무리

3개월간 125번의 커밋. AI 어시스턴트를 AI와 함께 만드는 아이러니한 경험이었다.

로컬 LLM 앱이라는 도전적인 주제였지만, 바이브 코딩 덕분에 실제로 앱스토어까지 출시할 수 있었다. 혼자였다면 중간에 포기했을 것 같다.


이 글은 바이브 코딩 시리즈의 일부입니다.

profile
손상혁.
Currently Managed
Currently not managed