Knowledge Base

개인용 살핌(Salpeem)

구상 중

수업 중 30초면 생기부 한 문장 — 학생 데이터가 내 컴퓨터를 떠나지 않는 교사용 데스크톱 앱

TauriViteReactTypeScriptSQLiteZustandTailwind CSSshadcn/uiOpenRouter APIFramer Motion

Overview

What

개인용 살핌(Salpeem)은 Tauri v2 기반의 교사용 데스크톱 앱이다. 수업 중 관찰한 내용을 30초 안에 메모하면 AI가 생기부 문장으로 자동 변환하고, 모든 데이터는 SQLite로 로컬에만 저장된다.

Why

학교용 살핌이 이미 있지만, 세 가지 현실적 필요 때문에 별도로 만들었다.

학생 개인정보를 클라우드에 올릴 수 없는 교사가 있다. 학교 정책이나 개인적 판단으로 데이터를 외부 서버에 보내지 않으려는 교사들에게 로컬 저장은 타협이 아니라 전제 조건이다.

수업 중에 브라우저를 열고 로그인해서 기록하는 건 현실적이지 않다. 글로벌 단축키 하나로 바 모드가 뜨고, 한 줄 입력하고 닫으면 끝나는 경험이 필요하다.

학교 가입 절차 없이, 다운로드하고 바로 쓸 수 있어야 한다. 진입 장벽이 낮아야 실제로 쓴다.

학교용 살핌의 개인용 모드를 폐기하고, 이 데스크톱 앱이 그 역할을 대체한다. 추후 데이터 동기화를 통해 학교용과 통합할 계획이다.

How

Tauri v2로 경량 네이티브 앱을 만들고, SQLite로 모든 데이터를 로컬에 저장한다. AI 문장 생성은 OpenRouter API를 통해 사용자가 직접 API 키와 모델을 선택할 수 있게 했다.

가장 핵심적인 설계는 세 가지 윈도우 모드다. Full 모드는 방과 후 정리용, Side 모드는 다른 앱 옆에 붙여두는 용도, Bar 모드는 수업 중 한 줄 빠른 입력용이다. 교사의 실제 워크플로에 맞춰 모드를 설계했다.

Impact

수업 중 30초면 생기부 한 문장이 만들어진다. 학생 데이터가 내 컴퓨터를 절대 떠나지 않는다. 이 두 가지가 교사에게 전달하는 핵심 가치다.

Architecture

Tech Stack

  • Desktop: Tauri v2 (Rust 백엔드 + 웹 프론트엔드)
  • Frontend: Vite + React 19 + TypeScript
  • Styling: Tailwind CSS v4 + shadcn/ui
  • State: Zustand v5
  • Local DB: SQLite (Tauri SQL 플러그인)
  • AI: OpenRouter API (기본 모델: Gemini 2.5 Flash, 사용자 변경 가능)

Architecture

데이터는 교사의 기기를 떠나지 않는다. 관찰 메모가 입력되면 SQLite에 바로 저장되고, AI 변환이 필요할 때만 OpenRouter API로 텍스트가 전송된다.

앱은 세 가지 윈도우 모드를 지원한다. Full(1280×800, 전체 관리), Side(400px 세로 패널, 항상 위), Bar(600×80, 한 줄 입력). 글로벌 단축키로 즉시 전환된다. 이 모드 전환이 교사의 수업-방과후 워크플로를 자연스럽게 따라간다.

상태 관리는 Zustand로 도메인별 독립 store를 운영한다. 기록, 학생, 영역(그룹), 완성 문장, 설정이 각각 분리되어 있다.

Decisions

Decision 1: Tauri 선택

Context: 학교용 살핌은 Electron으로 데스크톱을 지원하지만, 앱 크기가 크고 메모리를 많이 잡아먹는다. 교사의 노트북 사양은 대부분 넉넉하지 않다. Decision: Tauri v2를 선택했다. Rust 백엔드로 앱이 경량화되고, SQLite를 네이티브로 통합할 수 있다. Consequence: 앱 크기가 대폭 줄었고 메모리 사용량도 낮다. 다만 Rust 생태계 학습이 필요했다.

Decision 2: SQLite 로컬 저장

Context: 학생 이름, 관찰 내용은 민감한 개인정보다. "내 학생 데이터가 어디 서버에 저장되는지 모르겠다"는 교사의 불안을 해소해야 했다. Decision: 모든 데이터를 SQLite로 로컬에만 저장한다. 클라우드 동기화는 의도적으로 뺐다. Consequence: 프라이버시가 완전히 보장되고 오프라인에서도 동작한다. 대신 기기 간 동기화와 백업이 사용자 책임이 된다.

Decision 3: OpenRouter API로 모델 선택 자유화

Context: 학교용 살핌은 내부적으로 Gemini API를 직접 호출한다. 그런데 개인용 앱에서 우리 API 키를 심어두면 비용 통제가 안 되고, 사용자마다 선호 모델이 다르다. Decision: OpenRouter API를 통해 사용자가 직접 API 키를 입력하고 모델을 선택하게 했다. Consequence: 비용을 사용자가 직접 통제한다. Gemini, Claude, GPT 등 여러 모델을 자유롭게 실험할 수 있다.

Lessons

배운 점

TauriElectron의 차이는 단순한 기술 선택이 아니라 사용자 경험의 차이다. 교사의 노트북에서 Electron 앱이 메모리를 잡아먹으면 수업 중에 쓸 수가 없다. 경량화는 기능이 아니라 전제 조건이었다.

로컬 우선 아키텍처는 프라이버시 관점에서 완벽하지만, "파일 날아가면 끝"이라는 리스크가 사용자에게 전가된다. 자동 백업 기능이 반드시 필요하다는 걸 베타 테스트에서 배웠다.

윈도우 모드 전환이 핵심이라는 건 교사를 관찰하면서 알게 됐다. 수업 중에는 Bar 모드로 한 줄 치고, 쉬는 시간에는 Side 모드로 확인하고, 방과 후에는 Full 모드로 정리한다. 이 흐름이 자연스러워야 실제로 쓴다.

학교용 살핌과의 관계

학교용 살핌의 개인용 모드(personal_profiles + RLS 격리)를 폐기하고, 이 Tauri 앱이 대체한다. 나중에 데이터 동기화로 통합할 계획이지만, 지금은 독립적으로 발전 중이다.

Timeline

2026-03 — 프로젝트 시작 (initial commit)

Tauri v2 + React + Vite 기반 초기 구조 확립. 기록/과제/설문/완성/설정 5개 화면 + SQLite 8개 테이블.

2026-03 — 중첩 그룹 구조 도입

카테고리/뷰 시스템을 폐기하고 재귀적 그룹(영역) 트리 구조로 전환.

2026-04 — 자동 업데이트 + CI/CD

GitHub Releases 기반 자동 업데이트 시스템 구축. 크로스 리포 배포 워크플로 추가.

현재 — 출시 예정

베타 단계. 소수 교사가 테스트 중. 정식 배포 준비 중.

관련 지식 노드