이형운
← 프로젝트 목록

Project

Mwoham

macOS 로컬 작업 기록 자동화 서비스

FastAPISQLiteAlembicSwiftUILLMSTTpytestruff

Screenshots

Overview

Mwoham은 macOS에서 앱 사용 흐름, 개발 이벤트, 회의 STT 기록, 수동 메모를 로컬 중심으로 수집하고 일일 리포트로 정리하는 작업 기록 자동화 앱입니다. SwiftUI macOS 앱이 사용자 인터페이스와 상태 표시를 담당하고, FastAPI 로컬 백엔드가 작업 세션, 이벤트, 메모, 회의 기록, 리포트 도메인을 처리합니다.

Problem

개발, 학습, 회의를 오가며 생기는 작업 기록은 앱 사용 이력, 수동 메모, 회의 내용, 개발 이벤트처럼 여러 위치에 흩어지기 쉽습니다. 하루가 끝난 뒤 실제 작업 흐름을 다시 정리하려면 기록을 직접 찾아 조합해야 했고, 리포트 작성에도 반복적인 시간이 들었습니다. 또한 화면과 음성처럼 민감할 수 있는 데이터를 다루기 때문에 외부 서버 의존도를 낮추고 AI 요청에 포함되는 정보를 통제할 필요가 있었습니다.

Solution

작업 세션, 앱/창 이벤트, 개발 이벤트, 수동 메모, 회의 STT 기록을 하나의 일일 타임라인으로 통합했습니다. TimelineBuilder를 통해 흩어진 기록을 시간 흐름에 맞게 정리하고, Gemini/OpenAI 기반 LLM 연동으로 일일 리포트 초안을 생성했습니다. 원본 화면이나 음성 파일을 장기 저장하는 방식 대신 로컬 텍스트 기록을 중심으로 처리하고, AI 요청 전 민감정보 마스킹을 적용해 기록 자동화와 개인정보 통제를 함께 고려했습니다.

Core Features

  • 작업 시작, 일시정지, 재개, 종료를 기준으로 하루 작업 세션 기록
  • 앱 사용 흐름, 창 제목, 개발 이벤트, 수동 메모를 하나의 타임라인으로 통합
  • 회의 중 음성을 로컬 STT로 텍스트화하고 회의 기록으로 저장
  • Git 변경 사항, 터미널 실행 흐름, 테스트·빌드·체크 결과를 개발 이벤트로 기록
  • TimelineBuilder를 통해 흩어진 작업 이벤트를 시간 순서의 일일 작업 흐름으로 정리
  • Gemini/OpenAI 기반 LLM 연동으로 일일 리포트 초안 자동 생성
  • 원본 화면·음성 장기 저장을 피하고, AI 요청 전 민감정보 마스킹 적용
  • macOS 메뉴바와 플로팅 위젯을 통해 기록 상태와 주요 액션 제공
  • Markdown/PDF 리포트 Export

Tech Stack

macOS App

SwiftSwiftUIAppKitAVFoundationSpeechScreenCaptureKit

Backend

PythonFastAPIUvicornSQLAlchemyAlembicSQLitePydantic

AI/STT

Gemini APIOpenAI APILocal WhisperApple Speech

Frontend/Web

Jinja2HTMLCSS

Storage/Security

SQLitemacOS KeychainLocal API TokenPrivacy Masking

Export

MarkdownWeasyPrint PDF

DevOps/QA

uvpytestruffxcodebuildhdiutilcodesign

macOS Integration

MenuBarExtraLaunch at LoginAccessibility PermissionScreen Recording Permission

Technical Decisions

  • macOS 앱과 FastAPI 로컬 백엔드를 분리해 UI 상태 관리와 데이터 처리 도메인의 책임을 나눴습니다.
  • 작업 기록, 메모, 회의 기록, 리포트를 각각 독립된 도메인으로 분리하고 Service/Repository 구조로 정리했습니다.
  • 앱/창 이벤트, Dev Tracking 이벤트, 수동 메모, 회의 STT 기록을 바로 리포트로 넘기지 않고 TimelineBuilder를 거쳐 일일 작업 흐름으로 정제하도록 설계했습니다.
  • Gemini와 OpenAI를 모두 사용할 수 있도록 LLM 연동부를 provider 기반으로 분리하고, 모델 선택과 API Key 저장을 설정 화면에서 관리하도록 구성했습니다.
  • 원본 화면이나 음성 파일을 장기 저장하지 않고 로컬 텍스트 기록 중심으로 처리해 개인정보 노출 범위를 줄였습니다.
  • AI 요청 전 민감정보 마스킹과 프롬프트 압축을 적용해 외부 API로 전달되는 정보를 제한했습니다.

Challenges

  • 앱 사용 흐름, 개발 이벤트, 메모, 회의 기록처럼 성격이 다른 데이터를 하나의 일일 타임라인으로 자연스럽게 합치는 과정이 어려웠습니다.
  • 짧은 앱 전환, 반복되는 창 제목, 의미 없는 이벤트가 리포트 품질을 떨어뜨려 low-signal 이벤트 정제와 동일 작업 흐름 병합이 필요했습니다.
  • macOS 앱 번들 환경에서 로컬 백엔드, STT CLI, STT 모델 파일의 실행 경로가 개발 환경과 달라지는 문제가 있었습니다.
  • LLM 리포트 생성 과정에서 응답 지연, 토큰 사용량, 실패 fallback, provider별 설정을 함께 고려해야 했습니다.
  • 화면과 음성처럼 민감할 수 있는 데이터를 다루기 때문에 자동 기록의 편의성과 개인정보 통제 사이의 균형을 맞추는 것이 중요했습니다.

