공문·메신저·이미지에 흩어진 학교 일정을 고양이에게 던지면, AI가 뽑아 Google 캘린더와 할 일에 넣어 주는 데스크톱 도구
교사에게 전달되는 일정과 업무는 공문(HWP, PDF), 메신저 쪽지, 이미지, 급하게 적어 둔 메모 등 여러 곳에 흩어져 있습니다. 이를 일일이 열어 읽고 캘린더에 옮겨 적는 과정에서 시간이 들고, 제출 기한을 놓치거나 같은 일정을 중복으로 등록하는 일이 생겼습니다. 또한 "1교시 끝나고", "퇴근 전까지"처럼 학교에서만 통하는 시간 표현은 일반적인 도구로는 처리되지 않았습니다.
문서, 이미지, 텍스트를 화면 위 고양이에게 드래그하거나 붙여넣으면 AI가 일정과 할 일을 추출합니다. 사용자는 카드로 한 장씩 넘기며 확인·수정하고, 캘린더 / 할 일 / 둘 다 중에서 골라 Google 캘린더 또는 테스크에 등록합니다. 등록 직전에 기존 항목과 중복인지 확인해 건너뛰기·갱신·새로 등록을 선택할 수 있습니다.
학교 상황에 맞추기 위해 출퇴근·교시·점심 시각을 설정에 넣어 시간 표현을 실제 시각으로 해석하고, 담당 학년·교과를 기준으로 나와 무관한 안내는 걸러 냅니다. 외부 AI로 보내기 전에는 이름·연락처 등 개인정보를 가린 뒤 전송하고, 결과에서 원문으로 되돌립니다.
- 다양한 자료 입력: HWP·HWPX·PDF 파일, 이미지·스크린샷, 복사한 텍스트를 드래그하거나 붙여넣을 수 있습니다.
- AI 일정 추출: 문서에서 행사 일정, 제출 기한, 해야 할 일, 장소, 알림 시간 등을 자동으로 찾아냅니다.
- 등록 전 검토: 추출 결과를 직접 수정하고, 각 항목을 캘린더 일정 또는 할 일로 선택할 수 있습니다.
- Google 연동: 확인한 내용을 Google Calendar와 Google Tasks에 등록합니다.
- 중복 방지: 기존 일정·할 일과 비슷한 항목을 찾아 건너뛰기, 업데이트, 신규 등록 중에서 선택하게 합니다.
- 메신저 및 할 일 수집: Windows에서는 쿨메신저 쪽지를 자동 감지하고, Google Tasks의 ‘인박스’ 항목도 가져와 정리할 수 있습니다.
- 맞춤 분류: 담당 학년·교과 같은 개인 조건과 사용자 규칙에 따라 필요한 일정만 걸러냅니다.
- 여러 AI 지원: Claude, OpenAI, Gemini, Upstage Solar, 로컬 Ollama 중 선택할 수 있습니다.
- 데스크톱 고양이 UI: 화면 위의 작은 고양이가 대기·분석·완료·오류 등의 처리 상태를 보여줍니다.
- 개인정보 마스킹: AI로 보내기 전에 이름·연락처·학번 등을 가리고, 결과를 받은 뒤 원문으로 되돌립니다(로컬 AI 모델 옵션 포함).
- 학교 시간표 인식: 출퇴근·교시·점심 시각을 설정해 두면 "1교시 후", "퇴근 전까지" 같은 표현을 실제 시각으로 바꿉니다.
- 원문 함께 보관: 캘린더 설명·할 일 메모 아래에 원문 일부를 남겨 나중에 구체적인 내용을 확인할 수 있습니다.
- 자동 업데이트·자동 실행: 새 버전이 나오면 고양이에 배지가 뜨고 앱 안에서 교체됩니다. OS 시작 시 자동 실행과 트레이 숨기기도 지원합니다.
- 사용자가 여러 방식으로 고양이에게 자료를 전달합니다 — 쿨메신저는 자동 감지, 텍스트 복사·화면 캡처 후 붙여넣기, PDF·HWP 파일 드래그 앤 드롭, Google Tasks에 음성·메모로 적어 둔 임시 항목 가져오기.
- 고양이가 자료에서 개인정보를 가린 뒤 외부 API 또는 로컬 LLM으로 보내 일정·할 일을 추출합니다.
- 사람이 카드를 한 장씩 넘기며 내용이 맞는지 검토하고, 캘린더 / 할 일 / 둘 다 / 건너뛰기를 고릅니다.
- 등록 직전 기존 항목과 중복인지 확인해 건너뛰기·갱신·새로 등록을 선택합니다.
- 확정된 항목이 업무 특성에 따라 Google Calendar 또는 Google Tasks(담당 목록)에 저장되고, 설정한 시각에 알림이 옵니다.
- 사용 환경: PC 데스크톱 — Windows 10/11, macOS(Apple Silicon), Linux
- 사용 조건: - Google 계정 로그인이 필요합니다(Google 캘린더, 테스크에 등록하기 위해). 로그인은 브라우저에서 진행되며 별도 키 파일은 필요 없습니다.
AI는 다음 중 하나를 선택합니다.- 유료 API 키 입력: Claude(Anthropic), ChatGPT(OpenAI), Gemini(Google), Solar(Upstage)
- 무료: 로컬 LLM(Ollama)을 설치하고 모델을 내려받아 사용 - 이 경우 문서 내용이 외부로 전송되지 않습니다.
- 프로그램 자체는 무료 오픈소스(MIT)이며, 별도 회원가입, 서버 계정이 없습니다.
- 화면: Python + PySide6(Qt) 기반 데스크톱 앱. 항상 위에 떠 있는 프레임리스 고양이 위젯 + 검토/설정 다이얼로그, 시스템 트레이 아이콘
- 서버·백엔드: 서버 없음. 사용자 PC에서 Google Calendar/Tasks API와 직접 통신하고, 선택한 AI 공급자에 직접 요청
- AI: 선택 사용: Claude(Anthropic), ChatGPT(OpenAI), Gemini(Google), Solar(Upstage), 로컬 Ollama. 개인정보 마스킹용 한국어 PII 탐지 모델은 ONNX로 PC 안에서 실행.
- 저장소: 로컬 저장. 설정은 사용자 설정 폴더의 JSON, API 키/OAuth 토큰은 OS 키체인(macOS Keychain / Windows Credential Manager / Linux Secret Service). 원본 문서/추출 이력은 저장하지 않음
- 배포: GitHub Actions로 Windows(단일 exe), macOS(dmg), Linux(tar.gz) 자동 빌드 -> 태그를 붙이면 GitHub Releases에 자동 첨부. GitHub Pages 소개 페이지에서 OS를 감지해 내려받기. 앱 안에서 새 버전 확인, 자동 업데이트 지원
catmoa/
├── main.py # 진입점
├── build.py · catmoa.spec # PyInstaller (Windows 단일 exe, macOS dmg, Linux tar.gz)
├── assets/cat/ # 고양이 표정 이미지 (배포용 320px)
├── src/
│ ├── config.py # 설정 저장/복원 (platformdirs + keyring)
│ ├── updater.py # 자동 업데이트 (GitHub Releases)
│ ├── autostart.py # OS 시작 시 자동 실행
│ ├── llm/ # Claude / OpenAI / Gemini / Upstage / Ollama 어댑터
│ ├── parsers/ # PDF / HWPX / HWP 텍스트 추출
│ ├── extract/ # 일정 추출 스키마·프롬프트·추출기
│ ├── pipeline/ # 통합 처리 큐
│ ├── gsync/ # Google OAuth / Calendar / Tasks / 등록 / 중복 검사
│ ├── sources/ # 쿨메신저 udb·워처, Tasks 인박스
│ ├── privacy/ # 개인정보 마스킹 (규칙 + 선택형 로컬 AI 모델)
│ ├── single_instance.py # 중복 실행 방지
│ └── ui/ # 고양이 위젯, 검토·중복·설정 다이얼로그, 토스트
├── tests/
├── tools/ # 아이콘·고양이 이미지 생성, 모델 변환, 실검증 스크립트
└── docs/ # PRD, GitHub Pages 소개 페이지
소개 페이지 또는 GitHub Releases에서 OS에 맞는 파일을 내려받아 실행합니다. Windows: catmoa-windows-x86_64.exe 실행 (SmartScreen 경고 시 추가 정보 → 실행) macOS: catmoa-macos-arm64.dmg 열고 응용 프로그램으로 복사 → 첫 실행 시 시스템 설정 → 개인정보 보호 및 보안 → "그래도 열기" Linux: catmoa-linux-x86_64.tar.gz 압축 해제 후 ./catmoa/catmoa 개발자용: git clone 후 ./run.sh(macOS·Linux) 또는 run.cmd(Windows), Python 3.11+
설치한 실행 파일을 실행하면 화면에 고양이가 뜹니다. 설정은 고양이 우클릭 → 설정. (설정에서 'OS 시작 시 자동 실행'을 켤 수 있습니다.)- 필요한 환경변수(이름만): 직접 빌드할 때만 필요합니다: CATMOA_GOOGLE_CLIENT_ID, CATMOA_GOOGLE_CLIENT_SECRET (Google Cloud에서 발급한 데스크톱 앱 OAuth 클라이언트). 배포판을 내려받아 쓰는 사용자는 설정할 필요가 없습니다. AI API 키는 환경변수가 아니라 앱 설정 화면에서 입력해 OS 키체인에 저장됩니다.
- 지금까지 확인한 범위: 개발자 본인이 macOS(Apple Silicon)와 Parallels 위 Windows(ARM64)에서 실제 업무 자료로 사용했습니다. 실제로 받은 쿨메신저 쪽지·공문을 비식별화한 테스트셋 약 50건으로 분류·마스킹 성능을 점검했고, 자동 테스트 246개가 통과합니다. v1.0.0부터 v1.4.14까지 24개 버전을 실제로 배포·설치했습니다.
- 입력 자료의 형태와 표현에 따라 분류·요약이 정확하지 않을 수 있고, 선택한 AI 모델의 성능에 영향을 많이 받습니다.
- 개인정보 마스킹은 핵심 항목 대부분을 가리지만 100%는 아닙니다. 특히 문맥 없이 등장하는 인명이나 반–번호 형태는 놓칠 수 있어, 민감한 자료는 로컬 LLM(Ollama) 사용을 권합니다.
- 코드 서명·공증을 하지 않아 macOS·Windows 첫 실행 시 보안 경고가 뜹니다(안내 문서 제공).
- Google OAuth 앱 검증 전이라 로그인 과정에 "확인되지 않은 앱" 경고가 표시됩니다.
- 쿨메신저 자동 감지는 Windows 전용이며, 메신저의 저장 형식이 바뀌면 동작하지 않을 수 있습니다.
- 스캔본 PDF·이미지는 AI의 이미지 인식 품질에 좌우되며, 비전 지원 모델이 필요합니다.
- 강력한 마스킹 옵션은 약 295MB 모델을 추가로 내려받아야 하고, 저사양 PC에서는 처리 속도가 느려집니다.
- 지금까지의 검증은 개발자 본인 환경과 비식별 테스트셋 약 50건 수준으로, 여러 학교·여러 교사를 대상으로 한 현장 검증은 하지 못했습니다.
- 더 다양한 메신저와 자료로부터 자동으로 입력을 받는 기능을 개발하고 싶습니다(학교 업무 포털, 메일, 공유 폴더 감시 등).
- 여러 교사와 함께 쓰는 현장 검증 — 학교급·시간표가 다른 환경에서 추출 정확도 측정.
- 개인정보 마스킹 정확도 개선(놓치는 인명·반번호 유형 보완)과 마스킹 결과 리포트 제공.
- macOS 공증·Windows 코드 서명, Google OAuth 앱 검증으로 첫 실행 경고 제거.
- 반복 일정·학사일정 일괄 등록, 등록 이력 되돌리기.
- 개인정보 처리 여부: 처리함
- 예상되는 위험: 일정·업무 내용 중에 학생·보호자 개인정보가 포함될 수 있고, 이 정보가 AI API를 통해 외부로 넘어갈 수 있습니다.
- 위험을 줄이려고 한 일: 1. 로컬 LLM(Ollama)을 선택하면 외부 전송을 원천 차단할 수 있는 방법을 제공했습니다.
- AI에 보내기 전에 개인정보 마스킹을 수행합니다 — 규칙 기반 탐지에 더해, 선택 옵션으로 PC 안에서만 도는 한국어 개인정보 탐지 모델을 함께 사용하는 2중 구조입니다. 결과에 남은 토큰은 등록 직전에 원문으로 복원됩니다.
- 쿨메신저 연동은 기본 꺼짐이고, DB는 임시 복사본을 읽기 전용으로만 열어 원본을 건드리지 않습니다.
- Google에는 사람이 검토·확정한 항목만 전송됩니다.
- 서버·텔레메트리가 없고, API 키와 토큰은 OS 키체인에만 저장합니다.
- 개인정보처리방침·서비스 약관을 공개하고, 앱이 요청하는 권한 범위와 저장 위치를 명시했습니다.
- 멈춤 기준: - 마스킹을 켠 상태에서 이름·연락처가 가려지지 않고 그대로 전송된 사례가 한 건이라도 확인되면, 해당 입력 경로 사용을 멈추고 로컬 LLM 전용으로 전환합니다.
- 사람 확인 없이 캘린더·할 일에 등록되는 경로가 발견되면 즉시 사용을 멈추고 수정합니다.
- 검증 방법: - 실제로 사용했던 메신저·공문 데이터를 비식별화한 테스트셋(약 50건)으로 분류·마스킹 성능을 점검했습니다. 대부분의 이름·휴대전화번호 등은 마스킹되었습니다.
- 설정 '개인정보' 탭의 '가려보기'로 실제 전송될 문장을 사람이 눈으로 확인합니다(마스킹 → 복원 왕복 검증).
- 자동 테스트 246개를 매 커밋 CI에서 실행하고, 앱에는 상태 점검 명령(catmoa --selftest)을 두었습니다.
- 3개 OS 빌드를 GitHub Actions에서 자동 생성하고, macOS·Windows 실기기에서 설치·업데이트를 직접 확인했습니다.
| 정보 이름 | 누가 입력하는지 | 외부 전송 | 저장 위치·기간 | 볼 수 있는 사람 | 삭제 방법·시점 |
|---|---|---|---|---|---|
| 입력 자료 원문 (HWP·PDF·이미지·복사한 텍스트) | 교사가 직접 드래그·붙여넣기 | ❌ 원문 그대로는 보내지 않음 (마스킹 후 전송) | 저장하지 않음 — 메모리에서만 처리 | 교사 본인 | 앱을 닫으면 사라짐 (별도 삭제 불필요) |
| 쿨메신저 받은 쪽지 | 앱이 자동 감지 (기본 꺼짐, Windows 전용) | ❌ 원문 그대로는 보내지 않음 | 원본 DB는 읽기 전용 임시 복사본으로만 열고, 읽는 즉시 삭제 | 교사 본인 | 읽기 직후 자동 삭제 · 설정에서 연동 끄기 |
| AI에 보내는 본문 (마스킹된 텍스트) | 앱이 원문에서 자동 생성 | ⭕ 선택한 AI 공급자로 전송 (Ollama 선택 시 전송 없음) | 앱에는 저장하지 않음. 공급자 보관 정책은 각 사업자 약관에 따름 | 교사 본인 + 해당 AI 공급자 | 로컬 LLM(Ollama)으로 바꾸면 전송 자체가 없어짐 |
| 이미지·스크린샷 | 교사가 붙여넣기·드롭 | ⭕ 비전 모델로 전송 | 저장하지 않음 | 교사 본인 + 해당 AI 공급자 | 앱을 닫으면 사라짐 · 이미지 속 글자는 마스킹되지 않음에 유의 |
| 추출된 일정·할 일 (제목·날짜·장소·메모) | AI가 제안 → 교사가 검토·수정·확정 | ⭕ 확정한 항목만 Google로 전송 | 교사 본인의 Google 캘린더·Tasks (구글 계정 정책에 따라 보관) | 교사 본인 (공유하지 않으면 남에게 안 보임) | 캘린더·Tasks에서 직접 삭제 |
| 일정에 함께 넣는 원문 발췌 | 앱이 자동 첨부 (기본 1,500자, 마스킹 안 함) | ⭕ Google로 전송 | 캘린더 설명·할 일 메모 하단 | 교사 본인 | 설정 → 일반 → '원문 포함 길이'를 0으로 두면 넣지 않음 · 항목 삭제 시 함께 삭제 |
| Google 계정 (이메일·OAuth 토큰) | 교사가 브라우저에서 로그인 | ⭕ Google 인증 서버 | OS 키체인(Keychain/자격 증명 관리자/Secret Service), 실패 시 설정 폴더 secrets.json |
교사 본인 | 설정 → Google → 로그아웃 (토큰 즉시 삭제) |
| AI API 키 | 교사가 설정 화면에 입력 | ⭕ 해당 AI 공급자 (인증용) | 위와 같은 OS 키체인 | 교사 본인 | 설정에서 키를 지우고 저장 |
| 앱 설정 (내 역할·시간표·분류 규칙·쿨메신저 폴더·창 위치) | 교사가 설정 화면에 입력 | ❌ (단, '내 역할'·시간표는 판단 기준으로 AI 프롬프트에 포함) | 설정 폴더 config.json — 지울 때까지 |
교사 본인 | 설정 폴더를 지우면 초기화 |
| 개인정보 마스킹 모델 (선택) | 교사가 설정에서 내려받기 | ❌ (내려받은 뒤에는 인터넷 없이 동작) | 설정 폴더 pii_model/ 약 295MB |
해당 없음 (개인정보 아님) | 설정 → 개인정보 → 모델 삭제 |
| 실행 기록(로그) | 앱이 자동 생성 | ❌ | 파일로 남기지 않음 (콘솔 출력만) | 교사 본인 | 앱 종료 시 사라짐 |
| 업데이트 확인 | 앱이 자동 (설정에서 끌 수 있음) | ⭕ GitHub — 보내는 값은 현재 버전 번호뿐 | 저장하지 않음 | 해당 없음 | 설정 → 업데이트 → 자동 확인 끄기 |
설정 폴더 위치 — Windows
%LOCALAPPDATA%\catmoa, macOS~/Library/Application Support/catmoa, Linux~/.config/catmoa. 이 폴더를 통째로 지우면 설정·토큰·내려받은 모델이 모두 사라집니다. 서버와 텔레메트리가 없어서, 제작자를 포함한 누구도 사용자의 자료를 볼 수 없습니다.
- 평가·추천·피드백을 프로그램이 대신 확정하지 않게 했나요?: 해당 없음 (교사의 일정·업무를 정리하는 도구로, 학생 평가나 추천을 다루지 않습니다.)
- 학생이나 교사의 생각을 대신하지 않게 했나요?: 해당 없음 (AI 결과는 제안일 뿐이고, 무엇을 언제 할지는 사용자가 카드에서 직접 고칩니다.)
- 저장·전달·제출 전에 사람이 확인할 수 있나요?: 해당함 (추출 결과를 카드로 한 장씩 확인·수정한 뒤에만 등록되고, 비슷한 항목이 있으면 다시 물어봅니다.)
- 기기·계정·조작 문제로 참여에서 빠지는 사람이 없게 했나요?: 해당 없음 (학생 참여가 없는 교사 개인 도구이며, 3개 OS를 모두 지원하고 유료 API 없이 무료 로컬 AI로도 쓸 수 있습니다.)
- 윤서희 · 서울잠동초등학교 · 기획, 검증, 디자인
- 함기훈 · 미림마이스터고등학교 · 기획, 개발, 릴리즈
- 이상민 · 하계중학교 · 기획, 개발, 문제정의
- 코드 라이선스: MIT
- 문서 라이선스: CC BY 4.0
- 외부 자료 출처: - 고양이 이미지·아이콘: ChatGPT로 생성
- 쿨메신저 .udb 읽기 방식: https://github.com/dacisosl/coolm-helper (MIT) 참고
- 개인정보 마스킹에 사용하는 AI 모델: https://huggingface.co/FrameByFrame/korean-pii-e5-base (MIT) — 앱은 이 모델을 ONNX int8로 변환해 배포합니다.
- 응답 인원: 3명 / 팀원 3명
| 원칙 | 평균 점수 |
|---|---|
| 학생 성장 최우선 | 5.0 / 5.0 |
| 개인정보·데이터 보호 | 5.0 / 5.0 |
| 책임과 출처 존중 | 5.0 / 5.0 |
| 안전한 실험과 검증 | 5.0 / 5.0 |
| 역할 경계 인식 | 5.0 / 5.0 |
| 공공성 | 5.0 / 5.0 |
| 투명성 및 설명 가능성 | 5.0 / 5.0 |
| 전체 평균 | 5.0 / 5.0 |
- 함기훈: 인공지능이 만능이 아니며 한계가 있음을 항시 기억하기
- 이상민: AI에게 모든 책임을 전가하지 않고 사람의 검토를 충분히 거치기
- 윤서희: 프로그램이 학생들에게 어떤 영향을 미치는지 반복해서 검증하기
