우리 AI 저널링 앱에서 가장 중요한 기능은 AI가 입을 다무는 기능입니다. 30일 중 7일차. 🌿
Source: Dev.to
Day 7 of building Evengood – a 60‑second end‑of‑day reflection app – in public on the Build with MeDo hackathon.
오늘 나는 가장 자랑스러운 기능을 배포했습니다: AI가 필요할 때 조용히 침묵하는.
조용 모드
내가 사용해 본 모든 AI 저널링 앱은 무거운 기록을 밝은 “성장 마인드셋” 카드로 바꾸는데, 이는 감각이 둔한 느낌이다. Quiet Mode는 사용자가 슬픔, 위기, 상실, 혹은 극심한 압박을 공유할 때 이를 감지하고 아무것도 하지 않는다 – LLM 호출도, 토큰 사용도, 강제적인 긍정도 없다.
작동 원리
- 순수 함수(detector)가 반성 텍스트를 디바이스를 떠나기 전에 로컬에서 실행됩니다.
- 텍스트에 네 가지 카테고리 중 하나(슬픔, 위기, 이별/상실, 혹은 극심한 압박)의 신호가 포함되어 있으면 앱은:
- Gemini 재구성 API 호출을 건너뜁니다.
- 텍스트‑음성 변환 호출을 건너뜁니다.
- 부드러운 확인 카드를 표시합니다:
어떤 날은 재구성이 필요하지 않아요.
오늘 밤은 자신에게 부드럽게 대하세요. 이 기록은 그대로 저장됩니다, 손대지 않은 채로.
-
항목은
isQuiet: true와 함께 저장됩니다; 원본 텍스트는 그대로 보존되며, 재구성된 내용은 저장되지 않습니다. -
주간 패턴 감지(또한 Gemini 호출)에서는 조용한 항목을 코퍼스에서 제외하여, 패턴이 비극이 아닌 리듬을 반영하도록 합니다.
-
연속 일수는 여전히 계산됩니다 – 조용한 날도 당신이 나타난 날로 간주됩니다.
-
자해 신호가 감지될 경우에만, 카드 아래에 한 줄의 차분한 문구가 표시됩니다:
If you need to talk to someone right now: text or call 988 (US) or befrienders.org (global).→ 지금 누군가와 이야기하고 싶다면: 문자나 전화 988(미국) 또는 befrienders.org(전 세계)로 연락하세요.
-
배너도, 온보딩도, 분석 이벤트도 없습니다 – 이 기능은 필요할 때까지 보이지 않으며, 작동하는 1 %의 시간에 가능한 최소한의 동작만 수행합니다.
데모
Type: "my dad died last week"
Hit share
앱은 더 크게 울리는 것이 아니라 조용해집니다. 그 15초짜리 상호작용이 전체 피치입니다.
구현
감지기 (src/lib/quietMode.ts)
export function detectQuietMode(text: string): { quiet: boolean; signal?: string } {
if (!text) return { quiet: false };
const lower = text.toLowerCase();
for (const signal of QUIET_SIGNALS) {
const re = new RegExp(`\\b${signal.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\$&')}\\b`, 'i');
if (re.test(lower)) return { quiet: true, signal };
}
return { quiet: false };
}
- LLM 없이, 외부 호출 없음.
- 직접 선별한 시그널 목록에 대해 단어 경계 정규식 사용.
- 마이크로초 단위로 실행되며 비용이 없고, 매치된 시그널을 로컬에만 보관.
제출 핸들러 (App.tsx)
const { quiet, signal } = detectQuietMode(reflectionText);
if (quiet && quietModeEnabled) {
saveQuietEntry({ text: reflectionText, signal, date: today });
showQuietAcknowledgment(signal);
return; // no Gemini call
}
// otherwise: normal reframe flow
const reframe = await callGemini(reflectionText);
패턴 감지 필터 (Supabase 엣지 함수)
const entries = allEntries.filter(e => !e.isQuiet);
전체적으로, 이 기능은 약 80 줄의 코드와 반나절 작업으로 구현됩니다.
제품 개요 (Day 7)
- 60‑second voice or text reflection (whisper for transcription) → 60초 음성 또는 텍스트 반성 (전사용 whisper)
- Calm AI reframe via Gemini (when not in Quiet Mode) → Calm AI가 Gemini을 통해 재구성 (Quiet Mode가 아닐 때)
- Weekly pattern detection – your last 7 reflections become one sentence → 주간 패턴 감지 – 최근 7개의 반성이 하나의 문장으로 합쳐짐
- “Moment of the Week” – an auto‑pulled keepsake from the week → “주간 순간” – 주에서 자동으로 추출된 기념품
- Save‑as‑image keepsake (lavender → peach card) → 이미지 저장 기념품 (라벤더 → 피치 카드)
- Streak counter, history view, ambient sound (rain / piano / silence) → 연속 기록 카운터, 기록 보기, 주변 소리 (비 / 피아노 / 무음)
- Email opt‑in for the Sunday pattern → 일요일 패턴을 위한 이메일 수신 동의
- Quiet Mode (today’s ship) → Quiet Mode (오늘 출시)
No account, no password. Nothing about you leaves the device except an anonymous device_id and, if you opt‑in, your email for the Sunday note. → 계정이나 비밀번호가 필요 없습니다. 장치를 떠나는 개인 정보는 익명 device_id와, 수신 동의 시 일요일 노트를 위한 이메일뿐입니다.
Live demo: built entirely on @MeDo with Supabase + Gemini. → 라이브 데모: @MeDo와 Supabase + Gemini만으로 완전히 구축되었습니다.
요약
AI 제품을 만든다면, 차년도 차별화는 어떤 모델을 감쌌는가가 아니라, 모델이 해를 끼칠 위험이 있을 때 모델을 호출하지 않을 판단력을 갖는 것이 될 것입니다.
More tomorrow.
— Day 7 / 30 🌿
#BuildInPublic #BuildWithMeDo