Troubleshooting

Case 1macOS 앱 배포 후 백엔드 경로 고정 문제
이슈
개발 환경에서는 정상 동작했지만 DMG 설치 후 앱이 고정된 개발 경로의 백엔드를 참조해, 설치 위치와 실행 환경에 따라 백엔드 시작이 불안정했습니다.
해결
Bundle.main.resourceURL/backend, 수동 override, Application Support, Debug fallback 순서로 백엔드 경로를 탐색하도록 변경했습니다.
결과
개발 환경의 절대 경로 의존성을 제거하고 실제 설치 환경에서도 백엔드를 탐색해 실행할 수 있는 앱 번들 구조로 개선했습니다.
Case 2STT 모델과 CLI 번들링에 따른 DMG 용량 및 배포 구조 문제
이슈
STT CLI, 모델 파일, dylib 의존성을 앱에 함께 포함하면서 DMG 용량이 커졌고, 다운로드 실패나 부분 설치 상황에서 배포 및 복구 상태를 관리하기 어려웠습니다.
해결
lightweight/full 패키징을 분리하고 STT, backend, model 컴포넌트를 독립적으로 설치할 수 있게 구성했습니다. checksum 검증과 staging 설치를 거친 뒤 final 경로로 이동하고, 실패 시 기존 정상 설치본을 보존하도록 처리했습니다.
결과
무거운 AI/STT 컴포넌트를 앱 본체와 분리해 배포 안정성, 설치 복구성, 이후 컴포넌트 업데이트 가능성을 개선했습니다.
Case 3macOS 권한, Gatekeeper 및 앱 실행 환경 차이
이슈
Accessibility와 Speech 권한, Gatekeeper, unsigned app 실행 제한, App Translocation 등 macOS 보안 정책으로 인해 로컬 개발 환경과 DMG 설치 후 실행 결과가 달랐습니다.
해결
권한 상태 진단, Privacy & Security의 Open Anyway 안내, App Translocation 및 실행 경로 확인, 설치 QA 체크리스트를 추가하고 권한 안내 UX를 보강했습니다.
결과
macOS 네이티브 앱의 권한과 보안 정책을 설치 흐름에 포함해, 실행 실패 원인을 확인하고 사용자가 대응할 수 있는 구조로 개선했습니다.
Case 4TimelineBuilder와 LLM 리포트 입력 데이터 품질 문제
이슈
작업 이벤트, 메모, 회의 기록이 분산된 상태로 LLM에 전달되면 시간 흐름이 불명확해 리포트 품질이 떨어지고 민감정보가 외부 요청에 포함될 위험이 있었습니다.
해결
TimelineBuilder로 이벤트와 메모를 시간순으로 병합하고 리포트 입력 데이터를 정리했습니다. API key, token, password 등 민감정보를 마스킹한 뒤 LLM Provider에 요청하도록 파이프라인을 구성했습니다.
결과
로컬 데이터 전처리, 타임라인 구성, 민감정보 필터링, AI 리포트 생성으로 이어지는 단계별 처리 흐름을 마련했습니다.

Improvements

  • 앱 사용 이력, 개발 이벤트, 회의 기록, 수동 메모를 하루 단위 타임라인으로 통합해 작업 흐름 복원 시간을 줄였습니다.
  • LLM 기반 일일 리포트 초안 생성과 fallback report를 함께 구성해 AI 실패 상황에서도 리포트 기능이 유지되도록 개선했습니다.
  • Local Whisper 기반 회의 전사를 적용해 별도 STT API key 없이 회의 내용을 로컬에서 텍스트화할 수 있게 했습니다.
  • 원본 화면·음성 장기 저장을 피하고 로컬 텍스트 기록 중심으로 처리해 민감한 작업 데이터의 외부 의존도를 낮췄습니다.
  • API Key를 macOS Keychain에 저장하고 AI 요청 전 민감정보 마스킹을 적용해 보안성을 개선했습니다.
  • 메뉴바와 플로팅 위젯을 통해 기록 상태 확인, 빠른 액션, 주요 화면 이동을 앱 외부에서도 수행할 수 있게 했습니다.
  • Markdown/PDF export를 제공해 일일 회고, 업무 공유, 포트폴리오 정리에 활용할 수 있도록 확장했습니다.
  • backend/STT CLI/STT model 컴포넌트 설치 상태를 앱에서 관리하도록 개선해 배포 후 실행 안정성을 높였습니다.

Next Improvements

  • 리포트 품질 개선을 위한 프롬프트 템플릿과 evidence 압축 로직 고도화
  • 회의 전사 화자 분리와 회의 요약 기능 추가
  • OCR 기반 화면 맥락 분류 정확도 개선
  • 프로젝트별·태그별 작업 리포트 필터링 강화
  • 주간·월간 회고를 위한 장기 통계 대시보드 추가
  • Calendar, Notion, GitHub 등 외부 도구 연동
  • 공개 배포를 위한 Developer ID signing 및 notarization 적용
  • 온디바이스 LLM 연동을 통한 완전 로컬 리포트 생성 지원

Links